diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java index 8b4f44aece..58c6eaf10d 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java @@ -30,6 +30,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_DEFAULT_POSITION; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_WINDOW; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW; @@ -1210,6 +1211,7 @@ public class CastPlayerTest { assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_WINDOW)).isFalse(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT_WINDOW)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_WINDOW)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_BACK)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_FORWARD)).isTrue(); @@ -1293,6 +1295,26 @@ public class CastPlayerTest { assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); } + @Test + public void isCommandAvailable_duringLiveItem_isTrueForSeekToNext() { + MediaItem mediaItem = createMediaItem(/* mediaQueueItemId= */ 1); + List mediaItems = ImmutableList.of(mediaItem); + int[] mediaQueueItemIds = new int[] {1}; + int[] streamTypes = new int[] {MediaInfo.STREAM_TYPE_LIVE}; + long[] durationsMs = new long[] {C.TIME_UNSET}; + + castPlayer.addMediaItem(mediaItem); + updateTimeLine( + mediaItems, + mediaQueueItemIds, + /* currentItemId= */ 1, + streamTypes, + durationsMs, + /* positionMs= */ C.TIME_UNSET); + + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); + } + @Test public void seekTo_nextWindow_notifiesAvailableCommandsChanged() { when(mockRemoteMediaClient.queueJumpToItem(anyInt(), anyLong(), eq(null))) @@ -1300,9 +1322,10 @@ public class CastPlayerTest { Player.Commands commandsWithSeekToPreviousWindow = createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands( + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); int[] mediaQueueItemIds = new int[] {1, 2, 3, 4}; List mediaItems = createMediaItems(mediaQueueItemIds); @@ -1331,9 +1354,10 @@ public class CastPlayerTest { Player.Commands commandsWithSeekToPreviousWindow = createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands( + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); int[] mediaQueueItemIds = new int[] {1, 2, 3, 4}; List mediaItems = createMediaItems(mediaQueueItemIds); @@ -1377,7 +1401,7 @@ public class CastPlayerTest { public void addMediaItem_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); MediaItem mediaItem3 = createMediaItem(/* mediaQueueItemId= */ 3); @@ -1445,7 +1469,7 @@ public class CastPlayerTest { public void removeMediaItem_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Commands emptyTimelineCommands = createWithDefaultCommands(/* isTimelineEmpty= */ true); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); @@ -1533,7 +1557,7 @@ public class CastPlayerTest { public void removeMediaItem_current_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); @@ -1561,7 +1585,8 @@ public class CastPlayerTest { .thenReturn(mockPendingResult); Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousAndNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands( + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); int[] mediaQueueItemIds = new int[] {1}; List mediaItems = createMediaItems(mediaQueueItemIds); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java index a6c6791d99..63e563997e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -302,6 +302,11 @@ public abstract class BasePlayer implements Player { && (hasPrevious() || !isCurrentWindowLive() || isCurrentWindowSeekable()) && !isPlayingAd()) .addIf(COMMAND_SEEK_TO_NEXT_WINDOW, hasNext() && !isPlayingAd()) + .addIf( + COMMAND_SEEK_TO_NEXT, + !getCurrentTimeline().isEmpty() + && (hasNext() || (isCurrentWindowLive() && isCurrentWindowDynamic())) + && !isPlayingAd()) .addIf(COMMAND_SEEK_TO_WINDOW, !isPlayingAd()) .addIf(COMMAND_SEEK_BACK, isCurrentWindowSeekable() && !isPlayingAd()) .addIf(COMMAND_SEEK_FORWARD, isCurrentWindowSeekable() && !isPlayingAd()) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 8c8a6e8ff8..8bf858aab6 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -642,6 +642,7 @@ public interface Player { COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_NEXT_WINDOW, + COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_WINDOW, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, @@ -1257,15 +1258,15 @@ public interface Player { * #COMMAND_PREPARE_STOP}, {@link #COMMAND_SEEK_TO_DEFAULT_POSITION}, {@link * #COMMAND_SEEK_IN_CURRENT_WINDOW}, {@link #COMMAND_SEEK_TO_PREVIOUS_WINDOW}, {@link * #COMMAND_SEEK_TO_PREVIOUS}, {@link #COMMAND_SEEK_TO_NEXT_WINDOW}, {@link - * #COMMAND_SEEK_TO_WINDOW}, {@link #COMMAND_SEEK_BACK}, {@link #COMMAND_SEEK_FORWARD}, {@link - * #COMMAND_SET_SPEED_AND_PITCH}, {@link #COMMAND_SET_SHUFFLE_MODE}, {@link - * #COMMAND_SET_REPEAT_MODE}, {@link #COMMAND_GET_CURRENT_MEDIA_ITEM}, {@link - * #COMMAND_GET_TIMELINE}, {@link #COMMAND_GET_MEDIA_ITEMS_METADATA}, {@link - * #COMMAND_SET_MEDIA_ITEMS_METADATA}, {@link #COMMAND_CHANGE_MEDIA_ITEMS}, {@link - * #COMMAND_GET_AUDIO_ATTRIBUTES}, {@link #COMMAND_GET_VOLUME}, {@link - * #COMMAND_GET_DEVICE_VOLUME}, {@link #COMMAND_SET_VOLUME}, {@link #COMMAND_SET_DEVICE_VOLUME}, - * {@link #COMMAND_ADJUST_DEVICE_VOLUME}, {@link #COMMAND_SET_VIDEO_SURFACE} or {@link - * #COMMAND_GET_TEXT}. + * #COMMAND_SEEK_TO_NEXT}, {@link #COMMAND_SEEK_TO_WINDOW}, {@link #COMMAND_SEEK_BACK}, {@link + * #COMMAND_SEEK_FORWARD}, {@link #COMMAND_SET_SPEED_AND_PITCH}, {@link + * #COMMAND_SET_SHUFFLE_MODE}, {@link #COMMAND_SET_REPEAT_MODE}, {@link + * #COMMAND_GET_CURRENT_MEDIA_ITEM}, {@link #COMMAND_GET_TIMELINE}, {@link + * #COMMAND_GET_MEDIA_ITEMS_METADATA}, {@link #COMMAND_SET_MEDIA_ITEMS_METADATA}, {@link + * #COMMAND_CHANGE_MEDIA_ITEMS}, {@link #COMMAND_GET_AUDIO_ATTRIBUTES}, {@link + * #COMMAND_GET_VOLUME}, {@link #COMMAND_GET_DEVICE_VOLUME}, {@link #COMMAND_SET_VOLUME}, {@link + * #COMMAND_SET_DEVICE_VOLUME}, {@link #COMMAND_ADJUST_DEVICE_VOLUME}, {@link + * #COMMAND_SET_VIDEO_SURFACE} or {@link #COMMAND_GET_TEXT}. */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -1278,6 +1279,7 @@ public interface Player { COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_NEXT_WINDOW, + COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_WINDOW, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, @@ -1313,44 +1315,46 @@ public interface Player { int COMMAND_SEEK_TO_PREVIOUS = 6; /** Command to seek to the default position of the next window. */ int COMMAND_SEEK_TO_NEXT_WINDOW = 7; + /** Command to seek to a later position in the current or next window. */ + int COMMAND_SEEK_TO_NEXT = 8; /** Command to seek anywhere in any window. */ - int COMMAND_SEEK_TO_WINDOW = 8; + int COMMAND_SEEK_TO_WINDOW = 9; /** Command to seek back by a fixed increment into the current window. */ - int COMMAND_SEEK_BACK = 9; + int COMMAND_SEEK_BACK = 10; /** Command to seek forward by a fixed increment into the current window. */ - int COMMAND_SEEK_FORWARD = 10; + int COMMAND_SEEK_FORWARD = 11; /** Command to set the playback speed and pitch. */ - int COMMAND_SET_SPEED_AND_PITCH = 11; + int COMMAND_SET_SPEED_AND_PITCH = 12; /** Command to enable shuffling. */ - int COMMAND_SET_SHUFFLE_MODE = 12; + int COMMAND_SET_SHUFFLE_MODE = 13; /** Command to set the repeat mode. */ - int COMMAND_SET_REPEAT_MODE = 13; + int COMMAND_SET_REPEAT_MODE = 14; /** Command to get the {@link MediaItem} of the current window. */ - int COMMAND_GET_CURRENT_MEDIA_ITEM = 14; + int COMMAND_GET_CURRENT_MEDIA_ITEM = 15; /** Command to get the information about the current timeline. */ - int COMMAND_GET_TIMELINE = 15; + int COMMAND_GET_TIMELINE = 16; /** Command to get the {@link MediaItem MediaItems} metadata. */ - int COMMAND_GET_MEDIA_ITEMS_METADATA = 16; + int COMMAND_GET_MEDIA_ITEMS_METADATA = 17; /** Command to set the {@link MediaItem MediaItems} metadata. */ - int COMMAND_SET_MEDIA_ITEMS_METADATA = 17; + int COMMAND_SET_MEDIA_ITEMS_METADATA = 18; /** Command to change the {@link MediaItem MediaItems} in the playlist. */ - int COMMAND_CHANGE_MEDIA_ITEMS = 18; + int COMMAND_CHANGE_MEDIA_ITEMS = 19; /** Command to get the player current {@link AudioAttributes}. */ - int COMMAND_GET_AUDIO_ATTRIBUTES = 19; + int COMMAND_GET_AUDIO_ATTRIBUTES = 20; /** Command to get the player volume. */ - int COMMAND_GET_VOLUME = 20; + int COMMAND_GET_VOLUME = 21; /** Command to get the device volume and whether it is muted. */ - int COMMAND_GET_DEVICE_VOLUME = 21; + int COMMAND_GET_DEVICE_VOLUME = 22; /** Command to set the player volume. */ - int COMMAND_SET_VOLUME = 22; + int COMMAND_SET_VOLUME = 23; /** Command to set the device volume and mute it. */ - int COMMAND_SET_DEVICE_VOLUME = 23; + int COMMAND_SET_DEVICE_VOLUME = 24; /** Command to increase and decrease the device volume and mute it. */ - int COMMAND_ADJUST_DEVICE_VOLUME = 24; + int COMMAND_ADJUST_DEVICE_VOLUME = 25; /** Command to set and clear the surface on which to render the video. */ - int COMMAND_SET_VIDEO_SURFACE = 25; + int COMMAND_SET_VIDEO_SURFACE = 26; /** Command to get the text that should currently be displayed by the player. */ - int COMMAND_GET_TEXT = 26; + int COMMAND_GET_TEXT = 27; /** Represents an invalid {@link Command}. */ int COMMAND_INVALID = -1; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 07ed9bdc61..f2c8e5cf0f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -30,6 +30,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_DEFAULT_POSITION; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_WINDOW; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW; @@ -8181,6 +8182,7 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_WINDOW)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_WINDOW)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_WINDOW)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); @@ -8231,6 +8233,7 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_WINDOW)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_WINDOW)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_WINDOW)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); @@ -8309,14 +8312,39 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); } + @Test + public void isCommandAvailable_duringLiveItem_isTrueForSeekToNext() throws Exception { + Timeline timelineWithLiveWindow = + new FakeTimeline( + new TimelineWindowDefinition( + /* periodCount= */ 1, + /* id= */ 0, + /* isSeekable= */ true, + /* isDynamic= */ true, + /* isLive= */ true, + /* isPlaceholder= */ false, + /* durationUs= */ C.TIME_UNSET, + /* defaultPositionUs= */ 10_000_000, + TimelineWindowDefinition.DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US, + AdPlaybackState.NONE)); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + + player.addMediaSource(new FakeMediaSource(timelineWithLiveWindow)); + player.prepare(); + runUntilPlaybackState(player, Player.STATE_READY); + + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); + } + @Test public void seekTo_nextWindow_notifiesAvailableCommandsChanged() { Player.Commands commandsWithSeekToPreviousWindow = createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands( + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8348,9 +8376,10 @@ public final class ExoPlayerTest { Player.Commands commandsWithSeekToPreviousWindow = createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands( + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8397,26 +8426,28 @@ public final class ExoPlayerTest { @Test public void automaticWindowTransition_notifiesAvailableCommandsChanged() throws Exception { Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekInCurrentAndToNextWindow = createWithDefaultCommands( COMMAND_SEEK_IN_CURRENT_WINDOW, + COMMAND_SEEK_TO_NEXT_WINDOW, + COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_BACK, - COMMAND_SEEK_FORWARD, - COMMAND_SEEK_TO_NEXT_WINDOW); + COMMAND_SEEK_FORWARD); Player.Commands commandsWithSeekInCurrentAndToPreviousWindow = createWithDefaultCommands( COMMAND_SEEK_IN_CURRENT_WINDOW, + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_BACK, - COMMAND_SEEK_FORWARD, - COMMAND_SEEK_TO_PREVIOUS_WINDOW); + COMMAND_SEEK_FORWARD); Player.Commands commandsWithSeekAnywhere = createWithDefaultCommands( COMMAND_SEEK_IN_CURRENT_WINDOW, - COMMAND_SEEK_BACK, - COMMAND_SEEK_FORWARD, + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, - COMMAND_SEEK_TO_PREVIOUS_WINDOW); + COMMAND_SEEK_TO_NEXT, + COMMAND_SEEK_BACK, + COMMAND_SEEK_FORWARD); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8455,7 +8486,7 @@ public final class ExoPlayerTest { public void addMediaSource_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8499,7 +8530,7 @@ public final class ExoPlayerTest { public void removeMediaItem_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Commands emptyTimelineCommands = createWithDefaultCommands(/* isTimelineEmpty */ true); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); @@ -8556,7 +8587,7 @@ public final class ExoPlayerTest { public void removeMediaItem_current_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8575,7 +8606,8 @@ public final class ExoPlayerTest { public void setRepeatMode_all_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousAndNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands( + COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8609,7 +8641,7 @@ public final class ExoPlayerTest { Player.Commands commandsWithSeekToPreviousWindow = createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener);