From 7d59383cc442d8e443e08732c985b886f8d033a0 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 13 Sep 2017 09:25:46 -0700 Subject: [PATCH] Add reason to onPositionDiscontinuity. This allows listeners to easily determine the source of the discontinuity. Reasons can be period transitions, seeks, and internal reasons. Listeners still using the deprecated ExoPlayer.EventListener interface were updated to Player.EventListener. GitHub: #3252 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=168549612 --- .../android/exoplayer2/demo/EventLogger.java | 17 ++++++++++-- .../exoplayer2/demo/PlayerActivity.java | 2 +- .../exoplayer2/ext/cast/CastPlayer.java | 4 +-- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 2 +- .../exoplayer2/ext/ima/ImaAdsLoader.java | 2 +- .../ext/leanback/LeanbackPlayerAdapter.java | 3 ++- .../mediasession/MediaSessionConnector.java | 2 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 2 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 2 +- .../android/exoplayer2/ExoPlayerImpl.java | 6 ++--- .../com/google/android/exoplayer2/Player.java | 27 +++++++++++++++++-- .../exoplayer2/ui/DebugTextViewHelper.java | 2 +- .../exoplayer2/ui/PlaybackControlView.java | 3 +-- .../exoplayer2/ui/SimpleExoPlayerView.java | 2 +- .../android/exoplayer2/testutil/Action.java | 4 +-- .../exoplayer2/testutil/ExoHostedTest.java | 2 +- .../testutil/ExoPlayerTestRunner.java | 2 +- 17 files changed, 60 insertions(+), 24 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java index 533306e0a2..83ba61fff1 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java @@ -105,8 +105,8 @@ import java.util.Locale; } @Override - public void onPositionDiscontinuity() { - Log.d(TAG, "positionDiscontinuity"); + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { + Log.d(TAG, "positionDiscontinuity [" + getDiscontinuityReasonString(reason) + "]"); } @Override @@ -484,4 +484,17 @@ import java.util.Locale; return "?"; } } + + private static String getDiscontinuityReasonString(@Player.DiscontinuityReason int reason) { + switch (reason) { + case Player.DISCONTINUITY_REASON_PERIOD_TRANSITION: + return "PERIOD_TRANSITION"; + case Player.DISCONTINUITY_REASON_SEEK: + return "SEEK"; + case Player.DISCONTINUITY_REASON_INTERNAL: + return "INTERNAL"; + default: + return "?"; + } + } } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index c2c4df9ea8..071e724053 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -510,7 +510,7 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { if (inErrorState) { // This will only occur if the user has performed a seek whilst in the error state. Update the // resume position so that if the user then retries, playback will resume from the position to 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 234b8384f9..9d3636f8ac 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 @@ -336,7 +336,7 @@ public final class CastPlayer implements Player { pendingSeekWindowIndex = windowIndex; pendingSeekPositionMs = positionMs; for (EventListener listener : listeners) { - listener.onPositionDiscontinuity(); + listener.onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK); } } } @@ -539,7 +539,7 @@ public final class CastPlayer implements Player { if (this.currentWindowIndex != currentWindowIndex) { this.currentWindowIndex = currentWindowIndex; for (EventListener listener : listeners) { - listener.onPositionDiscontinuity(); + listener.onPositionDiscontinuity(DISCONTINUITY_REASON_PERIOD_TRANSITION); } } if (updateTracksAndSelections()) { diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index 1257b652eb..8e1926ab3b 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -100,7 +100,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { // Do nothing. } diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index 87033173de..3ce4202450 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -583,7 +583,7 @@ public final class ImaAdsLoader implements Player.EventListener, VideoAdPlayer, } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { if (adsManager == null) { return; } diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index f5ef8b2ca4..93583f7d24 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -32,6 +32,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -278,7 +279,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@DiscontinuityReason int reason) { Callback callback = getCallback(); callback.onCurrentPositionChanged(LeanbackPlayerAdapter.this); callback.onBufferedPositionChanged(LeanbackPlayerAdapter.this); diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index 7304d9cdb6..61e3772750 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -686,7 +686,7 @@ public final class MediaSessionConnector { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { if (currentWindowIndex != player.getCurrentWindowIndex()) { if (queueNavigator != null) { queueNavigator.onCurrentWindowIndexChanged(player); diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index 6eeebaef4b..8f82a9fdc0 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -100,7 +100,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { // Do nothing. } diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index 50f4bf394d..52b6670c09 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -132,7 +132,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { // Do nothing. } 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 e574bfc1ee..75e08aadc6 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 @@ -257,7 +257,7 @@ import java.util.concurrent.CopyOnWriteArraySet; maskingWindowPositionMs = positionMs; internalPlayer.seekTo(timeline, windowIndex, C.msToUs(positionMs)); for (Player.EventListener listener : listeners) { - listener.onPositionDiscontinuity(); + listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK); } } } @@ -484,7 +484,7 @@ import java.util.concurrent.CopyOnWriteArraySet; } if (msg.arg1 != 0) { for (Player.EventListener listener : listeners) { - listener.onPositionDiscontinuity(); + listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK); } } } @@ -494,7 +494,7 @@ import java.util.concurrent.CopyOnWriteArraySet; if (pendingSeekAcks == 0) { playbackInfo = (ExoPlayerImplInternal.PlaybackInfo) msg.obj; for (Player.EventListener listener : listeners) { - listener.onPositionDiscontinuity(); + listener.onPositionDiscontinuity(DISCONTINUITY_REASON_PERIOD_TRANSITION); } } break; 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 ae2785f6f8..795b7249c8 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 @@ -55,7 +55,7 @@ public interface Player { * Note that if the timeline has changed then a position discontinuity may also have occurred. * For example, the current period index may have changed as a result of periods being added or * removed from the timeline. This will not be reported via a separate call to - * {@link #onPositionDiscontinuity()}. + * {@link #onPositionDiscontinuity(int)}. * * @param timeline The latest timeline. Never null, but may be empty. * @param manifest The latest manifest. May be null. @@ -119,8 +119,10 @@ public interface Player { *

* When a position discontinuity occurs as a result of a change to the timeline this method is * not called. {@link #onTimelineChanged(Timeline, Object)} is called in this case. + * + * @param reason The {@link DiscontinuityReason} responsible for the discontinuity. */ - void onPositionDiscontinuity(); + void onPositionDiscontinuity(@DiscontinuityReason int reason); /** * Called when the current playback parameters change. The playback parameters may change due to @@ -172,6 +174,27 @@ public interface Player { */ int REPEAT_MODE_ALL = 2; + /** + * Reasons for position discontinuities. + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({DISCONTINUITY_REASON_PERIOD_TRANSITION, DISCONTINUITY_REASON_SEEK, + DISCONTINUITY_REASON_INTERNAL}) + public @interface DiscontinuityReason {} + /** + * Automatic playback transition from one period in the timeline to the next. The period index may + * be the same as it was before the discontinuity in case the current period is repeated. + */ + int DISCONTINUITY_REASON_PERIOD_TRANSITION = 0; + /** + * Seek within the current period or to another period. + */ + int DISCONTINUITY_REASON_SEEK = 1; + /** + * Discontinuity introduced internally by the source. + */ + int DISCONTINUITY_REASON_INTERNAL = 2; + /** * Register a listener to receive events from the player. The listener's methods will be called on * the thread that was used to construct the player. However, if the thread used to construct the diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java index be04ce2fe0..cff860b671 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java @@ -99,7 +99,7 @@ public final class DebugTextViewHelper implements Runnable, Player.EventListener } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { updateAndPost(); } 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 16f555ffbc..848aabc258 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 @@ -1090,7 +1090,7 @@ public class PlaybackControlView extends FrameLayout { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { updateNavigation(); updateProgress(); } @@ -1150,4 +1150,3 @@ public class PlaybackControlView extends FrameLayout { } } - diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java index 9bc4bb5b87..b7e162d748 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java @@ -927,7 +927,7 @@ public final class SimpleExoPlayerView extends FrameLayout { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { // Do nothing. } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java index bc16e105da..b41d44d016 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java @@ -368,7 +368,7 @@ public abstract class Action { final ActionNode nextAction) { player.addListener(new PlayerListener() { @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { player.removeListener(this); nextAction.schedule(player, trackSelector, surface, handler); } @@ -445,7 +445,7 @@ public abstract class Action { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index c039dd3283..d3186e475d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -248,7 +248,7 @@ public abstract class ExoHostedTest implements HostedTest, Player.EventListener, } @Override - public final void onPositionDiscontinuity() { + public final void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { // Do nothing. } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index f65cb39bfc..b8c0846f8e 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -374,7 +374,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener { } @Override - public void onPositionDiscontinuity() { + public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { positionDiscontinuityCount++; periodIndices.add(player.getCurrentPeriodIndex()); }