mirror of
https://github.com/samsonjs/media.git
synced 2026-04-04 11:05:47 +00:00
Add permanently available commands
PiperOrigin-RevId: 362906290
This commit is contained in:
parent
10de7b2ab0
commit
46aab92206
6 changed files with 85 additions and 25 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue