Avoid media item transitions for auto discontinuities when ads involved

#minor-release

PiperOrigin-RevId: 372433555
This commit is contained in:
bachinger 2021-05-06 23:06:59 +01:00
parent bbeedd5e76
commit 15ce148877
3 changed files with 254 additions and 82 deletions

View File

@ -51,6 +51,8 @@
* Added a combined and structured metadata object (`MediaMetadata`) to * Added a combined and structured metadata object (`MediaMetadata`) to
Player, accessible through `getMediaMetadata` or by listening to Player, accessible through `getMediaMetadata` or by listening to
`EventListener.onMediaMetadataChanged`. `EventListener.onMediaMetadataChanged`.
* Fix bug when transitions from content to ad periods called
`onMediaItemTransition` by mistake.
* UI: * UI:
* Add builder for `PlayerNotificationManager`. * Add builder for `PlayerNotificationManager`.
* Add group setting to `PlayerNotificationManager`. * Add group setting to `PlayerNotificationManager`.

View File

@ -1463,7 +1463,6 @@ import java.util.concurrent.CopyOnWriteArraySet;
int newWindowIndex = int newWindowIndex =
newTimeline.getPeriodByUid(playbackInfo.periodId.periodUid, period).windowIndex; newTimeline.getPeriodByUid(playbackInfo.periodId.periodUid, period).windowIndex;
Object newWindowUid = newTimeline.getWindow(newWindowIndex, window).uid; Object newWindowUid = newTimeline.getWindow(newWindowIndex, window).uid;
int firstPeriodIndexInNewWindow = window.firstPeriodIndex;
if (!oldWindowUid.equals(newWindowUid)) { if (!oldWindowUid.equals(newWindowUid)) {
@Player.MediaItemTransitionReason int transitionReason; @Player.MediaItemTransitionReason int transitionReason;
if (positionDiscontinuity if (positionDiscontinuity
@ -1481,8 +1480,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
return new Pair<>(/* isTransitioning */ true, transitionReason); return new Pair<>(/* isTransitioning */ true, transitionReason);
} else if (positionDiscontinuity } else if (positionDiscontinuity
&& positionDiscontinuityReason == DISCONTINUITY_REASON_AUTO_TRANSITION && positionDiscontinuityReason == DISCONTINUITY_REASON_AUTO_TRANSITION
&& newTimeline.getIndexOfPeriod(playbackInfo.periodId.periodUid) && oldPlaybackInfo.periodId.windowSequenceNumber
== firstPeriodIndexInNewWindow) { < playbackInfo.periodId.windowSequenceNumber) {
return new Pair<>(/* isTransitioning */ true, MEDIA_ITEM_TRANSITION_REASON_REPEAT); return new Pair<>(/* isTransitioning */ true, MEDIA_ITEM_TRANSITION_REASON_REPEAT);
} }
return new Pair<>(/* isTransitioning */ false, /* mediaItemTransitionReason */ C.INDEX_UNSET); return new Pair<>(/* isTransitioning */ false, /* mediaItemTransitionReason */ C.INDEX_UNSET);

View File

@ -9356,6 +9356,130 @@ public final class ExoPlayerTest {
assertThat(containsEvent(allEvents, Player.EVENT_PLAYER_ERROR)).isTrue(); assertThat(containsEvent(allEvents, Player.EVENT_PLAYER_ERROR)).isTrue();
} }
@Test
public void repeatMode_windowTransition_callsOnPositionDiscontinuityAndOnMediaItemTransition()
throws Exception {
ExoPlayer player = new TestExoPlayerBuilder(context).build();
Player.Listener listener = mock(Player.Listener.class);
FakeMediaSource secondMediaSource =
new FakeMediaSource(
new FakeTimeline(
new TimelineWindowDefinition(
/* periodCount= */ 1,
/* id= */ 2,
/* isSeekable= */ true,
/* isDynamic= */ false,
/* durationUs= */ 20 * C.MICROS_PER_SECOND)));
player.addListener(listener);
player.setMediaSource(
new FakeMediaSource(
new FakeTimeline(
new TimelineWindowDefinition(
/* periodCount= */ 1,
/* id= */ 1,
/* isSeekable= */ true,
/* isDynamic= */ false,
/* durationUs= */ 10 * C.MICROS_PER_SECOND))));
player.setRepeatMode(Player.REPEAT_MODE_ONE);
player.prepare();
player.play();
TestPlayerRunHelper.runUntilPositionDiscontinuity(
player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION);
player.setRepeatMode(Player.REPEAT_MODE_ALL);
player.play();
TestPlayerRunHelper.runUntilPositionDiscontinuity(
player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION);
player.addMediaSource(secondMediaSource);
player.seekTo(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET);
player.play();
TestPlayerRunHelper.runUntilPositionDiscontinuity(
player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION);
player.setRepeatMode(Player.REPEAT_MODE_OFF);
player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
ArgumentCaptor<Player.PositionInfo> oldPosition =
ArgumentCaptor.forClass(Player.PositionInfo.class);
ArgumentCaptor<Player.PositionInfo> newPosition =
ArgumentCaptor.forClass(Player.PositionInfo.class);
InOrder inOrder = inOrder(listener);
// Expect media item transition for repeat mode ONE to be attributed to
// DISCONTINUITY_REASON_REPEAT.
inOrder
.verify(listener)
.onPositionDiscontinuity(
oldPosition.capture(),
newPosition.capture(),
eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
Player.PositionInfo oldPositionInfo = oldPosition.getValue();
Player.PositionInfo newPositionInfo = newPosition.getValue();
assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid);
assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex);
assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex);
assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid);
assertThat(oldPositionInfo.positionMs).isEqualTo(10_000);
assertThat(oldPositionInfo.contentPositionMs).isEqualTo(10_000);
assertThat(newPositionInfo.positionMs).isEqualTo(0);
assertThat(newPositionInfo.contentPositionMs).isEqualTo(0);
inOrder
.verify(listener)
.onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT));
// Expect media item transition for repeat mode ALL with a single item to be attributed to
// DISCONTINUITY_REASON_REPEAT.
inOrder
.verify(listener)
.onPositionDiscontinuity(
oldPosition.capture(),
newPosition.capture(),
eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
oldPositionInfo = oldPosition.getValue();
newPositionInfo = newPosition.getValue();
assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid);
assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex);
assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex);
assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid);
assertThat(oldPositionInfo.positionMs).isEqualTo(10_000);
assertThat(oldPositionInfo.contentPositionMs).isEqualTo(10_000);
assertThat(newPositionInfo.positionMs).isEqualTo(0);
assertThat(newPositionInfo.contentPositionMs).isEqualTo(0);
inOrder
.verify(listener)
.onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT));
// Expect media item transition for repeat mode ALL with more than one item which is attributed
// to DISCONTINUITY_REASON_AUTO_TRANSITION not DISCONTINUITY_REASON_REPEAT.
inOrder
.verify(listener)
.onPositionDiscontinuity(
oldPosition.capture(),
newPosition.capture(),
eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
oldPositionInfo = oldPosition.getValue();
newPositionInfo = newPosition.getValue();
assertThat(oldPositionInfo.windowIndex).isEqualTo(1);
assertThat(oldPositionInfo.windowUid).isNotEqualTo(newPositionInfo.windowUid);
assertThat(oldPositionInfo.positionMs).isEqualTo(20_000);
assertThat(oldPositionInfo.contentPositionMs).isEqualTo(20_000);
assertThat(newPositionInfo.positionMs).isEqualTo(0);
assertThat(newPositionInfo.windowIndex).isEqualTo(0);
inOrder
.verify(listener)
.onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO));
// Last auto transition from window 0 to window 1 not caused by repeat mode.
inOrder
.verify(listener)
.onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
inOrder
.verify(listener)
.onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO));
// No more callbacks called.
inOrder
.verify(listener, never())
.onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
inOrder.verify(listener, never()).onMediaItemTransition(any(), anyInt());
player.release();
}
@Test @Test
public void play_withPreMidAndPostRollAd_callsOnDiscontinuityCorrectly() throws Exception { public void play_withPreMidAndPostRollAd_callsOnDiscontinuityCorrectly() throws Exception {
ExoPlayer player = new TestExoPlayerBuilder(context).build(); ExoPlayer player = new TestExoPlayerBuilder(context).build();
@ -9637,98 +9761,145 @@ public final class ExoPlayerTest {
ArgumentCaptor.forClass(Player.PositionInfo.class); ArgumentCaptor.forClass(Player.PositionInfo.class);
ArgumentCaptor<Player.PositionInfo> newPosition = ArgumentCaptor<Player.PositionInfo> newPosition =
ArgumentCaptor.forClass(Player.PositionInfo.class); ArgumentCaptor.forClass(Player.PositionInfo.class);
verify(listener, never()) Window window = new Window();
.onPositionDiscontinuity( InOrder inOrder = Mockito.inOrder(listener);
any(), any(), not(eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION))); // from first to second window
verify(listener, times(6)) inOrder
.verify(listener)
.onPositionDiscontinuity( .onPositionDiscontinuity(
oldPosition.capture(), oldPosition.capture(),
newPosition.capture(), newPosition.capture(),
eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
// from first to second window inOrder
List<Player.PositionInfo> oldPositions = oldPosition.getAllValues(); .verify(listener)
List<Player.PositionInfo> newPositions = newPosition.getAllValues(); .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO));
Window window = new Window(); assertThat(oldPosition.getValue().windowUid)
assertThat(oldPositions.get(0).windowUid)
.isEqualTo(player.getCurrentTimeline().getWindow(0, window).uid); .isEqualTo(player.getCurrentTimeline().getWindow(0, window).uid);
assertThat(newPositions.get(0).windowUid) assertThat(oldPosition.getValue().windowIndex).isEqualTo(0);
assertThat(oldPosition.getValue().positionMs).isEqualTo(10_000);
assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(10_000);
assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
assertThat(newPosition.getValue().windowUid)
.isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid); .isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid);
assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); assertThat(newPosition.getValue().windowIndex).isEqualTo(1);
assertThat(oldPositions.get(0).positionMs).isEqualTo(10_000); assertThat(newPosition.getValue().positionMs).isEqualTo(0);
assertThat(oldPositions.get(0).contentPositionMs).isEqualTo(10_000); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0);
assertThat(oldPositions.get(0).adGroupIndex).isEqualTo(-1); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(oldPositions.get(0).adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
assertThat(newPositions.get(0).windowIndex).isEqualTo(1);
assertThat(newPositions.get(0).positionMs).isEqualTo(0);
assertThat(newPositions.get(0).contentPositionMs).isEqualTo(0);
assertThat(newPositions.get(0).adGroupIndex).isEqualTo(-1);
assertThat(newPositions.get(0).adIndexInAdGroup).isEqualTo(-1);
// from second window to third // from second window to third
assertThat(oldPositions.get(1).windowUid) inOrder
.verify(listener)
.onPositionDiscontinuity(
oldPosition.capture(),
newPosition.capture(),
eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
inOrder
.verify(listener)
.onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO));
assertThat(oldPosition.getValue().windowUid)
.isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid); .isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid);
assertThat(newPositions.get(1).windowUid) assertThat(newPosition.getValue().windowUid)
.isEqualTo(player.getCurrentTimeline().getWindow(2, window).uid); .isEqualTo(player.getCurrentTimeline().getWindow(2, window).uid);
assertThat(oldPositions.get(1).windowIndex).isEqualTo(1); assertThat(oldPosition.getValue().windowIndex).isEqualTo(1);
assertThat(oldPositions.get(1).positionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().positionMs).isEqualTo(15_000);
assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(15_000);
assertThat(oldPositions.get(1).adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(oldPositions.get(1).adIndexInAdGroup).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
assertThat(newPositions.get(1).windowIndex).isEqualTo(2); assertThat(newPosition.getValue().windowIndex).isEqualTo(2);
assertThat(newPositions.get(1).positionMs).isEqualTo(0); assertThat(newPosition.getValue().positionMs).isEqualTo(0);
assertThat(newPositions.get(1).contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0);
assertThat(newPositions.get(1).adGroupIndex).isEqualTo(-1); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(newPositions.get(1).adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
// from third window content to post roll ad // from third window content to post roll ad
assertThat(oldPositions.get(2).windowIndex).isEqualTo(2); @Nullable Object lastNewWindowUid = newPosition.getValue().windowUid;
assertThat(oldPositions.get(2).windowUid).isEqualTo(newPositions.get(2).windowUid); inOrder
assertThat(oldPositions.get(2).positionMs).isEqualTo(20_000); .verify(listener)
assertThat(oldPositions.get(2).contentPositionMs).isEqualTo(20_000); .onPositionDiscontinuity(
assertThat(oldPositions.get(2).adGroupIndex).isEqualTo(-1); oldPosition.capture(),
assertThat(oldPositions.get(2).adIndexInAdGroup).isEqualTo(-1); newPosition.capture(),
assertThat(newPositions.get(2).windowIndex).isEqualTo(2); eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
assertThat(newPositions.get(2).positionMs).isEqualTo(0); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2);
assertThat(newPositions.get(2).contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid);
assertThat(newPositions.get(2).adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000);
assertThat(newPositions.get(2).adIndexInAdGroup).isEqualTo(0); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000);
assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
assertThat(newPosition.getValue().windowIndex).isEqualTo(2);
assertThat(newPosition.getValue().positionMs).isEqualTo(0);
assertThat(newPosition.getValue().contentPositionMs).isEqualTo(20_000);
assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0);
assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(0);
// from third window post roll to third window content end // from third window post roll to third window content end
assertThat(oldPositions.get(3).windowUid).isEqualTo(newPositions.get(2).windowUid); lastNewWindowUid = newPosition.getValue().windowUid;
assertThat(oldPositions.get(3).windowIndex).isEqualTo(2); inOrder
assertThat(oldPositions.get(3).positionMs).isEqualTo(5_000); .verify(listener)
assertThat(oldPositions.get(3).contentPositionMs).isEqualTo(20_000); .onPositionDiscontinuity(
assertThat(oldPositions.get(3).adGroupIndex).isEqualTo(0); oldPosition.capture(),
assertThat(oldPositions.get(3).adIndexInAdGroup).isEqualTo(0); newPosition.capture(),
assertThat(newPositions.get(3).windowUid).isEqualTo(oldPositions.get(3).windowUid); eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
assertThat(newPositions.get(3).windowIndex).isEqualTo(2); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid);
assertThat(newPositions.get(3).positionMs).isEqualTo(19_999); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2);
assertThat(newPositions.get(3).contentPositionMs).isEqualTo(19_999); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000);
assertThat(newPositions.get(3).adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000);
assertThat(newPositions.get(3).adIndexInAdGroup).isEqualTo(-1); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0);
assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0);
assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid);
assertThat(newPosition.getValue().windowIndex).isEqualTo(2);
assertThat(newPosition.getValue().positionMs).isEqualTo(19_999);
assertThat(newPosition.getValue().contentPositionMs).isEqualTo(19_999);
assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
// from third window content end to fourth window pre roll ad // from third window content end to fourth window pre roll ad
assertThat(oldPositions.get(4).windowUid).isEqualTo(newPositions.get(3).windowUid); lastNewWindowUid = newPosition.getValue().windowUid;
assertThat(oldPositions.get(4).windowIndex).isEqualTo(2); inOrder
assertThat(oldPositions.get(4).positionMs).isEqualTo(20_000); .verify(listener)
assertThat(oldPositions.get(4).contentPositionMs).isEqualTo(20_000); .onPositionDiscontinuity(
assertThat(oldPositions.get(4).adGroupIndex).isEqualTo(-1); oldPosition.capture(),
assertThat(oldPositions.get(4).adIndexInAdGroup).isEqualTo(-1); newPosition.capture(),
assertThat(newPositions.get(4).windowUid).isNotEqualTo(oldPositions.get(4).windowUid); eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
assertThat(newPositions.get(4).windowIndex).isEqualTo(3); inOrder
assertThat(newPositions.get(4).positionMs).isEqualTo(0); .verify(listener)
assertThat(newPositions.get(4).contentPositionMs).isEqualTo(0); .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO));
assertThat(newPositions.get(4).adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid);
assertThat(newPositions.get(4).adIndexInAdGroup).isEqualTo(0); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2);
assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000);
assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000);
assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
assertThat(newPosition.getValue().windowUid).isNotEqualTo(oldPosition.getValue().windowUid);
assertThat(newPosition.getValue().windowIndex).isEqualTo(3);
assertThat(newPosition.getValue().positionMs).isEqualTo(0);
assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0);
assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0);
assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(0);
// from fourth window pre roll ad to fourth window content // from fourth window pre roll ad to fourth window content
assertThat(oldPositions.get(5).windowUid).isEqualTo(newPositions.get(4).windowUid); lastNewWindowUid = newPosition.getValue().windowUid;
assertThat(oldPositions.get(5).windowIndex).isEqualTo(3); inOrder
assertThat(oldPositions.get(5).positionMs).isEqualTo(5_000); .verify(listener)
assertThat(oldPositions.get(5).contentPositionMs).isEqualTo(0); .onPositionDiscontinuity(
assertThat(oldPositions.get(5).adGroupIndex).isEqualTo(0); oldPosition.capture(),
assertThat(oldPositions.get(5).adIndexInAdGroup).isEqualTo(0); newPosition.capture(),
assertThat(newPositions.get(5).windowUid).isEqualTo(oldPositions.get(5).windowUid); eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
assertThat(newPositions.get(5).windowIndex).isEqualTo(3); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid);
assertThat(newPositions.get(5).positionMs).isEqualTo(0); assertThat(oldPosition.getValue().windowIndex).isEqualTo(3);
assertThat(newPositions.get(5).contentPositionMs).isEqualTo(0); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000);
assertThat(newPositions.get(5).adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(0);
assertThat(newPositions.get(5).adIndexInAdGroup).isEqualTo(-1); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0);
assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0);
assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid);
assertThat(newPosition.getValue().windowIndex).isEqualTo(3);
assertThat(newPosition.getValue().positionMs).isEqualTo(0);
assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0);
assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1);
assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(-1);
inOrder
.verify(listener, never())
.onPositionDiscontinuity(
any(), any(), not(eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)));
inOrder
.verify(listener, never())
.onMediaItemTransition(any(), not(eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)));
player.release(); player.release();
} }