Clean ups, new default album art cover and widget resize fix
|
|
@ -29,10 +29,6 @@ public abstract class AbsMultiSelectAdapter<VH extends RecyclerView.ViewHolder,
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setMultiSelectMenuRes(int menuRes) {
|
|
||||||
this.menuRes = menuRes;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void toggleChecked(final int position) {
|
protected void toggleChecked(final int position) {
|
||||||
if (cabHolder != null) {
|
if (cabHolder != null) {
|
||||||
openCabIfNecessary();
|
openCabIfNecessary();
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
||||||
.cacheInMemory(true)
|
.cacheInMemory(true)
|
||||||
.showImageOnFail(R.drawable.default_album_art)
|
.showImageOnFail(R.drawable.default_album_art)
|
||||||
.resetViewBeforeLoading(true)
|
.resetViewBeforeLoading(true)
|
||||||
.displayer(new FadeInBitmapDisplayer(FADE_IN_TIME))
|
.displayer(new FadeInBitmapDisplayer(FADE_IN_TIME, true, true, false))
|
||||||
.build(),
|
.build(),
|
||||||
new SimpleImageLoadingListener() {
|
new SimpleImageLoadingListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -196,6 +196,12 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
usePalette = PreferenceUtils.getInstance(activity).coloredAlbumFooters();
|
usePalette = PreferenceUtils.getInstance(activity).coloredAlbumFooters();
|
||||||
loadDataSet();
|
loadDataSet();
|
||||||
|
setHasStableIds(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return dataSet.get(position).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDataSet() {
|
private void loadDataSet() {
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,12 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
lastFMRestClient = new LastFMRestClient(activity);
|
lastFMRestClient = new LastFMRestClient(activity);
|
||||||
loadDataSet();
|
loadDataSet();
|
||||||
|
setHasStableIds(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return dataSet.get(position).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDataSet() {
|
private void loadDataSet() {
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,12 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter<ArtistAlbumAdapter
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
dataSet = objects;
|
dataSet = objects;
|
||||||
listMargin = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin);
|
listMargin = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin);
|
||||||
|
setHasStableIds(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return dataSet.get(position).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateDataSet(ArrayList<Album> objects) {
|
public void updateDataSet(ArrayList<Album> objects) {
|
||||||
|
|
|
||||||
|
|
@ -25,10 +25,10 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
import com.kabouzeid.gramophone.model.Playlist;
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
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.LastAddedPlaylist;
|
import com.kabouzeid.gramophone.model.smartplaylist.LastAddedPlaylist;
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.MyTopTracksPlaylist;
|
import com.kabouzeid.gramophone.model.smartplaylist.MyTopTracksPlaylist;
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.RecentlyPlayedPlaylist;
|
import com.kabouzeid.gramophone.model.smartplaylist.RecentlyPlayedPlaylist;
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.SmartPlaylist;
|
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
@ -56,6 +56,12 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
||||||
super(activity, cabHolder, R.menu.menu_playlists_selection);
|
super(activity, cabHolder, R.menu.menu_playlists_selection);
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
loadDataSet();
|
loadDataSet();
|
||||||
|
setHasStableIds(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return dataSet.get(position).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadDataSet() {
|
public void loadDataSet() {
|
||||||
|
|
@ -82,15 +88,15 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getIconRes(Playlist playlist) {
|
private int getIconRes(Playlist playlist) {
|
||||||
if (playlist instanceof SmartPlaylist) {
|
if (playlist instanceof AbsSmartPlaylist) {
|
||||||
return ((SmartPlaylist) playlist).iconRes;
|
return ((AbsSmartPlaylist) playlist).iconRes;
|
||||||
}
|
}
|
||||||
return R.drawable.ic_queue_music_white_24dp;
|
return R.drawable.ic_queue_music_white_24dp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemViewType(int position) {
|
public int getItemViewType(int position) {
|
||||||
return dataSet.get(position) instanceof SmartPlaylist ? VIEW_TYPE_SMART : VIEW_TYPE_DEFAULT;
|
return dataSet.get(position) instanceof AbsSmartPlaylist ? VIEW_TYPE_SMART : VIEW_TYPE_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -109,9 +115,9 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
||||||
case R.id.action_delete_playlist:
|
case R.id.action_delete_playlist:
|
||||||
for (int i = 0; i < selection.size(); i++) {
|
for (int i = 0; i < selection.size(); i++) {
|
||||||
Playlist playlist = selection.get(i);
|
Playlist playlist = selection.get(i);
|
||||||
if (playlist instanceof SmartPlaylist) {
|
if (playlist instanceof AbsSmartPlaylist) {
|
||||||
SmartPlaylist smartPlaylist = (SmartPlaylist) playlist;
|
AbsSmartPlaylist absSmartPlaylist = (AbsSmartPlaylist) playlist;
|
||||||
ClearSmartPlaylistDialog.create(smartPlaylist).show(activity.getSupportFragmentManager(), "CLEAR_PLAYLIST_" + smartPlaylist.name);
|
ClearSmartPlaylistDialog.create(absSmartPlaylist).show(activity.getSupportFragmentManager(), "CLEAR_PLAYLIST_" + absSmartPlaylist.name);
|
||||||
selection.remove(playlist);
|
selection.remove(playlist);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
|
|
@ -132,8 +138,8 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
||||||
private ArrayList<Song> getSongList(List<Playlist> playlists) {
|
private ArrayList<Song> getSongList(List<Playlist> playlists) {
|
||||||
final ArrayList<Song> songs = new ArrayList<>();
|
final ArrayList<Song> songs = new ArrayList<>();
|
||||||
for (Playlist playlist : playlists) {
|
for (Playlist playlist : playlists) {
|
||||||
if (playlist instanceof SmartPlaylist) {
|
if (playlist instanceof AbsSmartPlaylist) {
|
||||||
songs.addAll(((SmartPlaylist) playlist).getSongs(activity));
|
songs.addAll(((AbsSmartPlaylist) playlist).getSongs(activity));
|
||||||
} else {
|
} else {
|
||||||
songs.addAll(PlaylistSongLoader.getPlaylistSongList(activity, playlist.id));
|
songs.addAll(PlaylistSongLoader.getPlaylistSongList(activity, playlist.id));
|
||||||
}
|
}
|
||||||
|
|
@ -166,8 +172,8 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
public boolean onMenuItemClick(MenuItem item) {
|
||||||
if (item.getItemId() == R.id.action_clear_playlist) {
|
if (item.getItemId() == R.id.action_clear_playlist) {
|
||||||
Playlist playlist = dataSet.get(getAdapterPosition());
|
Playlist playlist = dataSet.get(getAdapterPosition());
|
||||||
if (playlist instanceof SmartPlaylist) {
|
if (playlist instanceof AbsSmartPlaylist) {
|
||||||
ClearSmartPlaylistDialog.create((SmartPlaylist) playlist).show(activity.getSupportFragmentManager(), "CLEAR_SMART_PLAYLIST_" + playlist.name);
|
ClearSmartPlaylistDialog.create((AbsSmartPlaylist) playlist).show(activity.getSupportFragmentManager(), "CLEAR_SMART_PLAYLIST_" + playlist.name);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,156 +1,26 @@
|
||||||
package com.kabouzeid.gramophone.adapter.songadapter;
|
package com.kabouzeid.gramophone.adapter.songadapter;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.util.Pair;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
|
||||||
import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter;
|
import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter;
|
||||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
|
||||||
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
|
||||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public abstract class AbsPlaylistSongAdapter<S extends Song> extends AbsMultiSelectAdapter<PlaylistSongViewHolder, S> implements PlaylistSongViewHolder.onViewHolderClickListener, PlaylistSongViewHolder.onViewHolderLongClickListener, PlaylistSongViewHolder.onViewHolderMenuItemClickListener {
|
public abstract class AbsPlaylistSongAdapter<VH extends RecyclerView.ViewHolder, S extends Song> extends AbsMultiSelectAdapter<VH, S> {
|
||||||
|
public static final String TAG = AbsPlaylistSongAdapter.class.getSimpleName();
|
||||||
|
|
||||||
public static final String TAG = AlbumSongAdapter.class.getSimpleName();
|
public AbsPlaylistSongAdapter(Context context, @Nullable CabHolder cabHolder, int menuRes) {
|
||||||
protected final AppCompatActivity activity;
|
super(context, cabHolder, menuRes);
|
||||||
protected ArrayList<S> dataSet;
|
|
||||||
|
|
||||||
public AbsPlaylistSongAdapter(AppCompatActivity activity, ArrayList<S> objects, @Nullable CabHolder cabHolder) {
|
|
||||||
super(activity, cabHolder, R.menu.menu_playlists_songs_selection);
|
|
||||||
setMultiSelectMenuRes(getMultiSelectMenuRes());
|
|
||||||
this.activity = activity;
|
|
||||||
dataSet = objects;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateDataSet(ArrayList<S> objects) {
|
public abstract ArrayList<S> getDataSet();
|
||||||
dataSet = objects;
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<S> getDataSet(){
|
public abstract void updateDataSet();
|
||||||
return dataSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getMultiSelectMenuRes() {
|
|
||||||
return R.menu.menu_playlists_songs_selection;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getSongMenuRes() {
|
|
||||||
return R.menu.menu_item_playlist_song;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PlaylistSongViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
||||||
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_song, parent, false);
|
|
||||||
return new PlaylistSongViewHolder(this, view, getSongMenuRes());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(final PlaylistSongViewHolder holder, int position) {
|
|
||||||
final S song = dataSet.get(position);
|
|
||||||
|
|
||||||
holder.view.setActivated(isChecked(song));
|
|
||||||
holder.songTitle.setText(song.title);
|
|
||||||
holder.songInfo.setText(song.artistName);
|
|
||||||
ImageLoader.getInstance().displayImage(
|
|
||||||
MusicUtil.getAlbumArtUri(song.albumId).toString(),
|
|
||||||
holder.albumArt,
|
|
||||||
new DisplayImageOptions.Builder()
|
|
||||||
.cacheInMemory(true)
|
|
||||||
.showImageOnFail(R.drawable.default_album_art)
|
|
||||||
.resetViewBeforeLoading(true)
|
|
||||||
.build()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return dataSet.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected S getIdentifier(int position) {
|
|
||||||
return dataSet.get(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onMultipleItemAction(MenuItem menuItem, ArrayList<S> selection) {
|
|
||||||
switch (menuItem.getItemId()) {
|
|
||||||
case R.id.action_delete_from_playlist:
|
|
||||||
onDeleteFromPlaylist(selection);
|
|
||||||
break;
|
|
||||||
case R.id.action_add_to_playlist:
|
|
||||||
onAddToPlaylist(selection);
|
|
||||||
break;
|
|
||||||
case R.id.action_add_to_current_playing:
|
|
||||||
onAddToCurrentPlaying(selection);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(View v, int adapterPosition) {
|
|
||||||
if (isInQuickSelectMode()) {
|
|
||||||
toggleChecked(adapterPosition);
|
|
||||||
} else {
|
|
||||||
//noinspection unchecked
|
|
||||||
MusicPlayerRemote.openQueue((ArrayList<Song>) (List) dataSet, adapterPosition, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onLongClick(View v, int adapterPosition) {
|
|
||||||
toggleChecked(adapterPosition);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item, PlaylistSongViewHolder viewHolder, int adapterPosition) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.action_delete_from_playlist:
|
|
||||||
onDeleteFromPlaylist(dataSet.get(adapterPosition));
|
|
||||||
return true;
|
|
||||||
case R.id.action_go_to_album:
|
|
||||||
Pair[] albumPairs = new Pair[]{
|
|
||||||
Pair.create(viewHolder.albumArt, activity.getString(R.string.transition_album_cover))
|
|
||||||
};
|
|
||||||
if (activity instanceof AbsFabActivity)
|
|
||||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
|
||||||
NavigationUtil.goToAlbum(activity, dataSet.get(adapterPosition).albumId, albumPairs);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(adapterPosition), item);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void onDeleteFromPlaylist(S song);
|
|
||||||
|
|
||||||
protected abstract void onDeleteFromPlaylist(ArrayList<S> songs);
|
|
||||||
|
|
||||||
protected void onAddToPlaylist(ArrayList<S> songs) {
|
|
||||||
//noinspection unchecked
|
|
||||||
AddToPlaylistDialog.create((ArrayList<Song>) (List) songs).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onAddToCurrentPlaying(ArrayList<S> songs) {
|
|
||||||
//noinspection unchecked
|
|
||||||
MusicPlayerRemote.enqueue((ArrayList<Song>) (List) songs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,12 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
|
||||||
super(activity, cabHolder, R.menu.menu_media_selection);
|
super(activity, cabHolder, R.menu.menu_media_selection);
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
dataSet = objects;
|
dataSet = objects;
|
||||||
|
setHasStableIds(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return dataSet.get(position).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateDataSet(ArrayList<Song> objects){
|
public void updateDataSet(ArrayList<Song> objects){
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,190 @@
|
||||||
package com.kabouzeid.gramophone.adapter.songadapter;
|
package com.kabouzeid.gramophone.adapter.songadapter;
|
||||||
|
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v4.util.Pair;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.PopupMenu;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.RemoveFromPlaylistDialog;
|
import com.kabouzeid.gramophone.dialogs.RemoveFromPlaylistDialog;
|
||||||
|
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
||||||
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
|
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
||||||
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.model.PlaylistSong;
|
import com.kabouzeid.gramophone.model.PlaylistSong;
|
||||||
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
||||||
|
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||||
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class PlaylistSongAdapter extends AbsPlaylistSongAdapter<PlaylistSong> {
|
public class PlaylistSongAdapter extends AbsPlaylistSongAdapter<PlaylistSongAdapter.ViewHolder, PlaylistSong> {
|
||||||
|
|
||||||
public PlaylistSongAdapter(AppCompatActivity activity, ArrayList<PlaylistSong> objects, @Nullable CabHolder cabHolder) {
|
public static final String TAG = PlaylistSongAdapter.class.getSimpleName();
|
||||||
super(activity, objects, cabHolder);
|
protected final AppCompatActivity activity;
|
||||||
|
protected ArrayList<PlaylistSong> dataSet;
|
||||||
|
private Playlist playlist;
|
||||||
|
|
||||||
|
public PlaylistSongAdapter(AppCompatActivity activity, Playlist playlist, @Nullable CabHolder cabHolder) {
|
||||||
|
super(activity, cabHolder, R.menu.menu_playlists_songs_selection);
|
||||||
|
this.activity = activity;
|
||||||
|
this.playlist = playlist;
|
||||||
|
dataSet = PlaylistSongLoader.getPlaylistSongList(activity, playlist.id);
|
||||||
|
setHasStableIds(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDeleteFromPlaylist(ArrayList<PlaylistSong> songs) {
|
public long getItemId(int position) {
|
||||||
RemoveFromPlaylistDialog.create(songs).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
return dataSet.get(position).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDeleteFromPlaylist(PlaylistSong song) {
|
public void updateDataSet() {
|
||||||
RemoveFromPlaylistDialog.create(song).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
dataSet = PlaylistSongLoader.getPlaylistSongList(activity, playlist.id);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<PlaylistSong> getDataSet() {
|
||||||
|
return dataSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_song, parent, false);
|
||||||
|
return new ViewHolder(view, R.menu.menu_item_playlist_song);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||||
|
final PlaylistSong song = dataSet.get(position);
|
||||||
|
|
||||||
|
holder.itemView.setActivated(isChecked(song));
|
||||||
|
holder.songTitle.setText(song.title);
|
||||||
|
holder.songInfo.setText(song.artistName);
|
||||||
|
ImageLoader.getInstance().displayImage(
|
||||||
|
MusicUtil.getAlbumArtUri(song.albumId).toString(),
|
||||||
|
holder.albumArt,
|
||||||
|
new DisplayImageOptions.Builder()
|
||||||
|
.cacheInMemory(true)
|
||||||
|
.showImageOnFail(R.drawable.default_album_art)
|
||||||
|
.resetViewBeforeLoading(true)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return dataSet.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected PlaylistSong getIdentifier(int position) {
|
||||||
|
return dataSet.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMultipleItemAction(MenuItem menuItem, ArrayList<PlaylistSong> selection) {
|
||||||
|
switch (menuItem.getItemId()) {
|
||||||
|
case R.id.action_delete_from_playlist:
|
||||||
|
RemoveFromPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||||
|
break;
|
||||||
|
case R.id.action_add_to_playlist:
|
||||||
|
//noinspection unchecked
|
||||||
|
AddToPlaylistDialog.create((ArrayList<Song>) (List) selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||||
|
break;
|
||||||
|
case R.id.action_add_to_current_playing:
|
||||||
|
//noinspection unchecked
|
||||||
|
MusicPlayerRemote.enqueue((ArrayList<Song>) (List) selection);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void moveItem(int from, int to) {
|
||||||
|
if (from == to) return;
|
||||||
|
|
||||||
|
if (PlaylistsUtil.moveItem(activity, playlist.id, from, to)) {
|
||||||
|
PlaylistSong song = dataSet.remove(from);
|
||||||
|
dataSet.add(to, song);
|
||||||
|
notifyItemMoved(from, to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
|
||||||
|
final TextView songTitle;
|
||||||
|
final TextView songInfo;
|
||||||
|
final ImageView overflowButton;
|
||||||
|
final ImageView albumArt;
|
||||||
|
|
||||||
|
public ViewHolder(View itemView, final int songMenu) {
|
||||||
|
super(itemView);
|
||||||
|
songTitle = (TextView) itemView.findViewById(R.id.song_title);
|
||||||
|
songInfo = (TextView) itemView.findViewById(R.id.song_info);
|
||||||
|
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
|
||||||
|
itemView.setOnClickListener(this);
|
||||||
|
itemView.setOnLongClickListener(this);
|
||||||
|
overflowButton = (ImageView) itemView.findViewById(R.id.menu);
|
||||||
|
overflowButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
PopupMenu popupMenu = new PopupMenu(activity, v);
|
||||||
|
popupMenu.inflate(songMenu);
|
||||||
|
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemClick(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.action_delete_from_playlist:
|
||||||
|
RemoveFromPlaylistDialog.create(dataSet.get(getAdapterPosition())).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||||
|
return true;
|
||||||
|
case R.id.action_go_to_album:
|
||||||
|
Pair[] albumPairs = new Pair[]{
|
||||||
|
Pair.create(albumArt, activity.getString(R.string.transition_album_cover))
|
||||||
|
};
|
||||||
|
if (activity instanceof AbsFabActivity)
|
||||||
|
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||||
|
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(getAdapterPosition()), item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
popupMenu.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (isInQuickSelectMode()) {
|
||||||
|
toggleChecked(getAdapterPosition());
|
||||||
|
} else {
|
||||||
|
//noinspection unchecked
|
||||||
|
MusicPlayerRemote.openQueue((ArrayList<Song>) (List) dataSet, getAdapterPosition(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View v) {
|
||||||
|
toggleChecked(getAdapterPosition());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.adapter.songadapter;
|
|
||||||
|
|
||||||
import android.support.v7.widget.RecyclerView;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.PopupMenu;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public class PlaylistSongViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
|
|
||||||
final TextView songTitle;
|
|
||||||
final TextView songInfo;
|
|
||||||
final ImageView overflowButton;
|
|
||||||
final ImageView albumArt;
|
|
||||||
final View view;
|
|
||||||
|
|
||||||
final AbsPlaylistSongAdapter adapter;
|
|
||||||
|
|
||||||
public PlaylistSongViewHolder(final AbsPlaylistSongAdapter adapter, View itemView, final int songMenu) {
|
|
||||||
super(itemView);
|
|
||||||
this.adapter = adapter;
|
|
||||||
view = itemView;
|
|
||||||
songTitle = (TextView) itemView.findViewById(R.id.song_title);
|
|
||||||
songInfo = (TextView) itemView.findViewById(R.id.song_info);
|
|
||||||
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
|
|
||||||
view.setOnClickListener(this);
|
|
||||||
view.setOnLongClickListener(this);
|
|
||||||
overflowButton = (ImageView) itemView.findViewById(R.id.menu);
|
|
||||||
overflowButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
PopupMenu popupMenu = new PopupMenu(adapter.activity, v);
|
|
||||||
popupMenu.inflate(songMenu);
|
|
||||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
|
||||||
return adapter.onMenuItemClick(item, PlaylistSongViewHolder.this, getAdapterPosition());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
popupMenu.show();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
adapter.onClick(v, getAdapterPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onLongClick(View v) {
|
|
||||||
return adapter.onLongClick(v, getAdapterPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected interface onViewHolderMenuItemClickListener {
|
|
||||||
boolean onMenuItemClick(MenuItem item, PlaylistSongViewHolder viewHolder, int adapterPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected interface onViewHolderClickListener {
|
|
||||||
void onClick(View v, int adapterPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected interface onViewHolderLongClickListener {
|
|
||||||
boolean onLongClick(View v, int adapterPosition);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -50,6 +50,12 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
||||||
super(activity, cabHolder, R.menu.menu_media_selection);
|
super(activity, cabHolder, R.menu.menu_media_selection);
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
loadDataSet();
|
loadDataSet();
|
||||||
|
setHasStableIds(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return dataSet.get(position).id;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDataSet() {
|
private void loadDataSet() {
|
||||||
|
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.adapter.songadapter.smartplaylist;
|
|
||||||
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.SmartPlaylist;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public class CannotDeleteSingleSongsSongAdapter extends SmartPlaylistSongAdapter {
|
|
||||||
|
|
||||||
public CannotDeleteSingleSongsSongAdapter(AppCompatActivity activity, SmartPlaylist smartPlaylist, @Nullable CabHolder cabHolder) {
|
|
||||||
super(activity, smartPlaylist, cabHolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getMultiSelectMenuRes() {
|
|
||||||
return R.menu.menu_cannot_delete_single_songs_playlist_songs_selection;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getSongMenuRes() {
|
|
||||||
return R.menu.menu_item_cannot_delete_single_songs_playlist_song;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDeleteFromPlaylist(Song song) {
|
|
||||||
// you cannot delete single songs from this playlist
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDeleteFromPlaylist(ArrayList<Song> songs) {
|
|
||||||
// you cannot delete single songs from this playlist
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,26 +1,176 @@
|
||||||
package com.kabouzeid.gramophone.adapter.songadapter.smartplaylist;
|
package com.kabouzeid.gramophone.adapter.songadapter.smartplaylist;
|
||||||
|
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v4.util.Pair;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.PopupMenu;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.AbsPlaylistSongAdapter;
|
import com.kabouzeid.gramophone.adapter.songadapter.AbsPlaylistSongAdapter;
|
||||||
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
|
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
||||||
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.SmartPlaylist;
|
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||||
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||||
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public abstract class SmartPlaylistSongAdapter extends AbsPlaylistSongAdapter<Song> {
|
public class SmartPlaylistSongAdapter extends AbsPlaylistSongAdapter<SmartPlaylistSongAdapter.ViewHolder, Song> {
|
||||||
private SmartPlaylist playlist;
|
|
||||||
|
|
||||||
public SmartPlaylistSongAdapter(AppCompatActivity activity, SmartPlaylist playlist, @Nullable CabHolder cabHolder) {
|
public static final String TAG = SmartPlaylistSongAdapter.class.getSimpleName();
|
||||||
super(activity, playlist.getSongs(activity), cabHolder);
|
protected final AppCompatActivity activity;
|
||||||
this.playlist = playlist;
|
private AbsSmartPlaylist playlist;
|
||||||
}
|
protected ArrayList<Song> dataSet;
|
||||||
|
|
||||||
|
@Override
|
||||||
public void updateDataSet() {
|
public void updateDataSet() {
|
||||||
updateDataSet(playlist.getSongs(activity));
|
dataSet = playlist.getSongs(activity);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
setHasStableIds(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return dataSet.get(position).id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SmartPlaylistSongAdapter(AppCompatActivity activity, AbsSmartPlaylist playlist, @Nullable CabHolder cabHolder) {
|
||||||
|
super(activity, cabHolder, R.menu.menu_cannot_delete_single_songs_playlist_songs_selection);
|
||||||
|
this.activity = activity;
|
||||||
|
this.playlist = playlist;
|
||||||
|
dataSet = playlist.getSongs(activity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<Song> getDataSet() {
|
||||||
|
return dataSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_song, parent, false);
|
||||||
|
return new ViewHolder(view, R.menu.menu_item_cannot_delete_single_songs_playlist_song);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||||
|
final Song song = dataSet.get(position);
|
||||||
|
|
||||||
|
holder.itemView.setActivated(isChecked(song));
|
||||||
|
holder.songTitle.setText(song.title);
|
||||||
|
holder.songInfo.setText(song.artistName);
|
||||||
|
ImageLoader.getInstance().displayImage(
|
||||||
|
MusicUtil.getAlbumArtUri(song.albumId).toString(),
|
||||||
|
holder.albumArt,
|
||||||
|
new DisplayImageOptions.Builder()
|
||||||
|
.cacheInMemory(true)
|
||||||
|
.showImageOnFail(R.drawable.default_album_art)
|
||||||
|
.resetViewBeforeLoading(true)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return dataSet.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Song getIdentifier(int position) {
|
||||||
|
return dataSet.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMultipleItemAction(MenuItem menuItem, ArrayList<Song> selection) {
|
||||||
|
switch (menuItem.getItemId()) {
|
||||||
|
case R.id.action_add_to_playlist:
|
||||||
|
onAddToPlaylist(selection);
|
||||||
|
break;
|
||||||
|
case R.id.action_add_to_current_playing:
|
||||||
|
onAddToCurrentPlaying(selection);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onAddToPlaylist(ArrayList<Song> songs) {
|
||||||
|
AddToPlaylistDialog.create(songs).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onAddToCurrentPlaying(ArrayList<Song> songs) {
|
||||||
|
MusicPlayerRemote.enqueue(songs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
|
||||||
|
final TextView songTitle;
|
||||||
|
final TextView songInfo;
|
||||||
|
final ImageView overflowButton;
|
||||||
|
final ImageView albumArt;
|
||||||
|
|
||||||
|
public ViewHolder(View itemView, final int songMenu) {
|
||||||
|
super(itemView);
|
||||||
|
songTitle = (TextView) itemView.findViewById(R.id.song_title);
|
||||||
|
songInfo = (TextView) itemView.findViewById(R.id.song_info);
|
||||||
|
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
|
||||||
|
itemView.setOnClickListener(this);
|
||||||
|
itemView.setOnLongClickListener(this);
|
||||||
|
overflowButton = (ImageView) itemView.findViewById(R.id.menu);
|
||||||
|
overflowButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
PopupMenu popupMenu = new PopupMenu(activity, v);
|
||||||
|
popupMenu.inflate(songMenu);
|
||||||
|
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemClick(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.action_go_to_album:
|
||||||
|
Pair[] albumPairs = new Pair[]{
|
||||||
|
Pair.create(albumArt, activity.getString(R.string.transition_album_cover))
|
||||||
|
};
|
||||||
|
if (activity instanceof AbsFabActivity)
|
||||||
|
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||||
|
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(getAdapterPosition()), item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
popupMenu.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (isInQuickSelectMode()) {
|
||||||
|
toggleChecked(getAdapterPosition());
|
||||||
|
} else {
|
||||||
|
//noinspection unchecked
|
||||||
|
MusicPlayerRemote.openQueue((ArrayList<Song>) (List) dataSet, getAdapterPosition(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View v) {
|
||||||
|
toggleChecked(getAdapterPosition());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -105,6 +105,7 @@ public class WidgetMedium extends AppWidgetProvider {
|
||||||
|
|
||||||
private static void linkButtons(final Context context, final RemoteViews views) {
|
private static void linkButtons(final Context context, final RemoteViews views) {
|
||||||
views.setOnClickPendingIntent(R.id.album_art, retrievePlaybackActions(context, 0));
|
views.setOnClickPendingIntent(R.id.album_art, retrievePlaybackActions(context, 0));
|
||||||
|
views.setOnClickPendingIntent(R.id.media_titles, retrievePlaybackActions(context, 0));
|
||||||
views.setOnClickPendingIntent(R.id.button_toggle_play_pause, retrievePlaybackActions(context, 1));
|
views.setOnClickPendingIntent(R.id.button_toggle_play_pause, retrievePlaybackActions(context, 1));
|
||||||
views.setOnClickPendingIntent(R.id.button_next, retrievePlaybackActions(context, 2));
|
views.setOnClickPendingIntent(R.id.button_next, retrievePlaybackActions(context, 2));
|
||||||
views.setOnClickPendingIntent(R.id.button_prev, retrievePlaybackActions(context, 3));
|
views.setOnClickPendingIntent(R.id.button_prev, retrievePlaybackActions(context, 3));
|
||||||
|
|
|
||||||
|
|
@ -8,14 +8,14 @@ import android.text.Html;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.SmartPlaylist;
|
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class ClearSmartPlaylistDialog extends DialogFragment {
|
public class ClearSmartPlaylistDialog extends DialogFragment {
|
||||||
|
|
||||||
public static ClearSmartPlaylistDialog create(SmartPlaylist playlist) {
|
public static ClearSmartPlaylistDialog create(AbsSmartPlaylist playlist) {
|
||||||
ClearSmartPlaylistDialog dialog = new ClearSmartPlaylistDialog();
|
ClearSmartPlaylistDialog dialog = new ClearSmartPlaylistDialog();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putSerializable("playlist", playlist);
|
args.putSerializable("playlist", playlist);
|
||||||
|
|
@ -27,7 +27,7 @@ public class ClearSmartPlaylistDialog extends DialogFragment {
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
final SmartPlaylist playlist = (SmartPlaylist) getArguments().getSerializable("playlist");
|
final AbsSmartPlaylist playlist = (AbsSmartPlaylist) getArguments().getSerializable("playlist");
|
||||||
int title = R.string.clear_playlist_title;
|
int title = R.string.clear_playlist_title;
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
CharSequence content = Html.fromHtml(getString(R.string.clear_playlist_x, playlist.name));
|
CharSequence content = Html.fromHtml(getString(R.string.clear_playlist_x, playlist.name));
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
||||||
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
||||||
import com.kabouzeid.gramophone.model.Playlist;
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.SmartPlaylist;
|
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
||||||
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
||||||
|
|
@ -99,8 +99,8 @@ public class MenuItemClickHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ArrayList<? extends Song> getPlaylistSongs(Activity activity, Playlist playlist) {
|
private static ArrayList<? extends Song> getPlaylistSongs(Activity activity, Playlist playlist) {
|
||||||
return playlist instanceof SmartPlaylist ?
|
return playlist instanceof AbsSmartPlaylist ?
|
||||||
((SmartPlaylist) playlist).getSongs(activity) :
|
((AbsSmartPlaylist) playlist).getSongs(activity) :
|
||||||
PlaylistSongLoader.getPlaylistSongList(activity, playlist.id);
|
PlaylistSongLoader.getPlaylistSongList(activity, playlist.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,25 +16,27 @@ import java.util.ArrayList;
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public abstract class SmartPlaylist extends Playlist {
|
public abstract class AbsSmartPlaylist extends Playlist {
|
||||||
private static final long serialVersionUID = 3013701295356403681L;
|
private static final long serialVersionUID = 3013701295356403681L;
|
||||||
|
|
||||||
@DrawableRes
|
@DrawableRes
|
||||||
public final int iconRes;
|
public final int iconRes;
|
||||||
|
|
||||||
public SmartPlaylist(final String name, final int iconRes) {
|
public AbsSmartPlaylist(final String name, final int iconRes) {
|
||||||
super(-1, name);
|
super(-1, name);
|
||||||
this.iconRes = iconRes;
|
this.iconRes = iconRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SmartPlaylist() {
|
public AbsSmartPlaylist() {
|
||||||
super();
|
super();
|
||||||
this.iconRes = R.drawable.ic_queue_music_white_24dp;
|
this.iconRes = R.drawable.ic_queue_music_white_24dp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract ArrayList<Song> getSongs(Context context);
|
public SmartPlaylistSongAdapter createAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) {
|
||||||
|
return new SmartPlaylistSongAdapter(activity, this, cabHolder);
|
||||||
|
}
|
||||||
|
|
||||||
public abstract SmartPlaylistSongAdapter createAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder);
|
public abstract ArrayList<Song> getSongs(Context context);
|
||||||
|
|
||||||
public abstract void clear(Context context);
|
public abstract void clear(Context context);
|
||||||
|
|
||||||
|
|
@ -52,7 +54,7 @@ public abstract class SmartPlaylist extends Playlist {
|
||||||
if (getClass() != obj.getClass()) {
|
if (getClass() != obj.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final SmartPlaylist other = (SmartPlaylist) obj;
|
final AbsSmartPlaylist other = (AbsSmartPlaylist) obj;
|
||||||
return iconRes == other.iconRes;
|
return iconRes == other.iconRes;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -1,14 +1,9 @@
|
||||||
package com.kabouzeid.gramophone.model.smartplaylist;
|
package com.kabouzeid.gramophone.model.smartplaylist;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.CannotDeleteSingleSongsSongAdapter;
|
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.SmartPlaylistSongAdapter;
|
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
|
||||||
import com.kabouzeid.gramophone.loader.LastAddedLoader;
|
import com.kabouzeid.gramophone.loader.LastAddedLoader;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
@ -19,7 +14,7 @@ import java.util.ArrayList;
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class LastAddedPlaylist extends SmartPlaylist {
|
public class LastAddedPlaylist extends AbsSmartPlaylist {
|
||||||
|
|
||||||
public LastAddedPlaylist(Context context) {
|
public LastAddedPlaylist(Context context) {
|
||||||
super(context.getString(R.string.last_added), R.drawable.ic_queue_white_24dp);
|
super(context.getString(R.string.last_added), R.drawable.ic_queue_white_24dp);
|
||||||
|
|
@ -30,11 +25,6 @@ public class LastAddedPlaylist extends SmartPlaylist {
|
||||||
return LastAddedLoader.getLastAddedSongs(context);
|
return LastAddedLoader.getLastAddedSongs(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public SmartPlaylistSongAdapter createAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) {
|
|
||||||
return new CannotDeleteSingleSongsSongAdapter(activity, this, cabHolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clear(Context context) {
|
public void clear(Context context) {
|
||||||
PreferenceUtils.getInstance(context).setLastAddedCutoffTimestamp(System.currentTimeMillis());
|
PreferenceUtils.getInstance(context).setLastAddedCutoffTimestamp(System.currentTimeMillis());
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,9 @@
|
||||||
package com.kabouzeid.gramophone.model.smartplaylist;
|
package com.kabouzeid.gramophone.model.smartplaylist;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.CannotDeleteSingleSongsSongAdapter;
|
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.SmartPlaylistSongAdapter;
|
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
|
||||||
import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader;
|
import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
@ -19,7 +14,7 @@ import java.util.ArrayList;
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class MyTopTracksPlaylist extends SmartPlaylist {
|
public class MyTopTracksPlaylist extends AbsSmartPlaylist {
|
||||||
|
|
||||||
public MyTopTracksPlaylist(Context context) {
|
public MyTopTracksPlaylist(Context context) {
|
||||||
super(context.getString(R.string.my_top_tracks), R.drawable.ic_trending_up_white_24dp);
|
super(context.getString(R.string.my_top_tracks), R.drawable.ic_trending_up_white_24dp);
|
||||||
|
|
@ -30,11 +25,6 @@ public class MyTopTracksPlaylist extends SmartPlaylist {
|
||||||
return TopAndRecentlyPlayedTracksLoader.getTopTracks(context);
|
return TopAndRecentlyPlayedTracksLoader.getTopTracks(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public SmartPlaylistSongAdapter createAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) {
|
|
||||||
return new CannotDeleteSingleSongsSongAdapter(activity, this, cabHolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clear(Context context) {
|
public void clear(Context context) {
|
||||||
SongPlayCountStore.getInstance(context).clear();
|
SongPlayCountStore.getInstance(context).clear();
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,9 @@
|
||||||
package com.kabouzeid.gramophone.model.smartplaylist;
|
package com.kabouzeid.gramophone.model.smartplaylist;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.CannotDeleteSingleSongsSongAdapter;
|
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.SmartPlaylistSongAdapter;
|
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
|
||||||
import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader;
|
import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
@ -19,7 +14,7 @@ import java.util.ArrayList;
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class RecentlyPlayedPlaylist extends SmartPlaylist {
|
public class RecentlyPlayedPlaylist extends AbsSmartPlaylist {
|
||||||
|
|
||||||
public RecentlyPlayedPlaylist(Context context) {
|
public RecentlyPlayedPlaylist(Context context) {
|
||||||
super(context.getString(R.string.recently_played), R.drawable.ic_access_time_white_24dp);
|
super(context.getString(R.string.recently_played), R.drawable.ic_access_time_white_24dp);
|
||||||
|
|
@ -30,11 +25,6 @@ public class RecentlyPlayedPlaylist extends SmartPlaylist {
|
||||||
return TopAndRecentlyPlayedTracksLoader.getRecentlyPlayedTracks(context);
|
return TopAndRecentlyPlayedTracksLoader.getRecentlyPlayedTracks(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public SmartPlaylistSongAdapter createAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) {
|
|
||||||
return new CannotDeleteSingleSongsSongAdapter(activity, this, cabHolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clear(Context context) {
|
public void clear(Context context) {
|
||||||
RecentlyPlayedStore.getInstance(context).clear();
|
RecentlyPlayedStore.getInstance(context).clear();
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,6 @@ import butterknife.InjectView;
|
||||||
public class MusicControllerActivity extends AbsFabActivity {
|
public class MusicControllerActivity extends AbsFabActivity {
|
||||||
|
|
||||||
public static final String TAG = MusicControllerActivity.class.getSimpleName();
|
public static final String TAG = MusicControllerActivity.class.getSimpleName();
|
||||||
private static final int COLOR_TRANSITION_TIME = 400;
|
|
||||||
private static final int FAB_CIRCULAR_REVEAL_ANIMATION_TIME = 1000;
|
private static final int FAB_CIRCULAR_REVEAL_ANIMATION_TIME = 1000;
|
||||||
private static final int PROGRESS_VIEW_UPDATE_INTERVAL = 100;
|
private static final int PROGRESS_VIEW_UPDATE_INTERVAL = 100;
|
||||||
|
|
||||||
|
|
@ -488,10 +487,10 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
|
|
||||||
private void animateColorChange(final int newColor) {
|
private void animateColorChange(final int newColor) {
|
||||||
if (lastFooterColor != -1 && lastFooterColor != newColor) {
|
if (lastFooterColor != -1 && lastFooterColor != newColor) {
|
||||||
ViewUtil.animateViewColor(footer, lastFooterColor, newColor, COLOR_TRANSITION_TIME);
|
ViewUtil.animateViewColor(footer, lastFooterColor, newColor);
|
||||||
|
|
||||||
if (opaqueToolBar)
|
if (opaqueToolBar)
|
||||||
ViewUtil.animateViewColor(toolbar, lastFooterColor, newColor, COLOR_TRANSITION_TIME);
|
ViewUtil.animateViewColor(toolbar, lastFooterColor, newColor);
|
||||||
else toolbar.setBackgroundColor(Color.TRANSPARENT);
|
else toolbar.setBackgroundColor(Color.TRANSPARENT);
|
||||||
} else {
|
} else {
|
||||||
footer.setBackgroundColor(newColor);
|
footer.setBackgroundColor(newColor);
|
||||||
|
|
@ -511,8 +510,8 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
|
|
||||||
private void animateTextColorChange(final int newColor) {
|
private void animateTextColorChange(final int newColor) {
|
||||||
if (lastTextColor != -2 && lastTextColor != newColor) {
|
if (lastTextColor != -2 && lastTextColor != newColor) {
|
||||||
ViewUtil.animateTextColor(songTitle, lastTextColor, newColor, COLOR_TRANSITION_TIME);
|
ViewUtil.animateTextColor(songTitle, lastTextColor, newColor);
|
||||||
ViewUtil.animateTextColor(songArtist, lastTextColor, newColor, COLOR_TRANSITION_TIME);
|
ViewUtil.animateTextColor(songArtist, lastTextColor, newColor);
|
||||||
} else {
|
} else {
|
||||||
songTitle.setTextColor(newColor);
|
songTitle.setTextColor(newColor);
|
||||||
songArtist.setTextColor(newColor);
|
songArtist.setTextColor(newColor);
|
||||||
|
|
|
||||||
|
|
@ -14,23 +14,17 @@ import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.AbsPlaylistSongAdapter;
|
import com.kabouzeid.gramophone.adapter.songadapter.AbsPlaylistSongAdapter;
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.PlaylistSongAdapter;
|
import com.kabouzeid.gramophone.adapter.songadapter.PlaylistSongAdapter;
|
||||||
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.SmartPlaylistSongAdapter;
|
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
|
||||||
import com.kabouzeid.gramophone.misc.DragSortRecycler;
|
import com.kabouzeid.gramophone.misc.DragSortRecycler;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
import com.kabouzeid.gramophone.model.Playlist;
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.model.PlaylistSong;
|
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||||
import com.kabouzeid.gramophone.model.smartplaylist.SmartPlaylist;
|
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import butterknife.InjectView;
|
import butterknife.InjectView;
|
||||||
|
|
||||||
|
|
@ -50,7 +44,6 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
|
||||||
private Playlist playlist;
|
private Playlist playlist;
|
||||||
private MaterialCab cab;
|
private MaterialCab cab;
|
||||||
private AbsPlaylistSongAdapter adapter;
|
private AbsPlaylistSongAdapter adapter;
|
||||||
private ArrayList<PlaylistSong> songs;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
@ -75,27 +68,24 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
|
||||||
|
|
||||||
private void setUpRecyclerView() {
|
private void setUpRecyclerView() {
|
||||||
recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
|
recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
|
||||||
if (playlist instanceof SmartPlaylist) {
|
if (playlist instanceof AbsSmartPlaylist) {
|
||||||
adapter = ((SmartPlaylist) playlist).createAdapter(this, this);
|
adapter = ((AbsSmartPlaylist) playlist).createAdapter(this, this);
|
||||||
} else {
|
} else {
|
||||||
songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id);
|
adapter = new PlaylistSongAdapter(this, playlist, this);
|
||||||
adapter = new PlaylistSongAdapter(this, songs, this);
|
|
||||||
|
|
||||||
DragSortRecycler dragSortRecycler = new DragSortRecycler();
|
DragSortRecycler dragSortRecycler = new DragSortRecycler();
|
||||||
dragSortRecycler.setViewHandleId(R.id.album_art);
|
dragSortRecycler.setViewHandleId(R.id.album_art);
|
||||||
dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() {
|
dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onItemMoved(int from, int to) {
|
public void onItemMoved(int from, int to) {
|
||||||
PlaylistSong song = songs.remove(from);
|
((PlaylistSongAdapter) adapter).moveItem(from, to);
|
||||||
songs.add(to, song);
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, from, to);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
recyclerView.addItemDecoration(dragSortRecycler);
|
recyclerView.addItemDecoration(dragSortRecycler);
|
||||||
recyclerView.addOnItemTouchListener(dragSortRecycler);
|
recyclerView.addOnItemTouchListener(dragSortRecycler);
|
||||||
recyclerView.addOnScrollListener(dragSortRecycler.getScrollListener());
|
recyclerView.addOnScrollListener(dragSortRecycler.getScrollListener());
|
||||||
|
recyclerView.setItemAnimator(null);
|
||||||
}
|
}
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
}
|
}
|
||||||
|
|
@ -175,13 +165,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
|
||||||
switch (event.getAction()) {
|
switch (event.getAction()) {
|
||||||
case DataBaseChangedEvent.PLAYLISTS_CHANGED:
|
case DataBaseChangedEvent.PLAYLISTS_CHANGED:
|
||||||
case DataBaseChangedEvent.DATABASE_CHANGED:
|
case DataBaseChangedEvent.DATABASE_CHANGED:
|
||||||
if (adapter instanceof SmartPlaylistSongAdapter) {
|
adapter.updateDataSet();
|
||||||
((SmartPlaylistSongAdapter) adapter).updateDataSet();
|
|
||||||
} else {
|
|
||||||
songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id);
|
|
||||||
//noinspection unchecked
|
|
||||||
adapter.updateDataSet(songs);
|
|
||||||
}
|
|
||||||
checkIsEmpty();
|
checkIsEmpty();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -195,8 +195,8 @@ public class PlaylistsUtil {
|
||||||
// return 0;
|
// return 0;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public static void moveItem(final Context context, int playlistId, int from, int to) {
|
public static boolean moveItem(final Context context, int playlistId, int from, int to) {
|
||||||
MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(),
|
return MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(),
|
||||||
playlistId, from, to);
|
playlistId, from, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,13 +20,11 @@ import com.afollestad.materialdialogs.internal.MDTintHelper;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
import hugo.weaving.DebugLog;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class ViewUtil {
|
public class ViewUtil {
|
||||||
public final static int DEFAULT_COLOR_ANIMATION_DURATION = 1000;
|
public final static int DEFAULT_COLOR_ANIMATION_DURATION = 500;
|
||||||
|
|
||||||
public static void disableViews(ViewGroup layout) {
|
public static void disableViews(ViewGroup layout) {
|
||||||
for (int i = 0; i < layout.getChildCount(); i++) {
|
for (int i = 0; i < layout.getChildCount(); i++) {
|
||||||
|
|
@ -87,7 +85,6 @@ public class ViewUtil {
|
||||||
animator.start();
|
animator.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@DebugLog
|
|
||||||
public static void animateTextColor(final TextView v, final int startColor, final int endColor) {
|
public static void animateTextColor(final TextView v, final int startColor, final int endColor) {
|
||||||
animateTextColor(v, startColor, endColor, DEFAULT_COLOR_ANIMATION_DURATION);
|
animateTextColor(v, startColor, endColor, DEFAULT_COLOR_ANIMATION_DURATION);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 723 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/default_album_art_dark.png
Normal file
|
After Width: | Height: | Size: 569 KiB |
|
|
@ -4,7 +4,7 @@
|
||||||
android:initialLayout="@layout/widget_medium"
|
android:initialLayout="@layout/widget_medium"
|
||||||
android:minHeight="40dp"
|
android:minHeight="40dp"
|
||||||
android:minWidth="250dp"
|
android:minWidth="250dp"
|
||||||
android:resizeMode="none"
|
android:resizeMode="horizontal"
|
||||||
android:updatePeriodMillis="0"
|
android:updatePeriodMillis="0"
|
||||||
android:widgetCategory="home_screen|keyguard"
|
android:widgetCategory="home_screen|keyguard"
|
||||||
tools:ignore="UnusedAttribute" />
|
tools:ignore="UnusedAttribute" />
|
||||||