From 8ca5a7a6aa294aaf04b44483d1769a6885112430 Mon Sep 17 00:00:00 2001 From: dkanada Date: Mon, 10 Aug 2020 22:46:10 +0900 Subject: [PATCH] add infinite loading to the main library fragments --- ...gerRecyclerViewCustomGridSizeFragment.java | 2 +- .../AbsLibraryPagerRecyclerViewFragment.java | 55 ++++++++++++++++--- .../library/pager/AlbumsFragment.java | 51 +++++++++++++---- .../library/pager/ArtistsFragment.java | 52 ++++++++++++++---- .../library/pager/GenresFragment.java | 49 ++++++++++++++--- .../library/pager/PlaylistsFragment.java | 50 ++++++++++++++--- .../library/pager/SongsFragment.java | 52 ++++++++++++++---- 7 files changed, 251 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java index c22272c2..03276326 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java @@ -9,7 +9,7 @@ import android.view.View; import com.dkanada.gramophone.R; import com.dkanada.gramophone.util.Util; -public abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment extends AbsLibraryPagerRecyclerViewFragment { +public abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment extends AbsLibraryPagerRecyclerViewFragment { private int gridSize; private String sortMethod; diff --git a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java index c6f57340..7c62628a 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java @@ -4,8 +4,14 @@ import android.os.Bundle; import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; import androidx.annotation.StringRes; + +import com.dkanada.gramophone.App; +import com.dkanada.gramophone.util.PreferenceUtil; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -21,7 +27,7 @@ import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; -public abstract class AbsLibraryPagerRecyclerViewFragment extends AbsLibraryPagerFragment implements OnOffsetChangedListener { +public abstract class AbsLibraryPagerRecyclerViewFragment extends AbsLibraryPagerFragment implements OnOffsetChangedListener { private Unbinder unbinder; @@ -34,6 +40,10 @@ public abstract class AbsLibraryPagerRecyclerViewFragment total - page / 2 && total < size) { + query = createQuery(); + loading = true; + loadItems(); + } } @Override @@ -134,4 +168,11 @@ public abstract class AbsLibraryPagerRecyclerViewFragment { +public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -35,19 +37,44 @@ public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFra protected AlbumAdapter createAdapter() { int itemLayoutRes = getItemLayoutRes(); notifyLayoutResChanged(itemLayoutRes); - List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); - AlbumAdapter adapter = new AlbumAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment()); - QueryUtil.getAlbums(new ItemQuery(), new MediaCallback() { + List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); + return new AlbumAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment()); + } + + @NonNull + @Override + protected ItemQuery createQuery() { + ItemQuery query = new ItemQuery(); + + query.setIncludeItemTypes(new String[]{"MusicAlbum"}); + query.setUserId(App.getApiClient().getCurrentUserId()); + query.setRecursive(true); + query.setLimit(PreferenceUtil.getInstance(App.getInstance()).getMaximumListSize()); + query.setStartIndex(getAdapter().getItemCount()); + query.setParentId(QueryUtil.currentLibrary.getId()); + + return query; + } + + protected void loadItems() { + App.getApiClient().GetItemsAsync(getQuery(), new Response() { @Override - public void onLoadMedia(List media) { - dataSet.clear(); - dataSet.addAll((Collection) media); - adapter.notifyDataSetChanged(); + public void onResponse(ItemsResult result) { + for (BaseItemDto itemDto : result.getItems()) { + getAdapter().getDataSet().add(new Album(itemDto)); + } + + size = result.getTotalRecordCount(); + getAdapter().notifyDataSetChanged(); + loading = false; + } + + @Override + public void onError(Exception exception) { + exception.printStackTrace(); } }); - - return adapter; } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java index 424df8c0..a4ba6505 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java @@ -6,21 +6,24 @@ import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; import androidx.recyclerview.widget.GridLayoutManager; +import com.dkanada.gramophone.App; import com.dkanada.gramophone.R; import com.dkanada.gramophone.adapter.artist.ArtistAdapter; import com.dkanada.gramophone.helper.sort.SortMethod; -import com.dkanada.gramophone.interfaces.MediaCallback; import com.dkanada.gramophone.model.Artist; 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.ArtistsQuery; +import org.jellyfin.apiclient.model.querying.ItemFields; +import org.jellyfin.apiclient.model.querying.ItemsResult; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment { +public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -37,18 +40,45 @@ public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFr protected ArtistAdapter createAdapter() { int itemLayoutRes = getItemLayoutRes(); notifyLayoutResChanged(itemLayoutRes); - List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); - ArtistAdapter adapter = new ArtistAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment()); - QueryUtil.getArtists(new ArtistsQuery(), new MediaCallback() { + List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); + return new ArtistAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment()); + } + + @NonNull + @Override + protected ArtistsQuery createQuery() { + ArtistsQuery query = new ArtistsQuery(); + + query.setFields(new ItemFields[]{ItemFields.Genres}); + query.setParentId(QueryUtil.currentLibrary.getId()); + query.setLimit(PreferenceUtil.getInstance(App.getInstance()).getMaximumListSize()); + query.setStartIndex(getAdapter().getItemCount()); + query.setUserId(App.getApiClient().getCurrentUserId()); + query.setRecursive(true); + + return query; + } + + @Override + protected void loadItems() { + App.getApiClient().GetAlbumArtistsAsync(getQuery(), new Response() { @Override - public void onLoadMedia(List media) { - dataSet.addAll((Collection) media); - adapter.notifyDataSetChanged(); + public void onResponse(ItemsResult result) { + for (BaseItemDto itemDto : result.getItems()) { + getAdapter().getDataSet().add(new Artist(itemDto)); + } + + size = result.getTotalRecordCount(); + getAdapter().notifyDataSetChanged(); + loading = false; + } + + @Override + public void onError(Exception exception) { + exception.printStackTrace(); } }); - - return adapter; } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java index 077ef874..e97cc416 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java @@ -4,16 +4,22 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; +import com.dkanada.gramophone.App; import com.dkanada.gramophone.R; import com.dkanada.gramophone.adapter.GenreAdapter; -import com.dkanada.gramophone.interfaces.MediaCallback; import com.dkanada.gramophone.model.Genre; +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.ItemsByNameQuery; +import org.jellyfin.apiclient.model.querying.ItemsResult; + import java.util.ArrayList; import java.util.List; -public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment { +public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -29,17 +35,42 @@ public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); + return new GenreAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_single_row); + } - GenreAdapter adapter = new GenreAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_single_row); - QueryUtil.getGenres(new MediaCallback() { + @NonNull + @Override + protected ItemsByNameQuery createQuery() { + ItemsByNameQuery query = new ItemsByNameQuery(); + + query.setParentId(QueryUtil.currentLibrary.getId()); + query.setLimit(PreferenceUtil.getInstance(App.getInstance()).getMaximumListSize()); + query.setUserId(App.getApiClient().getCurrentUserId()); + query.setStartIndex(getAdapter().getItemCount()); + query.setRecursive(true); + + return query; + } + + @Override + protected void loadItems() { + App.getApiClient().GetGenresAsync(getQuery(), new Response() { @Override - public void onLoadMedia(List media) { - dataSet.addAll((List) media); - adapter.notifyDataSetChanged(); + public void onResponse(ItemsResult result) { + for (BaseItemDto itemDto : result.getItems()) { + getAdapter().getDataSet().add(new Genre(itemDto)); + } + + size = result.getTotalRecordCount(); + getAdapter().notifyDataSetChanged(); + loading = false; + } + + @Override + public void onError(Exception exception) { + exception.printStackTrace(); } }); - - return adapter; } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java index 064e3a83..2e890b24 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java @@ -5,16 +5,22 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; +import com.dkanada.gramophone.App; import com.dkanada.gramophone.R; import com.dkanada.gramophone.adapter.PlaylistAdapter; -import com.dkanada.gramophone.interfaces.MediaCallback; import com.dkanada.gramophone.model.Playlist; +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.ItemQuery; +import org.jellyfin.apiclient.model.querying.ItemsResult; + import java.util.ArrayList; import java.util.List; -public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment { +public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -30,17 +36,43 @@ public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); + return new PlaylistAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_single_row, getLibraryFragment()); + } - PlaylistAdapter adapter = new PlaylistAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_single_row, getLibraryFragment()); - QueryUtil.getPlaylists(new MediaCallback() { + @NonNull + @Override + protected ItemQuery createQuery() { + ItemQuery query = new ItemQuery(); + + query.setIncludeItemTypes(new String[]{"Playlist"}); + query.setParentId(QueryUtil.currentLibrary.getId()); + query.setLimit(PreferenceUtil.getInstance(App.getInstance()).getMaximumListSize()); + query.setStartIndex(getAdapter().getItemCount()); + query.setUserId(App.getApiClient().getCurrentUserId()); + query.setRecursive(true); + + return query; + } + + @Override + protected void loadItems() { + App.getApiClient().GetItemsAsync(getQuery(), new Response() { @Override - public void onLoadMedia(List media) { - dataSet.addAll((List) media); - adapter.notifyDataSetChanged(); + public void onResponse(ItemsResult result) { + for (BaseItemDto itemDto : result.getItems()) { + getAdapter().getDataSet().add(new Playlist(itemDto)); + } + + size = result.getTotalRecordCount(); + getAdapter().notifyDataSetChanged(); + loading = false; + } + + @Override + public void onError(Exception exception) { + exception.printStackTrace(); } }); - - return adapter; } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/SongsFragment.java b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/SongsFragment.java index b7dbf467..33ed4d35 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/SongsFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/SongsFragment.java @@ -4,21 +4,23 @@ 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.interfaces.MediaCallback; 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.ItemQuery; +import org.jellyfin.apiclient.model.querying.ItemsResult; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment { +public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -36,9 +38,10 @@ public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFrag int itemLayoutRes = getItemLayoutRes(); notifyLayoutResChanged(itemLayoutRes); boolean usePalette = loadUsePalette(); - List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); + List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); SongAdapter adapter; + if (getGridSize() <= getMaxGridSizeForList()) { adapter = new ShuffleButtonSongAdapter( getLibraryFragment().getMainActivity(), @@ -55,16 +58,43 @@ public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFrag getLibraryFragment()); } - QueryUtil.getSongs(new ItemQuery(), new MediaCallback() { + return adapter; + } + + @NonNull + @Override + protected ItemQuery createQuery() { + ItemQuery query = new ItemQuery(); + + query.setIncludeItemTypes(new String[]{"Audio"}); + query.setUserId(App.getApiClient().getCurrentUserId()); + query.setRecursive(true); + query.setLimit(PreferenceUtil.getInstance(App.getInstance()).getMaximumListSize()); + query.setStartIndex(getAdapter().getItemCount()); + query.setParentId(QueryUtil.currentLibrary.getId()); + + return query; + } + + @Override + protected void loadItems() { + App.getApiClient().GetItemsAsync(getQuery(), new Response() { @Override - public void onLoadMedia(List media) { - dataSet.clear(); - dataSet.addAll((Collection) media); - adapter.notifyDataSetChanged(); + public void onResponse(ItemsResult result) { + 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(); } }); - - return adapter; } @Override