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()); }