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 da42778c34..020b71c692 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 @@ -309,6 +309,13 @@ public final class CastPlayer extends BasePlayer { } } + @Override + public void setMediaItems(List mediaItems, boolean resetPosition) { + int windowIndex = resetPosition ? 0 : getCurrentWindowIndex(); + long startPositionMs = resetPosition ? C.TIME_UNSET : getContentPosition(); + setMediaItems(mediaItems, windowIndex, startPositionMs); + } + @Override public void setMediaItems( List mediaItems, int startWindowIndex, long startPositionMs) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/BasePlayer.java index 9d7af2dce6..4f89925121 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -44,12 +44,6 @@ public abstract class BasePlayer implements Player { setMediaItems(Collections.singletonList(mediaItem), resetPosition); } - @Override - public void setMediaItems(List mediaItems, boolean resetPosition) { - setMediaItems( - mediaItems, /* startWindowIndex= */ C.INDEX_UNSET, /* startPositionMs= */ C.TIME_UNSET); - } - @Override public void setMediaItems(List mediaItems) { setMediaItems(mediaItems, /* resetPosition= */ true); 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 a435684d69..4167307da3 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 @@ -338,6 +338,11 @@ import java.util.concurrent.TimeoutException; prepare(); } + @Override + public void setMediaItems(List mediaItems, boolean resetPosition) { + setMediaSources(createMediaSources(mediaItems), resetPosition); + } + @Override public void setMediaItems( List mediaItems, int startWindowIndex, long startPositionMs) { 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 b176d41b45..fa31d1a4f4 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 @@ -109,6 +109,7 @@ import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -5706,6 +5707,42 @@ public final class ExoPlayerTest { assertArrayEquals(new int[] {0, 0, 0}, currentWindowIndices); } + @Test + public void setMediaItems_resetPosition_resetsPosition() throws Exception { + final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; + final long[] currentPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; + ActionSchedule actionSchedule = + new ActionSchedule.Builder(TAG) + .pause() + .executeRunnable( + new PlayerRunnable() { + @Override + public void run(SimpleExoPlayer player) { + player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 1000); + currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentPositions[0] = player.getCurrentPosition(); + List listOfTwo = + Lists.newArrayList( + MediaItem.fromUri(Uri.EMPTY), MediaItem.fromUri(Uri.EMPTY)); + player.setMediaItems(listOfTwo, /* resetPosition= */ true); + currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentPositions[1] = player.getCurrentPosition(); + } + }) + .prepare() + .waitForTimelineChanged() + .play() + .build(); + new ExoPlayerTestRunner.Builder(context) + .setActionSchedule(actionSchedule) + .build() + .start(/* doPrepare= */ false) + .blockUntilActionScheduleFinished(TIMEOUT_MS) + .blockUntilEnded(TIMEOUT_MS); + assertArrayEquals(new int[] {1, 0}, currentWindowIndices); + assertArrayEquals(new long[] {1000, 0}, currentPositions); + } + @Test public void setMediaSources_empty_whenEmpty_validInitialSeek_correctMaskingWindowIndex() throws Exception {