From 294f3fc5d01f30b8f80686f241be829e5104ee81 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Wed, 15 Jul 2015 03:40:47 +0200 Subject: [PATCH] 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. --- .../adapter/album/AlbumAdapter.java | 3 +- .../adapter/album/HorizontalAlbumAdapter.java | 2 +- .../ui/activities/MainActivity.java | 142 +++++++++--------- .../AbsMainActivityRecyclerViewFragment.java | 22 ++- ...ctivityRecyclerViewLayoutModeFragment.java | 59 ++++++++ .../AlbumViewFragment.java | 33 ++-- .../gramophone/util/PreferenceUtil.java | 111 ++++++++++---- app/src/main/res/menu/menu_main.xml | 30 +--- app/src/main/res/menu/menu_playlists.xml | 41 ----- app/src/main/res/values-land/integers.xml | 5 + .../main/res/values-sw600dp-land/integers.xml | 5 + app/src/main/res/values-sw600dp/integers.xml | 5 + app/src/main/res/values/ids.xml | 4 + app/src/main/res/values/integers.xml | 3 +- 14 files changed, 284 insertions(+), 181 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewLayoutModeFragment.java delete mode 100644 app/src/main/res/menu/menu_playlists.xml create mode 100644 app/src/main/res/values-land/integers.xml create mode 100644 app/src/main/res/values-sw600dp-land/integers.xml create mode 100644 app/src/main/res/values-sw600dp/integers.xml create mode 100644 app/src/main/res/values/ids.xml diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java index 11cb7726..b2876f0b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java @@ -52,11 +52,12 @@ public class AlbumAdapter extends AbsMultiSelectAdapter dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { + public AlbumAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { super(activity, cabHolder, R.menu.menu_media_selection); this.activity = activity; this.dataSet = dataSet; this.itemLayoutRes = itemLayoutRes; + this.usePalette = usePalette; setHasStableIds(true); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/HorizontalAlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/HorizontalAlbumAdapter.java index 7ca8a328..d35c0c47 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/HorizontalAlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/HorizontalAlbumAdapter.java @@ -19,7 +19,7 @@ public class HorizontalAlbumAdapter extends AlbumAdapter { public static final String TAG = AlbumAdapter.class.getSimpleName(); public HorizontalAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, @Nullable CabHolder cabHolder) { - super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, cabHolder); + super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, false, cabHolder); usePalette = false; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index afeed734..1a23f326 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java index def303cf..90d82eec 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java @@ -66,6 +66,11 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityRecyclerViewFragment { + 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(); +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java index e87708cd..dd95162c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java @@ -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 { +public class AlbumViewFragment extends AbsMainActivityRecyclerViewLayoutModeFragment { 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 - - + android:id="@+id/action_layout_mode_list" + android:title="@string/list" /> - - - - + android:id="@+id/action_layout_mode_grid" + android:title="@string/grid" /> diff --git a/app/src/main/res/menu/menu_playlists.xml b/app/src/main/res/menu/menu_playlists.xml deleted file mode 100644 index 2d56f8ea..00000000 --- a/app/src/main/res/menu/menu_playlists.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-land/integers.xml b/app/src/main/res/values-land/integers.xml new file mode 100644 index 00000000..4a3e2e0f --- /dev/null +++ b/app/src/main/res/values-land/integers.xml @@ -0,0 +1,5 @@ + + + 4 + 2 + \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp-land/integers.xml b/app/src/main/res/values-sw600dp-land/integers.xml new file mode 100644 index 00000000..53329a50 --- /dev/null +++ b/app/src/main/res/values-sw600dp-land/integers.xml @@ -0,0 +1,5 @@ + + + 6 + 3 + \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/integers.xml b/app/src/main/res/values-sw600dp/integers.xml new file mode 100644 index 00000000..4a3e2e0f --- /dev/null +++ b/app/src/main/res/values-sw600dp/integers.xml @@ -0,0 +1,5 @@ + + + 4 + 2 + \ No newline at end of file diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 00000000..e6ce922e --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index cf629fc2..3454c447 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,6 +1,7 @@ + 2 + 1 1 - \ No newline at end of file