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