DefaultPlaybackSessionManager implements PlaybackSessionManager { @Override public synchronized void updateSessions(EventTime eventTime) { boolean isObviouslyFinished = eventTime.mediaPeriodId != null && currentMediaPeriodId != null && eventTime.mediaPeriodId.windowSequenceNumber < currentMediaPeriodId.windowSequenceNumber; if (!isObviouslyFinished) { SessionDescriptor descriptor = getOrAddSession(eventTime.windowIndex, eventTime.mediaPeriodId); if (!descriptor.isCreated) { descriptor.isCreated = true; Assertions.checkNotNull(listener).onSessionCreated(eventTime, descriptor.sessionId); if (activeSessionId == null) { updateActiveSession(eventTime, descriptor); } } } } DefaultPlaybackSessionManager(); @Override void setListener(Listener listener); @Override synchronized String getSessionForMediaPeriodId(
      Timeline timeline, MediaPeriodId mediaPeriodId); @Override synchronized boolean belongsToSession(EventTime eventTime, String sessionId); @Override synchronized void updateSessions(EventTime eventTime); @Override synchronized void handleTimelineUpdate(EventTime eventTime); @Override synchronized void handlePositionDiscontinuity(
      EventTime eventTime, @DiscontinuityReason int reason);  }
@Test public void updateSessions_withoutMediaPeriodId_createsNewSession() { Timeline timeline = new FakeTimeline( 1); EventTime eventTime = createEventTime(timeline, 0, null); sessionManager.updateSessions(eventTime); verify(mockListener).onSessionCreated(eq(eventTime), anyString()); verify(mockListener).onSessionActive(eq(eventTime), anyString()); verifyNoMoreInteractions(mockListener); }
@Test public void updateSessions_ofOtherWindow_createsNewSession() { Timeline timeline = new FakeTimeline( 2); EventTime eventTime1 = createEventTime(timeline, 0, null); EventTime eventTime2 = createEventTime(timeline, 1, null); sessionManager.updateSessions(eventTime1); sessionManager.updateSessions(eventTime2); ArgumentCaptor<String> sessionId1 = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> sessionId2 = ArgumentCaptor.forClass(String.class); verify(mockListener).onSessionCreated(eq(eventTime1), sessionId1.capture()); verify(mockListener).onSessionCreated(eq(eventTime2), sessionId2.capture()); verify(mockListener).onSessionActive(eventTime1, sessionId1.getValue()); verifyNoMoreInteractions(mockListener); assertThat(sessionId1).isNotEqualTo(sessionId2); }
@Test public void updateSessions_withoutMediaPeriodId_andPreviouslyCreatedSessions_doesNotCreateNewSession() { Timeline timeline = new FakeTimeline( 1); MediaPeriodId mediaPeriodId1 = new MediaPeriodId( timeline.getUidOfPeriod( 0), 0); MediaPeriodId mediaPeriodId2 = new MediaPeriodId( timeline.getUidOfPeriod( 0), 1); MediaPeriodId mediaPeriodIdWithAd = new MediaPeriodId( timeline.getUidOfPeriod( 0), 0, 0, 0); EventTime eventTime1 = createEventTime(timeline, 0, mediaPeriodId1); EventTime eventTime2 = createEventTime(timeline, 0, mediaPeriodId2); EventTime eventTime3 = createEventTime(timeline, 0, mediaPeriodIdWithAd); EventTime eventTime4 = createEventTime(timeline, 0, null); sessionManager.updateSessions(eventTime1); sessionManager.updateSessions(eventTime2); sessionManager.updateSessions(eventTime3); sessionManager.updateSessions(eventTime4); verify(mockListener).onSessionCreated(eq(eventTime1), anyString()); verify(mockListener).onSessionActive(eq(eventTime1), anyString()); verify(mockListener).onSessionCreated(eq(eventTime2), anyString()); verify(mockListener).onSessionCreated(eq(eventTime3), anyString()); verifyNoMoreInteractions(mockListener); }