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
This commit is contained in:
tonihei 2022-05-30 12:32:25 +00:00 committed by Marc Baechinger
parent 6b782d1011
commit 581c6b5429
9 changed files with 47 additions and 61 deletions

View File

@ -23,6 +23,9 @@
`MediaSource.Factory.setLoadErrorHandlingPolicy`. Instances of `MediaSource.Factory.setLoadErrorHandlingPolicy`. Instances of
`DefaultDrmSessionManagerProvider` and `DefaultLoadErrorHandlingPolicy` `DefaultDrmSessionManagerProvider` and `DefaultLoadErrorHandlingPolicy`
can be passed explicitly if required. 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: * Track selection:
* Flatten `TrackSelectionOverrides` class into `TrackSelectionParameters`, * Flatten `TrackSelectionOverrides` class into `TrackSelectionParameters`,
and promote `TrackSelectionOverride` to a top level class. and promote `TrackSelectionOverride` to a top level class.

View File

@ -52,7 +52,6 @@ public final class MediaMetadata implements Bundleable {
@Nullable private CharSequence displayTitle; @Nullable private CharSequence displayTitle;
@Nullable private CharSequence subtitle; @Nullable private CharSequence subtitle;
@Nullable private CharSequence description; @Nullable private CharSequence description;
@Nullable private Uri mediaUri;
@Nullable private Rating userRating; @Nullable private Rating userRating;
@Nullable private Rating overallRating; @Nullable private Rating overallRating;
@Nullable private byte[] artworkData; @Nullable private byte[] artworkData;
@ -88,7 +87,6 @@ public final class MediaMetadata implements Bundleable {
this.displayTitle = mediaMetadata.displayTitle; this.displayTitle = mediaMetadata.displayTitle;
this.subtitle = mediaMetadata.subtitle; this.subtitle = mediaMetadata.subtitle;
this.description = mediaMetadata.description; this.description = mediaMetadata.description;
this.mediaUri = mediaMetadata.mediaUri;
this.userRating = mediaMetadata.userRating; this.userRating = mediaMetadata.userRating;
this.overallRating = mediaMetadata.overallRating; this.overallRating = mediaMetadata.overallRating;
this.artworkData = mediaMetadata.artworkData; this.artworkData = mediaMetadata.artworkData;
@ -161,12 +159,6 @@ public final class MediaMetadata implements Bundleable {
return this; return this;
} }
/** Sets the media {@link Uri}. */
public Builder setMediaUri(@Nullable Uri mediaUri) {
this.mediaUri = mediaUri;
return this;
}
/** Sets the user {@link Rating}. */ /** Sets the user {@link Rating}. */
public Builder setUserRating(@Nullable Rating userRating) { public Builder setUserRating(@Nullable Rating userRating) {
this.userRating = userRating; this.userRating = userRating;
@ -431,9 +423,6 @@ public final class MediaMetadata implements Bundleable {
if (mediaMetadata.description != null) { if (mediaMetadata.description != null) {
setDescription(mediaMetadata.description); setDescription(mediaMetadata.description);
} }
if (mediaMetadata.mediaUri != null) {
setMediaUri(mediaMetadata.mediaUri);
}
if (mediaMetadata.userRating != null) { if (mediaMetadata.userRating != null) {
setUserRating(mediaMetadata.userRating); setUserRating(mediaMetadata.userRating);
} }
@ -636,8 +625,6 @@ public final class MediaMetadata implements Bundleable {
@Nullable public final CharSequence subtitle; @Nullable public final CharSequence subtitle;
/** Optional description. */ /** Optional description. */
@Nullable public final CharSequence description; @Nullable public final CharSequence description;
/** Optional media {@link Uri}. */
@Nullable public final Uri mediaUri;
/** Optional user {@link Rating}. */ /** Optional user {@link Rating}. */
@Nullable public final Rating userRating; @Nullable public final Rating userRating;
/** Optional overall {@link Rating}. */ /** Optional overall {@link Rating}. */
@ -722,7 +709,6 @@ public final class MediaMetadata implements Bundleable {
this.displayTitle = builder.displayTitle; this.displayTitle = builder.displayTitle;
this.subtitle = builder.subtitle; this.subtitle = builder.subtitle;
this.description = builder.description; this.description = builder.description;
this.mediaUri = builder.mediaUri;
this.userRating = builder.userRating; this.userRating = builder.userRating;
this.overallRating = builder.overallRating; this.overallRating = builder.overallRating;
this.artworkData = builder.artworkData; this.artworkData = builder.artworkData;
@ -771,7 +757,6 @@ public final class MediaMetadata implements Bundleable {
&& Util.areEqual(displayTitle, that.displayTitle) && Util.areEqual(displayTitle, that.displayTitle)
&& Util.areEqual(subtitle, that.subtitle) && Util.areEqual(subtitle, that.subtitle)
&& Util.areEqual(description, that.description) && Util.areEqual(description, that.description)
&& Util.areEqual(mediaUri, that.mediaUri)
&& Util.areEqual(userRating, that.userRating) && Util.areEqual(userRating, that.userRating)
&& Util.areEqual(overallRating, that.overallRating) && Util.areEqual(overallRating, that.overallRating)
&& Arrays.equals(artworkData, that.artworkData) && Arrays.equals(artworkData, that.artworkData)
@ -807,7 +792,6 @@ public final class MediaMetadata implements Bundleable {
displayTitle, displayTitle,
subtitle, subtitle,
description, description,
mediaUri,
userRating, userRating,
overallRating, overallRating,
Arrays.hashCode(artworkData), Arrays.hashCode(artworkData),
@ -918,7 +902,6 @@ public final class MediaMetadata implements Bundleable {
bundle.putCharSequence(keyForField(FIELD_DISPLAY_TITLE), displayTitle); bundle.putCharSequence(keyForField(FIELD_DISPLAY_TITLE), displayTitle);
bundle.putCharSequence(keyForField(FIELD_SUBTITLE), subtitle); bundle.putCharSequence(keyForField(FIELD_SUBTITLE), subtitle);
bundle.putCharSequence(keyForField(FIELD_DESCRIPTION), description); bundle.putCharSequence(keyForField(FIELD_DESCRIPTION), description);
bundle.putParcelable(keyForField(FIELD_MEDIA_URI), mediaUri);
bundle.putByteArray(keyForField(FIELD_ARTWORK_DATA), artworkData); bundle.putByteArray(keyForField(FIELD_ARTWORK_DATA), artworkData);
bundle.putParcelable(keyForField(FIELD_ARTWORK_URI), artworkUri); bundle.putParcelable(keyForField(FIELD_ARTWORK_URI), artworkUri);
bundle.putCharSequence(keyForField(FIELD_WRITER), writer); bundle.putCharSequence(keyForField(FIELD_WRITER), writer);
@ -992,7 +975,6 @@ public final class MediaMetadata implements Bundleable {
.setDisplayTitle(bundle.getCharSequence(keyForField(FIELD_DISPLAY_TITLE))) .setDisplayTitle(bundle.getCharSequence(keyForField(FIELD_DISPLAY_TITLE)))
.setSubtitle(bundle.getCharSequence(keyForField(FIELD_SUBTITLE))) .setSubtitle(bundle.getCharSequence(keyForField(FIELD_SUBTITLE)))
.setDescription(bundle.getCharSequence(keyForField(FIELD_DESCRIPTION))) .setDescription(bundle.getCharSequence(keyForField(FIELD_DESCRIPTION)))
.setMediaUri(bundle.getParcelable(keyForField(FIELD_MEDIA_URI)))
.setArtworkData( .setArtworkData(
bundle.getByteArray(keyForField(FIELD_ARTWORK_DATA)), bundle.getByteArray(keyForField(FIELD_ARTWORK_DATA)),
bundle.containsKey(keyForField(FIELD_ARTWORK_DATA_TYPE)) bundle.containsKey(keyForField(FIELD_ARTWORK_DATA_TYPE))

View File

@ -41,7 +41,6 @@ public class MediaMetadataTest {
assertThat(mediaMetadata.displayTitle).isNull(); assertThat(mediaMetadata.displayTitle).isNull();
assertThat(mediaMetadata.subtitle).isNull(); assertThat(mediaMetadata.subtitle).isNull();
assertThat(mediaMetadata.description).isNull(); assertThat(mediaMetadata.description).isNull();
assertThat(mediaMetadata.mediaUri).isNull();
assertThat(mediaMetadata.userRating).isNull(); assertThat(mediaMetadata.userRating).isNull();
assertThat(mediaMetadata.overallRating).isNull(); assertThat(mediaMetadata.overallRating).isNull();
assertThat(mediaMetadata.artworkData).isNull(); assertThat(mediaMetadata.artworkData).isNull();
@ -127,7 +126,6 @@ public class MediaMetadataTest {
.setDisplayTitle("display title") .setDisplayTitle("display title")
.setSubtitle("subtitle") .setSubtitle("subtitle")
.setDescription("description") .setDescription("description")
.setMediaUri(Uri.parse("https://www.google.com"))
.setUserRating(new HeartRating(false)) .setUserRating(new HeartRating(false))
.setOverallRating(new PercentageRating(87.4f)) .setOverallRating(new PercentageRating(87.4f))
.setArtworkData( .setArtworkData(

View File

@ -188,29 +188,33 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
@Nullable String mediaId, @Nullable String mediaId,
MediaMetadataCompat metadataCompat, MediaMetadataCompat metadataCompat,
@RatingCompat.Style int ratingType) { @RatingCompat.Style int ratingType) {
MediaItem.Builder mediaItemBuilder = new MediaItem.Builder(); MediaItem.Builder builder = new MediaItem.Builder();
if (mediaId != null) { if (mediaId != null) {
mediaItemBuilder.setMediaId(mediaId); builder.setMediaId(mediaId);
} }
mediaItemBuilder.setMediaMetadata(convertToMediaMetadata(metadataCompat, ratingType)); @Nullable
String mediaUriString = metadataCompat.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI);
return mediaItemBuilder.build(); 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( private static MediaItem convertToMediaItem(
MediaDescriptionCompat descriptionCompat, boolean browsable, boolean playable) { MediaDescriptionCompat descriptionCompat, boolean browsable, boolean playable) {
MediaItem.Builder mediaItemBuilder = new MediaItem.Builder();
@Nullable String mediaId = descriptionCompat.getMediaId(); @Nullable String mediaId = descriptionCompat.getMediaId();
if (mediaId != null) { return new MediaItem.Builder()
mediaItemBuilder.setMediaId(mediaId); .setMediaId(mediaId == null ? MediaItem.DEFAULT_MEDIA_ID : mediaId)
} .setRequestMetadata(
new MediaItem.RequestMetadata.Builder()
mediaItemBuilder.setMediaMetadata( .setMediaUri(descriptionCompat.getMediaUri())
convertToMediaMetadata(descriptionCompat, RatingCompat.RATING_NONE, browsable, playable)); .build())
.setMediaMetadata(
return mediaItemBuilder.build(); convertToMediaMetadata(
descriptionCompat, RatingCompat.RATING_NONE, browsable, playable))
.build();
} }
/** Converts a list of {@link MediaBrowserCompat.MediaItem} to a list of {@link MediaItem}. */ /** 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) .setSubtitle(metadata.subtitle)
.setDescription(metadata.description) .setDescription(metadata.description)
.setIconUri(metadata.artworkUri) .setIconUri(metadata.artworkUri)
.setMediaUri(metadata.mediaUri) .setMediaUri(item.requestMetadata.mediaUri)
.setExtras(extras) .setExtras(extras)
.build(); .build();
} }
@ -381,7 +385,6 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
.setSubtitle(descriptionCompat.getSubtitle()) .setSubtitle(descriptionCompat.getSubtitle())
.setDescription(descriptionCompat.getDescription()) .setDescription(descriptionCompat.getDescription())
.setArtworkUri(descriptionCompat.getIconUri()) .setArtworkUri(descriptionCompat.getIconUri())
.setMediaUri(descriptionCompat.getMediaUri())
.setUserRating(convertToRating(RatingCompat.newUnratedRating(ratingType))); .setUserRating(convertToRating(RatingCompat.newUnratedRating(ratingType)));
@Nullable Bitmap iconBitmap = descriptionCompat.getIconBitmap(); @Nullable Bitmap iconBitmap = descriptionCompat.getIconBitmap();
@ -450,12 +453,6 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
builder.setRecordingYear((int) year); builder.setRecordingYear((int) year);
} }
@Nullable
String mediaUriString = metadataCompat.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI);
if (mediaUriString != null) {
builder.setMediaUri(Uri.parse(mediaUriString));
}
@Nullable @Nullable
String artworkUriString = String artworkUriString =
getFirstString( getFirstString(
@ -563,8 +560,10 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
builder.putLong(MediaMetadataCompat.METADATA_KEY_YEAR, metadata.recordingYear); builder.putLong(MediaMetadataCompat.METADATA_KEY_YEAR, metadata.recordingYear);
} }
if (metadata.mediaUri != null) { if (mediaItem.requestMetadata.mediaUri != null) {
builder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI, metadata.mediaUri.toString()); builder.putString(
MediaMetadataCompat.METADATA_KEY_MEDIA_URI,
mediaItem.requestMetadata.mediaUri.toString());
} }
if (metadata.artworkUri != null) { if (metadata.artworkUri != null) {

View File

@ -497,12 +497,12 @@ public class MediaBrowserServiceCompatCallbackWithMediaBrowserTest {
MediaBrowserCompat.MediaItem browserItem, MediaItem commonItem) { MediaBrowserCompat.MediaItem browserItem, MediaItem commonItem) {
assertThat(commonItem.mediaId).isEqualTo(browserItem.getMediaId()); assertThat(commonItem.mediaId).isEqualTo(browserItem.getMediaId());
MediaDescriptionCompat description = browserItem.getDescription(); MediaDescriptionCompat description = browserItem.getDescription();
assertThat(commonItem.requestMetadata.mediaUri).isEqualTo(description.getMediaUri());
MediaMetadata metadata = commonItem.mediaMetadata; MediaMetadata metadata = commonItem.mediaMetadata;
assertThat(TextUtils.equals(metadata.title, description.getTitle())).isTrue(); assertThat(TextUtils.equals(metadata.title, description.getTitle())).isTrue();
assertThat(TextUtils.equals(metadata.subtitle, description.getSubtitle())).isTrue(); assertThat(TextUtils.equals(metadata.subtitle, description.getSubtitle())).isTrue();
assertThat(TextUtils.equals(metadata.description, description.getDescription())).isTrue(); assertThat(TextUtils.equals(metadata.description, description.getDescription())).isTrue();
assertThat(metadata.artworkUri).isEqualTo(description.getIconUri()); assertThat(metadata.artworkUri).isEqualTo(description.getIconUri());
assertThat(metadata.mediaUri).isEqualTo(description.getMediaUri());
assertThat(TestUtils.equals(metadata.extras, description.getExtras())).isTrue(); assertThat(TestUtils.equals(metadata.extras, description.getExtras())).isTrue();
} }

View File

@ -979,7 +979,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
assertThat(TextUtils.equals(description.getDescription(), mediaItem.mediaMetadata.description)) assertThat(TextUtils.equals(description.getDescription(), mediaItem.mediaMetadata.description))
.isTrue(); .isTrue();
assertThat(description.getIconUri()).isEqualTo(mediaItem.mediaMetadata.artworkUri); 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(); assertThat(TestUtils.equals(description.getExtras(), mediaItem.mediaMetadata.extras)).isTrue();
} }

View File

@ -440,19 +440,16 @@ public class MediaControllerWithMediaSessionCompatTest {
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
assertThat(timelineRef.get().getWindowCount()).isEqualTo(1); assertThat(timelineRef.get().getWindowCount()).isEqualTo(1);
MediaMetadata metadata = MediaItem mediaItem =
timelineRef timelineRef.get().getWindow(/* windowIndex= */ 0, new Timeline.Window()).mediaItem;
.get() MediaMetadata metadata = mediaItem.mediaMetadata;
.getWindow(/* windowIndex= */ 0, new Timeline.Window())
.mediaItem
.mediaMetadata;
assertThat(TextUtils.equals(metadata.title, testTitle)).isTrue(); assertThat(TextUtils.equals(metadata.title, testTitle)).isTrue();
assertThat(TextUtils.equals(metadata.subtitle, testSubtitle)).isTrue(); assertThat(TextUtils.equals(metadata.subtitle, testSubtitle)).isTrue();
assertThat(TextUtils.equals(metadata.description, testDescription)).isTrue(); assertThat(TextUtils.equals(metadata.description, testDescription)).isTrue();
assertThat(metadata.artworkUri).isEqualTo(testIconUri); assertThat(metadata.artworkUri).isEqualTo(testIconUri);
if (Util.SDK_INT < 21 || Util.SDK_INT >= 23) { if (Util.SDK_INT < 21 || Util.SDK_INT >= 23) {
// TODO(b/199055952): Test mediaUri for all API levels once the bug is fixed. // 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(); assertThat(TestUtils.equals(metadata.extras, testExtras)).isTrue();
} }
@ -536,13 +533,14 @@ public class MediaControllerWithMediaSessionCompatTest {
session.setMetadata(metadataCompat); session.setMetadata(metadataCompat);
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
assertThat(itemRef.get().mediaId).isEqualTo(testMediaId); MediaItem mediaItem = itemRef.get();
MediaMetadata metadata = itemRef.get().mediaMetadata; 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.title, testTitle)).isTrue();
assertThat(TextUtils.equals(metadata.subtitle, testSubtitle)).isTrue(); assertThat(TextUtils.equals(metadata.subtitle, testSubtitle)).isTrue();
assertThat(TextUtils.equals(metadata.description, testDescription)).isTrue(); assertThat(TextUtils.equals(metadata.description, testDescription)).isTrue();
assertThat(metadata.artworkUri).isEqualTo(Uri.parse(testIconUri)); assertThat(metadata.artworkUri).isEqualTo(Uri.parse(testIconUri));
assertThat(metadata.mediaUri).isEqualTo(Uri.parse(testMediaUri));
} }
@Test @Test

View File

@ -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_ARTWORK_URI;
import static androidx.media3.test.session.common.CommonConstants.METADATA_DESCRIPTION; 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_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_SUBTITLE;
import static androidx.media3.test.session.common.CommonConstants.METADATA_TITLE; import static androidx.media3.test.session.common.CommonConstants.METADATA_TITLE;
import static androidx.media3.test.session.common.CommonConstants.SUPPORT_APP_PACKAGE_NAME; import static androidx.media3.test.session.common.CommonConstants.SUPPORT_APP_PACKAGE_NAME;
@ -82,7 +81,6 @@ public final class MediaTestUtils {
.setSubtitle(METADATA_SUBTITLE) .setSubtitle(METADATA_SUBTITLE)
.setDescription(METADATA_DESCRIPTION) .setDescription(METADATA_DESCRIPTION)
.setArtworkUri(METADATA_ARTWORK_URI) .setArtworkUri(METADATA_ARTWORK_URI)
.setMediaUri(METADATA_MEDIA_URI)
.setExtras(METADATA_EXTRAS) .setExtras(METADATA_EXTRAS)
.build(); .build();
} }

View File

@ -66,6 +66,7 @@ import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.session.MediaLibraryService.MediaLibrarySession; import androidx.media3.session.MediaLibraryService.MediaLibrarySession;
import androidx.media3.session.MediaSession.ControllerInfo; 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.TestHandler;
import androidx.media3.test.session.common.TestUtils; import androidx.media3.test.session.common.TestUtils;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@ -440,6 +441,13 @@ public class MockMediaLibraryService extends MediaLibraryService {
private static MediaItem createMediaItemWithMetadata(String mediaId) { private static MediaItem createMediaItemWithMetadata(String mediaId) {
MediaMetadata mediaMetadata = MediaTestUtils.createMediaMetadata(); 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();
} }
} }