From 46aab92206b7468bdeb28474d458ff8d73b4509d Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 15 Mar 2021 11:01:30 +0000 Subject: [PATCH] Add permanently available commands PiperOrigin-RevId: 362906290 --- .../exoplayer2/ext/cast/CastPlayer.java | 15 ++++++++++- .../exoplayer2/ext/cast/CastPlayerTest.java | 24 ++++++++++++----- .../google/android/exoplayer2/BasePlayer.java | 7 ++--- .../com/google/android/exoplayer2/Player.java | 21 +++++++++++++-- .../android/exoplayer2/ExoPlayerImpl.java | 17 +++++++++++- .../android/exoplayer2/ExoPlayerTest.java | 26 ++++++++++++------- 6 files changed, 85 insertions(+), 25 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 2e0a2f59b9..74999635e9 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -19,6 +19,7 @@ import static java.lang.Math.min; import android.os.Looper; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.BasePlayer; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; @@ -73,6 +74,18 @@ public final class CastPlayer extends BasePlayer { ExoPlayerLibraryInfo.registerModule("goog.exo.cast"); } + @VisibleForTesting + /* package */ static final int[] PERMANENT_AVAILABLE_COMMANDS = + new int[] { + COMMAND_PLAY_PAUSE, + COMMAND_PREPARE_STOP_RELEASE, + COMMAND_SET_REPEAT_MODE, + COMMAND_GET_CURRENT_MEDIA_ITEM, + COMMAND_GET_MEDIA_ITEMS, + COMMAND_GET_MEDIA_ITEMS_METADATA, + COMMAND_CHANGE_MEDIA_ITEMS + }; + private static final String TAG = "CastPlayer"; private static final int RENDERER_COUNT = 3; @@ -795,7 +808,7 @@ public final class CastPlayer extends BasePlayer { private void updateAvailableCommandsAndNotifyIfChanged() { Commands previousAvailableCommands = availableCommands; - availableCommands = getAvailableCommands(); + availableCommands = getAvailableCommands(PERMANENT_AVAILABLE_COMMANDS); if (!availableCommands.equals(previousAvailableCommands)) { listeners.queueEvent( Player.EVENT_AVAILABLE_COMMANDS_CHANGED, 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 153c6b88c1..51763b6dc2 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 @@ -15,10 +15,17 @@ */ package com.google.android.exoplayer2.ext.cast; +import static com.google.android.exoplayer2.Player.COMMAND_CHANGE_MEDIA_ITEMS; +import static com.google.android.exoplayer2.Player.COMMAND_GET_CURRENT_MEDIA_ITEM; +import static com.google.android.exoplayer2.Player.COMMAND_GET_MEDIA_ITEMS; +import static com.google.android.exoplayer2.Player.COMMAND_GET_MEDIA_ITEMS_METADATA; import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; import static com.google.android.exoplayer2.Player.COMMAND_PREPARE_STOP_RELEASE; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; +import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE; +import static com.google.android.exoplayer2.Player.COMMAND_SET_SHUFFLE_MODE; +import static com.google.android.exoplayer2.Player.COMMAND_SET_SPEED_AND_PITCH; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -590,14 +597,17 @@ public class CastPlayerTest { castPlayer.addMediaItems(mediaItems); updateTimeLine(mediaItems, mediaQueueItemIds, /* currentItemId= */ 1); - assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isTrue(); - assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); - } - - @Test - public void isCommandAvailable_containsPermanentCommands() { assertThat(castPlayer.isCommandAvailable(COMMAND_PLAY_PAUSE)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_PREPARE_STOP_RELEASE)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)).isFalse(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SHUFFLE_MODE)).isFalse(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_REPEAT_MODE)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_CURRENT_MEDIA_ITEM)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_MEDIA_ITEMS)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_MEDIA_ITEMS_METADATA)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)).isTrue(); } @Test @@ -923,7 +933,7 @@ public class CastPlayerTest { private static Player.Commands createCommands(@Player.Command int... commands) { Player.Commands.Builder builder = new Player.Commands.Builder(); - builder.addAll(COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP_RELEASE); + builder.addAll(CastPlayer.PERMANENT_AVAILABLE_COMMANDS); for (int command : commands) { builder.add(command); } 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 def5629bfe..b9b6795de4 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 @@ -24,9 +24,6 @@ import java.util.List; /** Abstract base {@link Player} which implements common implementation independent methods. */ public abstract class BasePlayer implements Player { - protected static final int[] PERMANENT_AVAILABLE_COMMANDS = - new int[] {COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP_RELEASE}; - protected final Timeline.Window window; public BasePlayer() { @@ -323,9 +320,9 @@ public abstract class BasePlayer implements Player { return repeatMode == REPEAT_MODE_ONE ? REPEAT_MODE_OFF : repeatMode; } - protected Commands getAvailableCommands() { + protected Commands getAvailableCommands(@Command int[] permanentAvailableCommands) { return new Commands.Builder() - .addAll(PERMANENT_AVAILABLE_COMMANDS) + .addAll(permanentAvailableCommands) .addIf(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, hasNext() && !isPlayingAd()) .addIf(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, hasPrevious() && !isPlayingAd()) .build(); 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 4ec99cf010..1d6df32184 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 @@ -1029,8 +1029,11 @@ public interface Player { /** * Commands that can be executed on a {@code Player}. One of {@link #COMMAND_PLAY_PAUSE}, {@link - * #COMMAND_PREPARE_STOP_RELEASE}, {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} or {@link - * #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM}. + * #COMMAND_PREPARE_STOP_RELEASE}, {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM}, {@link + * #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM}, {@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_MEDIA_ITEMS}, {@link + * #COMMAND_GET_MEDIA_ITEMS_METADATA} or {@link #COMMAND_CHANGE_MEDIA_ITEMS}. */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -1049,6 +1052,20 @@ public interface Player { int COMMAND_SEEK_TO_NEXT_MEDIA_ITEM = 3; /** Command to seek to the previous {@link MediaItem} in the playlist. */ int COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM = 4; + /** Command to set the playback speed and pitch. */ + int COMMAND_SET_SPEED_AND_PITCH = 5; + /** Command to enable shuffling. */ + int COMMAND_SET_SHUFFLE_MODE = 6; + /** Command to set the repeat mode. */ + int COMMAND_SET_REPEAT_MODE = 7; + /** Command to get the current {@link MediaItem}. */ + int COMMAND_GET_CURRENT_MEDIA_ITEM = 8; + /** Command to get the {@link MediaItem MediaItems} in the playlist. */ + int COMMAND_GET_MEDIA_ITEMS = 9; + /** Command to get the {@link MediaItem MediaItems} metadata. */ + int COMMAND_GET_MEDIA_ITEMS_METADATA = 10; + /** Command to change the {@link MediaItem MediaItems} in the playlist. */ + int COMMAND_CHANGE_MEDIA_ITEMS = 11; /** Returns the component of this player for audio output, or null if audio is not supported. */ @Nullable diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 32b341b437..eefcd11d68 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -26,6 +26,7 @@ import android.os.Handler; import android.os.Looper; import android.util.Pair; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.metadata.Metadata; @@ -56,6 +57,20 @@ import java.util.concurrent.CopyOnWriteArraySet; */ /* package */ final class ExoPlayerImpl extends BasePlayer implements ExoPlayer { + @VisibleForTesting + /* package */ static final int[] PERMANENT_AVAILABLE_COMMANDS = + new int[] { + COMMAND_PLAY_PAUSE, + COMMAND_PREPARE_STOP_RELEASE, + COMMAND_SET_SPEED_AND_PITCH, + COMMAND_SET_SHUFFLE_MODE, + COMMAND_SET_REPEAT_MODE, + COMMAND_GET_CURRENT_MEDIA_ITEM, + COMMAND_GET_MEDIA_ITEMS, + COMMAND_GET_MEDIA_ITEMS_METADATA, + COMMAND_CHANGE_MEDIA_ITEMS + }; + private static final String TAG = "ExoPlayerImpl"; /** @@ -1176,7 +1191,7 @@ import java.util.concurrent.CopyOnWriteArraySet; private void updateAvailableCommands() { Commands previousAvailableCommands = availableCommands; - availableCommands = getAvailableCommands(); + availableCommands = getAvailableCommands(PERMANENT_AVAILABLE_COMMANDS); if (!availableCommands.equals(previousAvailableCommands)) { listeners.queueEvent( Player.EVENT_AVAILABLE_COMMANDS_CHANGED, 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 31cf947884..732db4c3e9 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 @@ -15,10 +15,17 @@ */ package com.google.android.exoplayer2; +import static com.google.android.exoplayer2.Player.COMMAND_CHANGE_MEDIA_ITEMS; +import static com.google.android.exoplayer2.Player.COMMAND_GET_CURRENT_MEDIA_ITEM; +import static com.google.android.exoplayer2.Player.COMMAND_GET_MEDIA_ITEMS; +import static com.google.android.exoplayer2.Player.COMMAND_GET_MEDIA_ITEMS_METADATA; import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; import static com.google.android.exoplayer2.Player.COMMAND_PREPARE_STOP_RELEASE; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; +import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE; +import static com.google.android.exoplayer2.Player.COMMAND_SET_SHUFFLE_MODE; +import static com.google.android.exoplayer2.Player.COMMAND_SET_SPEED_AND_PITCH; import static com.google.android.exoplayer2.robolectric.RobolectricUtil.runMainLooperUntil; import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.playUntilStartOfWindow; import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled; @@ -8078,16 +8085,17 @@ public final class ExoPlayerTest { player.addMediaSources(ImmutableList.of(new FakeMediaSource(), new FakeMediaSource())); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isTrue(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); - } - - @Test - public void isCommandAvailable_containsPermanentCommands() { - ExoPlayer player = new TestExoPlayerBuilder(context).build(); - assertThat(player.isCommandAvailable(COMMAND_PLAY_PAUSE)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_PREPARE_STOP_RELEASE)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SET_SHUFFLE_MODE)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SET_REPEAT_MODE)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_GET_CURRENT_MEDIA_ITEM)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_GET_MEDIA_ITEMS)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_GET_MEDIA_ITEMS_METADATA)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)).isTrue(); } @Test @@ -9326,7 +9334,7 @@ public final class ExoPlayerTest { private static Player.Commands createCommands(@Player.Command int... commands) { Player.Commands.Builder builder = new Player.Commands.Builder(); - builder.addAll(COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP_RELEASE); + builder.addAll(ExoPlayerImpl.PERMANENT_AVAILABLE_COMMANDS); for (int command : commands) { builder.add(command); }