Songs view shuffle all button

This commit is contained in:
Karim Abou Zeid 2015-03-24 20:48:29 +01:00
commit 07b9fbb599
4 changed files with 68 additions and 25 deletions

View file

@ -23,21 +23,27 @@ import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import java.util.Random;
/** /**
* Created by karim on 27.11.14. * Created by karim on 27.11.14.
*/ */
public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> { public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
public static final String TAG = AlbumSongAdapter.class.getSimpleName(); public static final String TAG = AlbumSongAdapter.class.getSimpleName();
private static final int SHUFFLE_BUTTON = 0;
private static final int SONG = 1;
protected Activity activity; protected Activity activity;
protected List<Song> dataSet; protected List<Song> dataSet;
@ -56,22 +62,38 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
return new ViewHolder(view); return new ViewHolder(view);
} }
@Override
public int getItemViewType(int position) {
return position == 0 ? SHUFFLE_BUTTON : SONG;
}
@Override @Override
public void onBindViewHolder(final ViewHolder holder, int position) { public void onBindViewHolder(final ViewHolder holder, int position) {
final Song song = dataSet.get(position); if(getItemViewType(position) == SONG) {
final Song song = dataSet.get(position - 1);
holder.songTitle.setText(song.title); holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName); holder.songInfo.setText(song.artistName);
Picasso.with(activity) Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId)) .load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art) .placeholder(R.drawable.default_album_art)
.into(holder.albumArt); .into(holder.albumArt);
} else {
int accentColor = Util.resolveColor(activity, R.attr.colorAccent);
holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase());
holder.songTitle.setTextColor(accentColor);
holder.songInfo.setVisibility(View.GONE);
holder.overflowButton.setVisibility(View.GONE);
holder.albumArt.setPadding(48, 48, 48, 48);
holder.albumArt.setColorFilter(accentColor);
holder.albumArt.setImageResource(R.drawable.ic_shuffle_white_48dp);
}
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return dataSet.size(); return dataSet.size() + 1;
} }
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@ -90,7 +112,12 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
itemView.setOnClickListener(new View.OnClickListener() { itemView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
MusicPlayerRemote.openQueue(dataSet, getPosition(), true); if (getItemViewType() == SHUFFLE_BUTTON) {
MusicPlayerRemote.openQueue(dataSet, new Random().nextInt(dataSet.size()), true);
MusicPlayerRemote.forceSetShuffleMode(activity, MusicService.SHUFFLE_MODE_SHUFFLE);
} else {
MusicPlayerRemote.openQueue(dataSet, getAdapterPosition() - 1, true);
}
} }
}); });
} }
@ -102,26 +129,27 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
final int position = getAdapterPosition();
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_delete_from_disk: case R.id.action_delete_from_disk:
DeleteSongsDialogHelper.getDialog(activity, dataSet.get(getAdapterPosition())).show(); DeleteSongsDialogHelper.getDialog(activity, dataSet.get(position)).show();
return true; return true;
case R.id.action_add_to_playlist: case R.id.action_add_to_playlist:
AddToPlaylistDialogHelper.getDialog(activity, dataSet.get(getAdapterPosition())).show(); AddToPlaylistDialogHelper.getDialog(activity, dataSet.get(position)).show();
return true; return true;
case R.id.action_play_next: case R.id.action_play_next:
MusicPlayerRemote.playNext(dataSet.get(getAdapterPosition())); MusicPlayerRemote.playNext(dataSet.get(position));
return true; return true;
case R.id.action_add_to_current_playing: case R.id.action_add_to_current_playing:
MusicPlayerRemote.enqueue(dataSet.get(getAdapterPosition())); MusicPlayerRemote.enqueue(dataSet.get(position));
return true; return true;
case R.id.action_tag_editor: case R.id.action_tag_editor:
Intent intent = new Intent(activity, SongTagEditorActivity.class); Intent intent = new Intent(activity, SongTagEditorActivity.class);
intent.putExtra(AppKeys.E_ID, dataSet.get(getAdapterPosition()).id); intent.putExtra(AppKeys.E_ID, dataSet.get(position).id);
activity.startActivity(intent); activity.startActivity(intent);
return true; return true;
case R.id.action_details: case R.id.action_details:
String songFilePath = SongFilePathLoader.getSongFilePath(activity, dataSet.get(getAdapterPosition()).id); String songFilePath = SongFilePathLoader.getSongFilePath(activity, dataSet.get(position).id);
File songFile = new File(songFilePath); File songFile = new File(songFilePath);
SongDetailDialogHelper.getDialog(activity, songFile).show(); SongDetailDialogHelper.getDialog(activity, songFile).show();
return true; return true;
@ -131,13 +159,13 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
}; };
if (activity instanceof AbsFabActivity) if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs); NavigationUtil.goToAlbum(activity, dataSet.get(position).albumId, albumPairs);
return true; return true;
case R.id.action_go_to_artist: case R.id.action_go_to_artist:
Pair[] artistPairs = null; Pair[] artistPairs = null;
if (activity instanceof AbsFabActivity) if (activity instanceof AbsFabActivity)
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs); artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs);
NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).artistId, artistPairs); NavigationUtil.goToArtist(activity, dataSet.get(position).artistId, artistPairs);
return true; return true;
} }
return false; return false;

View file

@ -216,6 +216,23 @@ public class MusicPlayerRemote {
return false; return false;
} }
public static boolean setShuffleMode(final int shuffleMode) {
if (musicService != null) {
musicService.setShuffleMode(shuffleMode);
return true;
} return false;
}
public static void forceSetShuffleMode(final Context context, final int shuffleMode){
if (musicService != null) {
musicService.setShuffleMode(shuffleMode);
} else {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putInt(AppKeys.SP_SHUFFLE_MODE, shuffleMode)
.apply();
}
}
public static void playNext(Song song) { public static void playNext(Song song) {
if (musicService != null) { if (musicService != null) {
musicService.addSong(getPosition() + 1, song); musicService.addSong(getPosition() + 1, song);

View file

@ -691,21 +691,18 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
} }
public void setShuffleMode(final int shuffleMode) { public void setShuffleMode(final int shuffleMode) {
PreferenceManager.getDefaultSharedPreferences(this).edit()
.putInt(AppKeys.SP_SHUFFLE_MODE, shuffleMode)
.apply();
switch (shuffleMode) { switch (shuffleMode) {
case SHUFFLE_MODE_SHUFFLE: case SHUFFLE_MODE_SHUFFLE:
this.shuffleMode = shuffleMode; this.shuffleMode = shuffleMode;
PreferenceManager.getDefaultSharedPreferences(this).edit()
.putInt(AppKeys.SP_SHUFFLE_MODE, shuffleMode)
.apply();
ShuffleHelper.makeShuffleList(this.playingQueue, getPosition()); ShuffleHelper.makeShuffleList(this.playingQueue, getPosition());
setPosition(0); setPosition(0);
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.SHUFFLE_MODE_CHANGED); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.SHUFFLE_MODE_CHANGED);
break; break;
case SHUFFLE_MODE_NONE: case SHUFFLE_MODE_NONE:
this.shuffleMode = shuffleMode; this.shuffleMode = shuffleMode;
PreferenceManager.getDefaultSharedPreferences(this).edit()
.putInt(AppKeys.SP_SHUFFLE_MODE, shuffleMode)
.apply();
playingQueue = new ArrayList<>(originalPlayingQueue); playingQueue = new ArrayList<>(originalPlayingQueue);
int newPosition = 0; int newPosition = 0;
for (Song song : playingQueue) { for (Song song : playingQueue) {

View file

@ -88,5 +88,6 @@
<string name="delete_songs_1">Delete\u0020</string> <string name="delete_songs_1">Delete\u0020</string>
<string name="delete_songs_2">\u0020songs?</string> <string name="delete_songs_2">\u0020songs?</string>
<string name="delete_warning">"Warning: This operation can not be undone."</string> <string name="delete_warning">"Warning: This operation can not be undone."</string>
<string name="shuffle_all">Shuffle all</string>
</resources> </resources>