diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f3c016cde16..254d4471c47 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -11,6 +11,8 @@ * ExoPlayer: * Ensure renderers don't consume data from the next playlist item more than 10 seconds before the end of the current item. + * Add getter for shuffle mode to the `ExoPlayer` interface + ([#2522](https://github.com/androidx/media/pull/2522)). * Transformer: * Track Selection: * Extractors: diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java index 37a75095903..9cb13f20778 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java @@ -1381,6 +1381,15 @@ void setMediaSources( @UnstableApi void setShuffleOrder(ShuffleOrder shuffleOrder); + /** + * Returns the shuffle order. + * + *

The {@link ShuffleOrder} returned will have the same length as the current playlist ({@link + * Player#getMediaItemCount()}). + */ + @UnstableApi + ShuffleOrder getShuffleOrder(); + /** * Sets the {@linkplain PreloadConfiguration preload configuration} to configure playlist * preloading. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java index 3118eb20f9e..a4f0d2e0a2d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java @@ -787,6 +787,12 @@ public void setShuffleOrder(ShuffleOrder shuffleOrder) { /* repeatCurrentMediaItem= */ false); } + @Override + public ShuffleOrder getShuffleOrder() { + verifyApplicationThread(); + return shuffleOrder; + } + @Override public void setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { verifyApplicationThread(); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java index 2742bd10f0b..ddddb21fe7a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java @@ -941,6 +941,12 @@ public void setShuffleOrder(ShuffleOrder shuffleOrder) { player.setShuffleOrder(shuffleOrder); } + @Override + public ShuffleOrder getShuffleOrder() { + blockUntilConstructorFinished(); + return player.getShuffleOrder(); + } + @Override public void setPlayWhenReady(boolean playWhenReady) { blockUntilConstructorFinished(); diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java index 31dd46a00fd..f0c7fe905f5 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java @@ -8132,15 +8132,18 @@ public void run(ExoPlayer player) { @Test public void setShuffleOrder_keepsCurrentPosition() throws Exception { AtomicLong positionAfterSetShuffleOrder = new AtomicLong(C.TIME_UNSET); + AtomicReference shuffleOrderRef = new AtomicReference<>(); + FakeShuffleOrder shuffleOrder = new FakeShuffleOrder(/* length= */ 1); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .playUntilPosition(0, 5000) - .setShuffleOrder(new FakeShuffleOrder(/* length= */ 1)) + .setShuffleOrder(shuffleOrder) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { positionAfterSetShuffleOrder.set(player.getCurrentPosition()); + shuffleOrderRef.set(player.getShuffleOrder()); } }) .play() @@ -8152,6 +8155,7 @@ public void run(ExoPlayer player) { .blockUntilEnded(TIMEOUT_MS); assertThat(positionAfterSetShuffleOrder.get()).isAtLeast(5000); + assertThat(shuffleOrderRef.get()).isEqualTo(shuffleOrder); } @Test diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java index 89d3bd58c11..6b22d5d95c9 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java @@ -176,6 +176,11 @@ public void setShuffleOrder(ShuffleOrder shuffleOrder) { throw new UnsupportedOperationException(); } + @Override + public ShuffleOrder getShuffleOrder() { + throw new UnsupportedOperationException(); + } + @Override public void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { throw new UnsupportedOperationException();