From 84c13ccbf3daf7814099137f2cfa27957893c664 Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 30 Aug 2017 10:32:47 -0700 Subject: [PATCH] Support setRepeatMode (and move shuffle action to PlaybackController) ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=167013507 --- .../DefaultPlaybackController.java | 53 ++++++++++--- .../mediasession/MediaSessionConnector.java | 79 +++++++++++-------- .../RepeatModeActionProvider.java | 10 +-- .../mediasession/TimelineQueueNavigator.java | 5 -- 4 files changed, 93 insertions(+), 54 deletions(-) diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/DefaultPlaybackController.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/DefaultPlaybackController.java index e01d6a48db..95ebcde095 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/DefaultPlaybackController.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/DefaultPlaybackController.java @@ -21,6 +21,7 @@ import android.support.v4.media.session.PlaybackStateCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.util.RepeatModeUtil; /** * A default implementation of {@link MediaSessionConnector.PlaybackController}. @@ -40,33 +41,37 @@ public class DefaultPlaybackController implements MediaSessionConnector.Playback private static final long BASE_ACTIONS = PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PAUSE - | PlaybackStateCompat.ACTION_STOP; + | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE_ENABLED + | PlaybackStateCompat.ACTION_SET_REPEAT_MODE; protected final long rewindIncrementMs; protected final long fastForwardIncrementMs; + protected final int repeatToggleModes; /** * Creates a new instance. *

- * Equivalent to {@code DefaultPlaybackController( - * DefaultPlaybackController.DEFAULT_REWIND_MS, - * DefaultPlaybackController.DEFAULT_FAST_FORWARD_MS)}. + * Equivalent to {@code DefaultPlaybackController(DefaultPlaybackController.DEFAULT_REWIND_MS, + * DefaultPlaybackController.DEFAULT_FAST_FORWARD_MS, + * MediaSessionConnector.DEFAULT_REPEAT_TOGGLE_MODES)}. */ public DefaultPlaybackController() { - this(DEFAULT_REWIND_MS, DEFAULT_FAST_FORWARD_MS); + this(DEFAULT_REWIND_MS, DEFAULT_FAST_FORWARD_MS, + MediaSessionConnector.DEFAULT_REPEAT_TOGGLE_MODES); } /** * Creates a new instance with the given fast forward and rewind increments. - * - * @param rewindIncrementMs The rewind increment in milliseconds. A zero or negative value will + * @param rewindIncrementMs The rewind increment in milliseconds. A zero or negative value will * cause the rewind action to be disabled. * @param fastForwardIncrementMs The fast forward increment in milliseconds. A zero or negative - * value will cause the fast forward action to be removed. + * @param repeatToggleModes The available repeatToggleModes. */ - public DefaultPlaybackController(long rewindIncrementMs, long fastForwardIncrementMs) { + public DefaultPlaybackController(long rewindIncrementMs, long fastForwardIncrementMs, + @RepeatModeUtil.RepeatToggleModes int repeatToggleModes) { this.rewindIncrementMs = rewindIncrementMs; this.fastForwardIncrementMs = fastForwardIncrementMs; + this.repeatToggleModes = repeatToggleModes; } @Override @@ -127,6 +132,36 @@ public class DefaultPlaybackController implements MediaSessionConnector.Playback player.stop(); } + @Override + public void onSetShuffleMode(Player player, int shuffleMode) { + player.setShuffleModeEnabled(shuffleMode == PlaybackStateCompat.SHUFFLE_MODE_ALL + || shuffleMode == PlaybackStateCompat.SHUFFLE_MODE_GROUP); + } + + @Override + public void onSetRepeatMode(Player player, int repeatMode) { + int selectedExoPlayerRepeatMode = player.getRepeatMode(); + switch (repeatMode) { + case PlaybackStateCompat.REPEAT_MODE_ALL: + case PlaybackStateCompat.REPEAT_MODE_GROUP: + if ((repeatToggleModes & RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL) != 0) { + selectedExoPlayerRepeatMode = Player.REPEAT_MODE_ALL; + } + break; + case PlaybackStateCompat.REPEAT_MODE_ONE: + if ((repeatToggleModes & RepeatModeUtil.REPEAT_TOGGLE_MODE_ONE) != 0) { + selectedExoPlayerRepeatMode = Player.REPEAT_MODE_ONE; + } + break; + default: + selectedExoPlayerRepeatMode = Player.REPEAT_MODE_OFF; + break; + } + player.setRepeatMode(selectedExoPlayerRepeatMode); + } + + // CommandReceiver implementation. + @Override public String[] getCommands() { return null; diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index a64f163733..4c7ad123f3 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -39,6 +39,8 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.ErrorMessageProvider; +import com.google.android.exoplayer2.util.RepeatModeUtil; + import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -73,6 +75,13 @@ public final class MediaSessionConnector { ExoPlayerLibraryInfo.registerModule("goog.exo.mediasession"); } + /** + * The default repeat toggle modes which is the bitmask of + * {@link RepeatModeUtil#REPEAT_TOGGLE_MODE_ONE} and + * {@link RepeatModeUtil#REPEAT_TOGGLE_MODE_ALL}. + */ + public static final @RepeatModeUtil.RepeatToggleModes int DEFAULT_REPEAT_TOGGLE_MODES = + RepeatModeUtil.REPEAT_TOGGLE_MODE_ONE | RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL; 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; @@ -145,14 +154,17 @@ public final class MediaSessionConnector { long ACTIONS = PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_SEEK_TO | PlaybackStateCompat.ACTION_FAST_FORWARD | PlaybackStateCompat.ACTION_REWIND - | PlaybackStateCompat.ACTION_STOP; + | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_SET_REPEAT_MODE + | PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE_ENABLED; /** * Returns the actions which are supported by the controller. The supported actions must be a * bitmask combined out of {@link PlaybackStateCompat#ACTION_PLAY_PAUSE}, * {@link PlaybackStateCompat#ACTION_PLAY}, {@link PlaybackStateCompat#ACTION_PAUSE}, * {@link PlaybackStateCompat#ACTION_SEEK_TO}, {@link PlaybackStateCompat#ACTION_FAST_FORWARD}, - * {@link PlaybackStateCompat#ACTION_REWIND} and {@link PlaybackStateCompat#ACTION_STOP}. + * {@link PlaybackStateCompat#ACTION_REWIND}, {@link PlaybackStateCompat#ACTION_STOP}, + * {@link PlaybackStateCompat#ACTION_SET_REPEAT_MODE} and + * {@link PlaybackStateCompat#ACTION_SET_SHUFFLE_MODE_ENABLED}. * * @param player The player. * @return The bitmask of the supported media actions. @@ -182,6 +194,14 @@ public final class MediaSessionConnector { * See {@link MediaSessionCompat.Callback#onStop()}. */ void onStop(Player player); + /** + * See {@link MediaSessionCompat.Callback#onSetShuffleMode(int)}. + */ + void onSetShuffleMode(Player player, int shuffleMode); + /** + * See {@link MediaSessionCompat.Callback#onSetRepeatMode(int)}. + */ + void onSetRepeatMode(Player player, int repeatMode); } /** @@ -191,15 +211,13 @@ public final class MediaSessionConnector { public interface QueueNavigator extends CommandReceiver { long ACTIONS = PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM - | PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS - | PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE_ENABLED; + | PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; /** * Returns the actions which are supported by the navigator. The supported actions must be a * bitmask combined out of {@link PlaybackStateCompat#ACTION_SKIP_TO_QUEUE_ITEM}, * {@link PlaybackStateCompat#ACTION_SKIP_TO_NEXT}, - * {@link PlaybackStateCompat#ACTION_SKIP_TO_PREVIOUS}, - * {@link PlaybackStateCompat#ACTION_SET_SHUFFLE_MODE_ENABLED}. + * {@link PlaybackStateCompat#ACTION_SKIP_TO_PREVIOUS}. * * @param player The {@link Player}. * @return The bitmask of the supported media actions. @@ -241,10 +259,6 @@ public final class MediaSessionConnector { * See {@link MediaSessionCompat.Callback#onSkipToNext()}. */ void onSkipToNext(Player player); - /** - * See {@link MediaSessionCompat.Callback#onSetShuffleMode(int)}. - */ - void onSetShuffleMode(Player player, int shuffleMode); } /** @@ -429,8 +443,7 @@ public final class MediaSessionConnector { /** * Sets the {@link QueueNavigator} to handle queue navigation actions {@code ACTION_SKIP_TO_NEXT}, - * {@code ACTION_SKIP_TO_PREVIOUS}, {@code ACTION_SKIP_TO_QUEUE_ITEM} and - * {@code ACTION_SET_SHUFFLE_MODE_ENABLED}. + * {@code ACTION_SKIP_TO_PREVIOUS} and {@code ACTION_SKIP_TO_QUEUE_ITEM}. * * @param queueNavigator The queue navigator. */ @@ -736,6 +749,28 @@ public final class MediaSessionConnector { } } + @Override + public void onSetShuffleModeEnabled(boolean enabled) { + if (canDispatchToPlaybackController(PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE_ENABLED)) { + playbackController.onSetShuffleMode(player, enabled + ? PlaybackStateCompat.SHUFFLE_MODE_ALL : PlaybackStateCompat.SHUFFLE_MODE_NONE); + } + } + + @Override + public void onSetShuffleMode(int shuffleMode) { + if (canDispatchToPlaybackController(PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE_ENABLED)) { + playbackController.onSetShuffleMode(player, shuffleMode); + } + } + + @Override + public void onSetRepeatMode(int repeatMode) { + if (canDispatchToPlaybackController(PlaybackStateCompat.ACTION_SET_REPEAT_MODE)) { + playbackController.onSetRepeatMode(player, repeatMode); + } + } + @Override public void onSkipToNext() { if (canDispatchToQueueNavigator(PlaybackStateCompat.ACTION_SKIP_TO_NEXT)) { @@ -757,11 +792,6 @@ public final class MediaSessionConnector { } } - @Override - public void onSetRepeatMode(int repeatMode) { - // implemented as custom action - } - @Override public void onCustomAction(@NonNull String action, @Nullable Bundle extras) { Map actionMap = customActionMap; @@ -842,21 +872,6 @@ public final class MediaSessionConnector { } } - @Override - public void onSetShuffleModeEnabled(boolean enabled) { - if (canDispatchToQueueNavigator(PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE_ENABLED)) { - queueNavigator.onSetShuffleMode(player, enabled - ? PlaybackStateCompat.SHUFFLE_MODE_ALL : PlaybackStateCompat.SHUFFLE_MODE_NONE); - } - } - - @Override - public void onSetShuffleMode(int shuffleMode) { - if (canDispatchToQueueNavigator(PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE_ENABLED)) { - queueNavigator.onSetShuffleMode(player, shuffleMode); - } - } - @Override public void onAddQueueItem(MediaDescriptionCompat description) { if (queueEditor != null) { diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java index db0190de0f..b4cb3c73d0 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java @@ -25,12 +25,6 @@ import com.google.android.exoplayer2.util.RepeatModeUtil; */ public final class RepeatModeActionProvider implements MediaSessionConnector.CustomActionProvider { - /** - * The default repeat toggle modes. - */ - public static final @RepeatModeUtil.RepeatToggleModes int DEFAULT_REPEAT_TOGGLE_MODES = - RepeatModeUtil.REPEAT_TOGGLE_MODE_ONE | RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL; - private static final String ACTION_REPEAT_MODE = "ACTION_EXO_REPEAT_MODE"; private final Player player; @@ -44,13 +38,13 @@ public final class RepeatModeActionProvider implements MediaSessionConnector.Cus * Creates a new instance. *

* Equivalent to {@code RepeatModeActionProvider(context, player, - * RepeatModeActionProvider.DEFAULT_REPEAT_TOGGLE_MODES)}. + * MediaSessionConnector.DEFAULT_REPEAT_TOGGLE_MODES)}. * * @param context The context. * @param player The player on which to toggle the repeat mode. */ public RepeatModeActionProvider(Context context, Player player) { - this(context, player, DEFAULT_REPEAT_TOGGLE_MODES); + this(context, player, MediaSessionConnector.DEFAULT_REPEAT_TOGGLE_MODES); } /** diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java index 777949863d..0484c0b641 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java @@ -161,11 +161,6 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu } } - @Override - public void onSetShuffleMode(Player player, int shuffleMode) { - player.setShuffleModeEnabled(shuffleMode == PlaybackStateCompat.SHUFFLE_MODE_ALL); - } - // CommandReceiver implementation. @Override