update adapters on query change

This commit is contained in:
dkanada 2020-09-06 14:12:30 +09:00
commit a88e851c4f
9 changed files with 68 additions and 20 deletions

View file

@ -26,8 +26,7 @@ public class MusicPlayerRemote {
private static final WeakHashMap<Context, ServiceBinder> mConnectionMap = new WeakHashMap<>(); private static final WeakHashMap<Context, ServiceBinder> mConnectionMap = new WeakHashMap<>();
public static ServiceToken bindToService(@NonNull final Context context, public static ServiceToken bindToService(@NonNull final Context context, final ServiceConnection callback) {
final ServiceConnection callback) {
Activity realActivity = ((Activity) context).getParent(); Activity realActivity = ((Activity) context).getParent();
if (realActivity == null) { if (realActivity == null) {
realActivity = (Activity) context; realActivity = (Activity) context;
@ -42,6 +41,7 @@ public class MusicPlayerRemote {
mConnectionMap.put(contextWrapper, binder); mConnectionMap.put(contextWrapper, binder);
return new ServiceToken(contextWrapper); return new ServiceToken(contextWrapper);
} }
return null; return null;
} }
@ -49,11 +49,13 @@ public class MusicPlayerRemote {
if (token == null) { if (token == null) {
return; return;
} }
final ContextWrapper mContextWrapper = token.mWrappedContext; final ContextWrapper mContextWrapper = token.mWrappedContext;
final ServiceBinder mBinder = mConnectionMap.remove(mContextWrapper); final ServiceBinder mBinder = mConnectionMap.remove(mContextWrapper);
if (mBinder == null) { if (mBinder == null) {
return; return;
} }
mContextWrapper.unbindService(mBinder); mContextWrapper.unbindService(mBinder);
if (mConnectionMap.isEmpty()) { if (mConnectionMap.isEmpty()) {
musicService = null; musicService = null;
@ -81,6 +83,7 @@ public class MusicPlayerRemote {
if (mCallback != null) { if (mCallback != null) {
mCallback.onServiceDisconnected(className); mCallback.onServiceDisconnected(className);
} }
musicService = null; musicService = null;
} }
} }
@ -178,6 +181,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getCurrentSong(); return musicService.getCurrentSong();
} }
return Song.EMPTY_SONG; return Song.EMPTY_SONG;
} }
@ -185,6 +189,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getPosition(); return musicService.getPosition();
} }
return -1; return -1;
} }
@ -192,6 +197,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getPlayingQueue(); return musicService.getPlayingQueue();
} }
return new ArrayList<>(); return new ArrayList<>();
} }
@ -199,6 +205,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getSongProgressMillis(); return musicService.getSongProgressMillis();
} }
return -1; return -1;
} }
@ -206,6 +213,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getSongDurationMillis(); return musicService.getSongDurationMillis();
} }
return -1; return -1;
} }
@ -213,6 +221,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getQueueDurationMillis(position); return musicService.getQueueDurationMillis(position);
} }
return -1; return -1;
} }
@ -220,6 +229,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.seek(millis); return musicService.seek(millis);
} }
return -1; return -1;
} }
@ -227,6 +237,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getRepeatMode(); return musicService.getRepeatMode();
} }
return MusicService.REPEAT_MODE_NONE; return MusicService.REPEAT_MODE_NONE;
} }
@ -234,6 +245,7 @@ public class MusicPlayerRemote {
if (musicService != null) { if (musicService != null) {
return musicService.getShuffleMode(); return musicService.getShuffleMode();
} }
return MusicService.SHUFFLE_MODE_NONE; return MusicService.SHUFFLE_MODE_NONE;
} }
@ -242,6 +254,7 @@ public class MusicPlayerRemote {
musicService.cycleRepeatMode(); musicService.cycleRepeatMode();
return true; return true;
} }
return false; return false;
} }
@ -250,6 +263,7 @@ public class MusicPlayerRemote {
musicService.toggleShuffle(); musicService.toggleShuffle();
return true; return true;
} }
return false; return false;
} }

View file

@ -9,7 +9,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@ -24,7 +23,6 @@ import android.os.Message;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.Process; import android.os.Process;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat; import android.support.v4.media.session.PlaybackStateCompat;

View file

@ -7,7 +7,10 @@ import android.os.Bundle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.dkanada.gramophone.App;
import com.dkanada.gramophone.databinding.FragmentLibraryBinding; import com.dkanada.gramophone.databinding.FragmentLibraryBinding;
import com.dkanada.gramophone.model.Song;
import com.dkanada.gramophone.util.QueryUtil;
import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.AppBarLayout;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
@ -44,6 +47,14 @@ import com.dkanada.gramophone.util.ThemeUtil;
import com.dkanada.gramophone.util.PreferenceUtil; import com.dkanada.gramophone.util.PreferenceUtil;
import com.dkanada.gramophone.util.Util; import com.dkanada.gramophone.util.Util;
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 LibraryFragment extends AbsMainActivityFragment implements CabHolder, MainActivity.MainActivityFragmentCallbacks, ViewPager.OnPageChangeListener, SharedPreferences.OnSharedPreferenceChangeListener { public class LibraryFragment extends AbsMainActivityFragment implements CabHolder, MainActivity.MainActivityFragmentCallbacks, ViewPager.OnPageChangeListener, SharedPreferences.OnSharedPreferenceChangeListener {
private FragmentLibraryBinding binding; private FragmentLibraryBinding binding;

View file

@ -60,14 +60,14 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
initAdapter(); initAdapter();
initLayoutManager(); initLayoutManager();
initQuery();
initRecyclerView(); initRecyclerView();
loadItems(0);
} }
private void initAdapter() { private void initAdapter() {
adapter = createAdapter(); adapter = createAdapter();
query = createQuery();
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override @Override
public void onChanged() { public void onChanged() {
@ -75,14 +75,16 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
checkIsEmpty(); checkIsEmpty();
} }
}); });
loadItems();
} }
private void initLayoutManager() { private void initLayoutManager() {
layoutManager = createLayoutManager(); layoutManager = createLayoutManager();
} }
private void initQuery() {
query = createQuery();
}
private void initRecyclerView() { private void initRecyclerView() {
if (recyclerView instanceof FastScrollRecyclerView) { if (recyclerView instanceof FastScrollRecyclerView) {
ViewUtil.setUpFastScrollRecyclerViewColor(getActivity(), ((FastScrollRecyclerView) recyclerView), ThemeStore.accentColor(getActivity())); ViewUtil.setUpFastScrollRecyclerViewColor(getActivity(), ((FastScrollRecyclerView) recyclerView), ThemeStore.accentColor(getActivity()));
@ -94,7 +96,10 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
protected void invalidateAdapter() { protected void invalidateAdapter() {
initAdapter(); initAdapter();
initQuery();
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
loadItems(0);
} }
protected void invalidateLayoutManager() { protected void invalidateLayoutManager() {
@ -137,7 +142,7 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
@NonNull @NonNull
protected abstract Q createQuery(); protected abstract Q createQuery();
protected abstract void loadItems(); protected abstract void loadItems(int index);
@Override @Override
public void onOffsetChanged(AppBarLayout appBarLayout, int i) { public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
@ -157,7 +162,7 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
if (last > total - page / 2 && total < size) { if (last > total - page / 2 && total < size) {
query = createQuery(); query = createQuery();
loading = true; loading = true;
loadItems(); loadItems(getAdapter().getItemCount());
} }
} }

View file

@ -59,10 +59,14 @@ public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFra
return query; return query;
} }
protected void loadItems() { protected void loadItems(int index) {
App.getApiClient().GetItemsAsync(getQuery(), new Response<ItemsResult>() { ItemQuery query = getQuery();
query.setStartIndex(index);
App.getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
@Override @Override
public void onResponse(ItemsResult result) { public void onResponse(ItemsResult result) {
if (index == 0) getAdapter().getDataSet().clear();
for (BaseItemDto itemDto : result.getItems()) { for (BaseItemDto itemDto : result.getItems()) {
getAdapter().getDataSet().add(new Album(itemDto)); getAdapter().getDataSet().add(new Album(itemDto));
} }

View file

@ -62,10 +62,14 @@ public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFr
} }
@Override @Override
protected void loadItems() { protected void loadItems(int index) {
App.getApiClient().GetAlbumArtistsAsync(getQuery(), new Response<ItemsResult>() { ArtistsQuery query = getQuery();
query.setStartIndex(index);
App.getApiClient().GetAlbumArtistsAsync(query, new Response<ItemsResult>() {
@Override @Override
public void onResponse(ItemsResult result) { public void onResponse(ItemsResult result) {
if (index == 0) getAdapter().getDataSet().clear();
for (BaseItemDto itemDto : result.getItems()) { for (BaseItemDto itemDto : result.getItems()) {
getAdapter().getDataSet().add(new Artist(itemDto)); getAdapter().getDataSet().add(new Artist(itemDto));
} }

View file

@ -53,10 +53,14 @@ public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment<GenreAda
} }
@Override @Override
protected void loadItems() { protected void loadItems(int index) {
App.getApiClient().GetGenresAsync(getQuery(), new Response<ItemsResult>() { ItemsByNameQuery query = getQuery();
query.setStartIndex(index);
App.getApiClient().GetGenresAsync(query, new Response<ItemsResult>() {
@Override @Override
public void onResponse(ItemsResult result) { public void onResponse(ItemsResult result) {
if (index == 0) getAdapter().getDataSet().clear();
for (BaseItemDto itemDto : result.getItems()) { for (BaseItemDto itemDto : result.getItems()) {
getAdapter().getDataSet().add(new Genre(itemDto)); getAdapter().getDataSet().add(new Genre(itemDto));
} }

View file

@ -55,10 +55,14 @@ public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment<Playl
} }
@Override @Override
protected void loadItems() { protected void loadItems(int index) {
App.getApiClient().GetItemsAsync(getQuery(), new Response<ItemsResult>() { ItemQuery query = getQuery();
query.setStartIndex(index);
App.getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
@Override @Override
public void onResponse(ItemsResult result) { public void onResponse(ItemsResult result) {
if (index == 0) getAdapter().getDataSet().clear();
for (BaseItemDto itemDto : result.getItems()) { for (BaseItemDto itemDto : result.getItems()) {
getAdapter().getDataSet().add(new Playlist(itemDto)); getAdapter().getDataSet().add(new Playlist(itemDto));
} }

View file

@ -81,10 +81,14 @@ public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFrag
} }
@Override @Override
protected void loadItems() { protected void loadItems(int index) {
App.getApiClient().GetItemsAsync(getQuery(), new Response<ItemsResult>() { ItemQuery query = getQuery();
query.setStartIndex(index);
App.getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
@Override @Override
public void onResponse(ItemsResult result) { public void onResponse(ItemsResult result) {
if (index == 0) getAdapter().getDataSet().clear();
for (BaseItemDto itemDto : result.getItems()) { for (BaseItemDto itemDto : result.getItems()) {
getAdapter().getDataSet().add(new Song(itemDto)); getAdapter().getDataSet().add(new Song(itemDto));
} }