From 54414e7d3ee70c35a3023b0c3b2e2b329a15912c Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Wed, 5 Apr 2017 16:39:22 -0700 Subject: [PATCH] Fixes issue #112 - Crash on too many songs in App Shortcut playlist Instead of passing all songs in an intent extra, pass the Playlist which is then used to load the songs in MusicService --- .../AppShortcutLauncherActivity.java | 27 +++++----- .../smartplaylist/ShuffleAllPlaylist.java | 54 +++++++++++++++++++ .../gramophone/service/MusicService.java | 54 +++++++++++++++---- app/src/main/res/values/strings.xml | 1 + 4 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/ShuffleAllPlaylist.java diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index b6b72cc8..51f19deb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -8,15 +8,14 @@ import android.support.annotation.IntDef; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.LastAddedShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.ShuffleAllShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.TopTracksShortcutType; -import com.kabouzeid.gramophone.loader.LastAddedLoader; -import com.kabouzeid.gramophone.loader.SongLoader; -import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader; -import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.model.Playlist; +import com.kabouzeid.gramophone.model.smartplaylist.LastAddedPlaylist; +import com.kabouzeid.gramophone.model.smartplaylist.MyTopTracksPlaylist; +import com.kabouzeid.gramophone.model.smartplaylist.ShuffleAllPlaylist; import com.kabouzeid.gramophone.service.MusicService; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; /** * @author Adrian Campos @@ -46,18 +45,18 @@ public class AppShortcutLauncherActivity extends Activity { switch (shortcutType) { case SHORTCUT_TYPE_SHUFFLE_ALL: - startServiceWithSongs(MusicService.SHUFFLE_MODE_SHUFFLE, - SongLoader.getAllSongs(getApplicationContext())); + startServiceWithPlaylist(MusicService.SHUFFLE_MODE_SHUFFLE, + new ShuffleAllPlaylist(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, ShuffleAllShortcutType.getId()); break; case SHORTCUT_TYPE_TOP_TRACKS: - startServiceWithSongs(MusicService.SHUFFLE_MODE_NONE, - TopAndRecentlyPlayedTracksLoader.getTopTracks(getApplicationContext())); + startServiceWithPlaylist(MusicService.SHUFFLE_MODE_NONE, + new MyTopTracksPlaylist(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.getId()); break; case SHORTCUT_TYPE_LAST_ADDED: - startServiceWithSongs(MusicService.SHUFFLE_MODE_NONE, - LastAddedLoader.getLastAddedSongs(getApplicationContext())); + startServiceWithPlaylist(MusicService.SHUFFLE_MODE_NONE, + new LastAddedPlaylist(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.getId()); break; } @@ -65,12 +64,12 @@ public class AppShortcutLauncherActivity extends Activity { finish(); } - private void startServiceWithSongs(int shuffleMode, ArrayList songs) { + private void startServiceWithPlaylist(int shuffleMode, Playlist playlist) { Intent intent = new Intent(this, MusicService.class); - intent.setAction(MusicService.ACTION_PLAY); + intent.setAction(MusicService.ACTION_PLAY_PLAYLIST); Bundle bundle = new Bundle(); - bundle.putParcelableArrayList(MusicService.INTENT_EXTRA_SONGS, songs); + bundle.putParcelable(MusicService.INTENT_EXTRA_PLAYLIST, playlist); bundle.putInt(MusicService.INTENT_EXTRA_SHUFFLE_MODE, shuffleMode); intent.putExtras(bundle); diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/ShuffleAllPlaylist.java b/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/ShuffleAllPlaylist.java new file mode 100644 index 00000000..d9fc3013 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/ShuffleAllPlaylist.java @@ -0,0 +1,54 @@ +package com.kabouzeid.gramophone.model.smartplaylist; + +import android.content.Context; +import android.os.Parcel; +import android.support.annotation.NonNull; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.loader.SongLoader; +import com.kabouzeid.gramophone.model.Song; + +import java.util.ArrayList; + +public class ShuffleAllPlaylist extends AbsSmartPlaylist { + + public ShuffleAllPlaylist(@NonNull Context context) { + super(context.getString(R.string.shuffle_all), R.drawable.ic_shuffle_white_24dp); + } + + @NonNull + @Override + public ArrayList getSongs(@NonNull Context context) { + return SongLoader.getAllSongs(context); + } + + @Override + public void clear(@NonNull Context context) { + //Can't clear all songs. Don't do anything here? + } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + } + + protected ShuffleAllPlaylist(Parcel in) { + super(in); + } + + public static final Creator CREATOR = new Creator() { + public ShuffleAllPlaylist createFromParcel(Parcel source) { + return new ShuffleAllPlaylist(source); + } + + public ShuffleAllPlaylist[] newArray(int size) { + return new ShuffleAllPlaylist[size]; + } + }; +} 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 83efdc80..fda4539b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -46,7 +46,10 @@ import com.kabouzeid.gramophone.glide.BlurTransformation; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.helper.ShuffleHelper; import com.kabouzeid.gramophone.helper.StopWatch; +import com.kabouzeid.gramophone.loader.PlaylistSongLoader; +import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; import com.kabouzeid.gramophone.provider.HistoryStore; import com.kabouzeid.gramophone.provider.MusicPlaybackQueueStore; import com.kabouzeid.gramophone.provider.SongPlayCountStore; @@ -74,12 +77,14 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP public static final String ACTION_TOGGLE_PAUSE = PHONOGRAPH_PACKAGE_NAME + ".togglepause"; public static final String ACTION_PLAY = PHONOGRAPH_PACKAGE_NAME + ".play"; + public static final String ACTION_PLAY_PLAYLIST = PHONOGRAPH_PACKAGE_NAME + ".play.playlist"; public static final String ACTION_PAUSE = PHONOGRAPH_PACKAGE_NAME + ".pause"; public static final String ACTION_STOP = PHONOGRAPH_PACKAGE_NAME + ".stop"; public static final String ACTION_SKIP = PHONOGRAPH_PACKAGE_NAME + ".skip"; public static final String ACTION_REWIND = PHONOGRAPH_PACKAGE_NAME + ".rewind"; public static final String ACTION_QUIT = PHONOGRAPH_PACKAGE_NAME + ".quitservice"; public static final String INTENT_EXTRA_SONGS = PHONOGRAPH_PACKAGE_NAME + ".intentextra.songs"; + public static final String INTENT_EXTRA_PLAYLIST = PHONOGRAPH_PACKAGE_NAME + "intentextra.playlist"; public static final String INTENT_EXTRA_SHUFFLE_MODE = PHONOGRAPH_PACKAGE_NAME + ".intentextra.shufflemode"; public static final String APP_WIDGET_UPDATE = PHONOGRAPH_PACKAGE_NAME + ".appwidgetupdate"; @@ -297,20 +302,29 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP pause(); break; case ACTION_PLAY: + //Load songs from intent ArrayList songs = intent.getParcelableArrayListExtra(INTENT_EXTRA_SONGS); - if (songs != null && !songs.isEmpty()) { - int shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode()); - if (intent.hasExtra(INTENT_EXTRA_SHUFFLE_MODE) && intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, 0) == SHUFFLE_MODE_SHUFFLE) { - int startPosition = 0; - if (!songs.isEmpty()) { - startPosition = new Random().nextInt(songs.size()); - } - openQueue(songs, startPosition, false); - setShuffleMode(shuffleMode); + + //Play songs with the intent's shuffle mode, if it has one + playSongs(songs, + intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode())); + break; + case ACTION_PLAY_PLAYLIST: + //Load playlist from intent + Playlist playlist = intent.getParcelableExtra(INTENT_EXTRA_PLAYLIST); + if (playlist != null) { + //Get songs from playlist + ArrayList playlistSongs; + if (playlist instanceof AbsSmartPlaylist) { + playlistSongs = ((AbsSmartPlaylist) playlist).getSongs(getApplicationContext()); } else { - openQueue(songs, 0, false); + //noinspection unchecked + playlistSongs = (ArrayList) (List) PlaylistSongLoader.getPlaylistSongList(getApplicationContext(), playlist.id); } - play(); + + //Play songs with the intent's shuffle mode, if it has one + playSongs(playlistSongs, + intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode())); } else { Toast.makeText(getApplicationContext(), R.string.no_songs_in_playlist, Toast.LENGTH_LONG).show(); } @@ -860,6 +874,24 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP } } + public void playSongs(ArrayList songs, int shuffleMode) { + if (songs != null && !songs.isEmpty()) { + if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { + int startPosition = 0; + if (!songs.isEmpty()) { + startPosition = new Random().nextInt(songs.size()); + } + openQueue(songs, startPosition, false); + setShuffleMode(shuffleMode); + } else { + openQueue(songs, 0, false); + } + play(); + } else { + Toast.makeText(getApplicationContext(), R.string.no_songs_in_playlist, Toast.LENGTH_LONG).show(); + } + } + public void playPreviousSong(boolean force) { playSongAt(getPreviousPosition(force)); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e3d2be94..feb01126 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -181,6 +181,7 @@ Favorites Last added History + Shuffle All My top tracks Remove cover Download from Last.fm