Automatically update the data list in every view when the media store has changed.

This commit is contained in:
Karim Abou Zeid 2015-07-15 16:35:37 +02:00
commit 5c513115e7
6 changed files with 119 additions and 16 deletions

View file

@ -44,18 +44,23 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
@NonNull @NonNull
private final AppCompatActivity activity; private final AppCompatActivity activity;
public ArtistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList<Song> songs, @Nullable CabHolder cabHolder) { public ArtistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList<Song> dataSet, @Nullable CabHolder cabHolder) {
super(activity, R.layout.item_list, songs); super(activity, R.layout.item_list, dataSet);
this.activity = activity; this.activity = activity;
this.cabHolder = cabHolder; this.cabHolder = cabHolder;
this.dataSet = dataSet;
checked = new ArrayList<>(); checked = new ArrayList<>();
dataSet = songs;
} }
public ArrayList<Song> getDataSet() { public ArrayList<Song> getDataSet() {
return dataSet; return dataSet;
} }
public void swapDataSet(ArrayList<Song> dataSet) {
this.dataSet = dataSet;
notifyDataSetChanged();
}
@Nullable @Nullable
@Override @Override
public View getView(final int position, @Nullable View convertView, ViewGroup parent) { public View getView(final int position, @Nullable View convertView, ViewGroup parent) {

View file

@ -10,6 +10,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.util.Pair; import android.support.v4.util.Pair;
import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.transition.Transition; import android.transition.Transition;
import android.view.Menu; import android.view.Menu;
@ -35,6 +36,7 @@ import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.misc.SmallTransitionListener;
import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity;
@ -50,6 +52,8 @@ import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.process.BitmapProcessor; import com.nostra13.universalimageloader.core.process.BitmapProcessor;
import java.util.ArrayList;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@ -187,7 +191,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
private void setUpViews() { private void setUpViews() {
albumTitleView.setText(album.title); albumTitleView.setText(album.title);
setUpListView(); setUpRecyclerViewView();
setUpSongsAdapter(); setUpSongsAdapter();
setUpAlbumArtAndApplyPalette(); setUpAlbumArtAndApplyPalette();
} }
@ -267,7 +271,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
return toolbarColor; return toolbarColor;
} }
private void setUpListView() { private void setUpRecyclerViewView() {
recyclerView.setScrollViewCallbacks(observableScrollViewCallbacks); recyclerView.setScrollViewCallbacks(observableScrollViewCallbacks);
recyclerView.setPadding(0, albumArtViewHeight + titleViewHeight, 0, bottomOffset); recyclerView.setPadding(0, albumArtViewHeight + titleViewHeight, 0, bottomOffset);
final View contentView = getWindow().getDecorView().findViewById(android.R.id.content); final View contentView = getWindow().getDecorView().findViewById(android.R.id.content);
@ -290,9 +294,24 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
} }
private void setUpSongsAdapter() { private void setUpSongsAdapter() {
adapter = new AlbumSongAdapter(this, AlbumSongLoader.getAlbumSongList(this, album.id), R.layout.item_list, this); adapter = new AlbumSongAdapter(this, loadSongDataSet(), R.layout.item_list, this);
recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
if (adapter.getItemCount() == 0) finish();
}
});
}
private void reloadDataSet() {
adapter.swapDataSet(loadSongDataSet());
}
private ArrayList<Song> loadSongDataSet() {
return AlbumSongLoader.getAlbumSongList(this, album.id);
} }
@Override @Override
@ -395,4 +414,10 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
super.onBackPressed(); super.onBackPressed();
} }
} }
@Override
public void onMediaStoreChanged() {
super.onMediaStoreChanged();
reloadDataSet();
}
} }

View file

@ -43,7 +43,9 @@ import com.kabouzeid.gramophone.loader.ArtistLoader;
import com.kabouzeid.gramophone.loader.ArtistSongLoader; import com.kabouzeid.gramophone.loader.ArtistSongLoader;
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.misc.SmallTransitionListener;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
@ -58,6 +60,8 @@ import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.process.BitmapProcessor; import com.nostra13.universalimageloader.core.process.BitmapProcessor;
import java.util.ArrayList;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import retrofit.Callback; import retrofit.Callback;
@ -226,7 +230,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, bottomOffset); songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, bottomOffset);
songListView.addHeaderView(songListHeader); songListView.addHeaderView(songListHeader);
songAdapter = new ArtistSongAdapter(this, ArtistSongLoader.getArtistSongList(this, artist.id), this); songAdapter = new ArtistSongAdapter(this, loadSongDataSet(), this);
songListView.setAdapter(songAdapter); songListView.setAdapter(songAdapter);
final View contentView = getWindow().getDecorView().findViewById(android.R.id.content); final View contentView = getWindow().getDecorView().findViewById(android.R.id.content);
@ -241,8 +245,28 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
private void setUpAlbumRecyclerView() { private void setUpAlbumRecyclerView() {
albumRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); albumRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
albumAdapter = new HorizontalAlbumAdapter(this, ArtistAlbumLoader.getArtistAlbumList(this, artist.id), this); albumAdapter = new HorizontalAlbumAdapter(this, loadAlbumDataSet(), this);
albumRecyclerView.setAdapter(albumAdapter); albumRecyclerView.setAdapter(albumAdapter);
albumAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
if (albumAdapter.getItemCount() == 0) finish();
}
});
}
private void reloadDataSets() {
songAdapter.swapDataSet(loadSongDataSet());
albumAdapter.swapDataSet(loadAlbumDataSet());
}
private ArrayList<Song> loadSongDataSet() {
return ArtistSongLoader.getArtistSongList(this, artist.id);
}
private ArrayList<Album> loadAlbumDataSet() {
return ArtistAlbumLoader.getArtistAlbumList(this, artist.id);
} }
private void loadBiography() { private void loadBiography() {
@ -496,4 +520,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
super.onBackPressed(); super.onBackPressed();
} }
} }
@Override
public void onMediaStoreChanged() {
super.onMediaStoreChanged();
reloadDataSets();
}
} }

View file

@ -21,6 +21,7 @@ import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.misc.DragSortRecycler; import com.kabouzeid.gramophone.misc.DragSortRecycler;
import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.PlaylistSong;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
@ -28,6 +29,9 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@ -71,9 +75,9 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
private void setUpRecyclerView() { private void setUpRecyclerView() {
recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
if (playlist instanceof AbsSmartPlaylist) { if (playlist instanceof AbsSmartPlaylist) {
adapter = new SmartPlaylistSongAdapter(this, ((AbsSmartPlaylist) playlist).getSongs(this), R.layout.item_list, this); adapter = new SmartPlaylistSongAdapter(this, loadSmartPlaylistDataSet(), R.layout.item_list, this);
} else { } else {
adapter = new PlaylistSongAdapter(this, PlaylistSongLoader.getPlaylistSongList(this, playlist.id), R.layout.item_list, this); adapter = new PlaylistSongAdapter(this, loadPlaylistDataSet(), R.layout.item_list, this);
DragSortRecycler dragSortRecycler = new DragSortRecycler(); DragSortRecycler dragSortRecycler = new DragSortRecycler();
dragSortRecycler.setViewHandleId(R.id.image); dragSortRecycler.setViewHandleId(R.id.image);
@ -96,6 +100,31 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
recyclerView.setItemAnimator(null); recyclerView.setItemAnimator(null);
} }
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
checkIsEmpty();
}
});
}
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() { private void setUpToolBar() {
@ -170,6 +199,12 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
} }
} }
@Override
public void onMediaStoreChanged() {
super.onMediaStoreChanged();
reloadDataSet();
}
private void checkIsEmpty() { private void checkIsEmpty() {
empty.setVisibility( empty.setVisibility(
adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE

View file

@ -21,13 +21,13 @@ import android.widget.TextView;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.SearchAdapter; import com.kabouzeid.gramophone.adapter.SearchAdapter;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsMusicStateActivity;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
public class SearchActivity extends AbsBaseActivity { public class SearchActivity extends AbsMusicStateActivity {
public static final String TAG = SearchActivity.class.getSimpleName(); public static final String TAG = SearchActivity.class.getSimpleName();
@Bind(R.id.recycler_view) @Bind(R.id.recycler_view)
@ -38,10 +38,11 @@ public class SearchActivity extends AbsBaseActivity {
@Bind(android.R.id.empty) @Bind(android.R.id.empty)
TextView empty; TextView empty;
private SearchView searchView; private SearchView searchView;
private SearchAdapter searchAdapter; private SearchAdapter searchAdapter;
private String searchQuery = "";
@SuppressLint("NewApi") @SuppressLint("NewApi")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -138,9 +139,16 @@ public class SearchActivity extends AbsBaseActivity {
} }
private void search(@NonNull String query) { private void search(@NonNull String query) {
searchQuery = query;
if (searchAdapter != null) { if (searchAdapter != null) {
searchAdapter.search(query); searchAdapter.search(query);
empty.setVisibility(searchAdapter.getItemCount() < 1 ? View.VISIBLE : View.GONE); empty.setVisibility(searchAdapter.getItemCount() < 1 ? View.VISIBLE : View.GONE);
} }
} }
@Override
public void onMediaStoreChanged() {
super.onMediaStoreChanged();
search(searchQuery);
}
} }

View file

@ -59,7 +59,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
setUpRecyclerView(); setUpRecyclerView();
showEmptyMessageIfEmpty(); checkIsEmpty();
} }
private void setUpRecyclerView() { private void setUpRecyclerView() {
@ -73,7 +73,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
@Override @Override
public void onChanged() { public void onChanged() {
super.onChanged(); super.onChanged();
showEmptyMessageIfEmpty(); checkIsEmpty();
} }
}); });
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
@ -131,7 +131,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
recyclerView.setEnabled(false); recyclerView.setEnabled(false);
} }
private void showEmptyMessageIfEmpty() { private void checkIsEmpty() {
if (empty != null) { if (empty != null) {
RecyclerView.Adapter adapter = getAdapter(); RecyclerView.Adapter adapter = getAdapter();
if (adapter != null) { if (adapter != null) {