From fa790bd73c36706f66b1f7997cfc5a5562a61654 Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 11 Nov 2024 06:04:38 -0800 Subject: [PATCH] Fix supportedCommands in MediaMetadata #cherrypick PiperOrigin-RevId: 695304782 --- .../androidx/media3/common/MediaMetadata.java | 18 +++++++++++++++++- .../media3/common/MediaMetadataTest.java | 3 +++ .../media3/session/MediaControllerTest.java | 16 +++------------- .../session/MediaSessionProviderService.java | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java index 52f4dcbb8b..1fe513417b 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java @@ -36,6 +36,7 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -611,6 +612,10 @@ public final class MediaMetadata { setExtras(mediaMetadata.extras); } + if (!mediaMetadata.supportedCommands.isEmpty()) { + setSupportedCommands(mediaMetadata.supportedCommands); + } + return this; } @@ -1249,6 +1254,7 @@ public final class MediaMetadata { && Util.areEqual(compilation, that.compilation) && Util.areEqual(station, that.station) && Util.areEqual(mediaType, that.mediaType) + && Util.areEqual(supportedCommands, that.supportedCommands) && ((extras == null) == (that.extras == null)); } @@ -1289,7 +1295,8 @@ public final class MediaMetadata { compilation, station, mediaType, - extras == null); + extras == null, + supportedCommands); } private static final String FIELD_TITLE = Util.intToStringMaxRadix(0); @@ -1326,6 +1333,7 @@ public final class MediaMetadata { private static final String FIELD_MEDIA_TYPE = Util.intToStringMaxRadix(31); private static final String FIELD_IS_BROWSABLE = Util.intToStringMaxRadix(32); private static final String FIELD_DURATION_MS = Util.intToStringMaxRadix(33); + private static final String FIELD_SUPPORTED_COMMANDS = Util.intToStringMaxRadix(34); private static final String FIELD_EXTRAS = Util.intToStringMaxRadix(1000); @SuppressWarnings("deprecation") // Bundling deprecated fields. @@ -1431,6 +1439,9 @@ public final class MediaMetadata { if (mediaType != null) { bundle.putInt(FIELD_MEDIA_TYPE, mediaType); } + if (!supportedCommands.isEmpty()) { + bundle.putStringArrayList(FIELD_SUPPORTED_COMMANDS, new ArrayList<>(supportedCommands)); + } if (extras != null) { bundle.putBundle(FIELD_EXTRAS, extras); } @@ -1521,6 +1532,11 @@ public final class MediaMetadata { if (bundle.containsKey(FIELD_MEDIA_TYPE)) { builder.setMediaType(bundle.getInt(FIELD_MEDIA_TYPE)); } + @Nullable + ArrayList supportedCommands = bundle.getStringArrayList(FIELD_SUPPORTED_COMMANDS); + if (supportedCommands != null) { + builder.setSupportedCommands(supportedCommands); + } return builder.build(); } diff --git a/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java b/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java index d3553fc9d9..5490402402 100644 --- a/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import android.net.Uri; import android.os.Bundle; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; @@ -68,6 +69,7 @@ public class MediaMetadataTest { assertThat(mediaMetadata.compilation).isNull(); assertThat(mediaMetadata.station).isNull(); assertThat(mediaMetadata.mediaType).isNull(); + assertThat(mediaMetadata.supportedCommands).isEmpty(); assertThat(mediaMetadata.extras).isNull(); } @@ -278,6 +280,7 @@ public class MediaMetadataTest { .setCompilation("Amazing songs.") .setStation("radio station") .setMediaType(MediaMetadata.MEDIA_TYPE_MIXED) + .setSupportedCommands(ImmutableList.of("command1", "command2")) .setExtras(extras) .build(); } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTest.java index b39524fbef..c15c521910 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTest.java @@ -2052,24 +2052,14 @@ public class MediaControllerTest { .setSessionCommand( new SessionCommand(MediaBrowserConstants.COMMAND_RADIO, Bundle.EMPTY)) .build(); - MediaItem mediaItem = - new MediaItem.Builder() - .setMediaId("mediaId") - .setMediaMetadata( - new MediaMetadata.Builder() - .setSupportedCommands( - ImmutableList.of( - MediaBrowserConstants.COMMAND_PLAYLIST_ADD, - MediaBrowserConstants.COMMAND_RADIO, - "invalid")) - .build()) - .build(); MediaController controller = controllerTestRule.createController(session.getToken()); + MediaItem currentMediaItem = + threadTestRule.getHandler().postAndSync(controller::getCurrentMediaItem); ImmutableList commandButtons = threadTestRule .getHandler() - .postAndSync(() -> controller.getCommandButtonsForMediaItem(mediaItem)); + .postAndSync(() -> controller.getCommandButtonsForMediaItem(currentMediaItem)); assertThat(commandButtons).containsExactly(playlistAddButton, radioButton).inOrder(); session.cleanUp(); diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java index fc55b0dbb8..18b4d13b8e 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java @@ -253,6 +253,20 @@ public class MediaSessionProviderService extends Service { .build(); builder.setCommandButtonsForMediaItems( ImmutableList.of(playlistAddButton, radioButton)); + mockPlayer.timeline = + new PlaylistTimeline( + ImmutableList.of( + new MediaItem.Builder() + .setMediaId("mediaIdWithSupportedCommands") + .setMediaMetadata( + new MediaMetadata.Builder() + .setSupportedCommands( + ImmutableList.of( + MediaBrowserConstants.COMMAND_PLAYLIST_ADD, + MediaBrowserConstants.COMMAND_RADIO, + "invalid")) + .build()) + .build())); builder.setCallback( new MediaSession.Callback() { @Override