Use onMediaMetadataChanged for updating the legacy session

Issue: androidx/media#219
PiperOrigin-RevId: 501080612
This commit is contained in:
bachinger 2023-01-10 21:31:35 +00:00 committed by Rohit Singh
parent 9882a20783
commit 375299bf36
9 changed files with 206 additions and 55 deletions

View File

@ -47,6 +47,8 @@ Release notes
for custom players.
* Add helper method to convert platform session token to Media3
`SessionToken` ([#171](https://github.com/androidx/media/issues/171)).
* Use `onMediaMetadataChanged` to trigger updates of the platform media
session ([#219](https://github.com/androidx/media/issues/219)).
* Metadata:
* Parse multiple null-separated values from ID3 frames, as permitted by
ID3 v2.4.

View File

@ -91,6 +91,7 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@ -850,12 +851,15 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
private final class ControllerLegacyCbForBroadcast implements ControllerCb {
@Nullable private MediaItem currentMediaItemForMetadataUpdate;
private long durationMsForMetadataUpdate;
private MediaMetadata lastMediaMetadata;
private String lastMediaId;
@Nullable private Uri lastMediaUri;
private long lastDurationMs;
public ControllerLegacyCbForBroadcast() {
durationMsForMetadataUpdate = C.TIME_UNSET;
lastMediaMetadata = MediaMetadata.EMPTY;
lastMediaId = MediaItem.DEFAULT_MEDIA_ID;
lastDurationMs = C.TIME_UNSET;
}
@Override
@ -992,6 +996,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
public void onMediaItemTransition(
int seq, @Nullable MediaItem mediaItem, @Player.MediaItemTransitionReason int reason)
throws RemoteException {
// MediaMetadataCompat needs to be updated when the media ID or URI of the media item changes.
updateMetadataIfChanged();
if (mediaItem == null) {
sessionCompat.setRatingType(RatingCompat.RATING_NONE);
@ -1004,6 +1009,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
.setPlaybackState(sessionImpl.getPlayerWrapper().createPlaybackStateCompat());
}
@Override
public void onMediaMetadataChanged(int seq, MediaMetadata mediaMetadata) {
updateMetadataIfChanged();
}
@Override
public void onTimelineChanged(
int seq, Timeline timeline, @Player.TimelineChangeReason int reason)
@ -1014,7 +1024,6 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
}
updateQueue(timeline);
// Duration might be unknown at onMediaItemTransition and become available afterward.
updateMetadataIfChanged();
}
@ -1146,22 +1155,30 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
.setPlaybackState(sessionImpl.getPlayerWrapper().createPlaybackStateCompat());
}
@Override
public void onMediaMetadataChanged(int seq, MediaMetadata mediaMetadata) {
// Metadata change will be notified by onMediaItemTransition.
}
private void updateMetadataIfChanged() {
@Nullable MediaItem currentMediaItem = sessionImpl.getPlayerWrapper().getCurrentMediaItem();
long durationMs = sessionImpl.getPlayerWrapper().getDuration();
Player player = sessionImpl.getPlayerWrapper();
@Nullable MediaItem currentMediaItem = player.getCurrentMediaItem();
MediaMetadata newMediaMetadata = player.getMediaMetadata();
long newDurationMs = player.getDuration();
String newMediaId =
currentMediaItem != null ? currentMediaItem.mediaId : MediaItem.DEFAULT_MEDIA_ID;
@Nullable
Uri newMediaUri =
currentMediaItem != null && currentMediaItem.localConfiguration != null
? currentMediaItem.localConfiguration.uri
: null;
if (ObjectsCompat.equals(currentMediaItemForMetadataUpdate, currentMediaItem)
&& durationMsForMetadataUpdate == durationMs) {
if (Objects.equals(lastMediaMetadata, newMediaMetadata)
&& Objects.equals(lastMediaId, newMediaId)
&& Objects.equals(lastMediaUri, newMediaUri)
&& lastDurationMs == newDurationMs) {
return;
}
currentMediaItemForMetadataUpdate = currentMediaItem;
durationMsForMetadataUpdate = durationMs;
lastMediaId = newMediaId;
lastMediaUri = newMediaUri;
lastMediaMetadata = newMediaMetadata;
lastDurationMs = newDurationMs;
if (currentMediaItem == null) {
setMetadata(sessionCompat, /* metadataCompat= */ null);
@ -1170,7 +1187,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
@Nullable Bitmap artworkBitmap = null;
ListenableFuture<Bitmap> bitmapFuture =
sessionImpl.getBitmapLoader().loadBitmapFromMetadata(currentMediaItem.mediaMetadata);
sessionImpl.getBitmapLoader().loadBitmapFromMetadata(newMediaMetadata);
if (bitmapFuture != null) {
pendingBitmapLoadCallback = null;
if (bitmapFuture.isDone()) {
@ -1190,7 +1207,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
setMetadata(
sessionCompat,
MediaUtils.convertToMediaMetadataCompat(
currentMediaItem, durationMs, result));
newMediaMetadata,
newMediaId,
newMediaUri,
newDurationMs,
/* artworkBitmap= */ result));
sessionImpl.onNotificationRefreshRequired();
}
@ -1210,7 +1231,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
}
setMetadata(
sessionCompat,
MediaUtils.convertToMediaMetadataCompat(currentMediaItem, durationMs, artworkBitmap));
MediaUtils.convertToMediaMetadataCompat(
newMediaMetadata, newMediaId, newMediaUri, newDurationMs, artworkBitmap));
}
}

View File

@ -531,14 +531,25 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
return null;
}
/** Converts a {@link MediaItem} to a {@link MediaMetadataCompat}. */
/**
* Converts a {@link MediaMetadata} to a {@link MediaMetadataCompat}.
*
* @param metadata The {@link MediaMetadata} instance to convert.
* @param mediaId The corresponding media ID.
* @param mediaUri The corresponding media URI, or null if unknown.
* @param durationMs The duration of the media, in milliseconds or {@link C#TIME_UNSET}, if no
* duration should be included.
* @return An instance of the legacy {@link MediaMetadataCompat}.
*/
public static MediaMetadataCompat convertToMediaMetadataCompat(
MediaItem mediaItem, long durationMs, @Nullable Bitmap artworkBitmap) {
MediaMetadata metadata,
String mediaId,
@Nullable Uri mediaUri,
long durationMs,
@Nullable Bitmap artworkBitmap) {
MediaMetadataCompat.Builder builder =
new MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, mediaItem.mediaId);
MediaMetadata metadata = mediaItem.mediaMetadata;
.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, mediaId);
if (metadata.title != null) {
builder.putText(MediaMetadataCompat.METADATA_KEY_TITLE, metadata.title);
@ -569,10 +580,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
builder.putLong(MediaMetadataCompat.METADATA_KEY_YEAR, metadata.recordingYear);
}
if (mediaItem.requestMetadata.mediaUri != null) {
builder.putString(
MediaMetadataCompat.METADATA_KEY_MEDIA_URI,
mediaItem.requestMetadata.mediaUri.toString());
if (mediaUri != null) {
builder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI, mediaUri.toString());
}
if (metadata.artworkUri != null) {
@ -597,21 +606,18 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, durationMs);
}
@Nullable
RatingCompat userRatingCompat = convertToRatingCompat(mediaItem.mediaMetadata.userRating);
@Nullable RatingCompat userRatingCompat = convertToRatingCompat(metadata.userRating);
if (userRatingCompat != null) {
builder.putRating(MediaMetadataCompat.METADATA_KEY_USER_RATING, userRatingCompat);
}
@Nullable
RatingCompat overallRatingCompat = convertToRatingCompat(mediaItem.mediaMetadata.overallRating);
@Nullable RatingCompat overallRatingCompat = convertToRatingCompat(metadata.overallRating);
if (overallRatingCompat != null) {
builder.putRating(MediaMetadataCompat.METADATA_KEY_RATING, overallRatingCompat);
}
if (mediaItem.mediaMetadata.mediaType != null) {
builder.putLong(
MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, mediaItem.mediaMetadata.mediaType);
if (metadata.mediaType != null) {
builder.putLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, metadata.mediaType);
}
return builder.build();

View File

@ -67,6 +67,7 @@ interface IRemoteMediaSession {
void setTimeline(String sessionId, in Bundle timeline);
void createAndSetFakeTimeline(String sessionId, int windowCount);
void setMediaMetadata(String sessionId, in Bundle metadata);
void setPlaylistMetadata(String sessionId, in Bundle metadata);
void setShuffleModeEnabled(String sessionId, boolean shuffleMode);
void setRepeatMode(String sessionId, int repeatMode);

View File

@ -127,6 +127,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
.setBufferedPosition(testBufferingPosition)
.setPlaybackParameters(new PlaybackParameters(testSpeed))
.setTimeline(testTimeline)
.setMediaMetadata(testMediaItems.get(testItemIndex).mediaMetadata)
.setPlaylistMetadata(testPlaylistMetadata)
.setCurrentMediaItemIndex(testItemIndex)
.setShuffleModeEnabled(testShuffleModeEnabled)
@ -370,6 +371,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
.setDuration(testDurationMs)
.setPlaybackParameters(playbackParameters)
.setTimeline(testTimeline)
.setMediaMetadata(testMediaItems.get(testItemIndex).mediaMetadata)
.setPlaylistMetadata(testPlaylistMetadata)
.setCurrentMediaItemIndex(testItemIndex)
.setShuffleModeEnabled(testShuffleModeEnabled)
@ -979,53 +981,68 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
}
@Test
public void currentMediaItemChange() throws Exception {
public void onMediaItemTransition_updatesLegacyMetadataAndPlaybackState_correctModelConversion()
throws Exception {
int testItemIndex = 3;
long testPosition = 1234;
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();
testMediaItems.set(
testItemIndex,
new MediaItem.Builder()
.setMediaId(testMediaItems.get(testItemIndex).mediaId)
.setMediaMetadata(new MediaMetadata.Builder().setTitle(testDisplayTitle).build())
.setMediaMetadata(testMediaMetadata)
.build());
Timeline timeline = new PlaylistTimeline(testMediaItems);
session.getMockPlayer().setTimeline(timeline);
session.getMockPlayer().setTimeline(new PlaylistTimeline(testMediaItems));
session.getMockPlayer().setCurrentMediaItemIndex(testItemIndex);
session.getMockPlayer().setCurrentPosition(testPosition);
session.getMockPlayer().setDuration(testDurationMs);
session.getMockPlayer().setMediaMetadata(testMediaMetadata);
AtomicReference<MediaMetadataCompat> metadataRef = new AtomicReference<>();
AtomicReference<PlaybackStateCompat> playbackStateRef = new AtomicReference<>();
CountDownLatch latchForMetadata = new CountDownLatch(1);
CountDownLatch latchForPlaybackState = new CountDownLatch(1);
List<String> callbackOrder = new ArrayList<>();
MediaControllerCompat.Callback callback =
new MediaControllerCompat.Callback() {
@Override
public void onMetadataChanged(MediaMetadataCompat metadata) {
metadataRef.set(metadata);
callbackOrder.add("onMetadataChanged");
latchForMetadata.countDown();
}
@Override
public void onPlaybackStateChanged(PlaybackStateCompat state) {
playbackStateRef.set(state);
callbackOrder.add("onPlaybackStateChanged");
latchForPlaybackState.countDown();
}
};
controllerCompat.registerCallback(callback, handler);
session.getMockPlayer().setCurrentMediaItemIndex(testItemIndex);
session.getMockPlayer().setCurrentPosition(testPosition);
session
.getMockPlayer()
.notifyMediaItemTransition(testItemIndex, Player.MEDIA_ITEM_TRANSITION_REASON_SEEK);
// Assert metadata.
assertThat(latchForMetadata.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
assertThat(metadataRef.get().getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
MediaMetadataCompat parameterMetadataCompat = metadataRef.get();
MediaMetadataCompat getterMetadataCompat = controllerCompat.getMetadata();
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
.isEqualTo(testDisplayTitle);
assertThat(
controllerCompat
.getMetadata()
.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
.isEqualTo(testDisplayTitle);
assertThat(parameterMetadataCompat.getLong(METADATA_KEY_DURATION)).isEqualTo(testDurationMs);
assertThat(getterMetadataCompat.getLong(METADATA_KEY_DURATION)).isEqualTo(testDurationMs);
assertThat(parameterMetadataCompat.getString(METADATA_KEY_MEDIA_ID))
.isEqualTo(testCurrentMediaId);
assertThat(getterMetadataCompat.getString(METADATA_KEY_MEDIA_ID)).isEqualTo(testCurrentMediaId);
// Assert the playback state.
assertThat(latchForPlaybackState.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
assertThat(playbackStateRef.get().getPosition()).isEqualTo(testPosition);
assertThat(controllerCompat.getPlaybackState().getPosition()).isEqualTo(testPosition);
@ -1033,6 +1050,56 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
.isEqualTo(MediaUtils.convertToQueueItemId(testItemIndex));
assertThat(controllerCompat.getPlaybackState().getActiveQueueItemId())
.isEqualTo(MediaUtils.convertToQueueItemId(testItemIndex));
assertThat(callbackOrder)
.containsExactly("onMetadataChanged", "onPlaybackStateChanged")
.inOrder();
}
@Test
public void onMediaMetadataChanged_updatesLegacyMetadata_correctModelConversion()
throws Exception {
int testItemIndex = 3;
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();
testMediaItems.set(
testItemIndex,
new MediaItem.Builder()
.setMediaId(testMediaItems.get(testItemIndex).mediaId)
.setMediaMetadata(testMediaMetadata)
.build());
session.getMockPlayer().setTimeline(new PlaylistTimeline(testMediaItems));
session.getMockPlayer().setCurrentMediaItemIndex(testItemIndex);
session.getMockPlayer().setDuration(testDurationMs);
AtomicReference<MediaMetadataCompat> metadataRef = new AtomicReference<>();
CountDownLatch latchForMetadata = new CountDownLatch(1);
MediaControllerCompat.Callback callback =
new MediaControllerCompat.Callback() {
@Override
public void onMetadataChanged(MediaMetadataCompat metadata) {
metadataRef.set(metadata);
latchForMetadata.countDown();
}
};
controllerCompat.registerCallback(callback, handler);
session.getMockPlayer().notifyMediaMetadataChanged(testMediaMetadata);
assertThat(latchForMetadata.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
MediaMetadataCompat parameterMetadataCompat = metadataRef.get();
MediaMetadataCompat getterMetadataCompat = controllerCompat.getMetadata();
assertThat(parameterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
.isEqualTo(testDisplayTitle);
assertThat(getterMetadataCompat.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE))
.isEqualTo(testDisplayTitle);
assertThat(parameterMetadataCompat.getLong(METADATA_KEY_DURATION)).isEqualTo(testDurationMs);
assertThat(getterMetadataCompat.getLong(METADATA_KEY_DURATION)).isEqualTo(testDurationMs);
assertThat(parameterMetadataCompat.getString(METADATA_KEY_MEDIA_ID))
.isEqualTo(testCurrentMediaId);
assertThat(getterMetadataCompat.getString(METADATA_KEY_MEDIA_ID)).isEqualTo(testCurrentMediaId);
}
@Test

View File

@ -714,7 +714,11 @@ public class MediaControllerWithMediaSessionCompatTest {
MediaItem testRemoveMediaItem = MediaTestUtils.createMediaItem("removed");
MediaMetadataCompat testMetadataCompat =
MediaUtils.convertToMediaMetadataCompat(
testRemoveMediaItem, /* durationMs= */ 100L, /* artworkBitmap= */ null);
testRemoveMediaItem.mediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 100L,
/* artworkBitmap= */ null);
session.setQueue(testQueue);
session.setMetadata(testMetadataCompat);
MediaController controller = controllerTestRule.createController(session.getSessionToken());
@ -732,7 +736,11 @@ public class MediaControllerWithMediaSessionCompatTest {
MediaItem testRemoveMediaItem = MediaTestUtils.createMediaItem("removed");
MediaMetadataCompat testMetadataCompat =
MediaUtils.convertToMediaMetadataCompat(
testRemoveMediaItem, /* durationMs= */ 100L, /* artworkBitmap= */ null);
testRemoveMediaItem.mediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 100L,
/* artworkBitmap= */ null);
session.setQueue(testQueue);
session.setMetadata(testMetadataCompat);
MediaController controller = controllerTestRule.createController(session.getSessionToken());
@ -767,7 +775,11 @@ public class MediaControllerWithMediaSessionCompatTest {
MediaItem testRemoveMediaItem = MediaTestUtils.createMediaItem("removed");
MediaMetadataCompat testMetadataCompat =
MediaUtils.convertToMediaMetadataCompat(
testRemoveMediaItem, /* durationMs= */ 100L, /* artworkBitmap= */ null);
testRemoveMediaItem.mediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 100L,
/* artworkBitmap= */ null);
session.setQueue(testQueue);
session.setMetadata(testMetadataCompat);
MediaController controller = controllerTestRule.createController(session.getSessionToken());
@ -785,7 +797,11 @@ public class MediaControllerWithMediaSessionCompatTest {
MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata;
MediaMetadataCompat testMediaMetadataCompat =
MediaUtils.convertToMediaMetadataCompat(
testMediaItem, /* durationMs= */ 100L, /* artworkBitmap= */ null);
testMediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 100L,
/* artworkBitmap= */ null);
session.setMetadata(testMediaMetadataCompat);
MediaController controller = controllerTestRule.createController(session.getSessionToken());
@ -803,7 +819,11 @@ public class MediaControllerWithMediaSessionCompatTest {
@Nullable Bitmap artworkBitmap = getBitmapFromMetadata(testMediaMetadata);
MediaMetadataCompat testMediaMetadataCompat =
MediaUtils.convertToMediaMetadataCompat(
testMediaItem, /* durationMs= */ 100L, artworkBitmap);
testMediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 100L,
artworkBitmap);
session.setMetadata(testMediaMetadataCompat);
MediaController controller = controllerTestRule.createController(session.getSessionToken());
@ -1141,9 +1161,14 @@ public class MediaControllerWithMediaSessionCompatTest {
@Test
public void setPlaybackState_fromStateBufferingToPlaying_notifiesReadyState() throws Exception {
List<MediaItem> testPlaylist = MediaTestUtils.createMediaItems(/* size= */ 1);
MediaItem firstMediaItemInPlaylist = testPlaylist.get(0);
MediaMetadataCompat metadata =
MediaUtils.convertToMediaMetadataCompat(
testPlaylist.get(0), /* durationMs= */ 50_000, /* artworkBitmap= */ null);
firstMediaItemInPlaylist.mediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 50_000,
/* artworkBitmap= */ null);
long testBufferedPosition = 5_000;
session.setMetadata(metadata);
session.setPlaybackState(
@ -1186,9 +1211,14 @@ public class MediaControllerWithMediaSessionCompatTest {
public void setPlaybackState_fromStatePlayingToBuffering_notifiesBufferingState()
throws Exception {
List<MediaItem> testPlaylist = MediaTestUtils.createMediaItems(1);
MediaItem firstMediaItemInPlaylist = testPlaylist.get(0);
MediaMetadataCompat metadata =
MediaUtils.convertToMediaMetadataCompat(
testPlaylist.get(0), /* durationMs= */ 1_000, /* artworkBitmap= */ null);
firstMediaItemInPlaylist.mediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 1_000,
/* artworkBitmap= */ null);
long testBufferingPosition = 0;
session.setMetadata(metadata);
session.setPlaybackState(

View File

@ -29,6 +29,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import android.service.media.MediaBrowserService;
@ -217,7 +218,11 @@ public final class MediaUtilsTest {
}
MediaMetadataCompat testMediaMetadataCompat =
MediaUtils.convertToMediaMetadataCompat(
testMediaItem, /* durationMs= */ 100L, testArtworkBitmap);
testMediaMetadata,
"mediaId",
Uri.parse("http://example.com"),
/* durationMs= */ 100L,
testArtworkBitmap);
MediaMetadata mediaMetadata =
MediaUtils.convertToMediaMetadata(testMediaMetadataCompat, RatingCompat.RATING_NONE);
@ -258,7 +263,11 @@ public final class MediaUtilsTest {
MediaMetadataCompat mediaMetadataCompat =
MediaUtils.convertToMediaMetadataCompat(
mediaItem, /* durotionsMs= */ C.TIME_UNSET, /* artworkBitmap= */ null);
mediaItem.mediaMetadata,
"mediaId",
Uri.parse("http://www.example.com"),
/* durotionsMs= */ C.TIME_UNSET,
/* artworkBitmap= */ null);
assertThat(
mediaMetadataCompat.getLong(

View File

@ -801,6 +801,16 @@ public class MediaSessionProviderService extends Service {
});
}
@Override
public void setMediaMetadata(String sessionId, Bundle metadataBundle) throws RemoteException {
runOnHandler(
() -> {
MediaSession session = sessionMap.get(sessionId);
MockPlayer player = (MockPlayer) session.getPlayer();
player.mediaMetadata = MediaMetadata.CREATOR.fromBundle(metadataBundle);
});
}
@Override
public void setPlaylistMetadata(String sessionId, Bundle playlistMetadataBundle)
throws RemoteException {

View File

@ -360,6 +360,10 @@ public class RemoteMediaSession {
binder.setTrackSelectionParameters(sessionId, parameters.toBundle());
}
public void setMediaMetadata(MediaMetadata mediaMetadata) throws RemoteException {
binder.setMediaMetadata(sessionId, mediaMetadata.toBundle());
}
public void notifyTimelineChanged(@Player.TimelineChangeReason int reason)
throws RemoteException {
binder.notifyTimelineChanged(sessionId, reason);