From aab1c9ada19ff404cc65ddfd31034eb7aa46a00e Mon Sep 17 00:00:00 2001 From: rohks Date: Fri, 17 Nov 2023 10:21:56 -0800 Subject: [PATCH] Populate `MediaMetadata.extras` to `MediaMetadataCompat` Ensures backward compatibility. Issue: androidx/media#802 PiperOrigin-RevId: 583425114 (cherry picked from commit 6df240877c30aedb271c2bc74c54fc2bab0e4cbf) --- RELEASENOTES.md | 6 ++- .../androidx/media3/common/MediaMetadata.java | 1 + .../media3/session/LegacyConversions.java | 18 ++++++++- .../media3/session/LegacyConversionsTest.java | 37 +++++++++++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 04ab268ffa..045c1dac5c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -21,8 +21,10 @@ * IMA extension: * Session: * Put the custom keys and values in `MediaMetadataCompat` to - `MediaMetadata.extras` - ([#756](https://github.com/androidx/media/issues/756)). + `MediaMetadata.extras` and `MediaMetadata.extras` to + `MediaMetadataCompat` + ([#756](https://github.com/androidx/media/issues/756), + [#802](https://github.com/androidx/media/issues/802)). * UI: * Fix issue where forward and rewind buttons are not visible when used with Material Design in a BottomSheetDialogFragment 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 55070dc938..72799617e7 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java @@ -1146,6 +1146,7 @@ public final class MediaMetadata implements Bundleable { return new Builder(/* mediaMetadata= */ this); } + /** Note: Equality checking does not consider {@link #extras}. */ @SuppressWarnings("deprecation") // Comparing deprecated fields. @Override public boolean equals(@Nullable Object obj) { diff --git a/libraries/session/src/main/java/androidx/media3/session/LegacyConversions.java b/libraries/session/src/main/java/androidx/media3/session/LegacyConversions.java index aa9901c967..b6fc7da1e6 100644 --- a/libraries/session/src/main/java/androidx/media3/session/LegacyConversions.java +++ b/libraries/session/src/main/java/androidx/media3/session/LegacyConversions.java @@ -559,7 +559,9 @@ import java.util.concurrent.TimeoutException; * duration should be included. * @return An instance of the legacy {@link MediaMetadataCompat}. */ - @SuppressWarnings("deprecation") // Converting deprecated fields. + // Converting deprecated fields and suppressing nullness. + // TODO: b/311689564 - Add @Nullable annotations to setters of MediaMetadataCompat.Builder + @SuppressWarnings({"deprecation", "nullness:argument"}) public static MediaMetadataCompat convertToMediaMetadataCompat( MediaMetadata metadata, String mediaId, @@ -639,6 +641,20 @@ import java.util.concurrent.TimeoutException; builder.putLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, metadata.mediaType); } + if (metadata.extras != null) { + for (@Nullable String customKey : metadata.extras.keySet()) { + @Nullable Object customValue = metadata.extras.get(customKey); + if (customValue == null || customValue instanceof CharSequence) { + builder.putText(customKey, (CharSequence) customValue); + } else if (customValue instanceof Byte + || customValue instanceof Short + || customValue instanceof Integer + || customValue instanceof Long) { + builder.putLong(customKey, ((Number) customValue).longValue()); + } + } + } + return builder.build(); } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/LegacyConversionsTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/LegacyConversionsTest.java index 3e13b522a8..3c7491d808 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/LegacyConversionsTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/LegacyConversionsTest.java @@ -37,6 +37,7 @@ import android.support.v4.media.RatingCompat; import android.support.v4.media.session.MediaControllerCompat; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; +import android.text.SpannedString; import androidx.annotation.Nullable; import androidx.media.AudioAttributesCompat; import androidx.media.VolumeProviderCompat; @@ -263,6 +264,42 @@ public final class LegacyConversionsTest { .isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC); } + @Test + public void convertToMediaMetadataCompat_populatesExtrasFromMediaMetadata() { + Bundle extras = new Bundle(); + extras.putString("customNullValueKey", null); + extras.putString(null, "customNullKeyValue"); + extras.putString("customStringKey", "customStringValue"); + extras.putCharSequence("customCharSequenceKey", new SpannedString("customCharSequenceValue")); + extras.putByte("customByteKey", (byte) 1); + extras.putShort("customShortKey", (short) 5); + extras.putInt("customIntegerKey", 10); + extras.putLong("customLongKey", 20L); + MediaItem mediaItem = + new MediaItem.Builder() + .setMediaMetadata(new MediaMetadata.Builder().setExtras(extras).build()) + .build(); + + MediaMetadataCompat mediaMetadataCompat = + LegacyConversions.convertToMediaMetadataCompat( + mediaItem.mediaMetadata, + "mediadId", + Uri.parse("http://www.test.com"), + /* durationMs= */ C.TIME_UNSET, + /* artworkBitmap= */ null); + + assertThat(mediaMetadataCompat.getString("customNullValueKey")).isNull(); + assertThat(mediaMetadataCompat.getString(null)).isEqualTo("customNullKeyValue"); + assertThat(mediaMetadataCompat.getString("customStringKey")).isEqualTo("customStringValue"); + CharSequence customCharSequence = mediaMetadataCompat.getText("customCharSequenceKey"); + assertThat(customCharSequence).isInstanceOf(SpannedString.class); + assertThat(customCharSequence.toString()).isEqualTo("customCharSequenceValue"); + assertThat(mediaMetadataCompat.getLong("customByteKey")).isEqualTo(1); + assertThat(mediaMetadataCompat.getLong("customShortKey")).isEqualTo(5); + assertThat(mediaMetadataCompat.getLong("customIntegerKey")).isEqualTo(10); + assertThat(mediaMetadataCompat.getLong("customLongKey")).isEqualTo(20); + } + @Test public void convertBetweenRatingAndRatingCompat() { assertRatingEquals(