diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java index 9cc1cb09..6cd70df1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java @@ -23,21 +23,27 @@ import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.model.DataBaseChangedEvent; 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.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.kabouzeid.gramophone.util.Util; import com.squareup.otto.Subscribe; import com.squareup.picasso.Picasso; import java.io.File; import java.util.List; +import java.util.Random; /** * Created by karim on 27.11.14. */ public class SongAdapter extends RecyclerView.Adapter { 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 List dataSet; @@ -56,22 +62,38 @@ public class SongAdapter extends RecyclerView.Adapter { return new ViewHolder(view); } + @Override + public int getItemViewType(int position) { + return position == 0 ? SHUFFLE_BUTTON : SONG; + } + @Override 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.songInfo.setText(song.artistName); + holder.songTitle.setText(song.title); + holder.songInfo.setText(song.artistName); - Picasso.with(activity) - .load(MusicUtil.getAlbumArtUri(song.albumId)) - .placeholder(R.drawable.default_album_art) - .into(holder.albumArt); + Picasso.with(activity) + .load(MusicUtil.getAlbumArtUri(song.albumId)) + .placeholder(R.drawable.default_album_art) + .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 public int getItemCount() { - return dataSet.size(); + return dataSet.size() + 1; } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @@ -90,7 +112,12 @@ public class SongAdapter extends RecyclerView.Adapter { itemView.setOnClickListener(new View.OnClickListener() { @Override 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 { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { + final int position = getAdapterPosition(); switch (item.getItemId()) { case R.id.action_delete_from_disk: - DeleteSongsDialogHelper.getDialog(activity, dataSet.get(getAdapterPosition())).show(); + DeleteSongsDialogHelper.getDialog(activity, dataSet.get(position)).show(); return true; case R.id.action_add_to_playlist: - AddToPlaylistDialogHelper.getDialog(activity, dataSet.get(getAdapterPosition())).show(); + AddToPlaylistDialogHelper.getDialog(activity, dataSet.get(position)).show(); return true; case R.id.action_play_next: - MusicPlayerRemote.playNext(dataSet.get(getAdapterPosition())); + MusicPlayerRemote.playNext(dataSet.get(position)); return true; case R.id.action_add_to_current_playing: - MusicPlayerRemote.enqueue(dataSet.get(getAdapterPosition())); + MusicPlayerRemote.enqueue(dataSet.get(position)); return true; case R.id.action_tag_editor: 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); return true; 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); SongDetailDialogHelper.getDialog(activity, songFile).show(); return true; @@ -131,13 +159,13 @@ public class SongAdapter extends RecyclerView.Adapter { }; if (activity instanceof AbsFabActivity) albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); - NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs); + NavigationUtil.goToAlbum(activity, dataSet.get(position).albumId, albumPairs); return true; case R.id.action_go_to_artist: Pair[] artistPairs = null; if (activity instanceof AbsFabActivity) artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs); - NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).artistId, artistPairs); + NavigationUtil.goToArtist(activity, dataSet.get(position).artistId, artistPairs); return true; } return false; diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 35cca4f3..bad323b4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -216,6 +216,23 @@ public class MusicPlayerRemote { 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) { if (musicService != null) { musicService.addSong(getPosition() + 1, song); diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 3d941ab9..284f735e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -691,21 +691,18 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe } public void setShuffleMode(final int shuffleMode) { + PreferenceManager.getDefaultSharedPreferences(this).edit() + .putInt(AppKeys.SP_SHUFFLE_MODE, shuffleMode) + .apply(); switch (shuffleMode) { case SHUFFLE_MODE_SHUFFLE: this.shuffleMode = shuffleMode; - PreferenceManager.getDefaultSharedPreferences(this).edit() - .putInt(AppKeys.SP_SHUFFLE_MODE, shuffleMode) - .apply(); ShuffleHelper.makeShuffleList(this.playingQueue, getPosition()); setPosition(0); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.SHUFFLE_MODE_CHANGED); break; case SHUFFLE_MODE_NONE: this.shuffleMode = shuffleMode; - PreferenceManager.getDefaultSharedPreferences(this).edit() - .putInt(AppKeys.SP_SHUFFLE_MODE, shuffleMode) - .apply(); playingQueue = new ArrayList<>(originalPlayingQueue); int newPosition = 0; for (Song song : playingQueue) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4ec9ab37..0214d3a7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -88,5 +88,6 @@ Delete\u0020 \u0020songs? "Warning: This operation can not be undone." + Shuffle all