mirror of
https://github.com/androidx/media.git
synced 2025-05-04 22:20:47 +08:00
Release all PlaybackStatsListener session when timeline becomes empty.
Currently they are only released when the timeline becomes non-empty again or the player is released. Issue: #8778 PiperOrigin-RevId: 366041625
This commit is contained in:
parent
e6780bd157
commit
6d0a04dd87
@ -293,18 +293,16 @@ public final class PlaybackStatsListener
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void maybeAddSessions(Player player, Events events) {
|
private void maybeAddSessions(Player player, Events events) {
|
||||||
if (player.getCurrentTimeline().isEmpty() && player.getPlaybackState() == Player.STATE_IDLE) {
|
boolean isCompletelyIdle =
|
||||||
// Player is completely idle. Don't add new sessions.
|
player.getCurrentTimeline().isEmpty() && player.getPlaybackState() == Player.STATE_IDLE;
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < events.size(); i++) {
|
for (int i = 0; i < events.size(); i++) {
|
||||||
@EventFlags int event = events.get(i);
|
@EventFlags int event = events.get(i);
|
||||||
EventTime eventTime = events.getEventTime(event);
|
EventTime eventTime = events.getEventTime(event);
|
||||||
if (event == EVENT_TIMELINE_CHANGED) {
|
if (event == EVENT_TIMELINE_CHANGED) {
|
||||||
sessionManager.updateSessionsWithTimelineChange(eventTime);
|
sessionManager.updateSessionsWithTimelineChange(eventTime);
|
||||||
} else if (event == EVENT_POSITION_DISCONTINUITY) {
|
} else if (!isCompletelyIdle && event == EVENT_POSITION_DISCONTINUITY) {
|
||||||
sessionManager.updateSessionsWithDiscontinuity(eventTime, discontinuityReason);
|
sessionManager.updateSessionsWithDiscontinuity(eventTime, discontinuityReason);
|
||||||
} else {
|
} else if (!isCompletelyIdle) {
|
||||||
sessionManager.updateSessions(eventTime);
|
sessionManager.updateSessions(eventTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.analytics;
|
package com.google.android.exoplayer2.analytics;
|
||||||
|
|
||||||
|
import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
@ -42,6 +43,7 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.robolectric.shadows.ShadowLooper;
|
||||||
|
|
||||||
/** Unit test for {@link PlaybackStatsListener}. */
|
/** Unit test for {@link PlaybackStatsListener}. */
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@ -151,6 +153,35 @@ public final class PlaybackStatsListenerTest {
|
|||||||
verify(callback).onPlaybackStatsReady(any(), any());
|
verify(callback).onPlaybackStatsReady(any(), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void playlistClear_callsAllPendingCallbacks() throws Exception {
|
||||||
|
PlaybackStatsListener.Callback callback = mock(PlaybackStatsListener.Callback.class);
|
||||||
|
PlaybackStatsListener playbackStatsListener =
|
||||||
|
new PlaybackStatsListener(/* keepHistory= */ true, callback);
|
||||||
|
player.addAnalyticsListener(playbackStatsListener);
|
||||||
|
|
||||||
|
MediaSource mediaSource = new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1));
|
||||||
|
player.setMediaSources(ImmutableList.of(mediaSource, mediaSource));
|
||||||
|
player.prepare();
|
||||||
|
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY);
|
||||||
|
// Play close to the end of the first item to ensure the second session is already created, but
|
||||||
|
// the first one isn't finished yet.
|
||||||
|
TestPlayerRunHelper.playUntilPosition(
|
||||||
|
player, /* windowIndex= */ 0, /* positionMs= */ player.getDuration());
|
||||||
|
runUntilPendingCommandsAreFullyHandled(player);
|
||||||
|
player.clearMediaItems();
|
||||||
|
ShadowLooper.idleMainLooper();
|
||||||
|
|
||||||
|
ArgumentCaptor<AnalyticsListener.EventTime> eventTimeCaptor =
|
||||||
|
ArgumentCaptor.forClass(AnalyticsListener.EventTime.class);
|
||||||
|
verify(callback, times(2)).onPlaybackStatsReady(eventTimeCaptor.capture(), any());
|
||||||
|
assertThat(
|
||||||
|
eventTimeCaptor.getAllValues().stream()
|
||||||
|
.map(eventTime -> eventTime.windowIndex)
|
||||||
|
.collect(Collectors.toList()))
|
||||||
|
.containsExactly(0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void playerRelease_callsAllPendingCallbacks() throws Exception {
|
public void playerRelease_callsAllPendingCallbacks() throws Exception {
|
||||||
PlaybackStatsListener.Callback callback = mock(PlaybackStatsListener.Callback.class);
|
PlaybackStatsListener.Callback callback = mock(PlaybackStatsListener.Callback.class);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user