Handle displayTitle and title in legacy conversions

When converting `MediaMetadata` to the legacy `MediaDescriptionCompat`
the selection and order of properties to use has been aligned with the
behavior of media1. This selection is relevant for users that use a
platform or legacy controller or browser. Before and up to the current
API version 34, this includes System UI, Android Auto/Automotive and
AVRCP (Bluetooth).

PiperOrigin-RevId: 630999535
This commit is contained in:
bachinger 2024-05-06 04:19:18 -07:00 committed by Copybara-Service
parent 1ef0b7c616
commit 2c912aa697
10 changed files with 308 additions and 50 deletions

View File

@ -73,6 +73,9 @@
* Hide seekbar in the media notification for live streams by not setting
the duration into the platform session metadata
([#1256](https://github.com/androidx/media/issues/1256)).
* Align conversion of `MediaMetadata` to `MediaDescriptionCompat`, to use
the same preferred order and logic when selecting metadata properties as
in media1.
* UI:
* Downloads:
* OkHttp Extension:

View File

@ -43,6 +43,7 @@ import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Util.constrainValue;
import static androidx.media3.session.MediaConstants.EXTRA_KEY_ROOT_CHILDREN_BROWSABLE_ONLY;
import static androidx.media3.session.legacy.MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS;
import static androidx.media3.session.legacy.MediaMetadataCompat.PREFERRED_DESCRIPTION_ORDER;
import static androidx.media3.session.legacy.MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS;
import static java.lang.Math.max;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
@ -342,7 +343,6 @@ import java.util.concurrent.TimeoutException;
MediaMetadata.Builder builder = new MediaMetadata.Builder();
builder
.setTitle(descriptionCompat.getTitle())
.setSubtitle(descriptionCompat.getSubtitle())
.setDescription(descriptionCompat.getDescription())
.setArtworkUri(descriptionCompat.getIconUri())
@ -373,6 +373,17 @@ import java.util.concurrent.TimeoutException;
builder.setMediaType((int) extras.getLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT));
extras.remove(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT);
}
if (extras != null
&& extras.containsKey(MediaConstants.EXTRAS_KEY_MEDIA_DESCRIPTION_COMPAT_TITLE)) {
builder.setTitle(
extras.getCharSequence(MediaConstants.EXTRAS_KEY_MEDIA_DESCRIPTION_COMPAT_TITLE));
builder.setDisplayTitle(descriptionCompat.getTitle());
extras.remove(MediaConstants.EXTRAS_KEY_MEDIA_DESCRIPTION_COMPAT_TITLE);
} else {
builder.setTitle(descriptionCompat.getTitle());
}
if (extras != null && !extras.isEmpty()) {
builder.setExtras(extras);
}
@ -392,12 +403,12 @@ import java.util.concurrent.TimeoutException;
MediaMetadata.Builder builder = new MediaMetadata.Builder();
CharSequence title = metadataCompat.getText(MediaMetadataCompat.METADATA_KEY_TITLE);
CharSequence displayTitle =
metadataCompat.getText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE);
builder
.setTitle(
getFirstText(
metadataCompat,
MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE,
MediaMetadataCompat.METADATA_KEY_TITLE))
.setTitle(title != null ? title : displayTitle)
.setDisplayTitle(title != null ? displayTitle : null)
.setSubtitle(metadataCompat.getText(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE))
.setDescription(
metadataCompat.getText(MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION))
@ -502,17 +513,6 @@ import java.util.concurrent.TimeoutException;
return null;
}
@Nullable
private static CharSequence getFirstText(
MediaMetadataCompat mediaMetadataCompat, String... keys) {
for (String key : keys) {
if (mediaMetadataCompat.containsKey(key)) {
return mediaMetadataCompat.getText(key);
}
}
return null;
}
/**
* Converts a {@link MediaMetadata} to a {@link MediaMetadataCompat}.
*
@ -538,7 +538,10 @@ import java.util.concurrent.TimeoutException;
if (metadata.title != null) {
builder.putText(MediaMetadataCompat.METADATA_KEY_TITLE, metadata.title);
builder.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, metadata.title);
}
if (metadata.displayTitle != null) {
builder.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, metadata.displayTitle);
}
if (metadata.subtitle != null) {
@ -638,14 +641,15 @@ import java.util.concurrent.TimeoutException;
builder.setIconBitmap(artworkBitmap);
}
@Nullable Bundle extras = metadata.extras;
if (extras != null) {
extras = new Bundle(extras);
}
boolean hasFolderType =
metadata.folderType != null && metadata.folderType != MediaMetadata.FOLDER_TYPE_NONE;
boolean hasMediaType = metadata.mediaType != null;
if (hasFolderType || hasMediaType) {
if (extras == null) {
extras = new Bundle();
} else {
extras = new Bundle(extras);
}
if (hasFolderType) {
extras.putLong(
@ -657,18 +661,67 @@ import java.util.concurrent.TimeoutException;
MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, checkNotNull(metadata.mediaType));
}
}
CharSequence title;
CharSequence subtitle;
CharSequence description;
if (metadata.displayTitle != null) {
title = metadata.displayTitle;
subtitle = metadata.subtitle;
description = metadata.description;
if (extras == null) {
extras = new Bundle();
}
extras.putCharSequence(
MediaConstants.EXTRAS_KEY_MEDIA_DESCRIPTION_COMPAT_TITLE, metadata.title);
} else {
// The BT AVRPC service expects the subtitle of the media description to be the artist
// (see https://github.com/androidx/media/issues/148). This can be achieved by NOT setting the
// `displayTitle` when setting the `artist`, or by setting the `displayTitle` and writing the
// artist into the `subtitle`. When `displayTitle` is set, the artist is always ignored.
CharSequence[] texts = new CharSequence[3];
int textIndex = 0;
int keyIndex = 0;
while (textIndex < texts.length && keyIndex < PREFERRED_DESCRIPTION_ORDER.length) {
CharSequence next = getText(PREFERRED_DESCRIPTION_ORDER[keyIndex++], metadata);
if (!TextUtils.isEmpty(next)) {
// Fill in the next empty bit of text
texts[textIndex++] = next;
}
}
title = texts[0];
subtitle = texts[1];
description = texts[2];
}
return builder
.setTitle(metadata.title)
// The BT AVRPC service expects the subtitle of the media description to be the artist
// (see https://github.com/androidx/media/issues/148).
.setSubtitle(metadata.artist != null ? metadata.artist : metadata.subtitle)
.setDescription(metadata.description)
.setTitle(title)
.setSubtitle(subtitle)
.setDescription(description)
.setIconUri(metadata.artworkUri)
.setMediaUri(item.requestMetadata.mediaUri)
.setExtras(extras)
.build();
}
@Nullable
private static CharSequence getText(String key, MediaMetadata metadata) {
switch (key) {
case MediaMetadataCompat.METADATA_KEY_TITLE:
return metadata.title;
case MediaMetadataCompat.METADATA_KEY_ARTIST:
return metadata.artist;
case MediaMetadataCompat.METADATA_KEY_ALBUM:
return metadata.albumTitle;
case MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST:
return metadata.albumArtist;
case MediaMetadataCompat.METADATA_KEY_WRITER:
return metadata.writer;
case MediaMetadataCompat.METADATA_KEY_COMPOSER:
return metadata.composer;
default:
return null;
}
}
@SuppressWarnings("deprecation") // Converting to deprecated constants.
@MediaMetadata.FolderType
private static int convertToFolderType(long extraBtFolderType) {

View File

@ -479,6 +479,14 @@ public final class MediaConstants {
public static final String EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT =
"androidx.media3.session.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT";
/**
* {@link Bundle} key used to store the title in case there was a display title that was given
* precedence when converting to a {@code MediaDescriptionCompat}. This key is only used to be
* able to convert back to the Media3 {@link MediaMetadata}.
*/
/* package */ static final String EXTRAS_KEY_MEDIA_DESCRIPTION_COMPAT_TITLE =
"androidx.media3.mediadescriptioncompat.title";
/* package */ static final String SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED =
"androidx.media3.session.SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED";
/* package */ static final String SESSION_COMMAND_REQUEST_SESSION3_TOKEN =

View File

@ -310,7 +310,7 @@ public final class MediaMetadataCompat implements Parcelable {
METADATA_KEYS_TYPE.put(METADATA_KEY_DOWNLOAD_STATUS, METADATA_TYPE_LONG);
}
private static final @TextKey String[] PREFERRED_DESCRIPTION_ORDER = {
public static final @TextKey String[] PREFERRED_DESCRIPTION_ORDER = {
METADATA_KEY_TITLE,
METADATA_KEY_ARTIST,
METADATA_KEY_ALBUM,

View File

@ -150,29 +150,186 @@ public final class LegacyConversionsTest {
@Test
public void convertToMediaDescriptionCompat_setsExpectedValues() {
String mediaId = "testId";
String title = "testTitle";
String description = "testDesc";
MediaMetadata metadata =
new MediaMetadata.Builder()
.setTitle(title)
.setDescription(description)
.setTitle("testTitle")
.setArtist("testArtist")
.setAlbumTitle("testAlbumTitle")
.setWriter("testWriter")
.setMediaType(MediaMetadata.MEDIA_TYPE_MUSIC)
.setDurationMs(10_000L)
.build();
MediaItem mediaItem =
new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(metadata).build();
new MediaItem.Builder().setMediaId("testId").setMediaMetadata(metadata).build();
MediaDescriptionCompat descriptionCompat =
LegacyConversions.convertToMediaDescriptionCompat(mediaItem, /* artworkBitmap= */ null);
assertThat(descriptionCompat.getMediaId()).isEqualTo(mediaId);
assertThat(descriptionCompat.getTitle().toString()).isEqualTo(title);
assertThat(descriptionCompat.getDescription().toString()).isEqualTo(description);
assertThat(descriptionCompat.getMediaId()).isEqualTo("testId");
assertThat(descriptionCompat.getTitle().toString()).isEqualTo("testTitle");
assertThat(descriptionCompat.getSubtitle().toString()).isEqualTo("testArtist");
assertThat(descriptionCompat.getDescription().toString()).isEqualTo("testAlbumTitle");
assertThat(descriptionCompat.getExtras().getLong(EXTRAS_KEY_MEDIA_TYPE_COMPAT))
.isEqualTo(MediaMetadata.MEDIA_TYPE_MUSIC);
}
@Test
public void convertToMediaDescriptionCompat_displayTitleAndTitleHandledCorrectly() {
MediaMetadata metadataWithTitleOnly =
new MediaMetadata.Builder()
.setTitle("title")
.setSubtitle("subtitle")
.setDescription("description")
.setArtist("artist")
.setAlbumTitle("albumTitle")
.setIsBrowsable(false)
.setIsPlayable(true)
.build();
MediaItem mediaItemWithTitleOnly =
new MediaItem.Builder().setMediaMetadata(metadataWithTitleOnly).build();
MediaMetadata metadataWithDisplayTitleOnly =
new MediaMetadata.Builder()
.setDisplayTitle("displayTitle")
.setSubtitle("subtitle")
.setDescription("description")
.setArtist("artist")
.setAlbumTitle("albumTitle")
.setIsBrowsable(false)
.setIsPlayable(true)
.build();
MediaItem mediaItemWithDisplayTitleOnly =
new MediaItem.Builder().setMediaMetadata(metadataWithDisplayTitleOnly).build();
MediaMetadata metadataWithDisplayTitleAndTitle =
new MediaMetadata.Builder()
.setDisplayTitle("displayTitle")
.setTitle("title")
.setSubtitle("subtitle")
.setDescription("description")
.setArtist("artist")
.setAlbumTitle("albumTitle")
.setIsBrowsable(false)
.setIsPlayable(true)
.build();
MediaItem mediaItemWithDisplayTitleAndTitle =
new MediaItem.Builder().setMediaMetadata(metadataWithDisplayTitleAndTitle).build();
MediaDescriptionCompat descriptionCompatWithTitleOnly =
LegacyConversions.convertToMediaDescriptionCompat(
mediaItemWithTitleOnly, /* artworkBitmap= */ null);
MediaDescriptionCompat descriptionCompatWithDisplayTitleOnly =
LegacyConversions.convertToMediaDescriptionCompat(
mediaItemWithDisplayTitleOnly, /* artworkBitmap= */ null);
MediaDescriptionCompat descriptionCompatWithDisplayTitleAndTitle =
LegacyConversions.convertToMediaDescriptionCompat(
mediaItemWithDisplayTitleAndTitle, /* artworkBitmap= */ null);
MediaItem convertedMediaItemWithTitleOnly =
LegacyConversions.convertToMediaItem(descriptionCompatWithTitleOnly);
MediaItem convertedMediaItemWithDisplayTitleOnly =
LegacyConversions.convertToMediaItem(descriptionCompatWithDisplayTitleOnly);
MediaItem convertedMediaItemWithDisplayTitleAndTitle =
LegacyConversions.convertToMediaItem(descriptionCompatWithDisplayTitleAndTitle);
assertThat(convertedMediaItemWithTitleOnly.mediaMetadata.title.toString()).isEqualTo("title");
assertThat(convertedMediaItemWithTitleOnly.mediaMetadata.subtitle.toString())
.isEqualTo("artist");
assertThat(convertedMediaItemWithTitleOnly.mediaMetadata.description.toString())
.isEqualTo("albumTitle");
assertThat(convertedMediaItemWithTitleOnly.mediaMetadata.displayTitle).isNull();
assertThat(convertedMediaItemWithTitleOnly.mediaMetadata.artist).isNull();
assertThat(convertedMediaItemWithTitleOnly.mediaMetadata.albumTitle).isNull();
assertThat(convertedMediaItemWithDisplayTitleOnly.mediaMetadata.title).isNull();
assertThat(convertedMediaItemWithDisplayTitleOnly.mediaMetadata.subtitle.toString())
.isEqualTo("subtitle");
assertThat(convertedMediaItemWithDisplayTitleOnly.mediaMetadata.description.toString())
.isEqualTo("description");
assertThat(convertedMediaItemWithDisplayTitleOnly.mediaMetadata.displayTitle.toString())
.isEqualTo("displayTitle");
assertThat(convertedMediaItemWithDisplayTitleOnly.mediaMetadata.artist).isNull();
assertThat(convertedMediaItemWithDisplayTitleOnly.mediaMetadata.albumTitle).isNull();
assertThat(convertedMediaItemWithDisplayTitleAndTitle.mediaMetadata.title.toString())
.isEqualTo("title");
assertThat(convertedMediaItemWithDisplayTitleAndTitle.mediaMetadata.subtitle.toString())
.isEqualTo("subtitle");
assertThat(convertedMediaItemWithDisplayTitleAndTitle.mediaMetadata.description.toString())
.isEqualTo("description");
assertThat(convertedMediaItemWithDisplayTitleAndTitle.mediaMetadata.displayTitle.toString())
.isEqualTo("displayTitle");
assertThat(convertedMediaItemWithDisplayTitleAndTitle.mediaMetadata.artist).isNull();
assertThat(convertedMediaItemWithDisplayTitleAndTitle.mediaMetadata.albumTitle).isNull();
}
@Test
public void convertToMediaMetadataCompat_displayTitleAndTitleHandledCorrectly() {
MediaMetadata mediaMetadataWithTitleOnly =
new MediaMetadata.Builder()
.setTitle("title")
.setSubtitle("subtitle")
.setDescription("description")
.setArtist("artist")
.setAlbumArtist("albumArtist")
.build();
MediaMetadata mediaMetadataWithDisplayTitleOnly =
new MediaMetadata.Builder()
.setDisplayTitle("displayTitle")
.setSubtitle("subtitle")
.setDescription("description")
.setArtist("artist")
.setAlbumArtist("albumArtist")
.build();
MediaMetadata mediaMetadataWithDisplayTitleAndTitle =
new MediaMetadata.Builder()
.setTitle("title")
.setDisplayTitle("displayTitle")
.setSubtitle("subtitle")
.setDescription("description")
.setArtist("artist")
.setAlbumArtist("albumArtist")
.build();
MediaDescriptionCompat mediaDescriptionCompatFromDisplayTitleAndTitle =
LegacyConversions.convertToMediaMetadataCompat(
mediaMetadataWithDisplayTitleAndTitle,
"mediaId",
/* mediaUri= */ null,
/* durationMs= */ 10_000L,
/* artworkBitmap= */ null)
.getDescription();
MediaDescriptionCompat mediaDescriptionCompatFromDisplayTitleOnly =
LegacyConversions.convertToMediaMetadataCompat(
mediaMetadataWithDisplayTitleOnly,
"mediaId",
/* mediaUri= */ null,
/* durationMs= */ 10_000L,
/* artworkBitmap= */ null)
.getDescription();
MediaDescriptionCompat mediaDescriptionCompatFromTitleOnly =
LegacyConversions.convertToMediaMetadataCompat(
mediaMetadataWithTitleOnly,
"mediaId",
/* mediaUri= */ null,
/* durationMs= */ 10_000L,
/* artworkBitmap= */ null)
.getDescription();
assertThat(mediaDescriptionCompatFromDisplayTitleAndTitle.getTitle().toString())
.isEqualTo("displayTitle");
assertThat(mediaDescriptionCompatFromDisplayTitleAndTitle.getSubtitle().toString())
.isEqualTo("subtitle");
assertThat(mediaDescriptionCompatFromDisplayTitleAndTitle.getDescription().toString())
.isEqualTo("description");
assertThat(mediaDescriptionCompatFromDisplayTitleOnly.getTitle().toString())
.isEqualTo("displayTitle");
assertThat(mediaDescriptionCompatFromDisplayTitleOnly.getSubtitle().toString())
.isEqualTo("subtitle");
assertThat(mediaDescriptionCompatFromDisplayTitleOnly.getDescription().toString())
.isEqualTo("description");
assertThat(mediaDescriptionCompatFromTitleOnly.getTitle().toString()).isEqualTo("title");
assertThat(mediaDescriptionCompatFromTitleOnly.getSubtitle().toString()).isEqualTo("artist");
assertThat(mediaDescriptionCompatFromTitleOnly.getDescription().toString())
.isEqualTo("albumArtist");
}
@Test
public void convertToQueueItemId() {
assertThat(LegacyConversions.convertToQueueItemId(C.INDEX_UNSET))
@ -237,6 +394,20 @@ public final class LegacyConversionsTest {
assertThat(mediaMetadata.artworkData).isNotNull();
}
@Test
public void convertToMediaMetadata_displayTitleKeyOnly_movedToTitle() {
MediaMetadataCompat testMediaMetadataCompat =
new MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "displayTitle")
.build();
MediaMetadata mediaMetadata =
LegacyConversions.convertToMediaMetadata(testMediaMetadataCompat, RatingCompat.RATING_NONE);
assertThat(mediaMetadata.title).isEqualTo("displayTitle");
assertThat(mediaMetadata.displayTitle).isNull();
}
@Test
public void
convertToMediaMetadata_roundTripViaMediaDescriptionCompat_returnsEqualMediaItemMetadata()
@ -1162,6 +1333,8 @@ public final class LegacyConversionsTest {
MediaMetadata.Builder mediaMetadataBuilder =
new MediaMetadata.Builder()
.setMediaType(MediaMetadata.MEDIA_TYPE_PLAYLIST)
.setTitle("title")
.setDisplayTitle("displayTitle")
.setIsBrowsable(false)
.setIsPlayable(true)
.setExtras(extras);

View File

@ -20,12 +20,12 @@ import static androidx.media3.session.MediaConstants.EXTRAS_KEY_COMPLETION_STATU
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED;
import static androidx.media3.session.MockMediaLibraryService.CONNECTION_HINTS_CUSTOM_LIBRARY_ROOT;
import static androidx.media3.session.MockMediaLibraryService.createNotifyChildrenChangedBundle;
import static androidx.media3.test.session.common.CommonConstants.METADATA_ALBUM_TITLE;
import static androidx.media3.test.session.common.CommonConstants.METADATA_ARTIST;
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_EXTRA_KEY;
import static androidx.media3.test.session.common.CommonConstants.METADATA_EXTRA_VALUE;
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.MOCK_MEDIA3_LIBRARY_SERVICE;
import static androidx.media3.test.session.common.MediaBrowserConstants.CHILDREN_COUNT;
@ -181,8 +181,8 @@ public class MediaBrowserCompatWithMediaLibraryServiceTest
assertThat(itemRef.get().getMediaId()).isEqualTo(mediaId);
MediaDescriptionCompat description = itemRef.get().getDescription();
assertThat(TextUtils.equals(description.getTitle(), METADATA_TITLE)).isTrue();
assertThat(TextUtils.equals(description.getSubtitle(), METADATA_SUBTITLE)).isTrue();
assertThat(TextUtils.equals(description.getDescription(), METADATA_DESCRIPTION)).isTrue();
assertThat(TextUtils.equals(description.getSubtitle(), METADATA_ARTIST)).isTrue();
assertThat(TextUtils.equals(description.getDescription(), METADATA_ALBUM_TITLE)).isTrue();
assertThat(description.getIconUri()).isEqualTo(METADATA_ARTWORK_URI);
assertThat(description.getMediaUri()).isEqualTo(METADATA_MEDIA_URI);
BundleSubject.assertThat(description.getExtras())

View File

@ -1081,12 +1081,13 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
throws Exception {
int testItemIndex = 3;
long testPosition = 1234;
String testTitle = "title";
String testDisplayTitle = "displayTitle";
long testDurationMs = 30_000;
List<MediaItem> testMediaItems = MediaTestUtils.createMediaItems(/* size= */ 5);
String testCurrentMediaId = testMediaItems.get(testItemIndex).mediaId;
MediaMetadata testMediaMetadata =
new MediaMetadata.Builder().setTitle(testDisplayTitle).build();
new MediaMetadata.Builder().setTitle(testTitle).setDisplayTitle(testDisplayTitle).build();
testMediaItems.set(
testItemIndex,
new MediaItem.Builder()
@ -1129,6 +1130,10 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
assertThat(latchForMetadata.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
MediaMetadataCompat parameterMetadataCompat = metadataRef.get();
MediaMetadataCompat getterMetadataCompat = controllerCompat.getMetadata();
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_TITLE))
.isEqualTo(testTitle);
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_TITLE))
.isEqualTo(testTitle);
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
.isEqualTo(testDisplayTitle);
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
@ -1154,12 +1159,13 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
onMediaMetadataChanged_withGetMetadataAndGetCurrentMediaItemCommand_updatesLegacyMetadata()
throws Exception {
int testItemIndex = 3;
String testTitle = "title";
String testDisplayTitle = "displayTitle";
long testDurationMs = 30_000;
List<MediaItem> testMediaItems = MediaTestUtils.createMediaItems(/* size= */ 5);
String testCurrentMediaId = testMediaItems.get(testItemIndex).mediaId;
MediaMetadata testMediaMetadata =
new MediaMetadata.Builder().setTitle(testDisplayTitle).build();
new MediaMetadata.Builder().setTitle(testTitle).setDisplayTitle(testDisplayTitle).build();
testMediaItems.set(
testItemIndex,
new MediaItem.Builder()
@ -1192,6 +1198,10 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
assertThat(latchForMetadata.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
MediaMetadataCompat parameterMetadataCompat = metadataRef.get();
MediaMetadataCompat getterMetadataCompat = controllerCompat.getMetadata();
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_TITLE))
.isEqualTo(testTitle);
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_TITLE))
.isEqualTo(testTitle);
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
.isEqualTo(testDisplayTitle);
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
@ -1207,10 +1217,11 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
public void onMediaMetadataChanged_withGetMetadataCommandOnly_updatesLegacyMetadata()
throws Exception {
int testItemIndex = 3;
String testDisplayTitle = "displayTitle";
String testTitle = "title";
String testDisplayTitle = "title";
List<MediaItem> testMediaItems = MediaTestUtils.createMediaItems(/* size= */ 5);
MediaMetadata testMediaMetadata =
new MediaMetadata.Builder().setTitle(testDisplayTitle).build();
new MediaMetadata.Builder().setTitle(testTitle).setDisplayTitle(testDisplayTitle).build();
testMediaItems.set(
testItemIndex,
new MediaItem.Builder()
@ -1240,6 +1251,10 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
assertThat(latchForMetadata.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
MediaMetadataCompat parameterMetadataCompat = metadataRef.get();
MediaMetadataCompat getterMetadataCompat = controllerCompat.getMetadata();
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_TITLE))
.isEqualTo(testTitle);
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_TITLE))
.isEqualTo(testTitle);
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
.isEqualTo(testDisplayTitle);
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
@ -1345,9 +1360,9 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
MediaDescriptionCompat description = queueFromParam.get(0).getDescription();
assertThat(description.getMediaId()).isEqualTo(mediaItem.mediaId);
assertThat(TextUtils.equals(description.getTitle(), mediaItem.mediaMetadata.title)).isTrue();
assertThat(TextUtils.equals(description.getSubtitle(), mediaItem.mediaMetadata.subtitle))
assertThat(TextUtils.equals(description.getSubtitle(), mediaItem.mediaMetadata.artist))
.isTrue();
assertThat(TextUtils.equals(description.getDescription(), mediaItem.mediaMetadata.description))
assertThat(TextUtils.equals(description.getDescription(), mediaItem.mediaMetadata.albumTitle))
.isTrue();
assertThat(description.getIconUri()).isEqualTo(mediaItem.mediaMetadata.artworkUri);
assertThat(description.getMediaUri()).isEqualTo(mediaItem.requestMetadata.mediaUri);

View File

@ -105,8 +105,8 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest {
int testMediaItemIndex = 1;
MediaMetadataCompat testMediaMetadataCompat =
new MediaMetadataCompat.Builder()
.putText(MediaMetadataCompat.METADATA_KEY_TITLE, "title")
.putText(MediaMetadataCompat.METADATA_KEY_ARTIST, "artist")
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "title")
.putLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, MEDIA_TYPE_PLAYLIST)
.build();
@RatingCompat.Style int testRatingType = RatingCompat.RATING_HEART;
@ -250,7 +250,7 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest {
MediaMetadataCompat testMediaMetadataCompat =
new MediaMetadataCompat.Builder()
.putText(MediaMetadataCompat.METADATA_KEY_ARTIST, "artist")
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "title")
.putText(MediaMetadataCompat.METADATA_KEY_TITLE, "title")
.build();
@RatingCompat.Style int testRatingType = RatingCompat.RATING_HEART;
MediaMetadata testMediaMetadata =
@ -453,7 +453,7 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest {
MediaMetadataCompat testMediaMetadataCompat =
new MediaMetadataCompat.Builder()
.putText(MediaMetadataCompat.METADATA_KEY_ARTIST, "artist")
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "title")
.putText(MediaMetadataCompat.METADATA_KEY_TITLE, "title")
.build();
@RatingCompat.Style int testRatingType = RatingCompat.RATING_HEART;
MediaMetadata testMediaMetadata =

View File

@ -21,7 +21,6 @@ import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_ARTIST;
import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION;
import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI;
import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE;
import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE;
import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DURATION;
import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_MEDIA_ID;
import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_MEDIA_URI;
@ -32,6 +31,7 @@ import static androidx.media3.common.Player.STATE_READY;
import static androidx.media3.session.MediaConstants.ARGUMENT_CAPTIONING_ENABLED;
import static androidx.media3.session.MediaConstants.SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED;
import static androidx.media3.session.SessionResult.RESULT_SUCCESS;
import static androidx.media3.session.legacy.MediaMetadataCompat.METADATA_KEY_TITLE;
import static androidx.media3.test.session.common.CommonConstants.DEFAULT_TEST_NAME;
import static androidx.media3.test.session.common.CommonConstants.KEY_DURATION;
import static androidx.media3.test.session.common.CommonConstants.METADATA_ALBUM_TITLE;
@ -654,7 +654,7 @@ public class MediaControllerWithMediaSessionCompatTest {
MediaMetadataCompat metadataCompat =
new MediaMetadataCompat.Builder()
.putText(METADATA_KEY_MEDIA_ID, testMediaId)
.putText(METADATA_KEY_DISPLAY_TITLE, testTitle)
.putText(METADATA_KEY_TITLE, testTitle)
.putText(METADATA_KEY_DISPLAY_SUBTITLE, testSubtitle)
.putText(METADATA_KEY_DISPLAY_DESCRIPTION, testDescription)
.putString(METADATA_KEY_DISPLAY_ICON_URI, testIconUri)

View File

@ -15,6 +15,8 @@
*/
package androidx.media3.session;
import static androidx.media3.test.session.common.CommonConstants.METADATA_ALBUM_TITLE;
import static androidx.media3.test.session.common.CommonConstants.METADATA_ARTIST;
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;
@ -161,6 +163,8 @@ public final class MediaTestUtils {
.setTitle(METADATA_TITLE)
.setSubtitle(METADATA_SUBTITLE)
.setDescription(METADATA_DESCRIPTION)
.setArtist(METADATA_ARTIST)
.setAlbumTitle(METADATA_ALBUM_TITLE)
.setArtworkUri(METADATA_ARTWORK_URI)
.setExtras(METADATA_EXTRAS)
.build();
@ -173,6 +177,8 @@ public final class MediaTestUtils {
.setIsPlayable(true)
.setTitle(METADATA_TITLE)
.setSubtitle(METADATA_SUBTITLE)
.setArtist(METADATA_ARTIST)
.setAlbumTitle(METADATA_ALBUM_TITLE)
.setDescription(METADATA_DESCRIPTION)
.setArtworkUri(METADATA_ARTWORK_URI)
.setExtras(METADATA_EXTRAS);