Automatically update the data list in every view when the media store has changed.
This commit is contained in:
parent
73cd0105ec
commit
5c513115e7
6 changed files with 119 additions and 16 deletions
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue