diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9ed5abd186..93bf29b3bc 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -43,6 +43,9 @@ * `void increaseDeviceVolume(int)` * `void decreaseDeviceVolume(int)` * `void setDeviceMuted(boolean, int)` + * Fix issue where `MediaController` doesn't update its available commands + when connected to a legacy `MediaSessionCompat` that updates its + actions. * Audio: * Fix bug where some playbacks fail when tunneling is enabled and `AudioProcessors` are active, e.g. for gapless trimming 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 e67dc76b54..52bcd02bd8 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplLegacy.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplLegacy.java @@ -1920,13 +1920,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 62551cccf0..4df4269499 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 @@ -1513,6 +1513,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;