aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java')
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java169
1 files changed, 138 insertions, 31 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java
index 456446f3..00bca833 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java
@@ -34,7 +34,10 @@ import android.media.session.PlaybackState;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
+import android.support.annotation.NonNull;
import android.support.v7.media.MediaRouter;
+import android.util.Log;
+import android.view.KeyEvent;
import java.util.ArrayList;
import java.util.List;
@@ -42,7 +45,9 @@ import java.util.List;
import github.daneren2005.dsub.R;
import github.daneren2005.dsub.activity.SubsonicActivity;
import github.daneren2005.dsub.activity.SubsonicFragmentActivity;
+import github.daneren2005.dsub.domain.Bookmark;
import github.daneren2005.dsub.domain.MusicDirectory;
+import github.daneren2005.dsub.domain.MusicDirectory.Entry;
import github.daneren2005.dsub.domain.Playlist;
import github.daneren2005.dsub.domain.SearchCritera;
import github.daneren2005.dsub.domain.SearchResult;
@@ -87,7 +92,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
Intent activityIntent = new Intent(context, SubsonicFragmentActivity.class);
activityIntent.putExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD, true);
- activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ activityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent activityPendingIntent = PendingIntent.getActivity(context, 0, activityIntent, 0);
mediaSession.setSessionActivity(activityPendingIntent);
@@ -116,8 +121,12 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
mediaSession.release();
}
+ private void setPlaybackState(int state) {
+ setPlaybackState(state, downloadService.getCurrentPlayingIndex(), downloadService.size());
+ }
+
@Override
- public void setPlaybackState(int state) {
+ public void setPlaybackState(int state, int index, int queueSize) {
PlaybackState.Builder builder = new PlaybackState.Builder();
int newState = PlaybackState.STATE_NONE;
@@ -141,11 +150,17 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
position = downloadService.getPlayerPosition();
}
builder.setState(newState, position, 1.0f);
- builder.setActions(getPlaybackActions());
-
DownloadFile downloadFile = downloadService.getCurrentPlaying();
+ Entry entry = null;
+ boolean isSong = true;
if(downloadFile != null) {
- MusicDirectory.Entry entry = downloadFile.getSong();
+ entry = downloadFile.getSong();
+ isSong = entry.isSong();
+ }
+
+ builder.setActions(getPlaybackActions(isSong, index, queueSize));
+
+ if(entry != null) {
addCustomActions(entry, builder);
builder.setActiveQueueItemId(entry.getId().hashCode());
}
@@ -156,7 +171,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
}
@Override
- public void updateMetadata(Context context, MusicDirectory.Entry currentSong) {
+ public void updateMetadata(Context context, Entry currentSong) {
setMetadata(currentSong, null);
if(currentSong != null && imageLoader != null) {
@@ -165,11 +180,11 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
}
@Override
- public void metadataChanged(MusicDirectory.Entry currentSong) {
+ public void metadataChanged(Entry currentSong) {
setPlaybackState(previousState);
}
- public void setMetadata(MusicDirectory.Entry currentSong, Bitmap bitmap) {
+ public void setMetadata(Entry currentSong, Bitmap bitmap) {
MediaMetadata.Builder builder = new MediaMetadata.Builder();
builder.putString(MediaMetadata.METADATA_KEY_ARTIST, (currentSong == null) ? null : currentSong.getArtist())
.putString(MediaMetadata.METADATA_KEY_ALBUM, (currentSong == null) ? null : currentSong.getAlbum())
@@ -189,7 +204,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
}
@Override
- public void updateAlbumArt(MusicDirectory.Entry currentSong, Bitmap bitmap) {
+ public void updateAlbumArt(Entry currentSong, Bitmap bitmap) {
setMetadata(currentSong, bitmap);
}
@@ -208,7 +223,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
List<MediaSession.QueueItem> queue = new ArrayList<>();
for(DownloadFile file: playlist) {
- MusicDirectory.Entry entry = file.getSong();
+ Entry entry = file.getSong();
MediaDescription description = new MediaDescription.Builder()
.setMediaId(entry.getId())
@@ -227,24 +242,27 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
return mediaSession;
}
- protected long getPlaybackActions() {
+ protected long getPlaybackActions(boolean isSong, int currentIndex, int size) {
long actions = PlaybackState.ACTION_PLAY |
PlaybackState.ACTION_PAUSE |
PlaybackState.ACTION_SEEK_TO |
PlaybackState.ACTION_SKIP_TO_QUEUE_ITEM;
- int currentIndex = downloadService.getCurrentPlayingIndex();
- int size = downloadService.size();
- if(currentIndex > 0) {
+ if(isSong) {
+ if (currentIndex > 0) {
+ actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS;
+ }
+ if (currentIndex < size - 1) {
+ actions |= PlaybackState.ACTION_SKIP_TO_NEXT;
+ }
+ } else {
actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS;
- }
- if(currentIndex < size - 1) {
actions |= PlaybackState.ACTION_SKIP_TO_NEXT;
}
return actions;
}
- protected void addCustomActions(MusicDirectory.Entry currentSong, PlaybackState.Builder builder) {
+ protected void addCustomActions(Entry currentSong, PlaybackState.Builder builder) {
Bundle showOnWearExtras = new Bundle();
showOnWearExtras.putBoolean(SHOW_ON_WEAR, true);
@@ -296,7 +314,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
SearchResult results = musicService.search(searchCritera, downloadService, null);
if(results.hasArtists()) {
- playFromParent(new MusicDirectory.Entry(results.getArtists().get(0)));
+ playFromParent(new Entry(results.getArtists().get(0)));
} else if(results.hasAlbums()) {
playFromParent(results.getAlbums().get(0));
} else if(results.hasSongs()) {
@@ -307,13 +325,13 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
return null;
}
-
- private void playFromParent(MusicDirectory.Entry parent) throws Exception {
- List<MusicDirectory.Entry> songs = new ArrayList<>();
+
+ private void playFromParent(Entry parent) throws Exception {
+ List<Entry> songs = new ArrayList<>();
getSongsRecursively(parent, songs);
playSongs(songs);
}
- private void getSongsRecursively(MusicDirectory.Entry parent, List<MusicDirectory.Entry> songs) throws Exception {
+ private void getSongsRecursively(Entry parent, List<Entry> songs) throws Exception {
MusicDirectory musicDirectory;
if(Util.isTagBrowsing(downloadService) && !Util.isOffline(downloadService)) {
musicDirectory = musicService.getAlbum(parent.getId(), parent.getTitle(), false, downloadService, this);
@@ -321,7 +339,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
musicDirectory = musicService.getMusicDirectory(parent.getId(), parent.getTitle(), false, downloadService, this);
}
- for (MusicDirectory.Entry dir : musicDirectory.getChildren(true, false)) {
+ for (Entry dir : musicDirectory.getChildren(true, false)) {
if (dir.getRating() == 1) {
continue;
}
@@ -329,7 +347,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
getSongsRecursively(dir, songs);
}
- for (MusicDirectory.Entry song : musicDirectory.getChildren(false, true)) {
+ for (Entry song : musicDirectory.getChildren(false, true)) {
if (!song.isVideo() && song.getRating() != 1) {
songs.add(song);
}
@@ -349,24 +367,75 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
}
}.execute();
}
+ private void playMusicDirectory(Entry dir, boolean shuffle, boolean append, boolean playFromBookmark) {
+ playMusicDirectory(dir.getId(), shuffle, append, playFromBookmark);
+ }
+ private void playMusicDirectory(final String dirId, final boolean shuffle, final boolean append, final boolean playFromBookmark) {
+ new SilentServiceTask<Void>(downloadService) {
+ @Override
+ protected Void doInBackground(MusicService musicService) throws Throwable {
+ MusicDirectory musicDirectory;
+ if(Util.isTagBrowsing(downloadService) && !Util.isOffline(downloadService)) {
+ musicDirectory = musicService.getAlbum(dirId, "dir", false, downloadService, null);
+ } else {
+ musicDirectory = musicService.getMusicDirectory(dirId, "dir", false, downloadService, null);
+ }
+
+ List<Entry> playEntries = new ArrayList<>();
+ List<Entry> allEntries = musicDirectory.getChildren(false, true);
+ for(Entry song: allEntries) {
+ if (!song.isVideo() && song.getRating() != 1) {
+ playEntries.add(song);
+ }
+ }
+ playSongs(playEntries, shuffle, append, playFromBookmark);
+
+ return null;
+ }
+ }.execute();
+ }
+
+ private void playSong(Entry entry) {
- private void playSong(MusicDirectory.Entry entry) {
- List<MusicDirectory.Entry> entries = new ArrayList<>();
+ }
+ private void playSong(Entry entry, boolean resumeFromBookmark) {
+ List<Entry> entries = new ArrayList<>();
entries.add(entry);
- playSongs(entries);
+ playSongs(entries, false, false, resumeFromBookmark);
}
- private void playSongs(List<MusicDirectory.Entry> entries) {
+ private void playSongs(List<Entry> entries) {
playSongs(entries, false, false);
}
- private void playSongs(List<MusicDirectory.Entry> entries, boolean shuffle, boolean append) {
+ private void playSongs(List<Entry> entries, boolean shuffle, boolean append) {
+ playSongs(entries, shuffle, append, false);
+ }
+ private void playSongs(List<Entry> entries, boolean shuffle, boolean append, boolean resumeFromBookmark) {
if(!append) {
downloadService.clear();
}
- downloadService.download(entries, false, true, false, shuffle);
+
+ int startIndex = 0;
+ int startPosition = 0;
+ if(resumeFromBookmark) {
+ int bookmarkIndex = 0;
+ for(Entry entry: entries) {
+ if(entry.getBookmark() != null) {
+ Bookmark bookmark = entry.getBookmark();
+ startIndex = bookmarkIndex;
+ startPosition = bookmark.getPosition();
+ break;
+ }
+ bookmarkIndex++;
+ }
+ }
+
+ downloadService.download(entries, false, !append, false, shuffle, startIndex, startPosition);
}
private void noResults() {
-
+ // Keep getting emails from Google that not playing something with no results is bad
+ downloadService.clear();
+ downloadService.setShufflePlayEnabled(true);
}
private class EventCallback extends MediaSession.Callback {
@@ -415,6 +484,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
public void onPlayFromSearch (String query, Bundle extras) {
// User just asked to playing something
if("".equals(query)) {
+ downloadService.clear();
downloadService.setShufflePlayEnabled(true);
} else {
String mediaFocus = extras.getString(MediaStore.EXTRA_MEDIA_FOCUS);
@@ -435,6 +505,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
editor.putString(Constants.PREFERENCES_KEY_SHUFFLE_GENRE, genre);
editor.commit();
+ downloadService.clear();
downloadService.setShufflePlayEnabled(true);
}
else {
@@ -467,6 +538,7 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
}
}
+ @Override
public void onPlayFromMediaId (String mediaId, Bundle extras) {
if(extras == null) {
return;
@@ -474,11 +546,33 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
boolean shuffle = extras.getBoolean(Constants.INTENT_EXTRA_NAME_SHUFFLE, false);
boolean playLast = extras.getBoolean(Constants.INTENT_EXTRA_PLAY_LAST, false);
+ Entry entry = (Entry) extras.getSerializable(Constants.INTENT_EXTRA_ENTRY);
+
String playlistId = extras.getString(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID, null);
if(playlistId != null) {
Playlist playlist = new Playlist(playlistId, null);
playPlaylist(playlist, shuffle, playLast);
}
+ String musicDirectoryId = extras.getString(Constants.INTENT_EXTRA_NAME_ID);
+ if(musicDirectoryId != null) {
+ Entry dir = new Entry(musicDirectoryId);
+ playMusicDirectory(dir, shuffle, playLast, true);
+ }
+
+ String podcastId = extras.getString(Constants.INTENT_EXTRA_NAME_PODCAST_ID, null);
+ if(podcastId != null) {
+ playSong(entry, true);
+ }
+
+ // Currently only happens when playing bookmarks so we should be looking up parent
+ String childId = extras.getString(Constants.INTENT_EXTRA_NAME_CHILD_ID, null);
+ if(childId != null) {
+ if(Util.isTagBrowsing(downloadService) && !Util.isOffline(downloadService)) {
+ playMusicDirectory(entry.getAlbumId(), shuffle, playLast, true);
+ } else {
+ playMusicDirectory(entry.getParent(), shuffle, playLast, true);
+ }
+ }
}
@Override
@@ -491,5 +585,18 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
downloadService.toggleStarred();
}
}
+
+ @Override
+ public boolean onMediaButtonEvent(@NonNull Intent mediaButtonIntent) {
+ if (getMediaSession() != null && Intent.ACTION_MEDIA_BUTTON.equals(mediaButtonIntent.getAction())) {
+ KeyEvent keyEvent = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
+ if (keyEvent != null) {
+ downloadService.handleKeyEvent(keyEvent);
+ return true;
+ }
+ }
+
+ return super.onMediaButtonEvent(mediaButtonIntent);
+ }
}
}