Commit fa9bf9c8 by tonihei Committed by Oliver Woodman

Ensure seeks to new windows are reported as seeking.

Currently, seeks are only tracked if both the start and the end of the seek
is within the same window. This means no seeking state is reported if the
playback switches to a new window during the seek.

This problem is fixed by tracking seek start and end events in all cases,
but only report seeking state once the window becomes the foreground window.

PiperOrigin-RevId: 288706674
parent 14e401f5
...@@ -84,6 +84,7 @@ public final class PlaybackStatsListener ...@@ -84,6 +84,7 @@ public final class PlaybackStatsListener
@Player.State private int playbackState; @Player.State private int playbackState;
private boolean isSuppressed; private boolean isSuppressed;
private float playbackSpeed; private float playbackSpeed;
private boolean isSeeking;
/** /**
* Creates listener for playback stats. * Creates listener for playback stats.
...@@ -169,6 +170,9 @@ public final class PlaybackStatsListener ...@@ -169,6 +170,9 @@ public final class PlaybackStatsListener
@Override @Override
public void onSessionCreated(EventTime eventTime, String session) { public void onSessionCreated(EventTime eventTime, String session) {
PlaybackStatsTracker tracker = new PlaybackStatsTracker(keepHistory, eventTime); PlaybackStatsTracker tracker = new PlaybackStatsTracker(keepHistory, eventTime);
if (isSeeking) {
tracker.onSeekStarted(eventTime, /* belongsToPlayback= */ true);
}
tracker.onPlayerStateChanged( tracker.onPlayerStateChanged(
eventTime, playWhenReady, playbackState, /* belongsToPlayback= */ true); eventTime, playWhenReady, playbackState, /* belongsToPlayback= */ true);
tracker.onIsSuppressedChanged(eventTime, isSuppressed, /* belongsToPlayback= */ true); tracker.onIsSuppressedChanged(eventTime, isSuppressed, /* belongsToPlayback= */ true);
...@@ -288,20 +292,20 @@ public final class PlaybackStatsListener ...@@ -288,20 +292,20 @@ public final class PlaybackStatsListener
public void onSeekStarted(EventTime eventTime) { public void onSeekStarted(EventTime eventTime) {
sessionManager.updateSessions(eventTime); sessionManager.updateSessions(eventTime);
for (String session : playbackStatsTrackers.keySet()) { for (String session : playbackStatsTrackers.keySet()) {
if (sessionManager.belongsToSession(eventTime, session)) { boolean belongsToPlayback = sessionManager.belongsToSession(eventTime, session);
playbackStatsTrackers.get(session).onSeekStarted(eventTime); playbackStatsTrackers.get(session).onSeekStarted(eventTime, belongsToPlayback);
}
} }
isSeeking = true;
} }
@Override @Override
public void onSeekProcessed(EventTime eventTime) { public void onSeekProcessed(EventTime eventTime) {
sessionManager.updateSessions(eventTime); sessionManager.updateSessions(eventTime);
for (String session : playbackStatsTrackers.keySet()) { for (String session : playbackStatsTrackers.keySet()) {
if (sessionManager.belongsToSession(eventTime, session)) { boolean belongsToPlayback = sessionManager.belongsToSession(eventTime, session);
playbackStatsTrackers.get(session).onSeekProcessed(eventTime); playbackStatsTrackers.get(session).onSeekProcessed(eventTime, belongsToPlayback);
}
} }
isSeeking = false;
} }
@Override @Override
...@@ -563,23 +567,27 @@ public final class PlaybackStatsListener ...@@ -563,23 +567,27 @@ public final class PlaybackStatsListener
} }
/** /**
* Notifies the tracker of the start of a seek in the current playback. * Notifies the tracker of the start of a seek, including all seeks while the playback is not in
* the foreground.
* *
* @param eventTime The {@link EventTime}. * @param eventTime The {@link EventTime}.
* @param belongsToPlayback Whether the {@code eventTime} belongs to the current playback.
*/ */
public void onSeekStarted(EventTime eventTime) { public void onSeekStarted(EventTime eventTime, boolean belongsToPlayback) {
isSeeking = true; isSeeking = true;
maybeUpdatePlaybackState(eventTime, /* belongsToPlayback= */ true); maybeUpdatePlaybackState(eventTime, belongsToPlayback);
} }
/** /**
* Notifies the tracker of a seek has been processed in the current playback. * 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 eventTime The {@link EventTime}.
* @param belongsToPlayback Whether the {@code eventTime} belongs to the current playback.
*/ */
public void onSeekProcessed(EventTime eventTime) { public void onSeekProcessed(EventTime eventTime, boolean belongsToPlayback) {
isSeeking = false; isSeeking = false;
maybeUpdatePlaybackState(eventTime, /* belongsToPlayback= */ true); maybeUpdatePlaybackState(eventTime, belongsToPlayback);
} }
/** /**
...@@ -875,7 +883,7 @@ public final class PlaybackStatsListener ...@@ -875,7 +883,7 @@ public final class PlaybackStatsListener
return currentPlaybackState == PlaybackStats.PLAYBACK_STATE_ENDED return currentPlaybackState == PlaybackStats.PLAYBACK_STATE_ENDED
? PlaybackStats.PLAYBACK_STATE_ENDED ? PlaybackStats.PLAYBACK_STATE_ENDED
: PlaybackStats.PLAYBACK_STATE_ABANDONED; : PlaybackStats.PLAYBACK_STATE_ABANDONED;
} else if (isSeeking) { } else if (isSeeking && isForeground) {
// Seeking takes precedence over errors such that we report a seek while in error state. // Seeking takes precedence over errors such that we report a seek while in error state.
return PlaybackStats.PLAYBACK_STATE_SEEKING; return PlaybackStats.PLAYBACK_STATE_SEEKING;
} else if (hasFatalError) { } else if (hasFatalError) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment