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:
parent
6b782d1011
commit
581c6b5429
@ -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.
|
||||
|
@ -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))
|
||||
|
@ -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(
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user