set mediaSession flags properly and keep queue in sync when timeline changes

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=164774783
This commit is contained in:
bachinger 2017-08-09 14:35:38 -07:00 committed by Oliver Woodman
parent 0d11ebdf2d
commit ab277675a1

View File

@ -74,6 +74,10 @@ public final class MediaSessionConnector {
} }
public static final String EXTRAS_PITCH = "EXO_PITCH"; public static final String EXTRAS_PITCH = "EXO_PITCH";
private static final int BASE_MEDIA_SESSION_FLAGS = MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
| MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS;
private static final int EDITOR_MEDIA_SESSION_FLAGS = BASE_MEDIA_SESSION_FLAGS
| MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS;
/** /**
* Interface to which playback preparation actions are delegated. * Interface to which playback preparation actions are delegated.
@ -308,7 +312,6 @@ public final class MediaSessionConnector {
private Player player; private Player player;
private CustomActionProvider[] customActionProviders; private CustomActionProvider[] customActionProviders;
private int currentWindowIndex;
private Map<String, CustomActionProvider> customActionMap; private Map<String, CustomActionProvider> customActionMap;
private ErrorMessageProvider<? super ExoPlaybackException> errorMessageProvider; private ErrorMessageProvider<? super ExoPlaybackException> errorMessageProvider;
private PlaybackPreparer playbackPreparer; private PlaybackPreparer playbackPreparer;
@ -359,8 +362,7 @@ public final class MediaSessionConnector {
this.handler = new Handler(Looper.myLooper() != null ? Looper.myLooper() this.handler = new Handler(Looper.myLooper() != null ? Looper.myLooper()
: Looper.getMainLooper()); : Looper.getMainLooper());
this.doMaintainMetadata = doMaintainMetadata; this.doMaintainMetadata = doMaintainMetadata;
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS mediaSession.setFlags(BASE_MEDIA_SESSION_FLAGS);
| MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaController = mediaSession.getController(); mediaController = mediaSession.getController();
mediaSessionCallback = new MediaSessionCallback(); mediaSessionCallback = new MediaSessionCallback();
exoPlayerEventListener = new ExoPlayerEventListener(); exoPlayerEventListener = new ExoPlayerEventListener();
@ -424,6 +426,8 @@ public final class MediaSessionConnector {
*/ */
public void setQueueEditor(QueueEditor queueEditor) { public void setQueueEditor(QueueEditor queueEditor) {
this.queueEditor = queueEditor; this.queueEditor = queueEditor;
mediaSession.setFlags(queueEditor == null ? BASE_MEDIA_SESSION_FLAGS
: EDITOR_MEDIA_SESSION_FLAGS);
} }
private void updateMediaSessionPlaybackState() { private void updateMediaSessionPlaybackState() {
@ -574,11 +578,20 @@ public final class MediaSessionConnector {
private class ExoPlayerEventListener implements Player.EventListener { private class ExoPlayerEventListener implements Player.EventListener {
private int currentWindowIndex;
private int currentWindowCount;
@Override @Override
public void onTimelineChanged(Timeline timeline, Object manifest) { public void onTimelineChanged(Timeline timeline, Object manifest) {
if (queueNavigator != null) { if (queueNavigator != null) {
queueNavigator.onTimelineChanged(player); queueNavigator.onTimelineChanged(player);
} }
int windowCount = player.getCurrentTimeline().getWindowCount();
if (currentWindowCount != windowCount) {
// active queue item and queue navigation actions may need to be updated
updateMediaSessionPlaybackState();
}
currentWindowCount = windowCount;
currentWindowIndex = player.getCurrentWindowIndex(); currentWindowIndex = player.getCurrentWindowIndex();
updateMediaSessionMetadata(); updateMediaSessionMetadata();
} }