From 8ec757ad2bca4280fbfe8d83a49a876a4eccb1cb Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 9 Nov 2018 05:33:57 -0800 Subject: [PATCH] Some MediaSessionConnector simplifications - Simplify logic for dispatching to the rating callback - Simplify CommandReceiver by removing getCommands. Simply calling receivers is simpler, and more flexible because it doesn't force implementations to define a static set of things that they handle up front. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=220788423 --- .../DefaultPlaybackController.java | 9 +--- .../mediasession/MediaSessionConnector.java | 49 +++++++------------ .../ext/mediasession/TimelineQueueEditor.java | 12 ++--- .../mediasession/TimelineQueueNavigator.java | 9 ++-- 4 files changed, 29 insertions(+), 50 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 fbc4a39ff2..655fc878ba 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 @@ -151,13 +151,8 @@ public class DefaultPlaybackController implements MediaSessionConnector.Playback // CommandReceiver implementation. @Override - public String[] getCommands() { - return null; - } - - @Override - public void onCommand(Player player, String command, Bundle extras, ResultReceiver cb) { - // Do nothing. + public boolean onCommand(Player player, String command, Bundle extras, ResultReceiver cb) { + return false; } } 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 b24c936f1a..16dc40d1e9 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 @@ -40,6 +40,7 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ErrorMessageProvider; import com.google.android.exoplayer2.util.Util; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -85,11 +86,11 @@ public final class MediaSessionConnector { /** Receiver of media commands sent by a media controller. */ public interface CommandReceiver { /** - * Returns the commands the receiver handles, or {@code null} if no commands need to be handled. + * See {@link MediaSessionCompat.Callback#onCommand(String, Bundle, ResultReceiver)}. + * + * @return Whether the command was handled by the receiver. */ - String[] getCommands(); - /** See {@link MediaSessionCompat.Callback#onCommand(String, Bundle, ResultReceiver)}. */ - void onCommand(Player player, String command, Bundle extras, ResultReceiver cb); + boolean onCommand(Player player, String command, Bundle extras, ResultReceiver cb); } /** Interface to which playback preparation actions are delegated. */ @@ -247,8 +248,6 @@ public final class MediaSessionConnector { /** Callback receiving a user rating for the active media item. */ public interface RatingCallback extends CommandReceiver { - long ACTIONS = PlaybackStateCompat.ACTION_SET_RATING; - /** See {@link MediaSessionCompat.Callback#onSetRating(RatingCompat)}. */ void onSetRating(Player player, RatingCompat rating); @@ -297,7 +296,7 @@ public final class MediaSessionConnector { private final ExoPlayerEventListener exoPlayerEventListener; private final MediaSessionCallback mediaSessionCallback; private final PlaybackController playbackController; - private final Map commandMap; + private final ArrayList commandReceivers; private Player player; private CustomActionProvider[] customActionProviders; @@ -385,7 +384,7 @@ public final class MediaSessionConnector { mediaSessionCallback = new MediaSessionCallback(); exoPlayerEventListener = new ExoPlayerEventListener(); customActionMap = Collections.emptyMap(); - commandMap = new HashMap<>(); + commandReceivers = new ArrayList<>(); registerCommandReceiver(playbackController); } @@ -593,19 +592,13 @@ public final class MediaSessionConnector { } private void registerCommandReceiver(CommandReceiver commandReceiver) { - if (commandReceiver != null && commandReceiver.getCommands() != null) { - for (String command : commandReceiver.getCommands()) { - commandMap.put(command, commandReceiver); - } + if (!commandReceivers.contains(commandReceiver)) { + commandReceivers.add(commandReceiver); } } private void unregisterCommandReceiver(CommandReceiver commandReceiver) { - if (commandReceiver != null && commandReceiver.getCommands() != null) { - for (String command : commandReceiver.getCommands()) { - commandMap.remove(command); - } - } + commandReceivers.remove(commandReceiver); } private long buildPlaybackActions() { @@ -619,7 +612,7 @@ public final class MediaSessionConnector { (QueueNavigator.ACTIONS & queueNavigator.getSupportedQueueNavigatorActions(player)); } if (ratingCallback != null) { - actions |= RatingCallback.ACTIONS; + actions |= PlaybackStateCompat.ACTION_SET_RATING; } return actions; } @@ -642,10 +635,6 @@ public final class MediaSessionConnector { && (playbackPreparer.getSupportedPrepareActions() & PlaybackPreparer.ACTIONS & action) != 0; } - private boolean canDispatchToRatingCallback(long action) { - return ratingCallback != null && (RatingCallback.ACTIONS & action) != 0; - } - private boolean canDispatchToPlaybackController(long action) { return (playbackController.getSupportedPlaybackActions(player) & PlaybackController.ACTIONS @@ -913,18 +902,18 @@ public final class MediaSessionConnector { @Override public void onCustomAction(@NonNull String action, @Nullable Bundle extras) { - Map actionMap = customActionMap; - if (actionMap.containsKey(action)) { - actionMap.get(action).onCustomAction(action, extras); + if (customActionMap.containsKey(action)) { + customActionMap.get(action).onCustomAction(action, extras); invalidateMediaSessionPlaybackState(); } } @Override public void onCommand(String command, Bundle extras, ResultReceiver cb) { - CommandReceiver commandReceiver = commandMap.get(command); - if (commandReceiver != null) { - commandReceiver.onCommand(player, command, extras, cb); + for (int i = 0; i < commandReceivers.size(); i++) { + if (commandReceivers.get(i).onCommand(player, command, extras, cb)) { + return; + } } } @@ -993,14 +982,14 @@ public final class MediaSessionConnector { @Override public void onSetRating(RatingCompat rating) { - if (canDispatchToRatingCallback(PlaybackStateCompat.ACTION_SET_RATING)) { + if (ratingCallback != null) { ratingCallback.onSetRating(player, rating); } } @Override public void onSetRating(RatingCompat rating, Bundle extras) { - if (canDispatchToRatingCallback(PlaybackStateCompat.ACTION_SET_RATING)) { + if (ratingCallback != null) { ratingCallback.onSetRating(player, rating, extras); } } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java index 4f9c553a15..ab296afad7 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java @@ -193,20 +193,18 @@ public final class TimelineQueueEditor // CommandReceiver implementation. - @NonNull @Override - public String[] getCommands() { - return new String[] {COMMAND_MOVE_QUEUE_ITEM}; - } - - @Override - public void onCommand(Player player, String command, Bundle extras, ResultReceiver cb) { + public boolean onCommand(Player player, String command, Bundle extras, ResultReceiver cb) { + if (!COMMAND_MOVE_QUEUE_ITEM.equals(command)) { + return false; + } int from = extras.getInt(EXTRA_FROM_INDEX, C.INDEX_UNSET); int to = extras.getInt(EXTRA_TO_INDEX, C.INDEX_UNSET); if (from != C.INDEX_UNSET && to != C.INDEX_UNSET) { queueDataAdapter.move(from, to); queueMediaSource.moveMediaSource(from, to); } + return true; } } 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 d55f8e04f0..53f784e021 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 @@ -171,14 +171,11 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu // CommandReceiver implementation. @Override - public String[] getCommands() { - return null; + public boolean onCommand(Player player, String command, Bundle extras, ResultReceiver cb) { + return false; } - @Override - public void onCommand(Player player, String command, Bundle extras, ResultReceiver cb) { - // Do nothing. - } + // Helper methods. private void publishFloatingQueueWindow(Player player) { if (player.getCurrentTimeline().isEmpty()) {