Async playlist song loading.

This commit is contained in:
Karim Abou Zeid 2016-03-24 18:37:27 +01:00
commit c351921855
6 changed files with 54 additions and 49 deletions

View file

@ -340,9 +340,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
public void onLoadFinished(Loader<Album> loader, Album data) {
supportStartPostponedEnterTransition();
setAlbum(data);
if (getAlbum().songs.isEmpty()) {
finish();
}
}
@Override

View file

@ -421,9 +421,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
public void onLoadFinished(Loader<ArtistData> loader, ArtistData data) {
supportStartPostponedEnterTransition();
setArtistData(data);
if (getArtistData().albums.isEmpty()) {
finish();
}
}
@Override

View file

@ -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<ArrayList<Song>> {
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<Song>(), 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<PlaylistSong>(), 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<Song>) (List) loadPlaylistDataSet());
}
}
private ArrayList<PlaylistSong> loadPlaylistDataSet() {
return PlaylistSongLoader.getPlaylistSongList(this, playlist.id);
}
private ArrayList<Song> 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<ArrayList<Song>> onCreateLoader(int id, Bundle args) {
return new AsyncPlaylistSongLoader(this, playlist);
}
@Override
public void onLoadFinished(Loader<ArrayList<Song>> loader, ArrayList<Song> data) {
if (adapter != null)
adapter.swapDataSet(data);
}
@Override
public void onLoaderReset(Loader<ArrayList<Song>> loader) {
if (adapter != null)
adapter.swapDataSet(new ArrayList<Song>());
}
private static class AsyncPlaylistSongLoader extends WrappedAsyncTaskLoader<ArrayList<Song>> {
private final Playlist playlist;
public AsyncPlaylistSongLoader(Context context, Playlist playlist) {
super(context);
this.playlist = playlist;
}
@Override
public ArrayList<Song> loadInBackground() {
if (playlist instanceof AbsSmartPlaylist) {
return ((AbsSmartPlaylist) playlist).getSongs(getContext());
} else {
//noinspection unchecked
return (ArrayList<Song>) (List) PlaylistSongLoader.getPlaylistSongList(getContext(), playlist.id);
}
}
}
}

View file

@ -77,6 +77,7 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
protected void invalidateAdapter() {
initAdapter();
checkIsEmpty();
recyclerView.setAdapter(adapter);
}
@ -89,7 +90,6 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
checkIsEmpty();
}
});
checkIsEmpty();
}
private void initLayoutManager() {

View file

@ -43,6 +43,7 @@
</LinearLayout>
<TextView
android:visibility="gone"
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -19,6 +19,7 @@
android:fontFamily="sans-serif-light"
android:text="@string/empty"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/empty_text_size" />
android:textSize="@dimen/empty_text_size"
android:visibility="gone" />
</FrameLayout>