diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java index b3393b67fd5..0e3dd578d6e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java @@ -380,15 +380,15 @@ public void maybeSetWindowSequenceNumber( } public boolean isFinishedAtEventTime(EventTime eventTime) { - if (windowSequenceNumber == C.INDEX_UNSET) { - // Sessions with unspecified window sequence number are kept until we know more. - return false; - } if (eventTime.mediaPeriodId == null) { // For event times without media period id (e.g. after seek to new window), we only keep // sessions of this window. return windowIndex != eventTime.windowIndex; } + if (windowSequenceNumber == C.INDEX_UNSET) { + // Sessions with unspecified window sequence number are kept until we know more. + return false; + } if (eventTime.mediaPeriodId.windowSequenceNumber > windowSequenceNumber) { // All past window sequence numbers are finished. return true; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManagerTest.java index 44aba86db3c..c9c3178255a 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManagerTest.java @@ -925,7 +925,8 @@ public void positionDiscontinuity_toNewWindow_withPeriodTransitionReason_finishe } @Test - public void positionDiscontinuity_toNewWindow_withSeekTransitionReason_finishesSession() { + public void + positionDiscontinuity_toNewWindow_withMediaPeriodIds_withSeekTransitionReason_finishesSession() { Timeline timeline = new FakeTimeline(/* windowCount= */ 2); EventTime eventTime1 = createEventTime( @@ -957,6 +958,30 @@ public void positionDiscontinuity_toNewWindow_withSeekTransitionReason_finishesS verifyNoMoreInteractions(mockListener); } + @Test + public void + positionDiscontinuity_toNewWindow_withoutMediaPeriodIds_withSeekTransitionReason_finishesSession() { + Timeline timeline = new FakeTimeline(/* windowCount= */ 2); + EventTime eventTime1 = + createEventTime(timeline, /* windowIndex= */ 0, /* mediaPeriodId= */ null); + EventTime eventTime2 = + createEventTime(timeline, /* windowIndex= */ 1, /* mediaPeriodId= */ null); + sessionManager.updateSessionsWithTimelineChange(eventTime1); + + sessionManager.updateSessionsWithDiscontinuity(eventTime2, Player.DISCONTINUITY_REASON_SEEK); + + ArgumentCaptor sessionId1 = ArgumentCaptor.forClass(String.class); + ArgumentCaptor sessionId2 = ArgumentCaptor.forClass(String.class); + verify(mockListener).onSessionCreated(eq(eventTime1), sessionId1.capture()); + verify(mockListener).onSessionActive(eventTime1, sessionId1.getValue()); + verify(mockListener).onSessionCreated(eq(eventTime2), sessionId2.capture()); + verify(mockListener) + .onSessionFinished( + eventTime2, sessionId1.getValue(), /* automaticTransitionToNextPlayback= */ false); + verify(mockListener).onSessionActive(eventTime2, sessionId2.getValue()); + verifyNoMoreInteractions(mockListener); + } + @Test public void positionDiscontinuity_toSameWindow_withoutMediaPeriodId_doesNotFinishSession() { Timeline timeline = new FakeTimeline();