Clean ups, new default album art cover and widget resize fix

This commit is contained in:
Karim Abou Zeid 2015-07-06 18:52:26 +02:00
commit 1cccaad0f4
30 changed files with 415 additions and 362 deletions

View file

@ -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();

View file

@ -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() {

View file

@ -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() {

View file

@ -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) {

View file

@ -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;
} }
} }

View file

@ -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);
}
} }

View file

@ -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){

View file

@ -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;
}
} }
} }

View file

@ -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);
}
}

View file

@ -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() {

View file

@ -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
}
}

View file

@ -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;
}
}
}

View file

@ -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));

View file

@ -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));

View file

@ -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);
} }
} }

View file

@ -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;

View file

@ -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());

View file

@ -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,14 +25,9 @@ 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();
App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED));
} }
} }

View file

@ -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();

View file

@ -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);

View file

@ -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;
} }

View file

@ -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);
} }

View file

@ -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);
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 723 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

View file

@ -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" />