From 581c6b54295d49ec0d562f41c324381852c7c3af Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 30 May 2022 12:32:25 +0000 Subject: [PATCH] Remove MediaMetadata.mediaUrl This value only existed to allow setting media URLs from external sources (e.g. in a MediaController) so that a player can start playing this item. Now that we have MediaItem.RequestMetadata.mediaUrl we can remove this value from MediaMetadata because it's request metadata, not media metadata. PiperOrigin-RevId: 451857413 --- RELEASENOTES.md | 3 ++ .../androidx/media3/common/MediaMetadata.java | 18 ------- .../media3/common/MediaMetadataTest.java | 2 - .../androidx/media3/session/MediaUtils.java | 51 +++++++++---------- ...iceCompatCallbackWithMediaBrowserTest.java | 2 +- ...lerCompatCallbackWithMediaSessionTest.java | 2 +- ...aControllerWithMediaSessionCompatTest.java | 18 +++---- .../media3/session/MediaTestUtils.java | 2 - .../session/MockMediaLibraryService.java | 10 +++- 9 files changed, 47 insertions(+), 61 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5efdf34cef..e803376b45 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -23,6 +23,9 @@ `MediaSource.Factory.setLoadErrorHandlingPolicy`. Instances of `DefaultDrmSessionManagerProvider` and `DefaultLoadErrorHandlingPolicy` can be passed explicitly if required. + * Add `MediaItem.RequestMetadata` to represent metadata needed to play + media when the exact `LocalConfiguration` is not known. Also remove + `MediaMetadata.mediaUrl` as this is now included in `RequestMetadata`. * Track selection: * Flatten `TrackSelectionOverrides` class into `TrackSelectionParameters`, and promote `TrackSelectionOverride` to a top level class. 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 91657f83bc..e32584785e 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java @@ -52,7 +52,6 @@ public final class MediaMetadata implements Bundleable { @Nullable private CharSequence displayTitle; @Nullable private CharSequence subtitle; @Nullable private CharSequence description; - @Nullable private Uri mediaUri; @Nullable private Rating userRating; @Nullable private Rating overallRating; @Nullable private byte[] artworkData; @@ -88,7 +87,6 @@ public final class MediaMetadata implements Bundleable { this.displayTitle = mediaMetadata.displayTitle; this.subtitle = mediaMetadata.subtitle; this.description = mediaMetadata.description; - this.mediaUri = mediaMetadata.mediaUri; this.userRating = mediaMetadata.userRating; this.overallRating = mediaMetadata.overallRating; this.artworkData = mediaMetadata.artworkData; @@ -161,12 +159,6 @@ public final class MediaMetadata implements Bundleable { return this; } - /** Sets the media {@link Uri}. */ - public Builder setMediaUri(@Nullable Uri mediaUri) { - this.mediaUri = mediaUri; - return this; - } - /** Sets the user {@link Rating}. */ public Builder setUserRating(@Nullable Rating userRating) { this.userRating = userRating; @@ -431,9 +423,6 @@ public final class MediaMetadata implements Bundleable { if (mediaMetadata.description != null) { setDescription(mediaMetadata.description); } - if (mediaMetadata.mediaUri != null) { - setMediaUri(mediaMetadata.mediaUri); - } if (mediaMetadata.userRating != null) { setUserRating(mediaMetadata.userRating); } @@ -636,8 +625,6 @@ public final class MediaMetadata implements Bundleable { @Nullable public final CharSequence subtitle; /** Optional description. */ @Nullable public final CharSequence description; - /** Optional media {@link Uri}. */ - @Nullable public final Uri mediaUri; /** Optional user {@link Rating}. */ @Nullable public final Rating userRating; /** Optional overall {@link Rating}. */ @@ -722,7 +709,6 @@ public final class MediaMetadata implements Bundleable { this.displayTitle = builder.displayTitle; this.subtitle = builder.subtitle; this.description = builder.description; - this.mediaUri = builder.mediaUri; this.userRating = builder.userRating; this.overallRating = builder.overallRating; this.artworkData = builder.artworkData; @@ -771,7 +757,6 @@ public final class MediaMetadata implements Bundleable { && Util.areEqual(displayTitle, that.displayTitle) && Util.areEqual(subtitle, that.subtitle) && Util.areEqual(description, that.description) - && Util.areEqual(mediaUri, that.mediaUri) && Util.areEqual(userRating, that.userRating) && Util.areEqual(overallRating, that.overallRating) && Arrays.equals(artworkData, that.artworkData) @@ -807,7 +792,6 @@ public final class MediaMetadata implements Bundleable { displayTitle, subtitle, description, - mediaUri, userRating, overallRating, Arrays.hashCode(artworkData), @@ -918,7 +902,6 @@ public final class MediaMetadata implements Bundleable { bundle.putCharSequence(keyForField(FIELD_DISPLAY_TITLE), displayTitle); bundle.putCharSequence(keyForField(FIELD_SUBTITLE), subtitle); bundle.putCharSequence(keyForField(FIELD_DESCRIPTION), description); - bundle.putParcelable(keyForField(FIELD_MEDIA_URI), mediaUri); bundle.putByteArray(keyForField(FIELD_ARTWORK_DATA), artworkData); bundle.putParcelable(keyForField(FIELD_ARTWORK_URI), artworkUri); bundle.putCharSequence(keyForField(FIELD_WRITER), writer); @@ -992,7 +975,6 @@ public final class MediaMetadata implements Bundleable { .setDisplayTitle(bundle.getCharSequence(keyForField(FIELD_DISPLAY_TITLE))) .setSubtitle(bundle.getCharSequence(keyForField(FIELD_SUBTITLE))) .setDescription(bundle.getCharSequence(keyForField(FIELD_DESCRIPTION))) - .setMediaUri(bundle.getParcelable(keyForField(FIELD_MEDIA_URI))) .setArtworkData( bundle.getByteArray(keyForField(FIELD_ARTWORK_DATA)), bundle.containsKey(keyForField(FIELD_ARTWORK_DATA_TYPE)) 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 cbba8e39f5..7e606597c4 100644 --- a/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java @@ -41,7 +41,6 @@ public class MediaMetadataTest { assertThat(mediaMetadata.displayTitle).isNull(); assertThat(mediaMetadata.subtitle).isNull(); assertThat(mediaMetadata.description).isNull(); - assertThat(mediaMetadata.mediaUri).isNull(); assertThat(mediaMetadata.userRating).isNull(); assertThat(mediaMetadata.overallRating).isNull(); assertThat(mediaMetadata.artworkData).isNull(); @@ -127,7 +126,6 @@ public class MediaMetadataTest { .setDisplayTitle("display title") .setSubtitle("subtitle") .setDescription("description") - .setMediaUri(Uri.parse("https://www.google.com")) .setUserRating(new HeartRating(false)) .setOverallRating(new PercentageRating(87.4f)) .setArtworkData( 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 16e984daeb..f3459fccca 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaUtils.java @@ -188,29 +188,33 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; @Nullable String mediaId, MediaMetadataCompat metadataCompat, @RatingCompat.Style int ratingType) { - MediaItem.Builder mediaItemBuilder = new MediaItem.Builder(); - + MediaItem.Builder builder = new MediaItem.Builder(); if (mediaId != null) { - mediaItemBuilder.setMediaId(mediaId); + builder.setMediaId(mediaId); } - mediaItemBuilder.setMediaMetadata(convertToMediaMetadata(metadataCompat, ratingType)); - - return mediaItemBuilder.build(); + @Nullable + String mediaUriString = metadataCompat.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI); + if (mediaUriString != null) { + builder.setRequestMetadata( + new MediaItem.RequestMetadata.Builder().setMediaUri(Uri.parse(mediaUriString)).build()); + } + builder.setMediaMetadata(convertToMediaMetadata(metadataCompat, ratingType)); + return builder.build(); } private static MediaItem convertToMediaItem( MediaDescriptionCompat descriptionCompat, boolean browsable, boolean playable) { - MediaItem.Builder mediaItemBuilder = new MediaItem.Builder(); - @Nullable String mediaId = descriptionCompat.getMediaId(); - if (mediaId != null) { - mediaItemBuilder.setMediaId(mediaId); - } - - mediaItemBuilder.setMediaMetadata( - convertToMediaMetadata(descriptionCompat, RatingCompat.RATING_NONE, browsable, playable)); - - return mediaItemBuilder.build(); + return new MediaItem.Builder() + .setMediaId(mediaId == null ? MediaItem.DEFAULT_MEDIA_ID : mediaId) + .setRequestMetadata( + new MediaItem.RequestMetadata.Builder() + .setMediaUri(descriptionCompat.getMediaUri()) + .build()) + .setMediaMetadata( + convertToMediaMetadata( + descriptionCompat, RatingCompat.RATING_NONE, browsable, playable)) + .build(); } /** Converts a list of {@link MediaBrowserCompat.MediaItem} to a list of {@link MediaItem}. */ @@ -342,7 +346,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; .setSubtitle(metadata.subtitle) .setDescription(metadata.description) .setIconUri(metadata.artworkUri) - .setMediaUri(metadata.mediaUri) + .setMediaUri(item.requestMetadata.mediaUri) .setExtras(extras) .build(); } @@ -381,7 +385,6 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; .setSubtitle(descriptionCompat.getSubtitle()) .setDescription(descriptionCompat.getDescription()) .setArtworkUri(descriptionCompat.getIconUri()) - .setMediaUri(descriptionCompat.getMediaUri()) .setUserRating(convertToRating(RatingCompat.newUnratedRating(ratingType))); @Nullable Bitmap iconBitmap = descriptionCompat.getIconBitmap(); @@ -450,12 +453,6 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; builder.setRecordingYear((int) year); } - @Nullable - String mediaUriString = metadataCompat.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI); - if (mediaUriString != null) { - builder.setMediaUri(Uri.parse(mediaUriString)); - } - @Nullable String artworkUriString = getFirstString( @@ -563,8 +560,10 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; builder.putLong(MediaMetadataCompat.METADATA_KEY_YEAR, metadata.recordingYear); } - if (metadata.mediaUri != null) { - builder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI, metadata.mediaUri.toString()); + if (mediaItem.requestMetadata.mediaUri != null) { + builder.putString( + MediaMetadataCompat.METADATA_KEY_MEDIA_URI, + mediaItem.requestMetadata.mediaUri.toString()); } if (metadata.artworkUri != null) { diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaBrowserServiceCompatCallbackWithMediaBrowserTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaBrowserServiceCompatCallbackWithMediaBrowserTest.java index 04af735d4c..043b654f5c 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaBrowserServiceCompatCallbackWithMediaBrowserTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaBrowserServiceCompatCallbackWithMediaBrowserTest.java @@ -497,12 +497,12 @@ public class MediaBrowserServiceCompatCallbackWithMediaBrowserTest { MediaBrowserCompat.MediaItem browserItem, MediaItem commonItem) { assertThat(commonItem.mediaId).isEqualTo(browserItem.getMediaId()); MediaDescriptionCompat description = browserItem.getDescription(); + assertThat(commonItem.requestMetadata.mediaUri).isEqualTo(description.getMediaUri()); MediaMetadata metadata = commonItem.mediaMetadata; assertThat(TextUtils.equals(metadata.title, description.getTitle())).isTrue(); assertThat(TextUtils.equals(metadata.subtitle, description.getSubtitle())).isTrue(); assertThat(TextUtils.equals(metadata.description, description.getDescription())).isTrue(); assertThat(metadata.artworkUri).isEqualTo(description.getIconUri()); - assertThat(metadata.mediaUri).isEqualTo(description.getMediaUri()); assertThat(TestUtils.equals(metadata.extras, description.getExtras())).isTrue(); } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java index 61f3e5742b..2a7af750fd 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java @@ -979,7 +979,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { assertThat(TextUtils.equals(description.getDescription(), mediaItem.mediaMetadata.description)) .isTrue(); assertThat(description.getIconUri()).isEqualTo(mediaItem.mediaMetadata.artworkUri); - assertThat(description.getMediaUri()).isEqualTo(mediaItem.mediaMetadata.mediaUri); + assertThat(description.getMediaUri()).isEqualTo(mediaItem.requestMetadata.mediaUri); assertThat(TestUtils.equals(description.getExtras(), mediaItem.mediaMetadata.extras)).isTrue(); } 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 24f168846d..882dc54dff 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 @@ -440,19 +440,16 @@ public class MediaControllerWithMediaSessionCompatTest { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(timelineRef.get().getWindowCount()).isEqualTo(1); - MediaMetadata metadata = - timelineRef - .get() - .getWindow(/* windowIndex= */ 0, new Timeline.Window()) - .mediaItem - .mediaMetadata; + MediaItem mediaItem = + timelineRef.get().getWindow(/* windowIndex= */ 0, new Timeline.Window()).mediaItem; + MediaMetadata metadata = mediaItem.mediaMetadata; assertThat(TextUtils.equals(metadata.title, testTitle)).isTrue(); assertThat(TextUtils.equals(metadata.subtitle, testSubtitle)).isTrue(); assertThat(TextUtils.equals(metadata.description, testDescription)).isTrue(); assertThat(metadata.artworkUri).isEqualTo(testIconUri); if (Util.SDK_INT < 21 || Util.SDK_INT >= 23) { // TODO(b/199055952): Test mediaUri for all API levels once the bug is fixed. - assertThat(metadata.mediaUri).isEqualTo(testMediaUri); + assertThat(mediaItem.requestMetadata.mediaUri).isEqualTo(testMediaUri); } assertThat(TestUtils.equals(metadata.extras, testExtras)).isTrue(); } @@ -536,13 +533,14 @@ public class MediaControllerWithMediaSessionCompatTest { session.setMetadata(metadataCompat); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(itemRef.get().mediaId).isEqualTo(testMediaId); - MediaMetadata metadata = itemRef.get().mediaMetadata; + MediaItem mediaItem = itemRef.get(); + assertThat(mediaItem.mediaId).isEqualTo(testMediaId); + assertThat(mediaItem.requestMetadata.mediaUri).isEqualTo(Uri.parse(testMediaUri)); + MediaMetadata metadata = mediaItem.mediaMetadata; assertThat(TextUtils.equals(metadata.title, testTitle)).isTrue(); assertThat(TextUtils.equals(metadata.subtitle, testSubtitle)).isTrue(); assertThat(TextUtils.equals(metadata.description, testDescription)).isTrue(); assertThat(metadata.artworkUri).isEqualTo(Uri.parse(testIconUri)); - assertThat(metadata.mediaUri).isEqualTo(Uri.parse(testMediaUri)); } @Test diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java index 2f5e2aa936..e6d5d24632 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java @@ -18,7 +18,6 @@ package androidx.media3.session; import static androidx.media3.test.session.common.CommonConstants.METADATA_ARTWORK_URI; import static androidx.media3.test.session.common.CommonConstants.METADATA_DESCRIPTION; import static androidx.media3.test.session.common.CommonConstants.METADATA_EXTRAS; -import static androidx.media3.test.session.common.CommonConstants.METADATA_MEDIA_URI; import static androidx.media3.test.session.common.CommonConstants.METADATA_SUBTITLE; import static androidx.media3.test.session.common.CommonConstants.METADATA_TITLE; import static androidx.media3.test.session.common.CommonConstants.SUPPORT_APP_PACKAGE_NAME; @@ -82,7 +81,6 @@ public final class MediaTestUtils { .setSubtitle(METADATA_SUBTITLE) .setDescription(METADATA_DESCRIPTION) .setArtworkUri(METADATA_ARTWORK_URI) - .setMediaUri(METADATA_MEDIA_URI) .setExtras(METADATA_EXTRAS) .build(); } diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java index b8f6a4cfd8..f6360454e9 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java @@ -66,6 +66,7 @@ import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import androidx.media3.session.MediaLibraryService.MediaLibrarySession; import androidx.media3.session.MediaSession.ControllerInfo; +import androidx.media3.test.session.common.CommonConstants; import androidx.media3.test.session.common.TestHandler; import androidx.media3.test.session.common.TestUtils; import com.google.common.collect.ImmutableList; @@ -440,6 +441,13 @@ public class MockMediaLibraryService extends MediaLibraryService { private static MediaItem createMediaItemWithMetadata(String mediaId) { MediaMetadata mediaMetadata = MediaTestUtils.createMediaMetadata(); - return new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(mediaMetadata).build(); + return new MediaItem.Builder() + .setMediaId(mediaId) + .setRequestMetadata( + new MediaItem.RequestMetadata.Builder() + .setMediaUri(CommonConstants.METADATA_MEDIA_URI) + .build()) + .setMediaMetadata(mediaMetadata) + .build(); } }