Making great progress with the "view as" option to toggle between list and grid mode. Currently only implemented in the album fragment. To add the functionality to other fragments just extend the AbsMainActivityRecyclerViewLayoutModeFragment class and implement its abstract methods (class name should be changed to something shorter soon). In future the artist and song fragments should extend that class.
This commit is contained in:
parent
280e8a15eb
commit
294f3fc5d0
14 changed files with 282 additions and 179 deletions
|
|
@ -16,6 +16,7 @@ import android.support.design.widget.AppBarLayout;
|
|||
import android.support.design.widget.AppBarLayout.OnOffsetChangedListener;
|
||||
import android.support.design.widget.NavigationView;
|
||||
import android.support.design.widget.TabLayout;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.util.Pair;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v4.widget.DrawerLayout;
|
||||
|
|
@ -49,11 +50,14 @@ import com.kabouzeid.gramophone.loader.SongLoader;
|
|||
import com.kabouzeid.gramophone.model.Song;
|
||||
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.AlbumViewFragment;
|
||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.ArtistViewFragment;
|
||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.PlaylistViewFragment;
|
||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.SongViewFragment;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
import com.kabouzeid.gramophone.util.Util;
|
||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||
|
|
@ -300,7 +304,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
|
|||
try {
|
||||
super.enableViews();
|
||||
toolbar.setEnabled(true);
|
||||
((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).enableViews();
|
||||
((AbsMainActivityFragment) getCurrentFragment()).enableViews();
|
||||
} catch (NullPointerException ignored) {
|
||||
}
|
||||
}
|
||||
|
|
@ -309,7 +313,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
|
|||
public void disableViews() {
|
||||
try {
|
||||
super.disableViews();
|
||||
((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).disableViews();
|
||||
((AbsMainActivityFragment) getCurrentFragment()).disableViews();
|
||||
} catch (NullPointerException ignored) {
|
||||
}
|
||||
}
|
||||
|
|
@ -336,11 +340,15 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
|
|||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.menu_main, menu);
|
||||
if (isPlaylistPage()) {
|
||||
getMenuInflater().inflate(R.menu.menu_playlists, menu);
|
||||
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);
|
||||
} else {
|
||||
getMenuInflater().inflate(R.menu.menu_main, menu);
|
||||
setUpGridMenu(menu);
|
||||
menu.removeItem(R.id.action_view_as);
|
||||
}
|
||||
restoreActionBar();
|
||||
return true;
|
||||
|
|
@ -360,7 +368,11 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
|
|||
|
||||
ViewUtil.invalidateToolbarPopupMenuTint(toolbar);
|
||||
|
||||
if (handleGridSize(item)) return true;
|
||||
Fragment currentFragment = getCurrentFragment();
|
||||
if (currentFragment instanceof AbsMainActivityRecyclerViewLayoutModeFragment) {
|
||||
if (handleLayoutModeMenuItem((AbsMainActivityRecyclerViewLayoutModeFragment) currentFragment, item))
|
||||
return true;
|
||||
}
|
||||
|
||||
int id = item.getItemId();
|
||||
switch (id) {
|
||||
|
|
@ -389,63 +401,45 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
|
|||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void setUpGridMenu(@NonNull Menu menu) {
|
||||
boolean isPortrait = Util.isInPortraitMode(this);
|
||||
int columns = isPortrait ? PreferenceUtil.getInstance(this).getAlbumGridColumns() : PreferenceUtil.getInstance(this).getAlbumGridColumnsLand();
|
||||
String title = isPortrait ? getResources().getString(R.string.action_view_as) : getResources().getString(R.string.action_view_as_land);
|
||||
private void setUpLayoutModeMenu(@NonNull AbsMainActivityRecyclerViewLayoutModeFragment fragment, @NonNull Menu menu) {
|
||||
SubMenu layoutModeMenu = menu.findItem(R.id.action_view_as).getSubMenu();
|
||||
|
||||
MenuItem gridSizeItem = menu.findItem(R.id.action_view_as);
|
||||
gridSizeItem.setTitle(title);
|
||||
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);
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
||||
SubMenu gridSizeMenu = gridSizeItem.getSubMenu();
|
||||
gridSizeMenu.getItem(columns - 1).setChecked(true);
|
||||
layoutModeMenu.findItem(R.id.action_colored_footers).setChecked(fragment.loadUsePalette());
|
||||
}
|
||||
|
||||
private boolean handleGridSize(@NonNull MenuItem item) {
|
||||
int size = getGridSize(item);
|
||||
|
||||
if (size > 0) {
|
||||
item.setChecked(true);
|
||||
if (isAlbumPage()) {
|
||||
getAlbumFragment().setColumns(size);
|
||||
if (Util.isInPortraitMode(this)) {
|
||||
PreferenceUtil.getInstance(this).setAlbumGridColumns(size);
|
||||
} else {
|
||||
PreferenceUtil.getInstance(this).setAlbumGridColumnsLand(size);
|
||||
}
|
||||
}
|
||||
private boolean handleLayoutModeMenuItem(AbsMainActivityRecyclerViewLayoutModeFragment fragment, @NonNull MenuItem item) {
|
||||
if (item.getItemId() == R.id.action_colored_footers) {
|
||||
item.setChecked(!item.isChecked());
|
||||
fragment.setUsePaletteAndSaveValue(item.isChecked());
|
||||
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;
|
||||
}
|
||||
|
||||
private int getGridSize(MenuItem item) {
|
||||
int size = -1;
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case R.id.gridSizeOne:
|
||||
size = 1;
|
||||
break;
|
||||
case R.id.gridSizeTwo:
|
||||
size = 2;
|
||||
break;
|
||||
case R.id.gridSizeThree:
|
||||
size = 3;
|
||||
break;
|
||||
case R.id.gridSizeFour:
|
||||
size = 4;
|
||||
break;
|
||||
case R.id.gridSizeFive:
|
||||
size = 5;
|
||||
break;
|
||||
case R.id.gridSizeSix:
|
||||
size = 6;
|
||||
break;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
drawerToggle.onConfigurationChanged(newConfig);
|
||||
|
|
@ -526,13 +520,17 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
|
|||
return id;
|
||||
}
|
||||
|
||||
// private boolean isArtistPage() {
|
||||
// return pager.getCurrentItem() == PagerAdapter.MusicFragments.ARTIST.ordinal();
|
||||
// }
|
||||
//
|
||||
// public ArtistViewFragment getArtistFragment() {
|
||||
// return (ArtistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ARTIST.ordinal());
|
||||
// }
|
||||
public Fragment getCurrentFragment() {
|
||||
return pagerAdapter.getFragment(pager.getCurrentItem());
|
||||
}
|
||||
|
||||
private boolean isArtistPage() {
|
||||
return pager.getCurrentItem() == PagerAdapter.MusicFragments.ARTIST.ordinal();
|
||||
}
|
||||
|
||||
public ArtistViewFragment getArtistFragment() {
|
||||
return (ArtistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ARTIST.ordinal());
|
||||
}
|
||||
|
||||
private boolean isAlbumPage() {
|
||||
return pager.getCurrentItem() == PagerAdapter.MusicFragments.ALBUM.ordinal();
|
||||
|
|
@ -543,21 +541,21 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
|
|||
return (AlbumViewFragment) 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());
|
||||
// }
|
||||
private boolean isSongPage() {
|
||||
return pager.getCurrentItem() == PagerAdapter.MusicFragments.SONG.ordinal();
|
||||
}
|
||||
|
||||
public SongViewFragment getSongFragment() {
|
||||
return (SongViewFragment) 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 PlaylistViewFragment getPlaylistFragment() {
|
||||
return (PlaylistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.PLAYLIST.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
|
||||
|
|
|
|||
|
|
@ -66,6 +66,11 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
|
|||
}
|
||||
|
||||
private void setUpRecyclerView() {
|
||||
invalidateLayoutManager();
|
||||
invalidateAdapter();
|
||||
}
|
||||
|
||||
protected void invalidateAdapter() {
|
||||
adapter = createAdapter();
|
||||
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
|
||||
@Override
|
||||
|
|
@ -74,13 +79,14 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
|
|||
showEmptyMessageIfEmpty();
|
||||
}
|
||||
});
|
||||
|
||||
layoutManager = createLayoutManager();
|
||||
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
recyclerView.setAdapter(adapter);
|
||||
}
|
||||
|
||||
protected void invalidateLayoutManager() {
|
||||
layoutManager = createLayoutManager();
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
}
|
||||
|
||||
protected A getAdapter() {
|
||||
return adapter;
|
||||
}
|
||||
|
|
@ -159,4 +165,12 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
|
|||
getMainActivity().removeMusicStateListenerListener(this);
|
||||
ButterKnife.reset(this);
|
||||
}
|
||||
|
||||
protected int getDefaultGridColumnNumber() {
|
||||
return getActivity().getResources().getInteger(R.integer.grid_num_columns);
|
||||
}
|
||||
|
||||
protected int getDefaultListColumnNumber() {
|
||||
return getActivity().getResources().getInteger(R.integer.list_num_columns);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
protected int getItemLayout() {
|
||||
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 getColumnNumber() {
|
||||
switch (getLayoutMode()) {
|
||||
case PreferenceUtil.LAYOUT_MODE_LIST:
|
||||
return getDefaultListColumnNumber();
|
||||
case PreferenceUtil.LAYOUT_MODE_GRID:
|
||||
return getDefaultGridColumnNumber();
|
||||
default:
|
||||
return R.layout.item_list;
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
@ -7,18 +7,16 @@ import com.kabouzeid.gramophone.R;
|
|||
import com.kabouzeid.gramophone.adapter.album.AlbumAdapter;
|
||||
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
import com.kabouzeid.gramophone.util.Util;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<AlbumAdapter, GridLayoutManager> {
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragment<AlbumAdapter, GridLayoutManager> {
|
||||
public static final String TAG = AlbumViewFragment.class.getSimpleName();
|
||||
|
||||
@Override
|
||||
protected GridLayoutManager createLayoutManager() {
|
||||
int columns = Util.isInPortraitMode(getActivity()) ? PreferenceUtil.getInstance(getActivity()).getAlbumGridColumns() : PreferenceUtil.getInstance(getActivity()).getAlbumGridColumnsLand();
|
||||
return new GridLayoutManager(getActivity(), columns);
|
||||
return new GridLayoutManager(getActivity(), getColumnNumber());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
|
@ -27,7 +25,8 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<Album
|
|||
return new AlbumAdapter(
|
||||
getMainActivity(),
|
||||
AlbumLoader.getAllAlbums(getActivity()),
|
||||
R.layout.item_grid,
|
||||
getItemLayout(),
|
||||
PreferenceUtil.getInstance(getActivity()).albumColoredFooters(),
|
||||
getMainActivity());
|
||||
}
|
||||
|
||||
|
|
@ -36,11 +35,25 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<Album
|
|||
return R.string.no_albums;
|
||||
}
|
||||
|
||||
public void setColumns(int columns) {
|
||||
getLayoutManager().setSpanCount(columns);
|
||||
getLayoutManager().requestLayout();
|
||||
// required to animate the column size change
|
||||
getAdapter().notifyDataSetChanged();
|
||||
@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();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void saveLayoutMode(int layoutMode) {
|
||||
PreferenceUtil.getInstance(getActivity()).setAlbumLayoutMode(layoutMode);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue