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 extends Fragment> mFragmentClass;
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)
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..0dc9c134
--- /dev/null
+++ b/app/src/main/java/com/dkanada/gramophone/fragments/mainactivity/library/pager/FavoritesFragment.java
@@ -0,0 +1,30 @@
+package com.dkanada.gramophone.fragments.mainactivity.library.pager;
+
+import androidx.annotation.NonNull;
+import com.dkanada.gramophone.App;
+import com.dkanada.gramophone.util.PreferenceUtil;
+import com.dkanada.gramophone.util.QueryUtil;
+import org.jellyfin.apiclient.model.querying.ItemFields;
+import org.jellyfin.apiclient.model.querying.ItemFilter;
+import org.jellyfin.apiclient.model.querying.ItemQuery;
+
+public class FavoritesFragment extends SongsFragment {
+ @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;
+ }
+}
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