From 84022eacc560b90cf34253b2470aabdf4a4b767d Mon Sep 17 00:00:00 2001 From: tianyifeng Date: Wed, 1 Nov 2023 04:26:40 -0700 Subject: [PATCH] Put the custom keys in MediaMetadataCompat to MediaMetadata.extras PiperOrigin-RevId: 578473874 --- RELEASENOTES.md | 3 ++ .../androidx/media3/session/MediaUtils.java | 44 +++++++++++++++++++ .../media3/session/MediaUtilsTest.java | 29 +++++++++--- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0243de74429..c6a6d2c1a2b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -31,6 +31,9 @@ * Muxers: * IMA extension: * Session: + * Put the custom keys and values in `MediaMetadataCompat` to + `MediaMetadata.extras` + ([#756](https://github.com/androidx/media/issues/756)). * UI: * Downloads: * OkHttp Extension: diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java b/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java index df42396a3eb..95949f0701e 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java @@ -99,6 +99,7 @@ import androidx.media3.session.MediaLibraryService.LibraryParams; import androidx.media3.session.PlayerInfo.BundlingExclusions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -119,6 +120,41 @@ public static final BrowserRoot defaultBrowserRoot = new BrowserRoot(MediaLibraryService.SERVICE_INTERFACE, null); + public static final ImmutableSet KNOWN_METADATA_COMPAT_KEYS = + ImmutableSet.of( + MediaMetadataCompat.METADATA_KEY_TITLE, + MediaMetadataCompat.METADATA_KEY_ARTIST, + MediaMetadataCompat.METADATA_KEY_DURATION, + MediaMetadataCompat.METADATA_KEY_ALBUM, + MediaMetadataCompat.METADATA_KEY_AUTHOR, + MediaMetadataCompat.METADATA_KEY_WRITER, + MediaMetadataCompat.METADATA_KEY_COMPOSER, + MediaMetadataCompat.METADATA_KEY_COMPILATION, + MediaMetadataCompat.METADATA_KEY_DATE, + MediaMetadataCompat.METADATA_KEY_YEAR, + MediaMetadataCompat.METADATA_KEY_GENRE, + MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, + MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, + MediaMetadataCompat.METADATA_KEY_DISC_NUMBER, + MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST, + MediaMetadataCompat.METADATA_KEY_ART, + MediaMetadataCompat.METADATA_KEY_ART_URI, + MediaMetadataCompat.METADATA_KEY_ALBUM_ART, + MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, + MediaMetadataCompat.METADATA_KEY_USER_RATING, + MediaMetadataCompat.METADATA_KEY_RATING, + MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, + MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, + MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, + MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, + MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI, + MediaMetadataCompat.METADATA_KEY_MEDIA_ID, + MediaMetadataCompat.METADATA_KEY_MEDIA_URI, + MediaMetadataCompat.METADATA_KEY_BT_FOLDER_TYPE, + MediaMetadataCompat.METADATA_KEY_ADVERTISEMENT, + MediaMetadataCompat.METADATA_KEY_DOWNLOAD_STATUS, + MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT); + /** Returns whether two {@link PlaybackStateCompat} have equal error. */ public static boolean areEqualError( @Nullable PlaybackStateCompat a, @Nullable PlaybackStateCompat b) { @@ -510,6 +546,14 @@ public static MediaMetadata convertToMediaMetadata( builder.setIsPlayable(true); + Bundle extras = metadataCompat.getBundle(); + for (String key : KNOWN_METADATA_COMPAT_KEYS) { + extras.remove(key); + } + if (!extras.isEmpty()) { + builder.setExtras(extras); + } + return builder.build(); } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaUtilsTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaUtilsTest.java index 778cb584f3e..3574329fbb5 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaUtilsTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaUtilsTest.java @@ -22,6 +22,7 @@ import static androidx.media3.common.MimeTypes.AUDIO_AAC; import static androidx.media3.common.MimeTypes.VIDEO_H264; import static androidx.media3.common.MimeTypes.VIDEO_H265; +import static androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT; import static androidx.media3.session.MediaConstants.EXTRA_KEY_ROOT_CHILDREN_BROWSABLE_ONLY; import static androidx.media3.test.session.common.TestUtils.getCommandsAsList; import static com.google.common.truth.Truth.assertThat; @@ -164,10 +165,7 @@ public void convertToMediaDescriptionCompat_setsExpectedValues() { assertThat(descriptionCompat.getMediaId()).isEqualTo(mediaId); assertThat(descriptionCompat.getTitle().toString()).isEqualTo(title); assertThat(descriptionCompat.getDescription().toString()).isEqualTo(description); - assertThat( - descriptionCompat - .getExtras() - .getLong(androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT)) + assertThat(descriptionCompat.getExtras().getLong(EXTRAS_KEY_MEDIA_TYPE_COMPAT)) .isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC); } @@ -208,6 +206,25 @@ public void convertToMediaMetadata_withTitle() { assertThat(MediaUtils.convertToMediaMetadata(title).title.toString()).isEqualTo(title); } + @Test + public void convertToMediaMetadata_withCustomKey() { + MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); + builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, "title"); + builder.putLong(EXTRAS_KEY_MEDIA_TYPE_COMPAT, (long) MediaMetadata.MEDIA_TYPE_MUSIC); + builder.putString("custom_key", "value"); + MediaMetadataCompat testMediaMetadataCompat = builder.build(); + + MediaMetadata mediaMetadata = + MediaUtils.convertToMediaMetadata(testMediaMetadataCompat, RatingCompat.RATING_NONE); + + assertThat(mediaMetadata.title.toString()).isEqualTo("title"); + assertThat(mediaMetadata.mediaType).isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC); + assertThat(mediaMetadata.extras).isNotNull(); + assertThat(mediaMetadata.extras.getString("custom_key")).isEqualTo("value"); + assertThat(mediaMetadata.extras.containsKey(MediaMetadataCompat.METADATA_KEY_TITLE)).isFalse(); + assertThat(mediaMetadata.extras.containsKey(EXTRAS_KEY_MEDIA_TYPE_COMPAT)).isFalse(); + } + @Test public void convertToMediaMetadata_roundTripViaMediaMetadataCompat_returnsEqualMediaItemMetadata() throws Exception { @@ -272,9 +289,7 @@ public void convertToMediaMetadataCompat_withMediaType_setsMediaType() { /* durationMs= */ C.TIME_UNSET, /* artworkBitmap= */ null); - assertThat( - mediaMetadataCompat.getLong( - androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT)) + assertThat(mediaMetadataCompat.getLong(EXTRAS_KEY_MEDIA_TYPE_COMPAT)) .isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC); }