Re added the adjustable grid size feature. Transition between two grid sizes are not working yet. Fixes kabouzeid/phonograph-issue-tracker#43

This commit is contained in:
Karim Abou Zeid 2015-09-30 20:53:09 +02:00
commit d1b06b79f8
17 changed files with 398 additions and 200 deletions

View file

@ -53,7 +53,7 @@ import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewLayoutModeFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewCustomGridSizeFragment;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
@ -324,10 +324,20 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title);
}
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsMainActivityRecyclerViewLayoutModeFragment) {
setUpLayoutModeMenu((AbsMainActivityRecyclerViewLayoutModeFragment) currentFragment, menu);
if (currentFragment instanceof AbsMainActivityRecyclerViewCustomGridSizeFragment) {
AbsMainActivityRecyclerViewCustomGridSizeFragment absMainActivityRecyclerViewCustomGridSizeFragment = (AbsMainActivityRecyclerViewCustomGridSizeFragment) currentFragment;
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size);
if (Util.isLandscape(this)) {
gridSizeItem.setTitle(R.string.action_grid_size_land);
}
setUpGridSizeMenu(absMainActivityRecyclerViewCustomGridSizeFragment, gridSizeItem.getSubMenu());
menu.findItem(R.id.action_colored_footers).setChecked(absMainActivityRecyclerViewCustomGridSizeFragment.usePalette());
menu.findItem(R.id.action_colored_footers).setEnabled(absMainActivityRecyclerViewCustomGridSizeFragment.canUsePalette());
} else {
menu.removeItem(R.id.action_view_as);
menu.removeItem(R.id.action_grid_size);
menu.removeItem(R.id.action_colored_footers);
}
ViewUtil.setToolbarContentColorForBackground(this, toolbar, getThemeColorPrimary());
return true;
@ -353,9 +363,16 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
ViewUtil.invalidateToolbarPopupMenuTint(toolbar);
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsMainActivityRecyclerViewLayoutModeFragment) {
if (handleLayoutModeMenuItem((AbsMainActivityRecyclerViewLayoutModeFragment) currentFragment, item))
if (currentFragment instanceof AbsMainActivityRecyclerViewCustomGridSizeFragment) {
AbsMainActivityRecyclerViewCustomGridSizeFragment absMainActivityRecyclerViewCustomGridSizeFragment = (AbsMainActivityRecyclerViewCustomGridSizeFragment) currentFragment;
if (item.getItemId() == R.id.action_colored_footers) {
item.setChecked(!item.isChecked());
absMainActivityRecyclerViewCustomGridSizeFragment.setAndSaveUsePalette(item.isChecked());
return true;
}
if (handleGridSizeMenuItem(absMainActivityRecyclerViewCustomGridSizeFragment, item)) {
return true;
}
}
int id = item.getItemId();
@ -379,41 +396,68 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
return super.onOptionsItemSelected(item);
}
private void setUpLayoutModeMenu(@NonNull AbsMainActivityRecyclerViewLayoutModeFragment fragment, @NonNull Menu menu) {
SubMenu layoutModeMenu = menu.findItem(R.id.action_view_as).getSubMenu();
switch (fragment.getLayoutMode()) {
case PreferenceUtil.LAYOUT_MODE_LIST:
layoutModeMenu.findItem(R.id.action_layout_mode_list).setChecked(true);
layoutModeMenu.findItem(R.id.action_colored_footers).setEnabled(false);
private void setUpGridSizeMenu(@NonNull AbsMainActivityRecyclerViewCustomGridSizeFragment fragment, @NonNull SubMenu gridSizeMenu) {
switch (fragment.getGridSize()) {
case 1:
gridSizeMenu.findItem(R.id.action_grid_size_1).setChecked(true);
break;
case PreferenceUtil.LAYOUT_MODE_GRID:
layoutModeMenu.findItem(R.id.action_layout_mode_grid).setChecked(true);
layoutModeMenu.findItem(R.id.action_colored_footers).setEnabled(true);
case 2:
gridSizeMenu.findItem(R.id.action_grid_size_2).setChecked(true);
break;
case 3:
gridSizeMenu.findItem(R.id.action_grid_size_3).setChecked(true);
break;
case 4:
gridSizeMenu.findItem(R.id.action_grid_size_4).setChecked(true);
break;
case 5:
gridSizeMenu.findItem(R.id.action_grid_size_5).setChecked(true);
break;
case 6:
gridSizeMenu.findItem(R.id.action_grid_size_6).setChecked(true);
break;
case 7:
gridSizeMenu.findItem(R.id.action_grid_size_7).setChecked(true);
break;
case 8:
gridSizeMenu.findItem(R.id.action_grid_size_8).setChecked(true);
break;
}
layoutModeMenu.findItem(R.id.action_colored_footers).setChecked(fragment.loadUsePalette());
}
private boolean handleLayoutModeMenuItem(AbsMainActivityRecyclerViewLayoutModeFragment fragment, @NonNull MenuItem item) {
if (item.getItemId() == R.id.action_colored_footers) {
item.setChecked(!item.isChecked());
fragment.setUsePaletteAndSaveValue(item.isChecked());
private boolean handleGridSizeMenuItem(@NonNull AbsMainActivityRecyclerViewCustomGridSizeFragment fragment, @NonNull MenuItem item) {
int gridSize = 0;
switch (item.getItemId()) {
case R.id.action_grid_size_1:
gridSize = 1;
break;
case R.id.action_grid_size_2:
gridSize = 2;
break;
case R.id.action_grid_size_3:
gridSize = 3;
break;
case R.id.action_grid_size_4:
gridSize = 4;
break;
case R.id.action_grid_size_5:
gridSize = 5;
break;
case R.id.action_grid_size_6:
gridSize = 6;
break;
case R.id.action_grid_size_7:
gridSize = 7;
break;
case R.id.action_grid_size_8:
gridSize = 8;
break;
}
if (gridSize > 0) {
item.setChecked(true);
fragment.setAndSaveGridSize(gridSize);
toolbar.getMenu().findItem(R.id.action_colored_footers).setEnabled(fragment.canUsePalette());
return true;
} else {
switch (item.getItemId()) {
case R.id.action_layout_mode_list:
item.setChecked(true);
fragment.setLayoutModeAndSaveValue(PreferenceUtil.LAYOUT_MODE_LIST);
toolbar.getMenu().findItem(R.id.action_colored_footers).setEnabled(false);
return true;
case R.id.action_layout_mode_grid:
item.setChecked(true);
fragment.setLayoutModeAndSaveValue(PreferenceUtil.LAYOUT_MODE_GRID);
toolbar.getMenu().findItem(R.id.action_colored_footers).setEnabled(true);
return true;
}
}
return false;
}
@ -505,32 +549,32 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
// return pager.getCurrentItem() == PagerAdapter.MusicFragments.ARTIST.ordinal();
// }
//
// public ArtistViewFragment getArtistFragment() {
// return (ArtistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ARTIST.ordinal());
// public ArtistsFragment getArtistFragment() {
// return (ArtistsFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ARTIST.ordinal());
// }
//
// private boolean isAlbumPage() {
// return pager.getCurrentItem() == PagerAdapter.MusicFragments.ALBUM.ordinal();
// }
//
// public AlbumViewFragment getAlbumFragment() {
// return (AlbumViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ALBUM.ordinal());
// public AlbumsFragment getAlbumFragment() {
// return (AlbumsFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ALBUM.ordinal());
// }
//
// private boolean isSongPage() {
// return pager.getCurrentItem() == PagerAdapter.MusicFragments.SONG.ordinal();
// }
//
// public SongViewFragment getSongFragment() {
// return (SongViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.SONG.ordinal());
// public SongsFragment getSongFragment() {
// return (SongsFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.SONG.ordinal());
// }
private boolean isPlaylistPage() {
return pager.getCurrentItem() == PagerAdapter.MusicFragments.PLAYLIST.ordinal();
}
// public PlaylistViewFragment getPlaylistFragment() {
// return (PlaylistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.PLAYLIST.ordinal());
// public PlaylistsFragment getPlaylistFragment() {
// return (PlaylistsFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.PLAYLIST.ordinal());
// }

View file

@ -0,0 +1,109 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.Util;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityRecyclerViewCustomGridSizeFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityRecyclerViewFragment<A, LM> {
private int gridSize;
private boolean usePaletteInitialized;
private boolean usePalette;
public final int getGridSize() {
if (gridSize == 0) {
if (isLandscape()) {
gridSize = loadGridSizeLand();
} else {
gridSize = loadGridSize();
}
}
return gridSize;
}
/**
* @return whether the palette should be used at all or not
*/
public final boolean usePalette() {
if (!usePaletteInitialized) {
usePalette = loadUsePalette();
usePaletteInitialized = true;
}
return usePalette;
}
public void setAndSaveGridSize(final int gridSize) {
int oldLayoutRes = getItemLayoutRes();
this.gridSize = gridSize;
if (isLandscape()) {
saveGridSizeLand(gridSize);
} else {
saveGridSize(gridSize);
}
// only recreate the adapter and layout manager if the layout res has changed
if (oldLayoutRes != getItemLayoutRes()) {
invalidateLayoutManager();
invalidateAdapter();
} else {
setGridSize(gridSize);
}
}
public void setAndSaveUsePalette(final boolean usePalette) {
this.usePalette = usePalette;
saveUsePalette(usePalette);
setUsePalette(usePalette);
}
/**
* @return whether the palette option should be available for the current item layout or not
*/
public boolean canUsePalette() {
return getItemLayoutRes() == R.layout.item_grid;
}
/**
* Override to customize which item layout res should be used. You might also want to override {@link #canUsePalette()} then.
*
* @see #getGridSize()
*/
@LayoutRes
protected int getItemLayoutRes() {
if (getGridSize() > getMaxGridSizeForList()) {
return R.layout.item_grid;
}
return R.layout.item_list;
}
protected abstract int loadGridSize();
protected abstract void saveGridSize(int gridColumns);
protected abstract int loadGridSizeLand();
protected abstract void saveGridSizeLand(int gridColumns);
protected abstract void saveUsePalette(boolean usePalette);
protected abstract boolean loadUsePalette();
protected abstract void setUsePalette(boolean usePalette);
protected abstract void setGridSize(int gridSize);
protected int getMaxGridSizeForList() {
if (isLandscape()) {
return getActivity().getResources().getInteger(R.integer.default_list_columns_land);
}
return getActivity().getResources().getInteger(R.integer.default_list_columns);
}
protected final boolean isLandscape() {
return Util.isLandscape(getActivity());
}
}

View file

@ -177,12 +177,4 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
getMainActivity().removeMusicServiceEventListener(this);
ButterKnife.unbind(this);
}
protected int getDefaultGridColumnCount() {
return getActivity().getResources().getInteger(R.integer.grid_num_columns);
}
protected int getDefaultListColumnCount() {
return getActivity().getResources().getInteger(R.integer.list_num_columns);
}
}

View file

@ -1,61 +0,0 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PreferenceUtil;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityRecyclerViewLayoutModeFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityRecyclerViewFragment<A, LM> {
public static final int NO_LAYOUT_MODE = -1;
private int layoutMode = NO_LAYOUT_MODE;
public int getLayoutMode() {
if (layoutMode == NO_LAYOUT_MODE) {
layoutMode = loadLayoutMode();
}
return layoutMode;
}
@LayoutRes
protected int getItemLayoutRes() {
switch (getLayoutMode()) {
case PreferenceUtil.LAYOUT_MODE_LIST:
return R.layout.item_list;
case PreferenceUtil.LAYOUT_MODE_GRID:
return R.layout.item_grid;
default:
return R.layout.item_list;
}
}
protected int getColumnCount() {
switch (getLayoutMode()) {
case PreferenceUtil.LAYOUT_MODE_LIST:
return getDefaultListColumnCount();
case PreferenceUtil.LAYOUT_MODE_GRID:
return getDefaultGridColumnCount();
default:
return getDefaultListColumnCount();
}
}
public void setLayoutModeAndSaveValue(int layoutMode) {
this.layoutMode = layoutMode;
saveLayoutMode(layoutMode);
invalidateLayoutManager();
invalidateAdapter();
}
protected abstract int loadLayoutMode();
protected abstract void saveLayoutMode(int layoutMode);
public abstract void setUsePaletteAndSaveValue(boolean usePalette);
public abstract boolean loadUsePalette();
}

View file

@ -11,12 +11,12 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragment<AlbumAdapter, GridLayoutManager> {
public static final String TAG = AlbumViewFragment.class.getSimpleName();
public class AlbumsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager> {
public static final String TAG = AlbumsFragment.class.getSimpleName();
@Override
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), getColumnCount());
return new GridLayoutManager(getActivity(), getGridSize());
}
@NonNull
@ -35,25 +35,45 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewLayoutModeFrag
return R.string.no_albums;
}
@Override
public void setUsePaletteAndSaveValue(boolean usePalette) {
getAdapter().usePalette(usePalette);
PreferenceUtil.getInstance(getActivity()).setAlbumColoredFooters(usePalette);
}
@Override
public boolean loadUsePalette() {
return PreferenceUtil.getInstance(getActivity()).albumColoredFooters();
}
@Override
protected int loadLayoutMode() {
return PreferenceUtil.getInstance(getActivity()).getAlbumLayoutMode();
protected void setUsePalette(boolean usePalette) {
getAdapter().usePalette(usePalette);
}
@Override
protected void saveLayoutMode(int layoutMode) {
PreferenceUtil.getInstance(getActivity()).setAlbumLayoutMode(layoutMode);
protected void setGridSize(int gridSize) {
getLayoutManager().setSpanCount(gridSize);
getLayoutManager().requestLayout();
}
@Override
protected int loadGridSize() {
return PreferenceUtil.getInstance(getActivity()).getAlbumGridSize(getActivity());
}
@Override
protected void saveGridSize(int gridSize) {
PreferenceUtil.getInstance(getActivity()).setAlbumGridSize(gridSize);
}
@Override
protected int loadGridSizeLand() {
return PreferenceUtil.getInstance(getActivity()).getAlbumGridSizeLand(getActivity());
}
@Override
protected void saveGridSizeLand(int gridSize) {
PreferenceUtil.getInstance(getActivity()).setAlbumGridSizeLand(gridSize);
}
@Override
protected void saveUsePalette(boolean usePalette) {
PreferenceUtil.getInstance(getActivity()).setAlbumColoredFooters(usePalette);
}
@Override

View file

@ -11,14 +11,14 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragment<ArtistAdapter, GridLayoutManager> {
public class ArtistsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager> {
public static final String TAG = ArtistViewFragment.class.getSimpleName();
public static final String TAG = ArtistsFragment.class.getSimpleName();
@NonNull
@Override
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), getColumnCount());
return new GridLayoutManager(getActivity(), getGridSize());
}
@NonNull
@ -43,18 +43,27 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewLayoutModeFra
}
@Override
protected int loadLayoutMode() {
return PreferenceUtil.getInstance(getActivity()).getArtistLayoutMode();
protected int loadGridSize() {
return PreferenceUtil.getInstance(getActivity()).getArtistGridSize(getActivity());
}
@Override
protected void saveLayoutMode(int layoutMode) {
PreferenceUtil.getInstance(getActivity()).setArtistLayoutMode(layoutMode);
protected void saveGridSize(int gridSize) {
PreferenceUtil.getInstance(getActivity()).setArtistGridSize(gridSize);
}
@Override
public void setUsePaletteAndSaveValue(boolean usePalette) {
getAdapter().usePalette(usePalette);
protected int loadGridSizeLand() {
return PreferenceUtil.getInstance(getActivity()).getArtistGridSizeLand(getActivity());
}
@Override
protected void saveGridSizeLand(int gridSize) {
PreferenceUtil.getInstance(getActivity()).setArtistGridSizeLand(gridSize);
}
@Override
protected void saveUsePalette(boolean usePalette) {
PreferenceUtil.getInstance(getActivity()).setArtistColoredFooters(usePalette);
}
@ -62,4 +71,15 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewLayoutModeFra
public boolean loadUsePalette() {
return PreferenceUtil.getInstance(getActivity()).artistColoredFooters();
}
@Override
protected void setUsePalette(boolean usePalette) {
getAdapter().usePalette(usePalette);
}
@Override
protected void setGridSize(int gridSize) {
getLayoutManager().setSpanCount(gridSize);
getLayoutManager().requestLayout();
}
}

View file

@ -16,9 +16,9 @@ import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter, LinearLayoutManager> {
public class PlaylistsFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter, LinearLayoutManager> {
public static final String TAG = PlaylistViewFragment.class.getSimpleName();
public static final String TAG = PlaylistsFragment.class.getSimpleName();
@NonNull
@Override

View file

@ -16,14 +16,14 @@ import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragment<SongAdapter, GridLayoutManager> {
public class SongsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFragment<SongAdapter, GridLayoutManager> {
public static final String TAG = SongViewFragment.class.getSimpleName();
public static final String TAG = SongsFragment.class.getSimpleName();
@NonNull
@Override
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), getColumnCount());
return new GridLayoutManager(getActivity(), getGridSize());
}
@NonNull
@ -34,7 +34,7 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragm
int itemLayoutRes = getItemLayoutRes();
boolean usePalette = loadUsePalette();
if (getLayoutMode() == PreferenceUtil.LAYOUT_MODE_LIST) {
if (getGridSize() <= getMaxGridSizeForList()) {
return new ShuffleButtonSongAdapter(
mainActivity,
songs,
@ -61,18 +61,27 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragm
}
@Override
protected int loadLayoutMode() {
return PreferenceUtil.getInstance(getActivity()).getSongLayoutMode();
protected int loadGridSize() {
return PreferenceUtil.getInstance(getActivity()).getSongGridSize(getActivity());
}
@Override
protected void saveLayoutMode(int layoutMode) {
PreferenceUtil.getInstance(getActivity()).setSongLayoutMode(layoutMode);
protected void saveGridSize(int gridSize) {
PreferenceUtil.getInstance(getActivity()).setSongGridSize(gridSize);
}
@Override
public void setUsePaletteAndSaveValue(boolean usePalette) {
getAdapter().usePalette(usePalette);
protected int loadGridSizeLand() {
return PreferenceUtil.getInstance(getActivity()).getSongGridSizeLand(getActivity());
}
@Override
protected void saveGridSizeLand(int gridSize) {
PreferenceUtil.getInstance(getActivity()).setSongGridSizeLand(gridSize);
}
@Override
public void saveUsePalette(boolean usePalette) {
PreferenceUtil.getInstance(getActivity()).setSongColoredFooters(usePalette);
}
@ -80,4 +89,15 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragm
public boolean loadUsePalette() {
return PreferenceUtil.getInstance(getActivity()).songColoredFooters();
}
@Override
public void setUsePalette(boolean usePalette) {
getAdapter().usePalette(usePalette);
}
@Override
protected void setGridSize(int gridSize) {
getLayoutManager().setSpanCount(gridSize);
getLayoutManager().requestLayout();
}
}