diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java index 893ecb07c2..3b1e0567cb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java @@ -163,9 +163,8 @@ public final class PlaybackStats { * #PLAYBACK_STATE_JOINING_FOREGROUND}, {@link #PLAYBACK_STATE_JOINING_BACKGROUND}, {@link * #PLAYBACK_STATE_PLAYING}, {@link #PLAYBACK_STATE_PAUSED}, {@link #PLAYBACK_STATE_SEEKING}, * {@link #PLAYBACK_STATE_BUFFERING}, {@link #PLAYBACK_STATE_PAUSED_BUFFERING}, {@link - * #PLAYBACK_STATE_SEEK_BUFFERING}, {@link #PLAYBACK_STATE_SUPPRESSED}, {@link - * #PLAYBACK_STATE_SUPPRESSED_BUFFERING}, {@link #PLAYBACK_STATE_ENDED}, {@link - * #PLAYBACK_STATE_STOPPED}, {@link #PLAYBACK_STATE_FAILED}, {@link + * #PLAYBACK_STATE_SUPPRESSED}, {@link #PLAYBACK_STATE_SUPPRESSED_BUFFERING}, {@link + * #PLAYBACK_STATE_ENDED}, {@link #PLAYBACK_STATE_STOPPED}, {@link #PLAYBACK_STATE_FAILED}, {@link * #PLAYBACK_STATE_INTERRUPTED_BY_AD} or {@link #PLAYBACK_STATE_ABANDONED}. */ @Documented @@ -180,7 +179,6 @@ public final class PlaybackStats { PLAYBACK_STATE_SEEKING, PLAYBACK_STATE_BUFFERING, PLAYBACK_STATE_PAUSED_BUFFERING, - PLAYBACK_STATE_SEEK_BUFFERING, PLAYBACK_STATE_SUPPRESSED, PLAYBACK_STATE_SUPPRESSED_BUFFERING, PLAYBACK_STATE_ENDED, @@ -206,8 +204,6 @@ public final class PlaybackStats { public static final int PLAYBACK_STATE_BUFFERING = 6; /** Playback is buffering while paused. */ public static final int PLAYBACK_STATE_PAUSED_BUFFERING = 7; - /** Playback is buffering after a seek. */ - public static final int PLAYBACK_STATE_SEEK_BUFFERING = 8; /** Playback is suppressed (e.g. due to audio focus loss). */ public static final int PLAYBACK_STATE_SUPPRESSED = 9; /** Playback is suppressed (e.g. due to audio focus loss) while buffering to resume a playback. */ @@ -769,8 +765,7 @@ public final class PlaybackStats { * milliseconds. */ public long getTotalSeekTimeMs() { - return getPlaybackStateDurationMs(PLAYBACK_STATE_SEEKING) - + getPlaybackStateDurationMs(PLAYBACK_STATE_SEEK_BUFFERING); + return getPlaybackStateDurationMs(PLAYBACK_STATE_SEEKING); } /** @@ -799,8 +794,7 @@ public final class PlaybackStats { public long getTotalWaitTimeMs() { return getPlaybackStateDurationMs(PLAYBACK_STATE_JOINING_FOREGROUND) + getPlaybackStateDurationMs(PLAYBACK_STATE_BUFFERING) - + getPlaybackStateDurationMs(PLAYBACK_STATE_SEEKING) - + getPlaybackStateDurationMs(PLAYBACK_STATE_SEEK_BUFFERING); + + getPlaybackStateDurationMs(PLAYBACK_STATE_SEEKING); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java index c312696176..6c086afc92 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java @@ -83,7 +83,7 @@ public final class PlaybackStatsListener @Player.State private int playbackState; private boolean isSuppressed; private float playbackSpeed; - private boolean isSeeking; + private boolean onSeekStartedCalled; /** * Creates listener for playback stats. @@ -170,7 +170,7 @@ public final class PlaybackStatsListener @Override public void onSessionCreated(EventTime eventTime, String session) { PlaybackStatsTracker tracker = new PlaybackStatsTracker(keepHistory, eventTime); - if (isSeeking) { + if (onSeekStartedCalled) { tracker.onSeekStarted(eventTime, /* belongsToPlayback= */ true); } tracker.onPlaybackStateChanged(eventTime, playbackState, /* belongsToPlayback= */ true); @@ -269,7 +269,7 @@ public final class PlaybackStatsListener @Override public void onPlaybackSuppressionReasonChanged( - EventTime eventTime, int playbackSuppressionReason) { + EventTime eventTime, @Player.PlaybackSuppressionReason int playbackSuppressionReason) { isSuppressed = playbackSuppressionReason != Player.PLAYBACK_SUPPRESSION_REASON_NONE; maybeAddSession(eventTime); for (String session : playbackStatsTrackers.keySet()) { @@ -281,23 +281,29 @@ public final class PlaybackStatsListener } @Override - public void onTimelineChanged(EventTime eventTime, int reason) { + public void onTimelineChanged(EventTime eventTime, @Player.TimelineChangeReason int reason) { sessionManager.handleTimelineUpdate(eventTime); maybeAddSession(eventTime); for (String session : playbackStatsTrackers.keySet()) { if (sessionManager.belongsToSession(eventTime, session)) { - playbackStatsTrackers.get(session).onPositionDiscontinuity(eventTime); + playbackStatsTrackers.get(session).onPositionDiscontinuity(eventTime, /* isSeek= */ false); } } } @Override - public void onPositionDiscontinuity(EventTime eventTime, int reason) { + public void onPositionDiscontinuity(EventTime eventTime, @Player.DiscontinuityReason int reason) { sessionManager.handlePositionDiscontinuity(eventTime, reason); maybeAddSession(eventTime); + if (reason == Player.DISCONTINUITY_REASON_SEEK) { + onSeekStartedCalled = false; + } for (String session : playbackStatsTrackers.keySet()) { if (sessionManager.belongsToSession(eventTime, session)) { - playbackStatsTrackers.get(session).onPositionDiscontinuity(eventTime); + playbackStatsTrackers + .get(session) + .onPositionDiscontinuity( + eventTime, /* isSeek= */ reason == Player.DISCONTINUITY_REASON_SEEK); } } } @@ -309,17 +315,7 @@ public final class PlaybackStatsListener boolean belongsToPlayback = sessionManager.belongsToSession(eventTime, session); playbackStatsTrackers.get(session).onSeekStarted(eventTime, belongsToPlayback); } - isSeeking = true; - } - - @Override - public void onSeekProcessed(EventTime eventTime) { - maybeAddSession(eventTime); - for (String session : playbackStatsTrackers.keySet()) { - boolean belongsToPlayback = sessionManager.belongsToSession(eventTime, session); - playbackStatsTrackers.get(session).onSeekProcessed(eventTime, belongsToPlayback); - } - isSeeking = false; + onSeekStartedCalled = true; } @Override @@ -551,6 +547,9 @@ public final class PlaybackStatsListener if (state != Player.STATE_IDLE) { hasFatalError = false; } + if (state != Player.STATE_BUFFERING) { + isSeeking = false; + } if (state == Player.STATE_IDLE || state == Player.STATE_ENDED) { isInterruptedByAd = false; } @@ -589,8 +588,12 @@ public final class PlaybackStatsListener * Notifies the tracker of a position discontinuity or timeline update for the current playback. * * @param eventTime The {@link EventTime}. + * @param isSeek Whether the position discontinuity is for a seek. */ - public void onPositionDiscontinuity(EventTime eventTime) { + public void onPositionDiscontinuity(EventTime eventTime, boolean isSeek) { + if (isSeek && playerPlaybackState == Player.STATE_IDLE) { + isSeeking = false; + } isInterruptedByAd = false; maybeUpdatePlaybackState(eventTime, /* belongsToPlayback= */ true); } @@ -607,18 +610,6 @@ public final class PlaybackStatsListener maybeUpdatePlaybackState(eventTime, belongsToPlayback); } - /** - * Notifies the tracker that a seek has been processed, including all seeks while the playback - * is not in the foreground. - * - * @param eventTime The {@link EventTime}. - * @param belongsToPlayback Whether the {@code eventTime} belongs to the current playback. - */ - public void onSeekProcessed(EventTime eventTime, boolean belongsToPlayback) { - isSeeking = false; - maybeUpdatePlaybackState(eventTime, belongsToPlayback); - } - /** * Notifies the tracker of fatal player error in the current playback. * @@ -934,10 +925,6 @@ public final class PlaybackStatsListener || currentPlaybackState == PlaybackStats.PLAYBACK_STATE_INTERRUPTED_BY_AD) { return PlaybackStats.PLAYBACK_STATE_JOINING_FOREGROUND; } - if (currentPlaybackState == PlaybackStats.PLAYBACK_STATE_SEEKING - || currentPlaybackState == PlaybackStats.PLAYBACK_STATE_SEEK_BUFFERING) { - return PlaybackStats.PLAYBACK_STATE_SEEK_BUFFERING; - } if (!playWhenReady) { return PlaybackStats.PLAYBACK_STATE_PAUSED_BUFFERING; }