From c35192185516918959050b65c460d45584ad857d Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 24 Mar 2016 18:37:27 +0100 Subject: [PATCH] Async playlist song loading. --- .../ui/activities/AlbumDetailActivity.java | 3 - .../ui/activities/ArtistDetailActivity.java | 3 - .../ui/activities/PlaylistDetailActivity.java | 91 ++++++++++--------- .../AbsLibraryPagerRecyclerViewFragment.java | 2 +- .../res/layout/activity_playlist_detail.xml | 1 + .../fragment_main_activity_recycler_view.xml | 3 +- 6 files changed, 54 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index ae732f20..1756880c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -340,9 +340,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements public void onLoadFinished(Loader loader, Album data) { supportStartPostponedEnterTransition(); setAlbum(data); - if (getAlbum().songs.isEmpty()) { - finish(); - } } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index c817f54c..da864a71 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -421,9 +421,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement public void onLoadFinished(Loader loader, ArtistData data) { supportStartPostponedEnterTransition(); setArtistData(data); - if (getArtistData().albums.isEmpty()) { - finish(); - } } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index d0ca8ef7..de0eba1d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -1,12 +1,13 @@ package com.kabouzeid.gramophone.ui.activities; -import android.os.Build; +import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.Loader; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; -import android.transition.Slide; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -26,6 +27,7 @@ import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; +import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; @@ -41,10 +43,12 @@ import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; -public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity implements CabHolder { +public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity implements CabHolder, LoaderManager.LoaderCallbacks> { public static final String TAG = PlaylistDetailActivity.class.getSimpleName(); + private static final int LOADER_ID = 1; + @NonNull public static String EXTRA_PLAYLIST = "extra_playlist"; @@ -56,6 +60,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme TextView empty; private Playlist playlist; + private MaterialCab cab; private SongAdapter adapter; @@ -72,17 +77,13 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme setNavigationbarColorAuto(); setTaskDescriptionColorAuto(); - getIntentExtras(); + playlist = getIntent().getExtras().getParcelable(EXTRA_PLAYLIST); setUpRecyclerView(); - checkIsEmpty(); - setUpToolBar(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - getWindow().setEnterTransition(new Slide()); - } + getSupportLoaderManager().initLoader(LOADER_ID, null, this); } @Override @@ -93,12 +94,12 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme private void setUpRecyclerView() { recyclerView.setLayoutManager(new LinearLayoutManager(this)); if (playlist instanceof AbsSmartPlaylist) { - adapter = new SmartPlaylistSongAdapter(this, loadSmartPlaylistDataSet(), R.layout.item_list, false, this); + adapter = new SmartPlaylistSongAdapter(this, new ArrayList(), R.layout.item_list, false, this); recyclerView.setAdapter(adapter); } else { recyclerViewDragDropManager = new RecyclerViewDragDropManager(); final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator(); - adapter = new PlaylistSongAdapter(this, loadPlaylistDataSet(), R.layout.item_list, false, this, new PlaylistSongAdapter.OnMoveItemListener() { + adapter = new PlaylistSongAdapter(this, new ArrayList(), R.layout.item_list, false, this, new PlaylistSongAdapter.OnMoveItemListener() { @Override public void onMoveItem(int fromPosition, int toPosition) { if (PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, fromPosition, toPosition)) { @@ -125,23 +126,6 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme }); } - private void reloadDataSet() { - if (playlist instanceof AbsSmartPlaylist) { - adapter.swapDataSet(loadSmartPlaylistDataSet()); - } else { - //noinspection unchecked - adapter.swapDataSet((ArrayList) (List) loadPlaylistDataSet()); - } - } - - private ArrayList loadPlaylistDataSet() { - return PlaylistSongLoader.getPlaylistSongList(this, playlist.id); - } - - private ArrayList loadSmartPlaylistDataSet() { - return ((AbsSmartPlaylist) playlist).getSongs(this); - } - private void setUpToolBar() { toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); setSupportActionBar(toolbar); @@ -150,18 +134,6 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme getSupportActionBar().setDisplayHomeAsUpEnabled(true); } - private void getIntentExtras() { - Bundle intentExtras = getIntent().getExtras(); - try { - playlist = intentExtras.getParcelable(EXTRA_PLAYLIST); - } catch (ClassCastException ignored) { - } - if (playlist == null) { - playlist = new Playlist(); - finish(); - } - } - @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_playlist_detail, menu); @@ -188,6 +160,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme return super.onOptionsItemSelected(item); } + @NonNull @Override public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) { if (cab != null && cab.isActive()) cab.finish(); @@ -211,7 +184,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme @Override public void onMediaStoreChanged() { super.onMediaStoreChanged(); - reloadDataSet(); + getSupportLoaderManager().restartLoader(LOADER_ID, null, this); } private void checkIsEmpty() { @@ -249,4 +222,40 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme super.onDestroy(); } + + @Override + public Loader> onCreateLoader(int id, Bundle args) { + return new AsyncPlaylistSongLoader(this, playlist); + } + + @Override + public void onLoadFinished(Loader> loader, ArrayList data) { + if (adapter != null) + adapter.swapDataSet(data); + } + + @Override + public void onLoaderReset(Loader> loader) { + if (adapter != null) + adapter.swapDataSet(new ArrayList()); + } + + private static class AsyncPlaylistSongLoader extends WrappedAsyncTaskLoader> { + private final Playlist playlist; + + public AsyncPlaylistSongLoader(Context context, Playlist playlist) { + super(context); + this.playlist = playlist; + } + + @Override + public ArrayList loadInBackground() { + if (playlist instanceof AbsSmartPlaylist) { + return ((AbsSmartPlaylist) playlist).getSongs(getContext()); + } else { + //noinspection unchecked + return (ArrayList) (List) PlaylistSongLoader.getPlaylistSongList(getContext(), playlist.id); + } + } + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java index 3c3d2a56..2fb2780b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java @@ -77,6 +77,7 @@ public abstract class AbsLibraryPagerRecyclerViewFragment + android:textSize="@dimen/empty_text_size" + android:visibility="gone" /> \ No newline at end of file