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:
Karim Abou Zeid 2015-07-15 03:40:47 +02:00
commit 294f3fc5d0
14 changed files with 282 additions and 179 deletions

View file

@ -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) {

View file

@ -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);
}
}

View file

@ -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();
}

View file

@ -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