Deduplicate onSetMediaItem handler logic

Created unified MediaUtils method to handle various logic for calling Player.setMediaItems from MediaSessionStub and MediaSessionLegacyStub

PiperOrigin-RevId: 504271877
This commit is contained in:
michaelkatz 2023-01-24 15:45:44 +00:00 committed by christosts
parent 030edb0e4a
commit 7fbdbeb6ca
4 changed files with 39 additions and 116 deletions

View file

@ -1130,9 +1130,7 @@ public class MediaSession {
* MediaItemsWithStartPosition} has been resolved, the session will call {@link
* Player#setMediaItems} as requested. If the resolved {@link
* MediaItemsWithStartPosition#startIndex startIndex} is {@link
* androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} and {@link
* MediaItemsWithStartPosition#startPositionMs startPositionMs} is {@link
* androidx.media3.common.C#TIME_UNSET C.TIME_UNSET} then the session will call {@link
* androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} then the session will call {@link
* Player#setMediaItem(MediaItem, boolean)} with {@code resetPosition} set to {@code true}.
*
* <p>Interoperability: This method will be called in response to the following {@link
@ -1157,14 +1155,12 @@ public class MediaSession {
* @param mediaSession The session for this event.
* @param controller The controller information.
* @param mediaItems The list of requested {@linkplain MediaItem media items}.
* @param startIndex The start index in the {@link MediaItem} list from which to start playing.
* If startIndex is {@link androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} and
* startPositionMs is {@link androidx.media3.common.C#TIME_UNSET C.TIME_UNSET} then caller
* is requesting to set media items with default index and position.
* @param startPositionMs The starting position in the media item from where to start playing.
* If startIndex is {@link androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} and
* startPositionMs is {@link androidx.media3.common.C#TIME_UNSET C.TIME_UNSET} then caller
* is requesting to set media items with default index and position.
* @param startIndex The start index in the {@link MediaItem} list from which to start playing,
* or {@link androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} to start playing from the
* default index in the playlist.
* @param startPositionMs The starting position in the media item from where to start playing,
* or {@link androidx.media3.common.C#TIME_UNSET C.TIME_UNSET} to start playing from the
* default position in the media item. This value is ignored if startIndex is C.INDEX_UNSET
* @return A {@link ListenableFuture} with a {@link MediaItemsWithStartPosition} containing a
* list of resolved {@linkplain MediaItem media items}, and a starting index and position
* that are playable by the underlying {@link Player}. If returned {@link
@ -1197,25 +1193,17 @@ public class MediaSession {
/**
* Index to start playing at in {@link MediaItem} list.
*
* <p>If startIndex is {@link androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} and
* startPositionMs is {@link androidx.media3.common.C#TIME_UNSET C.TIME_UNSET} then the
* requested start is the default index and position. If only startIndex is {@link
* androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET}, then the requested start is the
* {@linkplain Player#getCurrentMediaItemIndex() current index} and {@linkplain
* Player#getContentPosition() position}.
* <p>The start index in the {@link MediaItem} list from which to start playing, or {@link
* androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} to start playing from the default index
* in the playlist.
*/
public final int startIndex;
/**
* Position to start playing from in starting media item.
*
* <p>If startIndex is {@link androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET} and
* startPositionMs is {@link androidx.media3.common.C#TIME_UNSET C.TIME_UNSET} then the
* requested start is the default start index that takes into account whether {@link
* Player#getShuffleModeEnabled() shuffling is enabled} and the {@linkplain
* Timeline.Window#defaultPositionUs} default position}. If only startIndex is {@link
* androidx.media3.common.C#INDEX_UNSET C.INDEX_UNSET}, then the requested start is the
* {@linkplain Player#getCurrentMediaItemIndex() current index} and {@linkplain
* Player#getContentPosition() position}.
* <p>The starting position in the media item from where to start playing, or {@link
* androidx.media3.common.C#TIME_UNSET C.TIME_UNSET} to start playing from the default position
* in the media item. This value is ignored if startIndex is C.INDEX_UNSET
*/
public final long startPositionMs;

View file

@ -724,14 +724,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
sessionImpl.getApplicationHandler(),
() -> {
PlayerWrapper player = sessionImpl.getPlayerWrapper();
if (mediaItemsWithStartPosition.startIndex == C.INDEX_UNSET
&& mediaItemsWithStartPosition.startPositionMs == C.TIME_UNSET) {
MediaUtils.setMediaItemsWithDefaultStartIndexAndPosition(
player, mediaItemsWithStartPosition);
} else {
MediaUtils.setMediaItemsWithSpecifiedStartIndexAndPosition(
player, mediaItemsWithStartPosition);
}
MediaUtils.setMediaItemsWithStartIndexAndPosition(
player, mediaItemsWithStartPosition);
@Player.State int playbackState = player.getPlaybackState();
if (playbackState == Player.STATE_IDLE) {
player.prepareIfCommandAvailable();

View file

@ -221,7 +221,7 @@ import java.util.concurrent.ExecutionException;
() -> {
if (!sessionImpl.isReleased()) {
mediaItemPlayerTask.run(
sessionImpl.getPlayerWrapper(), controller, mediaItemsWithStartPosition);
sessionImpl.getPlayerWrapper(), mediaItemsWithStartPosition);
}
},
new SessionResult(SessionResult.RESULT_SUCCESS)));
@ -909,28 +909,7 @@ import java.util.concurrent.ExecutionException;
ImmutableList.of(mediaItem),
/* startIndex= */ 0,
startPositionMs),
(player, controller, mediaItemsWithStartPosition) -> {
if (player.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)) {
if (mediaItemsWithStartPosition.startIndex == C.INDEX_UNSET
&& mediaItemsWithStartPosition.startPositionMs == C.TIME_UNSET) {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems, /* resetPosition= */ true);
} else {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems,
mediaItemsWithStartPosition.startIndex,
mediaItemsWithStartPosition.startPositionMs);
}
} else {
if (!mediaItemsWithStartPosition.mediaItems.isEmpty()) {
player.setMediaItem(
mediaItemsWithStartPosition.mediaItems.get(0),
mediaItemsWithStartPosition.startPositionMs);
} else {
player.clearMediaItems();
}
}
})));
MediaUtils::setMediaItemsWithStartIndexAndPosition)));
}
@Override
@ -965,16 +944,7 @@ import java.util.concurrent.ExecutionException;
resetPosition
? C.TIME_UNSET
: sessionImpl.getPlayerWrapper().getCurrentPosition()),
(player, controller, mediaItemsWithStartPosition) -> {
if (mediaItemsWithStartPosition.startIndex == C.INDEX_UNSET
&& mediaItemsWithStartPosition.startPositionMs == C.TIME_UNSET) {
MediaUtils.setMediaItemsWithDefaultStartIndexAndPosition(
player, mediaItemsWithStartPosition);
} else {
MediaUtils.setMediaItemsWithSpecifiedStartIndexAndPosition(
player, mediaItemsWithStartPosition);
}
})));
MediaUtils::setMediaItemsWithStartIndexAndPosition)));
}
@Override
@ -1020,18 +990,7 @@ import java.util.concurrent.ExecutionException;
resetPosition
? C.TIME_UNSET
: sessionImpl.getPlayerWrapper().getCurrentPosition()),
(player, controller, mediaItemsWithStartPosition) -> {
if (mediaItemsWithStartPosition.startIndex == C.INDEX_UNSET
&& mediaItemsWithStartPosition.startPositionMs == C.TIME_UNSET) {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems, /* resetPosition= */ true);
} else {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems,
mediaItemsWithStartPosition.startIndex,
mediaItemsWithStartPosition.startPositionMs);
}
})));
MediaUtils::setMediaItemsWithStartIndexAndPosition)));
}
@Override
@ -1069,18 +1028,7 @@ import java.util.concurrent.ExecutionException;
(startIndex == C.INDEX_UNSET)
? sessionImpl.getPlayerWrapper().getCurrentPosition()
: startPositionMs),
(player, controller, mediaItemsWithStartPosition) -> {
if (mediaItemsWithStartPosition.startIndex == C.INDEX_UNSET
&& mediaItemsWithStartPosition.startPositionMs == C.TIME_UNSET) {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems, /* resetPosition= */ true);
} else {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems,
mediaItemsWithStartPosition.startIndex,
mediaItemsWithStartPosition.startPositionMs);
}
})));
MediaUtils::setMediaItemsWithStartIndexAndPosition)));
}
@Override
@ -1688,10 +1636,7 @@ import java.util.concurrent.ExecutionException;
}
private interface MediaItemsWithStartPositionPlayerTask {
void run(
PlayerWrapper player,
ControllerInfo controller,
MediaItemsWithStartPosition mediaItemsWithStartPosition);
void run(PlayerWrapper player, MediaItemsWithStartPosition mediaItemsWithStartPosition);
}
/* package */ static final class Controller2Cb implements ControllerCb {

View file

@ -1368,30 +1368,26 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
: Util.constrainValue((int) ((bufferedPositionMs * 100) / durationMs), 0, 100);
}
public static void setMediaItemsWithDefaultStartIndexAndPosition(
public static void setMediaItemsWithStartIndexAndPosition(
PlayerWrapper player, MediaSession.MediaItemsWithStartPosition mediaItemsWithStartPosition) {
if (player.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)) {
player.setMediaItems(mediaItemsWithStartPosition.mediaItems, /* resetPosition= */ true);
} else if (!mediaItemsWithStartPosition.mediaItems.isEmpty()) {
player.setMediaItem(mediaItemsWithStartPosition.mediaItems.get(0), /* resetPosition= */ true);
if (mediaItemsWithStartPosition.startIndex == C.INDEX_UNSET) {
if (player.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)) {
player.setMediaItems(mediaItemsWithStartPosition.mediaItems, /* resetPosition= */ true);
} else if (!mediaItemsWithStartPosition.mediaItems.isEmpty()) {
player.setMediaItem(
mediaItemsWithStartPosition.mediaItems.get(0), /* resetPosition= */ true);
}
} else {
player.clearMediaItems();
}
}
public static void setMediaItemsWithSpecifiedStartIndexAndPosition(
PlayerWrapper player, MediaSession.MediaItemsWithStartPosition mediaItemsWithStartPosition) {
if (player.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)) {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems,
mediaItemsWithStartPosition.startIndex,
mediaItemsWithStartPosition.startPositionMs);
} else if (!mediaItemsWithStartPosition.mediaItems.isEmpty()) {
player.setMediaItem(
mediaItemsWithStartPosition.mediaItems.get(0),
mediaItemsWithStartPosition.startPositionMs);
} else {
player.clearMediaItems();
if (player.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)) {
player.setMediaItems(
mediaItemsWithStartPosition.mediaItems,
mediaItemsWithStartPosition.startIndex,
mediaItemsWithStartPosition.startPositionMs);
} else if (!mediaItemsWithStartPosition.mediaItems.isEmpty()) {
player.setMediaItem(
mediaItemsWithStartPosition.mediaItems.get(0),
mediaItemsWithStartPosition.startPositionMs);
}
}
}