From d15350ab015b416280d5bb619470ae609df4c77d Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 19 Jan 2022 13:24:32 +0000 Subject: [PATCH] Avoid ending session early if an unrelated other session is finished Currently, we always end the current session if onSessionFinished is called. However, the finished session may not be the active one (for example when discarding prebuffered items in a playlist). To make this code more robust, we can save the active session id explicitly and only end this session. PiperOrigin-RevId: 422788542 --- .../exoplayer2/analytics/MediaMetricsListener.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java index cbab179f9f..9cc1636332 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.analytics; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Util.castNonNull; import android.annotation.SuppressLint; @@ -113,6 +114,7 @@ public final class MediaMetricsListener private final Timeline.Window window; private final Timeline.Period period; + @Nullable private String activeSessionId; @Nullable private PlaybackMetrics.Builder metricsBuilder; @Player.DiscontinuityReason private int discontinuityReason; private int currentPlaybackState; @@ -167,7 +169,8 @@ public final class MediaMetricsListener // Ignore ad sessions. return; } - finishCurrentSession(); + checkState(activeSessionId == null); + activeSessionId = sessionId; metricsBuilder = new PlaybackMetrics.Builder() .setPlayerName(ExoPlayerLibraryInfo.TAG) @@ -182,9 +185,9 @@ public final class MediaMetricsListener @Override public void onSessionFinished( EventTime eventTime, String sessionId, boolean automaticTransitionToNextPlayback) { - if (eventTime.mediaPeriodId != null && eventTime.mediaPeriodId.isAd()) { - // Ignore ad sessions. - return; + if ((eventTime.mediaPeriodId != null && eventTime.mediaPeriodId.isAd()) + || !sessionId.equals(activeSessionId)) { + // Ignore ad sessions and other sessions that are finished before becoming active. } finishCurrentSession(); } @@ -588,6 +591,7 @@ public final class MediaMetricsListener : PlaybackMetrics.STREAM_SOURCE_UNKNOWN); playbackSession.reportPlaybackMetrics(metricsBuilder.build()); metricsBuilder = null; + activeSessionId = null; } private static int getTrackChangeReason(@C.SelectionReason int trackSelectionReason) {