Write media type with a custom key to legacy components.
This allows legacy media controllers and browsers to access this information and legacy sessions and browser services to set this information. PiperOrigin-RevId: 492414716
This commit is contained in:
parent
85c48c481e
commit
ca4c6efdb7
@ -19,6 +19,7 @@ import android.app.PendingIntent;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
import android.support.v4.media.MediaDescriptionCompat;
|
||||||
import android.support.v4.media.session.MediaControllerCompat;
|
import android.support.v4.media.session.MediaControllerCompat;
|
||||||
import android.support.v4.media.session.MediaSessionCompat;
|
import android.support.v4.media.session.MediaSessionCompat;
|
||||||
import android.support.v4.media.session.PlaybackStateCompat;
|
import android.support.v4.media.session.PlaybackStateCompat;
|
||||||
@ -455,6 +456,15 @@ public final class MediaConstants {
|
|||||||
androidx.media.utils.MediaConstants
|
androidx.media.utils.MediaConstants
|
||||||
.BROWSER_SERVICE_EXTRAS_KEY_APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT;
|
.BROWSER_SERVICE_EXTRAS_KEY_APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Bundle} key used to indicate the {@link MediaMetadata.MediaType} in the legacy {@link
|
||||||
|
* MediaDescriptionCompat} as a long {@link MediaDescriptionCompat#getExtras() extra} and as a
|
||||||
|
* long value in {@link android.support.v4.media.MediaMetadataCompat}.
|
||||||
|
*/
|
||||||
|
@UnstableApi
|
||||||
|
public static final String EXTRAS_KEY_MEDIA_TYPE_COMPAT =
|
||||||
|
"androidx.media3.session.EXTRAS_KEY_MEDIA_TYPE_COMPAT";
|
||||||
|
|
||||||
/* package */ static final String SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED =
|
/* package */ static final String SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED =
|
||||||
"androidx.media3.session.SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED";
|
"androidx.media3.session.SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED";
|
||||||
/* package */ static final String SESSION_COMMAND_REQUEST_SESSION3_TOKEN =
|
/* package */ static final String SESSION_COMMAND_REQUEST_SESSION3_TOKEN =
|
||||||
|
@ -339,15 +339,24 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
|
|||||||
builder.setIconBitmap(artworkBitmap);
|
builder.setIconBitmap(artworkBitmap);
|
||||||
}
|
}
|
||||||
@Nullable Bundle extras = metadata.extras;
|
@Nullable Bundle extras = metadata.extras;
|
||||||
if (metadata.folderType != null && metadata.folderType != MediaMetadata.FOLDER_TYPE_NONE) {
|
boolean hasFolderType =
|
||||||
|
metadata.folderType != null && metadata.folderType != MediaMetadata.FOLDER_TYPE_NONE;
|
||||||
|
boolean hasMediaType = metadata.mediaType != null;
|
||||||
|
if (hasFolderType || hasMediaType) {
|
||||||
if (extras == null) {
|
if (extras == null) {
|
||||||
extras = new Bundle();
|
extras = new Bundle();
|
||||||
} else {
|
} else {
|
||||||
extras = new Bundle(extras);
|
extras = new Bundle(extras);
|
||||||
}
|
}
|
||||||
|
if (hasFolderType) {
|
||||||
extras.putLong(
|
extras.putLong(
|
||||||
MediaDescriptionCompat.EXTRA_BT_FOLDER_TYPE,
|
MediaDescriptionCompat.EXTRA_BT_FOLDER_TYPE,
|
||||||
convertToExtraBtFolderType(metadata.folderType));
|
convertToExtraBtFolderType(checkNotNull(metadata.folderType)));
|
||||||
|
}
|
||||||
|
if (hasMediaType) {
|
||||||
|
extras.putLong(
|
||||||
|
MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, checkNotNull(metadata.mediaType));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return builder
|
return builder
|
||||||
.setTitle(metadata.title)
|
.setTitle(metadata.title)
|
||||||
@ -420,6 +429,10 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
|
|||||||
builder.setFolderType(MediaMetadata.FOLDER_TYPE_NONE);
|
builder.setFolderType(MediaMetadata.FOLDER_TYPE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (extras != null && extras.containsKey(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT)) {
|
||||||
|
builder.setMediaType((int) extras.getLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT));
|
||||||
|
}
|
||||||
|
|
||||||
builder.setIsPlayable(playable);
|
builder.setIsPlayable(playable);
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
@ -496,6 +509,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
|
|||||||
builder.setFolderType(MediaMetadata.FOLDER_TYPE_NONE);
|
builder.setFolderType(MediaMetadata.FOLDER_TYPE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (metadataCompat.containsKey(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT)) {
|
||||||
|
builder.setMediaType(
|
||||||
|
(int) metadataCompat.getLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT));
|
||||||
|
}
|
||||||
|
|
||||||
builder.setIsPlayable(true);
|
builder.setIsPlayable(true);
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
@ -610,6 +628,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
|
|||||||
builder.putRating(MediaMetadataCompat.METADATA_KEY_RATING, overallRatingCompat);
|
builder.putRating(MediaMetadataCompat.METADATA_KEY_RATING, overallRatingCompat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mediaItem.mediaMetadata.mediaType != null) {
|
||||||
|
builder.putLong(
|
||||||
|
MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, mediaItem.mediaMetadata.mediaType);
|
||||||
|
}
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,20 +142,29 @@ public final class MediaUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void convertToMediaDescriptionCompat() {
|
public void convertToMediaDescriptionCompat_setsExpectedValues() {
|
||||||
String mediaId = "testId";
|
String mediaId = "testId";
|
||||||
String title = "testTitle";
|
String title = "testTitle";
|
||||||
String description = "testDesc";
|
String description = "testDesc";
|
||||||
MediaMetadata metadata =
|
MediaMetadata metadata =
|
||||||
new MediaMetadata.Builder().setTitle(title).setDescription(description).build();
|
new MediaMetadata.Builder()
|
||||||
|
.setTitle(title)
|
||||||
|
.setDescription(description)
|
||||||
|
.setMediaType(MediaMetadata.MEDIA_TYPE_MUSIC)
|
||||||
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(metadata).build();
|
new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(metadata).build();
|
||||||
MediaDescriptionCompat descriptionCompat =
|
MediaDescriptionCompat descriptionCompat =
|
||||||
MediaUtils.convertToMediaDescriptionCompat(mediaItem);
|
MediaUtils.convertToMediaDescriptionCompat(mediaItem, /* artworkBitmap= */ null);
|
||||||
|
|
||||||
assertThat(descriptionCompat.getMediaId()).isEqualTo(mediaId);
|
assertThat(descriptionCompat.getMediaId()).isEqualTo(mediaId);
|
||||||
assertThat(descriptionCompat.getTitle()).isEqualTo(title);
|
assertThat(descriptionCompat.getTitle()).isEqualTo(title);
|
||||||
assertThat(descriptionCompat.getDescription()).isEqualTo(description);
|
assertThat(descriptionCompat.getDescription()).isEqualTo(description);
|
||||||
|
assertThat(
|
||||||
|
descriptionCompat
|
||||||
|
.getExtras()
|
||||||
|
.getLong(androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT))
|
||||||
|
.isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -196,7 +205,8 @@ public final class MediaUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void convertToMediaMetadata_roundTrip_returnsEqualMediaItem() throws Exception {
|
public void convertToMediaMetadata_roundTripViaMediaMetadataCompat_returnsEqualMediaItemMetadata()
|
||||||
|
throws Exception {
|
||||||
MediaItem testMediaItem = MediaTestUtils.createMediaItemWithArtworkData("testZZZ");
|
MediaItem testMediaItem = MediaTestUtils.createMediaItemWithArtworkData("testZZZ");
|
||||||
MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata;
|
MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata;
|
||||||
@Nullable Bitmap testArtworkBitmap = null;
|
@Nullable Bitmap testArtworkBitmap = null;
|
||||||
@ -216,6 +226,46 @@ public final class MediaUtilsTest {
|
|||||||
assertThat(mediaMetadata.artworkData).isNotNull();
|
assertThat(mediaMetadata.artworkData).isNotNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void
|
||||||
|
convertToMediaMetadata_roundTripViaMediaDescriptionCompat_returnsEqualMediaItemMetadata()
|
||||||
|
throws Exception {
|
||||||
|
MediaItem testMediaItem = MediaTestUtils.createMediaItemWithArtworkData("testZZZ");
|
||||||
|
MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata;
|
||||||
|
@Nullable Bitmap testArtworkBitmap = null;
|
||||||
|
@Nullable
|
||||||
|
ListenableFuture<Bitmap> bitmapFuture = bitmapLoader.loadBitmapFromMetadata(testMediaMetadata);
|
||||||
|
if (bitmapFuture != null) {
|
||||||
|
testArtworkBitmap = bitmapFuture.get(10, SECONDS);
|
||||||
|
}
|
||||||
|
MediaDescriptionCompat mediaDescriptionCompat =
|
||||||
|
MediaUtils.convertToMediaDescriptionCompat(testMediaItem, testArtworkBitmap);
|
||||||
|
|
||||||
|
MediaMetadata mediaMetadata =
|
||||||
|
MediaUtils.convertToMediaMetadata(mediaDescriptionCompat, RatingCompat.RATING_NONE);
|
||||||
|
|
||||||
|
assertThat(mediaMetadata).isEqualTo(testMediaMetadata);
|
||||||
|
assertThat(mediaMetadata.artworkData).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void convertToMediaMetadataCompat_withMediaType_setsMediaType() {
|
||||||
|
MediaItem mediaItem =
|
||||||
|
new MediaItem.Builder()
|
||||||
|
.setMediaMetadata(
|
||||||
|
new MediaMetadata.Builder().setMediaType(MediaMetadata.MEDIA_TYPE_MUSIC).build())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
MediaMetadataCompat mediaMetadataCompat =
|
||||||
|
MediaUtils.convertToMediaMetadataCompat(
|
||||||
|
mediaItem, /* durotionsMs= */ C.TIME_UNSET, /* artworkBitmap= */ null);
|
||||||
|
|
||||||
|
assertThat(
|
||||||
|
mediaMetadataCompat.getLong(
|
||||||
|
androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT))
|
||||||
|
.isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void convertBetweenRatingAndRatingCompat() {
|
public void convertBetweenRatingAndRatingCompat() {
|
||||||
assertRatingEquals(MediaUtils.convertToRating(null), MediaUtils.convertToRatingCompat(null));
|
assertRatingEquals(MediaUtils.convertToRating(null), MediaUtils.convertToRatingCompat(null));
|
||||||
|
@ -56,7 +56,8 @@ public final class MediaTestUtils {
|
|||||||
public static MediaItem createMediaItem(String mediaId) {
|
public static MediaItem createMediaItem(String mediaId) {
|
||||||
MediaMetadata mediaMetadata =
|
MediaMetadata mediaMetadata =
|
||||||
new MediaMetadata.Builder()
|
new MediaMetadata.Builder()
|
||||||
.setFolderType(MediaMetadata.FOLDER_TYPE_NONE)
|
.setFolderType(MediaMetadata.FOLDER_TYPE_TITLES)
|
||||||
|
.setMediaType(MediaMetadata.MEDIA_TYPE_PLAYLIST)
|
||||||
.setIsPlayable(true)
|
.setIsPlayable(true)
|
||||||
.build();
|
.build();
|
||||||
return new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(mediaMetadata).build();
|
return new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(mediaMetadata).build();
|
||||||
@ -65,7 +66,8 @@ public final class MediaTestUtils {
|
|||||||
public static MediaItem createMediaItemWithArtworkData(String mediaId) {
|
public static MediaItem createMediaItemWithArtworkData(String mediaId) {
|
||||||
MediaMetadata.Builder mediaMetadataBuilder =
|
MediaMetadata.Builder mediaMetadataBuilder =
|
||||||
new MediaMetadata.Builder()
|
new MediaMetadata.Builder()
|
||||||
.setFolderType(MediaMetadata.FOLDER_TYPE_NONE)
|
.setFolderType(MediaMetadata.FOLDER_TYPE_TITLES)
|
||||||
|
.setMediaType(MediaMetadata.MEDIA_TYPE_PLAYLIST)
|
||||||
.setIsPlayable(true);
|
.setIsPlayable(true);
|
||||||
try {
|
try {
|
||||||
byte[] artworkData =
|
byte[] artworkData =
|
||||||
|
Loading…
x
Reference in New Issue
Block a user