Put the custom keys in MediaMetadataCompat to MediaMetadata.extras

PiperOrigin-RevId: 578473874
(cherry picked from commit 84022eacc560b90cf34253b2470aabdf4a4b767d)
This commit is contained in:
tianyifeng 2023-11-01 04:26:40 -07:00 committed by microkatz
parent fe8bbcaa12
commit 2237f4902d
3 changed files with 69 additions and 7 deletions

View File

@ -20,6 +20,9 @@
* Muxers:
* IMA extension:
* Session:
* Put the custom keys and values in `MediaMetadataCompat` to
`MediaMetadata.extras`
([#756](https://github.com/androidx/media/issues/756)).
* UI:
* Downloads:
* OkHttp Extension:

View File

@ -99,6 +99,7 @@ import androidx.media3.common.util.Util;
import androidx.media3.session.MediaLibraryService.LibraryParams;
import androidx.media3.session.PlayerInfo.BundlingExclusions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
@ -119,6 +120,41 @@ import java.util.concurrent.TimeoutException;
public static final BrowserRoot defaultBrowserRoot =
new BrowserRoot(MediaLibraryService.SERVICE_INTERFACE, null);
public static final ImmutableSet<String> KNOWN_METADATA_COMPAT_KEYS =
ImmutableSet.of(
MediaMetadataCompat.METADATA_KEY_TITLE,
MediaMetadataCompat.METADATA_KEY_ARTIST,
MediaMetadataCompat.METADATA_KEY_DURATION,
MediaMetadataCompat.METADATA_KEY_ALBUM,
MediaMetadataCompat.METADATA_KEY_AUTHOR,
MediaMetadataCompat.METADATA_KEY_WRITER,
MediaMetadataCompat.METADATA_KEY_COMPOSER,
MediaMetadataCompat.METADATA_KEY_COMPILATION,
MediaMetadataCompat.METADATA_KEY_DATE,
MediaMetadataCompat.METADATA_KEY_YEAR,
MediaMetadataCompat.METADATA_KEY_GENRE,
MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER,
MediaMetadataCompat.METADATA_KEY_NUM_TRACKS,
MediaMetadataCompat.METADATA_KEY_DISC_NUMBER,
MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST,
MediaMetadataCompat.METADATA_KEY_ART,
MediaMetadataCompat.METADATA_KEY_ART_URI,
MediaMetadataCompat.METADATA_KEY_ALBUM_ART,
MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
MediaMetadataCompat.METADATA_KEY_USER_RATING,
MediaMetadataCompat.METADATA_KEY_RATING,
MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE,
MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE,
MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION,
MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON,
MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI,
MediaMetadataCompat.METADATA_KEY_MEDIA_ID,
MediaMetadataCompat.METADATA_KEY_MEDIA_URI,
MediaMetadataCompat.METADATA_KEY_BT_FOLDER_TYPE,
MediaMetadataCompat.METADATA_KEY_ADVERTISEMENT,
MediaMetadataCompat.METADATA_KEY_DOWNLOAD_STATUS,
MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT);
/** Returns whether two {@link PlaybackStateCompat} have equal error. */
public static boolean areEqualError(
@Nullable PlaybackStateCompat a, @Nullable PlaybackStateCompat b) {
@ -510,6 +546,14 @@ import java.util.concurrent.TimeoutException;
builder.setIsPlayable(true);
Bundle extras = metadataCompat.getBundle();
for (String key : KNOWN_METADATA_COMPAT_KEYS) {
extras.remove(key);
}
if (!extras.isEmpty()) {
builder.setExtras(extras);
}
return builder.build();
}

View File

@ -22,6 +22,7 @@ import static androidx.media.utils.MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CH
import static androidx.media3.common.MimeTypes.AUDIO_AAC;
import static androidx.media3.common.MimeTypes.VIDEO_H264;
import static androidx.media3.common.MimeTypes.VIDEO_H265;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT;
import static androidx.media3.session.MediaConstants.EXTRA_KEY_ROOT_CHILDREN_BROWSABLE_ONLY;
import static androidx.media3.test.session.common.TestUtils.getCommandsAsList;
import static com.google.common.truth.Truth.assertThat;
@ -164,10 +165,7 @@ public final class MediaUtilsTest {
assertThat(descriptionCompat.getMediaId()).isEqualTo(mediaId);
assertThat(descriptionCompat.getTitle().toString()).isEqualTo(title);
assertThat(descriptionCompat.getDescription().toString()).isEqualTo(description);
assertThat(
descriptionCompat
.getExtras()
.getLong(androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT))
assertThat(descriptionCompat.getExtras().getLong(EXTRAS_KEY_MEDIA_TYPE_COMPAT))
.isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC);
}
@ -208,6 +206,25 @@ public final class MediaUtilsTest {
assertThat(MediaUtils.convertToMediaMetadata(title).title.toString()).isEqualTo(title);
}
@Test
public void convertToMediaMetadata_withCustomKey() {
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, "title");
builder.putLong(EXTRAS_KEY_MEDIA_TYPE_COMPAT, (long) MediaMetadata.MEDIA_TYPE_MUSIC);
builder.putString("custom_key", "value");
MediaMetadataCompat testMediaMetadataCompat = builder.build();
MediaMetadata mediaMetadata =
MediaUtils.convertToMediaMetadata(testMediaMetadataCompat, RatingCompat.RATING_NONE);
assertThat(mediaMetadata.title.toString()).isEqualTo("title");
assertThat(mediaMetadata.mediaType).isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC);
assertThat(mediaMetadata.extras).isNotNull();
assertThat(mediaMetadata.extras.getString("custom_key")).isEqualTo("value");
assertThat(mediaMetadata.extras.containsKey(MediaMetadataCompat.METADATA_KEY_TITLE)).isFalse();
assertThat(mediaMetadata.extras.containsKey(EXTRAS_KEY_MEDIA_TYPE_COMPAT)).isFalse();
}
@Test
public void convertToMediaMetadata_roundTripViaMediaMetadataCompat_returnsEqualMediaItemMetadata()
throws Exception {
@ -272,9 +289,7 @@ public final class MediaUtilsTest {
/* durationMs= */ C.TIME_UNSET,
/* artworkBitmap= */ null);
assertThat(
mediaMetadataCompat.getLong(
androidx.media3.session.MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT))
assertThat(mediaMetadataCompat.getLong(EXTRAS_KEY_MEDIA_TYPE_COMPAT))
.isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC);
}