From bd81181892879b3ca0a573b669cfbce14015cd24 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 23 Aug 2017 03:29:21 -0700 Subject: [PATCH] Add shortcut methods to query next or previous window index. This functionality is most likely needed by UI modules which currently need to obtain the timeline, the current repeat and shuffle modes and are only then able to query the next/previous window index using this information. Adding these methods simplifies these cumbersome requests. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=166181202 --- .../android/exoplayer2/ext/cast/CastPlayer.java | 10 ++++++++++ .../ext/mediasession/TimelineQueueNavigator.java | 7 +++---- .../DynamicConcatenatingMediaSourceTest.java | 10 ++++++++++ .../google/android/exoplayer2/ExoPlayerImpl.java | 12 ++++++++++++ .../java/com/google/android/exoplayer2/Player.java | 14 ++++++++++++++ .../google/android/exoplayer2/SimpleExoPlayer.java | 10 ++++++++++ .../android/exoplayer2/ui/PlaybackControlView.java | 13 +++++-------- .../exoplayer2/testutil/FakeSimpleExoPlayer.java | 10 ++++++++++ 8 files changed, 74 insertions(+), 12 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 50ae7ea5ba..e79fef74d5 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 @@ -371,6 +371,16 @@ public final class CastPlayer implements Player { return 0; } + @Override + public int getNextWindowIndex() { + return C.INDEX_UNSET; + } + + @Override + public int getPreviousWindowIndex() { + return C.INDEX_UNSET; + } + @Override public long getDuration() { return currentTimeline.isEmpty() ? C.TIME_UNSET diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java index bd3f3f2820..9d7ed75c83 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java @@ -126,8 +126,7 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu if (timeline.isEmpty()) { return; } - int previousWindowIndex = timeline.getPreviousWindowIndex(player.getCurrentWindowIndex(), - player.getRepeatMode(), false); + int previousWindowIndex = player.getPreviousWindowIndex(); if (player.getCurrentPosition() > MAX_POSITION_FOR_SEEK_TO_PREVIOUS || previousWindowIndex == C.INDEX_UNSET) { player.seekTo(0); @@ -154,8 +153,7 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu if (timeline.isEmpty()) { return; } - int nextWindowIndex = timeline.getNextWindowIndex(player.getCurrentWindowIndex(), - player.getRepeatMode(), false); + int nextWindowIndex = player.getNextWindowIndex(); if (nextWindowIndex != C.INDEX_UNSET) { player.seekTo(nextWindowIndex, C.TIME_UNSET); } @@ -186,3 +184,4 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu } } + diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSourceTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSourceTest.java index 35233febf5..9cdb461d7b 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSourceTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSourceTest.java @@ -502,6 +502,16 @@ public final class DynamicConcatenatingMediaSourceTest extends TestCase { throw new UnsupportedOperationException(); } + @Override + public int getNextWindowIndex() { + throw new UnsupportedOperationException(); + } + + @Override + public int getPreviousWindowIndex() { + throw new UnsupportedOperationException(); + } + @Override public long getDuration() { throw new UnsupportedOperationException(); 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 0ce920a16f..7bf0cd5a02 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 @@ -317,6 +317,18 @@ import java.util.concurrent.CopyOnWriteArraySet; } } + @Override + public int getNextWindowIndex() { + return timeline.getNextWindowIndex(getCurrentWindowIndex(), getRepeatMode(), + getShuffleModeEnabled()); + } + + @Override + public int getPreviousWindowIndex() { + return timeline.getPreviousWindowIndex(getCurrentWindowIndex(), getRepeatMode(), + getShuffleModeEnabled()); + } + @Override public long getDuration() { if (timeline.isEmpty()) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Player.java b/library/core/src/main/java/com/google/android/exoplayer2/Player.java index 6eee930018..ae2785f6f8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Player.java @@ -363,6 +363,20 @@ public interface Player { */ int getCurrentWindowIndex(); + /** + * Returns the index of the next timeline window to be played, which may depend on the current + * repeat mode and whether shuffle mode is enabled. Returns {@link C#INDEX_UNSET} if the window + * currently being played is the last window. + */ + int getNextWindowIndex(); + + /** + * Returns the index of the previous timeline window to be played, which may depend on the current + * repeat mode and whether shuffle mode is enabled. Returns {@link C#INDEX_UNSET} if the window + * currently being played is the first window. + */ + int getPreviousWindowIndex(); + /** * Returns the duration of the current window in milliseconds, or {@link C#TIME_UNSET} if the * duration is not known. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 9fcc4d2128..1c35adb917 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -754,6 +754,16 @@ public class SimpleExoPlayer implements ExoPlayer { return player.getCurrentWindowIndex(); } + @Override + public int getNextWindowIndex() { + return player.getNextWindowIndex(); + } + + @Override + public int getPreviousWindowIndex() { + return player.getPreviousWindowIndex(); + } + @Override public long getDuration() { return player.getDuration(); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java index acb6e3e7cd..105dbc2495 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java @@ -675,11 +675,8 @@ public class PlaybackControlView extends FrameLayout { timeline.getWindow(windowIndex, window); isSeekable = window.isSeekable; enablePrevious = isSeekable || !window.isDynamic - || timeline.getPreviousWindowIndex(windowIndex, player.getRepeatMode(), false) - != C.INDEX_UNSET; - enableNext = window.isDynamic - || timeline.getNextWindowIndex(windowIndex, player.getRepeatMode(), false) - != C.INDEX_UNSET; + || player.getPreviousWindowIndex() != C.INDEX_UNSET; + enableNext = window.isDynamic || player.getNextWindowIndex() != C.INDEX_UNSET; if (player.isPlayingAd()) { // Always hide player controls during ads. hide(); @@ -863,8 +860,7 @@ public class PlaybackControlView extends FrameLayout { } int windowIndex = player.getCurrentWindowIndex(); timeline.getWindow(windowIndex, window); - int previousWindowIndex = timeline.getPreviousWindowIndex(windowIndex, player.getRepeatMode(), - false); + int previousWindowIndex = player.getPreviousWindowIndex(); if (previousWindowIndex != C.INDEX_UNSET && (player.getCurrentPosition() <= MAX_POSITION_FOR_SEEK_TO_PREVIOUS || (window.isDynamic && !window.isSeekable))) { @@ -880,7 +876,7 @@ public class PlaybackControlView extends FrameLayout { return; } int windowIndex = player.getCurrentWindowIndex(); - int nextWindowIndex = timeline.getNextWindowIndex(windowIndex, player.getRepeatMode(), false); + int nextWindowIndex = player.getNextWindowIndex(); if (nextWindowIndex != C.INDEX_UNSET) { seekTo(nextWindowIndex, C.TIME_UNSET); } else if (timeline.getWindow(windowIndex, window, false).isDynamic) { @@ -1146,3 +1142,4 @@ public class PlaybackControlView extends FrameLayout { } } + diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeSimpleExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeSimpleExoPlayer.java index 7edaa6b13e..67a83b84e1 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeSimpleExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeSimpleExoPlayer.java @@ -250,6 +250,16 @@ public class FakeSimpleExoPlayer extends SimpleExoPlayer { return 0; } + @Override + public int getNextWindowIndex() { + return C.INDEX_UNSET; + } + + @Override + public int getPreviousWindowIndex() { + return C.INDEX_UNSET; + } + @Override public long getDuration() { return C.usToMs(durationUs);