From 9fc3ea79a122bc63ae9b1bdc5cade3584de563d6 Mon Sep 17 00:00:00 2001 From: borrelli Date: Tue, 16 Apr 2019 14:54:40 +0100 Subject: [PATCH] Add ability to register/unregister custom CommandReceivers. PiperOrigin-RevId: 243799572 --- RELEASENOTES.md | 3 ++ .../mediasession/MediaSessionConnector.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d108140f46..d5cef0bb08 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,6 +2,9 @@ ### dev-v2 (not yet released) ### +* MediaSession extension: + * Allow handling of custom commands via `registerCustomCommandReceiver`. + ### 2.10.0 ### * Core library: 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 617423a399..9a1f38c10b 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 @@ -364,6 +364,7 @@ public final class MediaSessionConnector { private final Looper looper; private final ComponentListener componentListener; private final ArrayList commandReceivers; + private final ArrayList customCommandReceivers; private ControlDispatcher controlDispatcher; private CustomActionProvider[] customActionProviders; @@ -392,6 +393,7 @@ public final class MediaSessionConnector { looper = Util.getLooper(); componentListener = new ComponentListener(); commandReceivers = new ArrayList<>(); + customCommandReceivers = new ArrayList<>(); controlDispatcher = new DefaultControlDispatcher(); customActionProviders = new CustomActionProvider[0]; customActionMap = Collections.emptyMap(); @@ -697,6 +699,29 @@ public final class MediaSessionConnector { } } + /** + * Registers a custom command receiver for responding to commands delivered via {@link + * MediaSessionCompat.Callback#onCommand(String, Bundle, ResultReceiver)}. + * + *

Commands are only dispatched to this receiver when a player is connected. + * + * @param commandReceiver The command receiver to register. + */ + public void registerCustomCommandReceiver(CommandReceiver commandReceiver) { + if (!customCommandReceivers.contains(commandReceiver)) { + customCommandReceivers.add(commandReceiver); + } + } + + /** + * Unregisters a previously registered custom command receiver. + * + * @param commandReceiver The command receiver to unregister. + */ + public void unregisterCustomCommandReceiver(CommandReceiver commandReceiver) { + customCommandReceivers.remove(commandReceiver); + } + private void registerCommandReceiver(CommandReceiver commandReceiver) { if (!commandReceivers.contains(commandReceiver)) { commandReceivers.add(commandReceiver); @@ -1113,6 +1138,13 @@ public final class MediaSessionConnector { return; } } + for (int i = 0; i < customCommandReceivers.size(); i++) { + if (customCommandReceivers + .get(i) + .onCommand(player, controlDispatcher, command, extras, cb)) { + return; + } + } } }