Commit 5b1370e6 by tonihei Committed by Marc Baechinger

Set duration in QueueTimeline

If the duration is reported in MediaMetadataCompat, it should
also be set in the QueueTimeline to match controller.getDuration()

PiperOrigin-RevId: 522022953
parent d66dd502
......@@ -1804,6 +1804,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
long oldActiveQueueId = getActiveQueueId(oldLegacyPlayerInfo.playbackStateCompat);
long newActiveQueueId = getActiveQueueId(newLegacyPlayerInfo.playbackStateCompat);
boolean isCurrentActiveQueueIdChanged = (oldActiveQueueId != newActiveQueueId) || initialUpdate;
long durationMs = MediaUtils.convertToDurationMs(newLegacyPlayerInfo.mediaMetadataCompat);
if (isMetadataCompatChanged || isCurrentActiveQueueIdChanged || isQueueChanged) {
currentMediaItemIndex = findQueueItemIndex(newLegacyPlayerInfo.queue, newActiveQueueId);
boolean hasMediaMetadataCompat = newLegacyPlayerInfo.mediaMetadataCompat != null;
......@@ -1829,19 +1830,17 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
+ " MediaItem.");
MediaItem fakeMediaItem =
MediaUtils.convertToMediaItem(newLegacyPlayerInfo.mediaMetadataCompat, ratingType);
// Ad a tag to make sure the fake media item can't have an equal instance by accident.
fakeMediaItem = fakeMediaItem.buildUpon().setTag(new Object()).build();
currentTimeline = currentTimeline.copyWithFakeMediaItem(fakeMediaItem);
currentTimeline = currentTimeline.copyWithFakeMediaItem(fakeMediaItem, durationMs);
currentMediaItemIndex = currentTimeline.getWindowCount() - 1;
} else {
currentTimeline = currentTimeline.copyWithFakeMediaItem(/* fakeMediaItem= */ null);
currentTimeline = currentTimeline.copyWithClearedFakeMediaItem();
// Shouldn't be C.INDEX_UNSET to make getCurrentMediaItemIndex() return masked index.
// In other words, this index is either the currently playing media item index or the
// would-be playing index when playing.
currentMediaItemIndex = 0;
}
} else if (currentMediaItemIndex != C.INDEX_UNSET) {
currentTimeline = currentTimeline.copyWithFakeMediaItem(/* fakeMediaItem= */ null);
currentTimeline = currentTimeline.copyWithClearedFakeMediaItem();
if (hasMediaMetadataCompat) {
MediaItem mediaItem =
MediaUtils.convertToMediaItem(
......@@ -1850,7 +1849,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
ratingType);
currentTimeline =
currentTimeline.copyWithNewMediaItem(
/* replaceIndex= */ currentMediaItemIndex, mediaItem);
/* replaceIndex= */ currentMediaItemIndex, mediaItem, durationMs);
}
} else {
// There's queue, but no valid queue item ID nor current media item metadata.
......@@ -1897,7 +1896,6 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
PlaybackException playerError =
MediaUtils.convertToPlaybackException(newLegacyPlayerInfo.playbackStateCompat);
long durationMs = MediaUtils.convertToDurationMs(newLegacyPlayerInfo.mediaMetadataCompat);
long currentPositionMs =
MediaUtils.convertToCurrentPositionMs(
newLegacyPlayerInfo.playbackStateCompat,
......
......@@ -246,6 +246,8 @@ public class MediaControllerWithMediaSessionCompatTest {
AtomicLong repeatModeRef = new AtomicLong();
AtomicReference<MediaMetadata> playlistMetadataRef = new AtomicReference<>();
AtomicBoolean isPlayingAdRef = new AtomicBoolean();
AtomicLong durationRef = new AtomicLong();
AtomicLong durationInTimelineRef = new AtomicLong();
threadTestRule
.getHandler()
.postAndSync(
......@@ -260,6 +262,12 @@ public class MediaControllerWithMediaSessionCompatTest {
shuffleModeEnabledRef.set(controller.getShuffleModeEnabled());
playlistMetadataRef.set(controller.getPlaylistMetadata());
isPlayingAdRef.set(controller.isPlayingAd());
durationRef.set(controller.getDuration());
durationInTimelineRef.set(
controller
.getCurrentTimeline()
.getWindow(/* windowIndex= */ 0, new Timeline.Window())
.getDurationMs());
});
assertThat(positionRef.get())
......@@ -273,6 +281,8 @@ public class MediaControllerWithMediaSessionCompatTest {
assertThat(repeatModeRef.get()).isEqualTo(Player.REPEAT_MODE_ALL);
assertThat(playlistMetadataRef.get().title.toString()).isEqualTo(queueTitle.toString());
assertThat(isPlayingAdRef.get()).isEqualTo(isPlayingAd);
assertThat(durationRef.get()).isEqualTo(duration);
assertThat(durationInTimelineRef.get()).isEqualTo(duration);
}
@Test
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment