From 342be88d814df4cb77a4f2f5b4ac73f2a932e2d8 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 30 May 2022 12:31:19 +0000 Subject: [PATCH] Improve playlist operation behavior of session test MockPlayer The MockPlayer currently: - uses separate fields for single mediaItem vs multiple mediaItems - replaces all items on addMediaItem operations - does nothing on remove/move operations. Fix all of this by using a single field that replicates the player operations directly. Some tests also need to be updated to make them more realistic (for example only removing items from a playlist that have previously been added). PiperOrigin-RevId: 451857271 --- .../MediaControllerStateMaskingTest.java | 38 ++++++++- ...CallbackWithMediaControllerCompatTest.java | 11 ++- .../session/MediaSessionPermissionTest.java | 5 +- .../session/MediaSessionPlayerTest.java | 16 ++-- .../media3/session/MockPlayerTest.java | 82 ++++++++++++++----- .../media3/session/MediaTestUtils.java | 4 +- .../androidx/media3/session/MockPlayer.java | 32 ++++---- 7 files changed, 137 insertions(+), 51 deletions(-) diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerStateMaskingTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerStateMaskingTest.java index 51535ebc5f..e077bc2e18 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerStateMaskingTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerStateMaskingTest.java @@ -2315,8 +2315,9 @@ public class MediaControllerStateMaskingTest { } @Test - public void removeMediaItems_removeCurrentItemWhenShuffledModeDisabled_masksIndices() - throws Exception { + public void + removeMediaItems_removeCurrentItemWhenShuffledModeDisabledFromMiddleToEnd_masksIndices() + throws Exception { String firstMediaId = "firstMediaId"; String secondMediaId = "secondMediaId"; String thirdMediaId = "thirdMediaId"; @@ -2334,6 +2335,17 @@ public class MediaControllerStateMaskingTest { /* testCurrentPeriodIndex= */ 0, /* testTimeline= */ testTimeline, /* testMediaId= */ firstMediaId); + } + + @Test + public void removeMediaItems_removeCurrentItemWhenShuffledModeDisabledFromTheMiddle_masksIndices() + throws Exception { + String firstMediaId = "firstMediaId"; + String secondMediaId = "secondMediaId"; + String thirdMediaId = "thirdMediaId"; + String fourthMediaId = "fourthMediaId"; + Timeline testTimeline = + createTimeline(createMediaItems(firstMediaId, secondMediaId, thirdMediaId, fourthMediaId)); // Remove middle of the timeline. assertRemoveMediaItems( @@ -2348,7 +2360,7 @@ public class MediaControllerStateMaskingTest { } @Test - public void removeMediaItems_removeCurrentItemWhenShuffledModeEnabled_masksIndices() + public void removeMediaItems_removeCurrentItemWhenShuffledModeEnabledWithNoNextItem_masksIndices() throws Exception { String firstMediaId = "firstMediaId"; String secondMediaId = "secondMediaId"; @@ -2368,6 +2380,16 @@ public class MediaControllerStateMaskingTest { createMediaItems(firstMediaId, secondMediaId, thirdMediaId, fourthMediaId), /* shuffledIndices= */ new int[] {1, 2, 3, 0}), /* testMediaId= */ secondMediaId); + } + + @Test + public void + removeMediaItems_removeCurrentItemWhenShuffledModeEnabledWithNextItemAndChangedIndex_masksIndices() + throws Exception { + String firstMediaId = "firstMediaId"; + String secondMediaId = "secondMediaId"; + String thirdMediaId = "thirdMediaId"; + String fourthMediaId = "fourthMediaId"; // Subsequent window index exists in the shuffled list after the fromIndex--current window index // should subtract size of removed items. @@ -2382,6 +2404,16 @@ public class MediaControllerStateMaskingTest { createMediaItems(firstMediaId, secondMediaId, thirdMediaId, fourthMediaId), /* shuffledIndices= */ new int[] {0, 3, 1, 2}), /* testMediaId= */ fourthMediaId); + } + + @Test + public void + removeMediaItems_removeCurrentItemWhenShuffledModeEnabledWithNextItemAndSameIndex_masksIndices() + throws Exception { + String firstMediaId = "firstMediaId"; + String secondMediaId = "secondMediaId"; + String thirdMediaId = "thirdMediaId"; + String fourthMediaId = "fourthMediaId"; // Subsequent window index exists in the shuffled list before the fromIndex--current window // index should not subtract size of removed items. diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java index e2359734a2..fd7bd48720 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java @@ -315,7 +315,8 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { controller.addQueueItem(desc); player.awaitMethodCalled(MockPlayer.METHOD_ADD_MEDIA_ITEM, TIMEOUT_MS); - assertThat(player.mediaItem.mediaId).isEqualTo(mediaId); + assertThat(player.mediaItems).hasSize(1); + assertThat(player.mediaItems.get(0).mediaId).isEqualTo(mediaId); } @Test @@ -329,9 +330,11 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { new RemoteMediaControllerCompat( context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 10); handler.postAndSync( () -> { - player.timeline = MediaTestUtils.createTimeline(/* windowCount= */ 10); + player.setMediaItems(mediaItems); + player.timeline = new PlaylistTimeline(mediaItems); player.notifyTimelineChanged(Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED); }); @@ -343,7 +346,8 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { player.awaitMethodCalled(MockPlayer.METHOD_ADD_MEDIA_ITEM_WITH_INDEX, TIMEOUT_MS); assertThat(player.index).isEqualTo(testIndex); - assertThat(player.mediaItem.mediaId).isEqualTo(mediaId); + assertThat(player.mediaItems).hasSize(11); + assertThat(player.mediaItems.get(1).mediaId).isEqualTo(mediaId); } @Test @@ -360,6 +364,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 10); handler.postAndSync( () -> { + player.setMediaItems(mediaItems); player.timeline = new PlaylistTimeline(mediaItems); player.notifyTimelineChanged(Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED); }); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPermissionTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPermissionTest.java index 03c6d2a034..4267345a60 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPermissionTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPermissionTest.java @@ -151,7 +151,10 @@ public class MediaSessionPermissionTest { public void removeMediaItems() throws Exception { testOnCommandRequest( COMMAND_CHANGE_MEDIA_ITEMS, - controller -> controller.removeMediaItems(/* fromIndex= */ 0, /* toIndex= */ 1)); + controller -> { + controller.addMediaItems(MediaTestUtils.createMediaItems(/* size= */ 5)); + controller.removeMediaItems(/* fromIndex= */ 0, /* toIndex= */ 1); + }); } @Test diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java index e8e5eb0156..537026101c 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java @@ -198,7 +198,7 @@ public class MediaSessionPlayerTest { controller.setMediaItem(item); player.awaitMethodCalled(MockPlayer.METHOD_SET_MEDIA_ITEM, TIMEOUT_MS); - assertThat(player.mediaItem).isEqualTo(item); + assertThat(player.mediaItems).containsExactly(item); assertThat(player.startPositionMs).isEqualTo(startPositionMs); assertThat(player.resetPosition).isEqualTo(resetPosition); } @@ -214,7 +214,7 @@ public class MediaSessionPlayerTest { controller.setMediaItem(item); player.awaitMethodCalled(MockPlayer.METHOD_SET_MEDIA_ITEM, TIMEOUT_MS); - assertThat(player.mediaItem).isEqualTo(item); + assertThat(player.mediaItems).containsExactly(item); assertThat(player.startPositionMs).isEqualTo(startPositionMs); assertThat(player.resetPosition).isEqualTo(resetPosition); } @@ -230,7 +230,7 @@ public class MediaSessionPlayerTest { controller.setMediaItem(item); player.awaitMethodCalled(MockPlayer.METHOD_SET_MEDIA_ITEM, TIMEOUT_MS); - assertThat(player.mediaItem).isEqualTo(item); + assertThat(player.mediaItems).containsExactly(item); assertThat(player.startPositionMs).isEqualTo(startPositionMs); assertThat(player.resetPosition).isEqualTo(resetPosition); } @@ -318,7 +318,7 @@ public class MediaSessionPlayerTest { controller.addMediaItem(mediaItem); player.awaitMethodCalled(MockPlayer.METHOD_ADD_MEDIA_ITEM, TIMEOUT_MS); - assertThat(player.mediaItem).isEqualTo(mediaItem); + assertThat(player.mediaItems).hasSize(6); } @Test @@ -330,7 +330,7 @@ public class MediaSessionPlayerTest { player.awaitMethodCalled(MockPlayer.METHOD_ADD_MEDIA_ITEM_WITH_INDEX, TIMEOUT_MS); assertThat(player.index).isEqualTo(index); - assertThat(player.mediaItem).isEqualTo(mediaItem); + assertThat(player.mediaItems).hasSize(6); } @Test @@ -341,7 +341,7 @@ public class MediaSessionPlayerTest { controller.addMediaItems(mediaItems); player.awaitMethodCalled(MockPlayer.METHOD_ADD_MEDIA_ITEMS, TIMEOUT_MS); - assertThat(player.mediaItems).isEqualTo(mediaItems); + assertThat(player.mediaItems).hasSize(7); } @Test @@ -354,12 +354,12 @@ public class MediaSessionPlayerTest { player.awaitMethodCalled(MockPlayer.METHOD_ADD_MEDIA_ITEMS_WITH_INDEX, TIMEOUT_MS); assertThat(player.index).isEqualTo(index); - assertThat(player.mediaItems).isEqualTo(mediaItems); + assertThat(player.mediaItems).hasSize(7); } @Test public void removeMediaItem() throws Exception { - int index = 5; + int index = 3; controller.removeMediaItem(index); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MockPlayerTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MockPlayerTest.java index f97a659fe3..2bf7dc8fa4 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MockPlayerTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MockPlayerTest.java @@ -136,7 +136,7 @@ public class MockPlayerTest { player.setMediaItem(mediaItem); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_SET_MEDIA_ITEM)).isTrue(); - assertThat(player.mediaItem).isSameInstanceAs(mediaItem); + assertThat(player.mediaItems).containsExactly(mediaItem); } @Test @@ -149,7 +149,7 @@ public class MockPlayerTest { assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_SET_MEDIA_ITEM_WITH_START_POSITION)) .isTrue(); assertThat(player.startPositionMs).isEqualTo(startPositionMs); - assertThat(player.mediaItem).isSameInstanceAs(mediaItem); + assertThat(player.mediaItems).containsExactly(mediaItem); } @Test @@ -162,7 +162,7 @@ public class MockPlayerTest { assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_SET_MEDIA_ITEM_WITH_RESET_POSITION)) .isTrue(); assertThat(player.resetPosition).isEqualTo(resetPosition); - assertThat(player.mediaItem).isEqualTo(mediaItem); + assertThat(player.mediaItems).containsExactly(mediaItem); } @Test @@ -172,7 +172,7 @@ public class MockPlayerTest { player.setMediaItems(list); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_SET_MEDIA_ITEMS)).isTrue(); - assertThat(player.mediaItems).isSameInstanceAs(list); + assertThat(player.mediaItems).containsExactlyElementsIn(list).inOrder(); } @Test @@ -185,7 +185,7 @@ public class MockPlayerTest { assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_SET_MEDIA_ITEMS_WITH_RESET_POSITION)) .isTrue(); assertThat(player.resetPosition).isEqualTo(resetPosition); - assertThat(player.mediaItems).isSameInstanceAs(list); + assertThat(player.mediaItems).containsExactlyElementsIn(list).inOrder(); } @Test @@ -200,7 +200,7 @@ public class MockPlayerTest { .isTrue(); assertThat(player.startMediaItemIndex).isEqualTo(startWindowIndex); assertThat(player.startPositionMs).isEqualTo(startPositionMs); - assertThat(player.mediaItems).isSameInstanceAs(list); + assertThat(player.mediaItems).containsExactlyElementsIn(list).inOrder(); } @Test @@ -211,7 +211,7 @@ public class MockPlayerTest { player.setMediaItems(list); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_SET_MEDIA_ITEMS)).isTrue(); - assertThat(player.mediaItems).isSameInstanceAs(list); + assertThat(player.mediaItems).containsExactlyElementsIn(list).inOrder(); } @Test @@ -226,98 +226,132 @@ public class MockPlayerTest { @Test public void addMediaItem() { + MediaItem existingItem = MediaTestUtils.createMediaItem("existing"); MediaItem mediaItem = MediaTestUtils.createMediaItem("item"); + player.setMediaItem(existingItem); player.addMediaItem(mediaItem); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_ADD_MEDIA_ITEM)).isTrue(); - assertThat(player.mediaItem).isSameInstanceAs(mediaItem); + assertThat(player.mediaItems).containsExactly(existingItem, mediaItem).inOrder(); } @Test public void addMediaItem_withIndex() { int index = 1; + List existingItems = MediaTestUtils.createMediaItems(/* size= */ 2); MediaItem mediaItem = MediaTestUtils.createMediaItem("item"); + player.setMediaItems(existingItems); player.addMediaItem(index, mediaItem); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_ADD_MEDIA_ITEM_WITH_INDEX)).isTrue(); assertThat(player.index).isEqualTo(index); - assertThat(player.mediaItem).isSameInstanceAs(mediaItem); + assertThat(player.mediaItems) + .containsExactly(existingItems.get(0), mediaItem, existingItems.get(1)) + .inOrder(); } @Test public void addMediaItems() { - int index = 1; - int size = 2; + int size = 4; List mediaItems = MediaTestUtils.createMediaItems(size); + player.setMediaItems(mediaItems.subList(/* fromIndex= */ 0, /* toIndex= */ 2)); - player.addMediaItems(index, mediaItems); + player.addMediaItems(mediaItems.subList(/* fromIndex= */ 2, /* toIndex= */ 4)); - assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_ADD_MEDIA_ITEMS_WITH_INDEX)).isTrue(); - assertThat(player.index).isEqualTo(index); - assertThat(player.mediaItems).isSameInstanceAs(mediaItems); + assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_ADD_MEDIA_ITEMS)).isTrue(); + assertThat(player.mediaItems).containsExactlyElementsIn(mediaItems).inOrder(); } @Test public void addMediaItems_withIndex() { int index = 1; - int size = 2; + int size = 4; List mediaItems = MediaTestUtils.createMediaItems(size); + player.setMediaItems(mediaItems.subList(/* fromIndex= */ 0, /* toIndex= */ 2)); - player.addMediaItems(index, mediaItems); + player.addMediaItems(index, mediaItems.subList(/* fromIndex= */ 2, /* toIndex= */ 4)); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_ADD_MEDIA_ITEMS_WITH_INDEX)).isTrue(); assertThat(player.index).isEqualTo(index); - assertThat(player.mediaItems).isSameInstanceAs(mediaItems); + assertThat(player.mediaItems) + .containsExactly(mediaItems.get(0), mediaItems.get(2), mediaItems.get(3), mediaItems.get(1)) + .inOrder(); } @Test public void removeMediaItem() { - int index = 8; + int index = 3; + List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 5); + player.addMediaItems(mediaItems); player.removeMediaItem(index); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_REMOVE_MEDIA_ITEM)).isTrue(); assertThat(player.index).isEqualTo(index); + assertThat(player.mediaItems) + .containsExactly(mediaItems.get(0), mediaItems.get(1), mediaItems.get(2), mediaItems.get(4)) + .inOrder(); } @Test public void removeMediaItems() { int fromIndex = 1; int toIndex = 3; + List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 5); + player.addMediaItems(mediaItems); player.removeMediaItems(fromIndex, toIndex); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_REMOVE_MEDIA_ITEMS)).isTrue(); assertThat(player.fromIndex).isEqualTo(fromIndex); assertThat(player.toIndex).isEqualTo(toIndex); + assertThat(player.mediaItems) + .containsExactly(mediaItems.get(0), mediaItems.get(3), mediaItems.get(4)) + .inOrder(); } @Test public void clearMediaItems() { + List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 5); + player.addMediaItems(mediaItems); + player.clearMediaItems(); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_CLEAR_MEDIA_ITEMS)).isTrue(); + assertThat(player.mediaItems).isEmpty(); } @Test public void moveMediaItem() { int index = 2; int newIndex = 3; + List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 5); + player.addMediaItems(mediaItems); player.moveMediaItem(index, newIndex); assertThat(player.hasMethodBeenCalled(MockPlayer.METHOD_MOVE_MEDIA_ITEM)).isTrue(); assertThat(player.index).isEqualTo(index); assertThat(player.newIndex).isEqualTo(newIndex); + assertThat(player.mediaItems) + .containsExactly( + mediaItems.get(0), + mediaItems.get(1), + mediaItems.get(3), + mediaItems.get(2), + mediaItems.get(4)) + .inOrder(); } @Test public void moveMediaItems() { int fromIndex = 1; - int toIndex = 2; + int toIndex = 3; int newIndex = 3; + List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 5); + player.addMediaItems(mediaItems); player.moveMediaItems(fromIndex, toIndex, newIndex); @@ -325,6 +359,14 @@ public class MockPlayerTest { assertThat(player.fromIndex).isEqualTo(fromIndex); assertThat(player.toIndex).isEqualTo(toIndex); assertThat(player.newIndex).isEqualTo(newIndex); + assertThat(player.mediaItems) + .containsExactly( + mediaItems.get(0), + mediaItems.get(3), + mediaItems.get(4), + mediaItems.get(1), + mediaItems.get(2)) + .inOrder(); } @Test diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java index 1eb19ef119..2f5e2aa936 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaTestUtils.java @@ -58,8 +58,8 @@ public final class MediaTestUtils { return new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(mediaMetadata).build(); } - public static List createMediaItems(int size) { - List list = new ArrayList<>(); + public static ArrayList createMediaItems(int size) { + ArrayList list = new ArrayList<>(); for (int i = 0; i < size; i++) { list.add(createMediaItem("mediaItem_" + (i + 1))); } diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java index 5cc4bd8cc1..693a380119 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MockPlayer.java @@ -48,6 +48,7 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeoutException; @@ -214,8 +215,7 @@ public class MockPlayer implements Player { public int currentAdIndexInAdGroup; @Nullable public PlaybackParameters playbackParameters; public Timeline timeline; - public MediaItem mediaItem; - public List mediaItems; + public ArrayList mediaItems; public boolean resetPosition; public int startMediaItemIndex; public long startPositionMs; @@ -260,14 +260,13 @@ public class MockPlayer implements Player { mediaItems = MediaTestUtils.createMediaItems(builder.itemCount); timeline = new PlaylistTimeline(mediaItems); } else { - mediaItems = ImmutableList.of(); + mediaItems = new ArrayList<>(); timeline = Timeline.EMPTY; } // Sets default audio attributes to prevent setVolume() from being called with the play(). audioAttributes = AudioAttributes.DEFAULT; - mediaItem = MediaItem.EMPTY; playlistMetadata = MediaMetadata.EMPTY; index = C.INDEX_UNSET; fromIndex = C.INDEX_UNSET; @@ -709,40 +708,40 @@ public class MockPlayer implements Player { @Override public void setMediaItem(MediaItem mediaItem) { - this.mediaItem = mediaItem; + this.mediaItems = new ArrayList<>(ImmutableList.of(mediaItem)); checkNotNull(conditionVariables.get(METHOD_SET_MEDIA_ITEM)).open(); } @Override public void setMediaItem(MediaItem mediaItem, long startPositionMs) { - this.mediaItem = mediaItem; + this.mediaItems = new ArrayList<>(ImmutableList.of(mediaItem)); this.startPositionMs = startPositionMs; checkNotNull(conditionVariables.get(METHOD_SET_MEDIA_ITEM_WITH_START_POSITION)).open(); } @Override public void setMediaItem(MediaItem mediaItem, boolean resetPosition) { - this.mediaItem = mediaItem; + this.mediaItems = new ArrayList<>(ImmutableList.of(mediaItem)); this.resetPosition = resetPosition; checkNotNull(conditionVariables.get(METHOD_SET_MEDIA_ITEM_WITH_RESET_POSITION)).open(); } @Override public void setMediaItems(List mediaItems) { - this.mediaItems = mediaItems; + this.mediaItems = new ArrayList<>(mediaItems); checkNotNull(conditionVariables.get(METHOD_SET_MEDIA_ITEMS)).open(); } @Override public void setMediaItems(List mediaItems, boolean resetPosition) { - this.mediaItems = mediaItems; + this.mediaItems = new ArrayList<>(mediaItems); this.resetPosition = resetPosition; checkNotNull(conditionVariables.get(METHOD_SET_MEDIA_ITEMS_WITH_RESET_POSITION)).open(); } @Override public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { - this.mediaItems = mediaItems; + this.mediaItems = new ArrayList<>(mediaItems); this.startMediaItemIndex = startIndex; this.startPositionMs = startPositionMs; checkNotNull(conditionVariables.get(METHOD_SET_MEDIA_ITEMS_WITH_START_INDEX)).open(); @@ -851,33 +850,34 @@ public class MockPlayer implements Player { @Override public void addMediaItem(MediaItem mediaItem) { - this.mediaItem = mediaItem; + this.mediaItems.add(mediaItem); checkNotNull(conditionVariables.get(METHOD_ADD_MEDIA_ITEM)).open(); } @Override public void addMediaItem(int index, MediaItem mediaItem) { this.index = index; - this.mediaItem = mediaItem; + this.mediaItems.add(index, mediaItem); checkNotNull(conditionVariables.get(METHOD_ADD_MEDIA_ITEM_WITH_INDEX)).open(); } @Override public void addMediaItems(List mediaItems) { - this.mediaItems = mediaItems; + this.mediaItems.addAll(mediaItems); checkNotNull(conditionVariables.get(METHOD_ADD_MEDIA_ITEMS)).open(); } @Override public void addMediaItems(int index, List mediaItems) { this.index = index; - this.mediaItems = mediaItems; + this.mediaItems.addAll(index, mediaItems); checkNotNull(conditionVariables.get(METHOD_ADD_MEDIA_ITEMS_WITH_INDEX)).open(); } @Override public void removeMediaItem(int index) { this.index = index; + this.mediaItems.remove(index); checkNotNull(conditionVariables.get(METHOD_REMOVE_MEDIA_ITEM)).open(); } @@ -885,11 +885,13 @@ public class MockPlayer implements Player { public void removeMediaItems(int fromIndex, int toIndex) { this.fromIndex = fromIndex; this.toIndex = toIndex; + Util.removeRange(mediaItems, fromIndex, toIndex); checkNotNull(conditionVariables.get(METHOD_REMOVE_MEDIA_ITEMS)).open(); } @Override public void clearMediaItems() { + this.mediaItems.clear(); checkNotNull(conditionVariables.get(METHOD_CLEAR_MEDIA_ITEMS)).open(); } @@ -897,6 +899,7 @@ public class MockPlayer implements Player { public void moveMediaItem(int currentIndex, int newIndex) { this.index = currentIndex; this.newIndex = newIndex; + Util.moveItems(mediaItems, currentIndex, /* toIndex= */ currentIndex + 1, newIndex); checkNotNull(conditionVariables.get(METHOD_MOVE_MEDIA_ITEM)).open(); } @@ -905,6 +908,7 @@ public class MockPlayer implements Player { this.fromIndex = fromIndex; this.toIndex = toIndex; this.newIndex = newIndex; + Util.moveItems(mediaItems, fromIndex, toIndex, newIndex); checkNotNull(conditionVariables.get(METHOD_MOVE_MEDIA_ITEMS)).open(); }