From 0f6a1eb6b850f6039f12602316aee09fa9f747e7 Mon Sep 17 00:00:00 2001 From: tonihei Date: Fri, 21 Apr 2023 12:35:39 +0100 Subject: [PATCH] Update available commands when MediaSessionCompat actions change This is a bug currently, where commands are created once but never updated again if the actions in MediaSessionCompat are changed. PiperOrigin-RevId: 525999084 (cherry picked from commit 79fab6783e07ea594410be347c8a3d6e1124707d) --- RELEASENOTES.md | 4 +++ .../session/MediaControllerImplLegacy.java | 12 ++++---- ...aControllerWithMediaSessionCompatTest.java | 30 +++++++++++++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 605c1c20f6..7b2b47b91e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -8,6 +8,10 @@ * Fix issue where last frame may not be rendered if the last sample with frames is dequeued without reading the 'end of stream' sample. ([#11079](https://github.com/google/ExoPlayer/issues/11079)). +* Session: + * Fix issue where `MediaController` doesn't update its available commands + when connected to a legacy `MediaSessionCompat` that updates its + actions. ### 1.0.1 (2023-04-18) diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplLegacy.java b/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplLegacy.java index e01ffcbf49..f625821d2c 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplLegacy.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplLegacy.java @@ -1885,13 +1885,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; ? newLegacyPlayerInfo.playbackInfoCompat.getVolumeControl() : VolumeProviderCompat.VOLUME_CONTROL_FIXED; availablePlayerCommands = - (oldControllerInfo.availablePlayerCommands == Commands.EMPTY) - ? MediaUtils.convertToPlayerCommands( - newLegacyPlayerInfo.playbackStateCompat, - volumeControlType, - sessionFlags, - isSessionReady) - : oldControllerInfo.availablePlayerCommands; + MediaUtils.convertToPlayerCommands( + newLegacyPlayerInfo.playbackStateCompat, + volumeControlType, + sessionFlags, + isSessionReady); PlaybackException playerError = MediaUtils.convertToPlaybackException(newLegacyPlayerInfo.playbackStateCompat); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java index 8e4afdcdeb..f0eca11593 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java @@ -1502,6 +1502,36 @@ public class MediaControllerWithMediaSessionCompatTest { assertThat(errorFromGetterRef.get().getMessage()).isEqualTo(testConvertedErrorMessage); } + @Test + public void setPlaybackState_withActions_updatesAndNotifiesAvailableCommands() throws Exception { + MediaController controller = controllerTestRule.createController(session.getSessionToken()); + CountDownLatch latch = new CountDownLatch(1); + AtomicReference commandsFromParamRef = new AtomicReference<>(); + AtomicReference commandsFromGetterRef = new AtomicReference<>(); + Player.Listener listener = + new Player.Listener() { + @Override + public void onAvailableCommandsChanged(Player.Commands commands) { + commandsFromParamRef.set(commands); + commandsFromGetterRef.set(controller.getAvailableCommands()); + latch.countDown(); + } + }; + controller.addListener(listener); + + session.setPlaybackState( + new PlaybackStateCompat.Builder() + .setActions( + PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_FAST_FORWARD) + .build()); + + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(commandsFromParamRef.get().contains(Player.COMMAND_PLAY_PAUSE)).isTrue(); + assertThat(commandsFromParamRef.get().contains(Player.COMMAND_SEEK_FORWARD)).isTrue(); + assertThat(commandsFromGetterRef.get().contains(Player.COMMAND_PLAY_PAUSE)).isTrue(); + assertThat(commandsFromGetterRef.get().contains(Player.COMMAND_SEEK_FORWARD)).isTrue(); + } + @Test public void setPlaybackToRemote_notifiesDeviceInfoAndVolume() throws Exception { int volumeControlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;