From ce23df3ef13ee4e968ca8d5b0769177cf0f4159c Mon Sep 17 00:00:00 2001 From: Luuk Nieuwdorp Date: Thu, 7 Jan 2021 17:01:10 +0100 Subject: [PATCH 1/3] Add FavoritesFragment based on SongsFragment --- .../adapter/MusicLibraryPagerAdapter.java | 4 +- .../library/pager/FavoritesFragment.java | 184 ++++++++++++++++++ .../gramophone/model/CategoryInfo.java | 3 +- .../gramophone/util/PreferenceUtil.java | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 191 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java diff --git a/app/src/main/java/com/dkanada/gramophone/adapter/MusicLibraryPagerAdapter.java b/app/src/main/java/com/dkanada/gramophone/adapter/MusicLibraryPagerAdapter.java index 1f93edde..0729f818 100644 --- a/app/src/main/java/com/dkanada/gramophone/adapter/MusicLibraryPagerAdapter.java +++ b/app/src/main/java/com/dkanada/gramophone/adapter/MusicLibraryPagerAdapter.java @@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; +import com.dkanada.gramophone.fragments.mainactivity.library.pager.FavoritesFragment; import com.dkanada.gramophone.model.CategoryInfo; import com.dkanada.gramophone.fragments.mainactivity.library.pager.AlbumsFragment; import com.dkanada.gramophone.fragments.mainactivity.library.pager.ArtistsFragment; @@ -154,7 +155,8 @@ public class MusicLibraryPagerAdapter extends FragmentPagerAdapter { ALBUMS(AlbumsFragment.class), ARTISTS(ArtistsFragment.class), GENRES(GenresFragment.class), - PLAYLISTS(PlaylistsFragment.class); + PLAYLISTS(PlaylistsFragment.class), + FAVORITES(FavoritesFragment.class); private final Class mFragmentClass; diff --git a/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java b/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java new file mode 100644 index 00000000..79afe827 --- /dev/null +++ b/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java @@ -0,0 +1,184 @@ +package com.dkanada.gramophone.fragments.mainactivity.library.pager; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.dkanada.gramophone.App; +import com.dkanada.gramophone.R; +import com.dkanada.gramophone.adapter.song.ShuffleButtonSongAdapter; +import com.dkanada.gramophone.adapter.song.SongAdapter; +import com.dkanada.gramophone.model.Song; +import com.dkanada.gramophone.util.PreferenceUtil; +import com.dkanada.gramophone.util.QueryUtil; + +import org.jellyfin.apiclient.interaction.Response; +import org.jellyfin.apiclient.model.dto.BaseItemDto; +import org.jellyfin.apiclient.model.querying.ItemFields; +import org.jellyfin.apiclient.model.querying.ItemFilter; +import org.jellyfin.apiclient.model.querying.ItemQuery; +import org.jellyfin.apiclient.model.querying.ItemsResult; + +import java.util.ArrayList; +import java.util.List; + +public class FavoritesFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment { + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + + @NonNull + @Override + protected GridLayoutManager createLayoutManager() { + return new GridLayoutManager(getActivity(), getGridSize()); + } + + @NonNull + @Override + protected SongAdapter createAdapter() { + int itemLayoutRes = getItemLayoutRes(); + notifyLayoutResChanged(itemLayoutRes); + boolean usePalette = loadUsePalette(); + + List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); + SongAdapter adapter; + + if (getGridSize() <= getMaxGridSizeForList()) { + adapter = new ShuffleButtonSongAdapter( + getLibraryFragment().getMainActivity(), + dataSet, + itemLayoutRes, + usePalette, + getLibraryFragment()); + } else { + adapter = new SongAdapter( + getLibraryFragment().getMainActivity(), + dataSet, + itemLayoutRes, + usePalette, + getLibraryFragment()); + } + + return adapter; + } + + @NonNull + @Override + protected ItemQuery createQuery() { + ItemQuery query = new ItemQuery(); + + query.setIncludeItemTypes(new String[]{"Audio"}); + query.setFields(new ItemFields[]{ItemFields.MediaSources}); + query.setUserId(App.getApiClient().getCurrentUserId()); + query.setRecursive(true); + query.setLimit(PreferenceUtil.getInstance(App.getInstance()).getPageSize()); + query.setStartIndex(getAdapter().getItemCount()); + query.setParentId(QueryUtil.currentLibrary.getId()); + query.setFilters(new ItemFilter[]{ItemFilter.IsFavorite}); + + QueryUtil.applySortMethod(query, PreferenceUtil.getInstance(App.getInstance()).getSongSortMethod()); + QueryUtil.applySortOrder(query, PreferenceUtil.getInstance(App.getInstance()).getSongSortOrder()); + return query; + } + + @Override + protected void loadItems(int index) { + ItemQuery query = getQuery(); + query.setStartIndex(index); + + App.getApiClient().GetItemsAsync(query, new Response() { + @Override + public void onResponse(ItemsResult result) { + if (index == 0) getAdapter().getDataSet().clear(); + for (BaseItemDto itemDto : result.getItems()) { + getAdapter().getDataSet().add(new Song(itemDto)); + } + + size = result.getTotalRecordCount(); + getAdapter().notifyDataSetChanged(); + loading = false; + } + + @Override + public void onError(Exception exception) { + exception.printStackTrace(); + } + }); + } + + @Override + protected int getEmptyMessage() { + return R.string.no_songs; + } + + @Override + protected String loadSortMethod() { + return PreferenceUtil.getInstance(getActivity()).getSongSortMethod(); + } + + @Override + protected void saveSortMethod(String sortMethod) { + PreferenceUtil.getInstance(getActivity()).setSongSortMethod(sortMethod); + } + + @Override + protected void setSortMethod(String sortMethod) { + } + + @Override + protected String loadSortOrder() { + return PreferenceUtil.getInstance(getActivity()).getSongSortOrder(); + } + + @Override + protected void saveSortOrder(String sortOrder) { + PreferenceUtil.getInstance(getActivity()).setSongSortOrder(sortOrder); + } + + @Override + protected void setSortOrder(String sortOrder) { + } + + @Override + protected int loadGridSize() { + return PreferenceUtil.getInstance(getActivity()).getSongGridSize(requireActivity()); + } + + @Override + protected void saveGridSize(int gridSize) { + PreferenceUtil.getInstance(getActivity()).setSongGridSize(gridSize); + } + + @Override + protected int loadGridSizeLand() { + return PreferenceUtil.getInstance(getActivity()).getSongGridSizeLand(requireActivity()); + } + + @Override + protected void saveGridSizeLand(int gridSize) { + PreferenceUtil.getInstance(getActivity()).setSongGridSizeLand(gridSize); + } + + @Override + public void saveUsePalette(boolean usePalette) { + PreferenceUtil.getInstance(getActivity()).setSongColoredFooters(usePalette); + } + + @Override + public boolean loadUsePalette() { + return PreferenceUtil.getInstance(getActivity()).getSongColoredFooters(); + } + + @Override + public void setUsePalette(boolean usePalette) { + getAdapter().usePalette(usePalette); + } + + @Override + protected void setGridSize(int gridSize) { + getLayoutManager().setSpanCount(gridSize); + getAdapter().notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/dkanada/gramophone/model/CategoryInfo.java b/app/src/main/java/com/dkanada/gramophone/model/CategoryInfo.java index 214c8221..0b112a6e 100644 --- a/app/src/main/java/com/dkanada/gramophone/model/CategoryInfo.java +++ b/app/src/main/java/com/dkanada/gramophone/model/CategoryInfo.java @@ -44,7 +44,8 @@ public class CategoryInfo implements Parcelable { ALBUMS(R.string.albums), ARTISTS(R.string.artists), GENRES(R.string.genres), - PLAYLISTS(R.string.playlists); + PLAYLISTS(R.string.playlists), + FAVORITES(R.string.favorites); public final int stringRes; diff --git a/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java index 7217d2f6..da2ff95f 100644 --- a/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java @@ -429,6 +429,7 @@ public final class PreferenceUtil { defaultCategories.add(new CategoryInfo(CategoryInfo.Category.ARTISTS, true)); defaultCategories.add(new CategoryInfo(CategoryInfo.Category.GENRES, true)); defaultCategories.add(new CategoryInfo(CategoryInfo.Category.PLAYLISTS, true)); + defaultCategories.add(new CategoryInfo(CategoryInfo.Category.FAVORITES, true)); return defaultCategories; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e6c53142..b88c2079 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,6 +49,7 @@ Genres Songs Playlists + Favorites No playlists No albums No songs From c33809d5a045a7fa9e3ed96f1b7736ec5d553e5e Mon Sep 17 00:00:00 2001 From: Luuk Nieuwdorp Date: Thu, 7 Jan 2021 17:02:22 +0100 Subject: [PATCH 2/3] Add sorting options to FavoritesFragment --- .../fragments/mainactivity/library/LibraryFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/LibraryFragment.java b/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/LibraryFragment.java index fa8fb365..67a5ad9b 100644 --- a/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/LibraryFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/LibraryFragment.java @@ -19,6 +19,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.dkanada.gramophone.databinding.FragmentLibraryBinding; +import com.dkanada.gramophone.fragments.mainactivity.library.pager.FavoritesFragment; import com.google.android.material.appbar.AppBarLayout; import com.afollestad.materialcab.MaterialCab; import com.kabouzeid.appthemehelper.ThemeStore; @@ -354,7 +355,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde .setChecked(currentSortMethod.equals(SortMethod.ADDED)); sortMethodMenu.add(0, R.id.action_sort_method_random, 4, R.string.sort_method_random) .setChecked(currentSortMethod.equals(SortMethod.RANDOM)); - } else if (fragment instanceof SongsFragment) { + } else if (fragment instanceof SongsFragment || fragment instanceof FavoritesFragment) { sortMethodMenu.add(0, R.id.action_sort_method_name, 0, R.string.sort_method_name) .setChecked(currentSortMethod.equals(SortMethod.NAME)); sortMethodMenu.add(0, R.id.action_sort_method_album, 1, R.string.sort_method_album) From f58d34344198b6680a50beed84458ffaee83425c Mon Sep 17 00:00:00 2001 From: Luuk Nieuwdorp Date: Thu, 7 Jan 2021 18:51:43 +0100 Subject: [PATCH 3/3] Re-use code from SongsFragment --- .../library/pager/FavoritesFragment.java | 156 +----------------- 1 file changed, 1 insertion(+), 155 deletions(-) diff --git a/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java b/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java index 79afe827..0dc9c134 100644 --- a/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java @@ -1,69 +1,14 @@ package com.dkanada.gramophone.fragments.mainactivity.library.pager; -import android.os.Bundle; - import androidx.annotation.NonNull; -import androidx.recyclerview.widget.GridLayoutManager; - import com.dkanada.gramophone.App; -import com.dkanada.gramophone.R; -import com.dkanada.gramophone.adapter.song.ShuffleButtonSongAdapter; -import com.dkanada.gramophone.adapter.song.SongAdapter; -import com.dkanada.gramophone.model.Song; import com.dkanada.gramophone.util.PreferenceUtil; import com.dkanada.gramophone.util.QueryUtil; - -import org.jellyfin.apiclient.interaction.Response; -import org.jellyfin.apiclient.model.dto.BaseItemDto; import org.jellyfin.apiclient.model.querying.ItemFields; import org.jellyfin.apiclient.model.querying.ItemFilter; import org.jellyfin.apiclient.model.querying.ItemQuery; -import org.jellyfin.apiclient.model.querying.ItemsResult; - -import java.util.ArrayList; -import java.util.List; - -public class FavoritesFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment { - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - } - - @NonNull - @Override - protected GridLayoutManager createLayoutManager() { - return new GridLayoutManager(getActivity(), getGridSize()); - } - - @NonNull - @Override - protected SongAdapter createAdapter() { - int itemLayoutRes = getItemLayoutRes(); - notifyLayoutResChanged(itemLayoutRes); - boolean usePalette = loadUsePalette(); - - List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); - SongAdapter adapter; - - if (getGridSize() <= getMaxGridSizeForList()) { - adapter = new ShuffleButtonSongAdapter( - getLibraryFragment().getMainActivity(), - dataSet, - itemLayoutRes, - usePalette, - getLibraryFragment()); - } else { - adapter = new SongAdapter( - getLibraryFragment().getMainActivity(), - dataSet, - itemLayoutRes, - usePalette, - getLibraryFragment()); - } - - return adapter; - } +public class FavoritesFragment extends SongsFragment { @NonNull @Override protected ItemQuery createQuery() { @@ -82,103 +27,4 @@ public class FavoritesFragment extends AbsLibraryPagerRecyclerViewCustomGridSize QueryUtil.applySortOrder(query, PreferenceUtil.getInstance(App.getInstance()).getSongSortOrder()); return query; } - - @Override - protected void loadItems(int index) { - ItemQuery query = getQuery(); - query.setStartIndex(index); - - App.getApiClient().GetItemsAsync(query, new Response() { - @Override - public void onResponse(ItemsResult result) { - if (index == 0) getAdapter().getDataSet().clear(); - for (BaseItemDto itemDto : result.getItems()) { - getAdapter().getDataSet().add(new Song(itemDto)); - } - - size = result.getTotalRecordCount(); - getAdapter().notifyDataSetChanged(); - loading = false; - } - - @Override - public void onError(Exception exception) { - exception.printStackTrace(); - } - }); - } - - @Override - protected int getEmptyMessage() { - return R.string.no_songs; - } - - @Override - protected String loadSortMethod() { - return PreferenceUtil.getInstance(getActivity()).getSongSortMethod(); - } - - @Override - protected void saveSortMethod(String sortMethod) { - PreferenceUtil.getInstance(getActivity()).setSongSortMethod(sortMethod); - } - - @Override - protected void setSortMethod(String sortMethod) { - } - - @Override - protected String loadSortOrder() { - return PreferenceUtil.getInstance(getActivity()).getSongSortOrder(); - } - - @Override - protected void saveSortOrder(String sortOrder) { - PreferenceUtil.getInstance(getActivity()).setSongSortOrder(sortOrder); - } - - @Override - protected void setSortOrder(String sortOrder) { - } - - @Override - protected int loadGridSize() { - return PreferenceUtil.getInstance(getActivity()).getSongGridSize(requireActivity()); - } - - @Override - protected void saveGridSize(int gridSize) { - PreferenceUtil.getInstance(getActivity()).setSongGridSize(gridSize); - } - - @Override - protected int loadGridSizeLand() { - return PreferenceUtil.getInstance(getActivity()).getSongGridSizeLand(requireActivity()); - } - - @Override - protected void saveGridSizeLand(int gridSize) { - PreferenceUtil.getInstance(getActivity()).setSongGridSizeLand(gridSize); - } - - @Override - public void saveUsePalette(boolean usePalette) { - PreferenceUtil.getInstance(getActivity()).setSongColoredFooters(usePalette); - } - - @Override - public boolean loadUsePalette() { - return PreferenceUtil.getInstance(getActivity()).getSongColoredFooters(); - } - - @Override - public void setUsePalette(boolean usePalette) { - getAdapter().usePalette(usePalette); - } - - @Override - protected void setGridSize(int gridSize) { - getLayoutManager().setSpanCount(gridSize); - getAdapter().notifyDataSetChanged(); - } }