diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplBase.java b/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplBase.java index c8bd52dc473..389228847f9 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplBase.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaControllerImplBase.java @@ -240,7 +240,7 @@ public void run(IMediaSession iSession, int seq) throws RemoteException { playerInfo.copyWithPlaybackState( Player.STATE_IDLE, /* playerError= */ playerInfo.playerError); listeners.queueEvent( - Player.EVENT_PLAYBACK_STATE_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_STATE_CHANGED, listener -> listener.onPlaybackStateChanged(Player.STATE_IDLE)); listeners.flushEvents(); } @@ -698,7 +698,7 @@ public void setPlaybackParameters(PlaybackParameters playbackParameters) { playerInfo = playerInfo.copyWithPlaybackParameters(playbackParameters); listeners.queueEvent( - Player.EVENT_PLAYBACK_PARAMETERS_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_PARAMETERS_CHANGED, listener -> listener.onPlaybackParametersChanged(playbackParameters)); listeners.flushEvents(); } @@ -724,7 +724,7 @@ public void setPlaybackSpeed(float speed) { playerInfo = playerInfo.copyWithPlaybackParameters(newPlaybackParameters); listeners.queueEvent( - Player.EVENT_PLAYBACK_PARAMETERS_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_PARAMETERS_CHANGED, listener -> listener.onPlaybackParametersChanged(newPlaybackParameters)); listeners.flushEvents(); } @@ -902,10 +902,8 @@ public void setPlaylistMetadata(MediaMetadata playlistMetadata) { if (!playerInfo.playlistMetadata.equals(playlistMetadata)) { playerInfo = playerInfo.copyWithPlaylistMetadata(playlistMetadata); - - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_PLAYLIST_METADATA_CHANGED, listener -> listener.onPlaylistMetadataChanged(playlistMetadata)); listeners.flushEvents(); } @@ -1404,7 +1402,8 @@ public void run(IMediaSession iSession, int seq) throws RemoteException { playerInfo = playerInfo.copyWithRepeatMode(repeatMode); listeners.queueEvent( - Player.EVENT_REPEAT_MODE_CHANGED, listener -> listener.onRepeatModeChanged(repeatMode)); + /* eventFlag= */ Player.EVENT_REPEAT_MODE_CHANGED, + listener -> listener.onRepeatModeChanged(repeatMode)); listeners.flushEvents(); } } @@ -1433,7 +1432,7 @@ public void run(IMediaSession iSession, int seq) throws RemoteException { playerInfo = playerInfo.copyWithShuffleModeEnabled(shuffleModeEnabled); listeners.queueEvent( - Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED, + /* eventFlag= */ Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED, listener -> listener.onShuffleModeEnabledChanged(shuffleModeEnabled)); listeners.flushEvents(); } @@ -1461,10 +1460,9 @@ public void setVolume(float volume) { if (playerInfo.volume != volume) { playerInfo = playerInfo.copyWithVolume(volume); - - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, listener -> listener.onVolumeChanged(volume)); + /* eventFlag= */ Player.EVENT_VOLUME_CHANGED, + listener -> listener.onVolumeChanged(volume)); listeners.flushEvents(); } } @@ -1497,9 +1495,8 @@ public void setDeviceVolume(int volume) { if (playerInfo.deviceVolume != volume) { playerInfo = playerInfo.copyWithDeviceVolume(volume, playerInfo.deviceMuted); - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_DEVICE_VOLUME_CHANGED, listener -> listener.onDeviceVolumeChanged(volume, playerInfo.deviceMuted)); listeners.flushEvents(); } @@ -1518,10 +1515,8 @@ public void increaseDeviceVolume() { int newDeviceVolume = playerInfo.deviceVolume + 1; if (newDeviceVolume <= getDeviceInfo().maxVolume) { playerInfo = playerInfo.copyWithDeviceVolume(newDeviceVolume, playerInfo.deviceMuted); - - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_DEVICE_VOLUME_CHANGED, listener -> listener.onDeviceVolumeChanged(newDeviceVolume, playerInfo.deviceMuted)); listeners.flushEvents(); } @@ -1540,10 +1535,8 @@ public void decreaseDeviceVolume() { int newDeviceVolume = playerInfo.deviceVolume - 1; if (newDeviceVolume >= getDeviceInfo().minVolume) { playerInfo = playerInfo.copyWithDeviceVolume(newDeviceVolume, playerInfo.deviceMuted); - - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_DEVICE_VOLUME_CHANGED, listener -> listener.onDeviceVolumeChanged(newDeviceVolume, playerInfo.deviceMuted)); listeners.flushEvents(); } @@ -1561,10 +1554,8 @@ public void setDeviceMuted(boolean muted) { if (playerInfo.deviceMuted != muted) { playerInfo = playerInfo.copyWithDeviceVolume(playerInfo.deviceVolume, muted); - - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_DEVICE_VOLUME_CHANGED, listener -> listener.onDeviceVolumeChanged(playerInfo.deviceVolume, muted)); listeners.flushEvents(); } @@ -1751,7 +1742,7 @@ public void setTrackSelectionParameters(TrackSelectionParameters parameters) { playerInfo = playerInfo.copyWithTrackSelectionParameters(parameters); listeners.queueEvent( - Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, + /* eventFlag= */ Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, listener -> listener.onTrackSelectionParametersChanged(parameters)); listeners.flushEvents(); } @@ -2074,14 +2065,14 @@ private void updatePlayerInfo( if (mediaItemTransition) { listeners.queueEvent( - Player.EVENT_MEDIA_ITEM_TRANSITION, + /* eventFlag= */ Player.EVENT_MEDIA_ITEM_TRANSITION, listener -> listener.onMediaItemTransition( newPlayerInfo.getCurrentMediaItem(), mediaItemTransitionReason)); } if (positionDiscontinuity) { listeners.queueEvent( - Player.EVENT_POSITION_DISCONTINUITY, + /* eventFlag= */ Player.EVENT_POSITION_DISCONTINUITY, listener -> listener.onPositionDiscontinuity( newPlayerInfo.oldPositionInfo, @@ -2090,30 +2081,30 @@ private void updatePlayerInfo( } if (!oldPlayerInfo.timeline.equals(newPlayerInfo.timeline)) { listeners.queueEvent( - Player.EVENT_TIMELINE_CHANGED, + /* eventFlag= */ Player.EVENT_TIMELINE_CHANGED, listener -> listener.onTimelineChanged(newPlayerInfo.timeline, timelineChangeReason)); } if (oldPlayerInfo.playbackState != newPlayerInfo.playbackState) { listeners.queueEvent( - Player.EVENT_PLAYBACK_STATE_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_STATE_CHANGED, listener -> listener.onPlaybackStateChanged(newPlayerInfo.playbackState)); } if (oldPlayerInfo.playWhenReady != newPlayerInfo.playWhenReady) { listeners.queueEvent( - Player.EVENT_PLAY_WHEN_READY_CHANGED, + /* eventFlag= */ Player.EVENT_PLAY_WHEN_READY_CHANGED, listener -> listener.onPlayWhenReadyChanged( newPlayerInfo.playWhenReady, playWhenReadyChangeReason)); } if (oldPlayerInfo.playbackSuppressionReason != newPlayerInfo.playbackSuppressionReason) { listeners.queueEvent( - Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, listener -> listener.onPlaybackSuppressionReasonChanged(newPlayerInfo.playbackSuppressionReason)); } if (oldPlayerInfo.isPlaying != newPlayerInfo.isPlaying) { listeners.queueEvent( - Player.EVENT_IS_PLAYING_CHANGED, + /* eventFlag= */ Player.EVENT_IS_PLAYING_CHANGED, listener -> listener.onIsPlayingChanged(newPlayerInfo.isPlaying)); } listeners.flushEvents(); @@ -2201,10 +2192,9 @@ private void maybeNotifySurfaceSizeChanged(int width, int height) { if (surfaceWidth != width || surfaceHeight != height) { surfaceWidth = width; surfaceHeight = height; - - // TODO(b/187152483): Set proper event code when available. listeners.sendEvent( - /* eventFlag= */ C.INDEX_UNSET, listener -> listener.onSurfaceSizeChanged(width, height)); + /* eventFlag= */ Player.EVENT_SURFACE_SIZE_CHANGED, + listener -> listener.onSurfaceSizeChanged(width, height)); } } @@ -2341,123 +2331,119 @@ void onPlayerInfoChanged( || (oldPlayerError != null && oldPlayerError.errorInfoEquals(playerError)); if (!errorsMatch) { listeners.queueEvent( - Player.EVENT_PLAYER_ERROR, + /* eventFlag= */ Player.EVENT_PLAYER_ERROR, listener -> listener.onPlayerErrorChanged(playerInfo.playerError)); if (playerInfo.playerError != null) { listeners.queueEvent( - Player.EVENT_PLAYER_ERROR, listener -> listener.onPlayerError(playerInfo.playerError)); + /* eventFlag= */ Player.EVENT_PLAYER_ERROR, + listener -> listener.onPlayerError(playerInfo.playerError)); } } MediaItem oldCurrentMediaItem = oldPlayerInfo.getCurrentMediaItem(); MediaItem currentMediaItem = playerInfo.getCurrentMediaItem(); if (!Util.areEqual(oldCurrentMediaItem, currentMediaItem)) { listeners.queueEvent( - Player.EVENT_MEDIA_ITEM_TRANSITION, + /* eventFlag= */ Player.EVENT_MEDIA_ITEM_TRANSITION, listener -> listener.onMediaItemTransition( currentMediaItem, playerInfo.mediaItemTransitionReason)); } if (!Util.areEqual(oldPlayerInfo.currentTracks, playerInfo.currentTracks)) { listeners.queueEvent( - Player.EVENT_TRACKS_CHANGED, + /* eventFlag= */ Player.EVENT_TRACKS_CHANGED, listener -> listener.onTracksChanged(playerInfo.currentTracks)); } if (!Util.areEqual(oldPlayerInfo.playbackParameters, playerInfo.playbackParameters)) { listeners.queueEvent( - Player.EVENT_PLAYBACK_PARAMETERS_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_PARAMETERS_CHANGED, listener -> listener.onPlaybackParametersChanged(playerInfo.playbackParameters)); } if (oldPlayerInfo.repeatMode != playerInfo.repeatMode) { listeners.queueEvent( - Player.EVENT_REPEAT_MODE_CHANGED, + /* eventFlag= */ Player.EVENT_REPEAT_MODE_CHANGED, listener -> listener.onRepeatModeChanged(playerInfo.repeatMode)); } if (oldPlayerInfo.shuffleModeEnabled != playerInfo.shuffleModeEnabled) { listeners.queueEvent( - Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED, + /* eventFlag= */ Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED, listener -> listener.onShuffleModeEnabledChanged(playerInfo.shuffleModeEnabled)); } if (!isTimelineExcluded && !Util.areEqual(oldPlayerInfo.timeline, playerInfo.timeline)) { listeners.queueEvent( - Player.EVENT_TIMELINE_CHANGED, + /* eventFlag= */ Player.EVENT_TIMELINE_CHANGED, listener -> listener.onTimelineChanged(playerInfo.timeline, timelineChangedReason)); } if (!Util.areEqual(oldPlayerInfo.playlistMetadata, playerInfo.playlistMetadata)) { - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_PLAYLIST_METADATA_CHANGED, listener -> listener.onPlaylistMetadataChanged(playerInfo.playlistMetadata)); } if (oldPlayerInfo.volume != playerInfo.volume) { - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, listener -> listener.onVolumeChanged(playerInfo.volume)); + /* eventFlag= */ Player.EVENT_VOLUME_CHANGED, + listener -> listener.onVolumeChanged(playerInfo.volume)); } if (!Util.areEqual(oldPlayerInfo.audioAttributes, playerInfo.audioAttributes)) { - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_AUDIO_ATTRIBUTES_CHANGED, listener -> listener.onAudioAttributesChanged(playerInfo.audioAttributes)); } if (!oldPlayerInfo.cueGroup.cues.equals(playerInfo.cueGroup.cues)) { - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, listener -> listener.onCues(playerInfo.cueGroup.cues)); + /* eventFlag= */ Player.EVENT_CUES, + listener -> listener.onCues(playerInfo.cueGroup.cues)); listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, listener -> listener.onCues(playerInfo.cueGroup)); + /* eventFlag= */ Player.EVENT_CUES, listener -> listener.onCues(playerInfo.cueGroup)); } if (!Util.areEqual(oldPlayerInfo.deviceInfo, playerInfo.deviceInfo)) { - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_DEVICE_INFO_CHANGED, listener -> listener.onDeviceInfoChanged(playerInfo.deviceInfo)); } if (oldPlayerInfo.deviceVolume != playerInfo.deviceVolume || oldPlayerInfo.deviceMuted != playerInfo.deviceMuted) { - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_DEVICE_VOLUME_CHANGED, listener -> listener.onDeviceVolumeChanged(playerInfo.deviceVolume, playerInfo.deviceMuted)); } if (oldPlayerInfo.playWhenReady != playerInfo.playWhenReady) { listeners.queueEvent( - Player.EVENT_PLAY_WHEN_READY_CHANGED, + /* eventFlag= */ Player.EVENT_PLAY_WHEN_READY_CHANGED, listener -> listener.onPlayWhenReadyChanged( playerInfo.playWhenReady, playerInfo.playWhenReadyChangedReason)); } if (oldPlayerInfo.playbackSuppressionReason != playerInfo.playbackSuppressionReason) { listeners.queueEvent( - Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, listener -> listener.onPlaybackSuppressionReasonChanged(playerInfo.playbackSuppressionReason)); } if (oldPlayerInfo.playbackState != playerInfo.playbackState) { listeners.queueEvent( - Player.EVENT_PLAYBACK_STATE_CHANGED, + /* eventFlag= */ Player.EVENT_PLAYBACK_STATE_CHANGED, listener -> listener.onPlaybackStateChanged(playerInfo.playbackState)); } if (oldPlayerInfo.isPlaying != playerInfo.isPlaying) { listeners.queueEvent( - Player.EVENT_IS_PLAYING_CHANGED, + /* eventFlag= */ Player.EVENT_IS_PLAYING_CHANGED, listener -> listener.onIsPlayingChanged(playerInfo.isPlaying)); } if (oldPlayerInfo.isLoading != playerInfo.isLoading) { listeners.queueEvent( - Player.EVENT_IS_LOADING_CHANGED, + /* eventFlag= */ Player.EVENT_IS_LOADING_CHANGED, listener -> listener.onIsLoadingChanged(playerInfo.isLoading)); } if (!Util.areEqual(oldPlayerInfo.videoSize, playerInfo.videoSize)) { - // TODO(b/187152483): Set proper event code when available. listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, + /* eventFlag= */ Player.EVENT_VIDEO_SIZE_CHANGED, listener -> listener.onVideoSizeChanged(playerInfo.videoSize)); } if (!Util.areEqual(oldPlayerInfo.oldPositionInfo, playerInfo.oldPositionInfo) || !Util.areEqual(oldPlayerInfo.newPositionInfo, playerInfo.newPositionInfo)) { listeners.queueEvent( - Player.EVENT_POSITION_DISCONTINUITY, + /* eventFlag= */ Player.EVENT_POSITION_DISCONTINUITY, listener -> listener.onPositionDiscontinuity( playerInfo.oldPositionInfo, @@ -2466,22 +2452,22 @@ void onPlayerInfoChanged( } if (!Util.areEqual(oldPlayerInfo.mediaMetadata, playerInfo.mediaMetadata)) { listeners.queueEvent( - Player.EVENT_MEDIA_METADATA_CHANGED, + /* eventFlag= */ Player.EVENT_MEDIA_METADATA_CHANGED, listener -> listener.onMediaMetadataChanged(playerInfo.mediaMetadata)); } if (oldPlayerInfo.seekBackIncrementMs != playerInfo.seekBackIncrementMs) { listeners.queueEvent( - Player.EVENT_SEEK_BACK_INCREMENT_CHANGED, + /* eventFlag= */ Player.EVENT_SEEK_BACK_INCREMENT_CHANGED, listener -> listener.onSeekBackIncrementChanged(playerInfo.seekBackIncrementMs)); } if (oldPlayerInfo.seekForwardIncrementMs != playerInfo.seekForwardIncrementMs) { listeners.queueEvent( - Player.EVENT_SEEK_FORWARD_INCREMENT_CHANGED, + /* eventFlag= */ Player.EVENT_SEEK_FORWARD_INCREMENT_CHANGED, listener -> listener.onSeekForwardIncrementChanged(playerInfo.seekForwardIncrementMs)); } if (oldPlayerInfo.maxSeekToPreviousPositionMs != newPlayerInfo.maxSeekToPreviousPositionMs) { listeners.queueEvent( - Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, + /* eventFlag= */ Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, listener -> listener.onMaxSeekToPreviousPositionChanged( newPlayerInfo.maxSeekToPreviousPositionMs)); @@ -2489,7 +2475,7 @@ void onPlayerInfoChanged( if (!Util.areEqual( oldPlayerInfo.trackSelectionParameters, newPlayerInfo.trackSelectionParameters)) { listeners.queueEvent( - Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, + /* eventFlag= */ Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, listener -> listener.onTrackSelectionParametersChanged(newPlayerInfo.trackSelectionParameters)); } @@ -2519,7 +2505,7 @@ void onAvailableCommandsChangedFromSession( } if (intersectedPlayerCommandsChanged) { listeners.sendEvent( - Player.EVENT_AVAILABLE_COMMANDS_CHANGED, + /* eventFlag= */ Player.EVENT_AVAILABLE_COMMANDS_CHANGED, listener -> listener.onAvailableCommandsChanged(intersectedPlayerCommands)); } if (sessionCommandsChanged) { @@ -2544,7 +2530,7 @@ void onAvailableCommandsChangedFromPlayer(Commands commandsFromPlayer) { !Util.areEqual(intersectedPlayerCommands, prevIntersectedPlayerCommands); if (intersectedPlayerCommandsChanged) { listeners.sendEvent( - Player.EVENT_AVAILABLE_COMMANDS_CHANGED, + /* eventFlag= */ Player.EVENT_AVAILABLE_COMMANDS_CHANGED, listener -> listener.onAvailableCommandsChanged(intersectedPlayerCommands)); } } @@ -2583,7 +2569,8 @@ public void onExtrasChanged(Bundle extras) { } public void onRenderedFirstFrame() { - listeners.sendEvent(/* eventFlag= */ C.INDEX_UNSET, Listener::onRenderedFirstFrame); + listeners.sendEvent( + /* eventFlag= */ Player.EVENT_RENDERED_FIRST_FRAME, Listener::onRenderedFirstFrame); } private void updateSessionPositionInfoIfNeeded(SessionPositionInfo sessionPositionInfo) { diff --git a/libraries/test_session_common/src/main/aidl/androidx/media3/test/session/common/IRemoteMediaSession.aidl b/libraries/test_session_common/src/main/aidl/androidx/media3/test/session/common/IRemoteMediaSession.aidl index 008bcc25452..4c119fdf6ae 100644 --- a/libraries/test_session_common/src/main/aidl/androidx/media3/test/session/common/IRemoteMediaSession.aidl +++ b/libraries/test_session_common/src/main/aidl/androidx/media3/test/session/common/IRemoteMediaSession.aidl @@ -51,6 +51,7 @@ interface IRemoteMediaSession { void setIsPlayingAd(String sessionId, boolean isPlayingAd); void setCurrentAdGroupIndex(String sessionId, int currentAdGroupIndex); void setCurrentAdIndexInAdGroup(String sessionId, int currentAdIndexInAdGroup); + void setVolume(String sessionId, float volume); void notifyPlayerError(String sessionId, in Bundle playerErrorBundle); void notifyPlayWhenReadyChanged(String sessionId, boolean playWhenReady, int reason); void notifyPlaybackStateChanged(String sessionId, int state); @@ -79,6 +80,8 @@ interface IRemoteMediaSession { void notifySeekBackIncrementChanged(String sessionId, long seekBackIncrementMs); void notifySeekForwardIncrementChanged(String sessionId, long seekForwardIncrementMs); void notifyDeviceVolumeChanged(String sessionId, int volume, boolean muted); + void decreaseDeviceVolume(String sessionId); + void increaseDeviceVolume(String sessionId); void notifyCuesChanged(String sessionId, in Bundle cueGroup); void notifyDeviceInfoChanged(String sessionId, in Bundle deviceInfo); void notifyMediaMetadataChanged(String sessionId, in Bundle mediaMetadata); diff --git a/libraries/test_session_common/src/main/java/androidx/media3/test/session/common/TestUtils.java b/libraries/test_session_common/src/main/java/androidx/media3/test/session/common/TestUtils.java index 966d0edb265..3975e98410b 100644 --- a/libraries/test_session_common/src/main/java/androidx/media3/test/session/common/TestUtils.java +++ b/libraries/test_session_common/src/main/java/androidx/media3/test/session/common/TestUtils.java @@ -24,8 +24,10 @@ import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.annotation.UiThread; +import androidx.media3.common.Player; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; +import com.google.common.collect.ImmutableList; import java.util.Locale; /** Provides utility methods for testing purpose. */ @@ -127,5 +129,19 @@ static void setKeepScreenOn(Activity activity) { } } + /** + * Returns an {@link ImmutableList} with the {@linkplain Player.Event Events} contained in {@code + * events}. The contents of the list are in matching order with the {@linkplain Player.Event + * Events} returned by {@link Player.Events#get(int)}. + */ + // TODO(b/254265256): Move this method off test-session-common. + public static ImmutableList<@Player.Event Integer> getEventsAsList(Player.Events events) { + ImmutableList.Builder<@Player.Event Integer> list = new ImmutableList.Builder<>(); + for (int i = 0; i < events.size(); i++) { + list.add(events.get(i)); + } + return list.build(); + } + private TestUtils() {} } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java index 055a6114139..5a4c2e50550 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java @@ -15,17 +15,9 @@ */ package androidx.media3.session; -import static androidx.media3.common.Player.COMMAND_SET_REPEAT_MODE; -import static androidx.media3.common.Player.EVENT_REPEAT_MODE_CHANGED; -import static androidx.media3.common.Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED; -import static androidx.media3.common.Player.REPEAT_MODE_ALL; -import static androidx.media3.common.Player.REPEAT_MODE_ONE; -import static androidx.media3.common.Player.STATE_BUFFERING; import static androidx.media3.session.MediaTestUtils.createTimeline; import static androidx.media3.session.MediaUtils.createPlayerCommandsWith; import static androidx.media3.session.MediaUtils.createPlayerCommandsWithout; -import static androidx.media3.session.SessionCommand.COMMAND_CODE_SESSION_SET_RATING; -import static androidx.media3.session.SessionResult.RESULT_SUCCESS; import static androidx.media3.test.session.common.CommonConstants.DEFAULT_TEST_NAME; import static androidx.media3.test.session.common.CommonConstants.MOCK_MEDIA3_LIBRARY_SERVICE; import static androidx.media3.test.session.common.CommonConstants.MOCK_MEDIA3_SESSION_SERVICE; @@ -37,6 +29,7 @@ import static androidx.media3.test.session.common.TestUtils.LONG_TIMEOUT_MS; import static androidx.media3.test.session.common.TestUtils.NO_RESPONSE_TIMEOUT_MS; import static androidx.media3.test.session.common.TestUtils.TIMEOUT_MS; +import static androidx.media3.test.session.common.TestUtils.getEventsAsList; import static com.google.common.truth.Truth.assertThat; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.junit.Assert.assertThrows; @@ -51,7 +44,6 @@ import androidx.media3.common.AudioAttributes; import androidx.media3.common.C; import androidx.media3.common.DeviceInfo; -import androidx.media3.common.FlagSet; import androidx.media3.common.Format; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaLibraryInfo; @@ -60,11 +52,7 @@ import androidx.media3.common.PlaybackParameters; import androidx.media3.common.Player; import androidx.media3.common.Player.Commands; -import androidx.media3.common.Player.DiscontinuityReason; -import androidx.media3.common.Player.PlayWhenReadyChangeReason; import androidx.media3.common.Player.PositionInfo; -import androidx.media3.common.Player.RepeatMode; -import androidx.media3.common.Player.State; import androidx.media3.common.Timeline; import androidx.media3.common.TrackGroup; import androidx.media3.common.TrackSelectionParameters; @@ -111,8 +99,6 @@ public class MediaControllerListenerTest { @ClassRule public static MainLooperTestRule mainLooperTestRule = new MainLooperTestRule(); - private static final int EVENT_ON_EVENTS = C.INDEX_UNSET; - final HandlerThreadTestRule threadTestRule = new HandlerThreadTestRule("MediaControllerListenerTest"); final MediaControllerTestRule controllerTestRule = new MediaControllerTestRule(threadTestRule); @@ -290,9 +276,11 @@ public void onPlayerError_isNotified() throws Exception { /* message= */ "test exception", /* cause= */ null, PlaybackException.ERROR_CODE_REMOTE_ERROR); - - AtomicReference playerErrorRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference playerErrorParamRef = new AtomicReference<>(); + AtomicReference playerErrorGetterRef = new AtomicReference<>(); + AtomicReference playerErrorOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); threadTestRule .getHandler() @@ -302,19 +290,31 @@ public void onPlayerError_isNotified() throws Exception { new Player.Listener() { @Override public void onPlayerError(PlaybackException error) { - playerErrorRef.set(error); + playerErrorParamRef.set(error); + playerErrorGetterRef.set(controller.getPlayerError()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + playerErrorOnEventsRef.set(player.getPlayerError()); latch.countDown(); } })); + remoteSession.getMockPlayer().notifyPlayerError(testPlayerError); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(TestUtils.equals(playerErrorRef.get(), testPlayerError)).isTrue(); + assertThat(TestUtils.equals(playerErrorParamRef.get(), testPlayerError)).isTrue(); + assertThat(TestUtils.equals(playerErrorGetterRef.get(), testPlayerError)).isTrue(); + assertThat(TestUtils.equals(playerErrorOnEventsRef.get(), testPlayerError)).isTrue(); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_PLAYER_ERROR); } @Test public void setPlayer_notifiesChangedValues() throws Exception { - @State int testState = STATE_BUFFERING; + @Player.State int testState = Player.STATE_BUFFERING; Timeline testTimeline = MediaTestUtils.createTimeline(/* windowCount= */ 3); MediaMetadata testPlaylistMetadata = new MediaMetadata.Builder().setTitle("title").build(); AudioAttributes testAudioAttributes = @@ -323,10 +323,9 @@ public void setPlayer_notifiesChangedValues() throws Exception { .setLegacyStreamType(AudioManager.STREAM_RING) .build()); boolean testShuffleModeEnabled = true; - @RepeatMode int testRepeatMode = REPEAT_MODE_ALL; + @Player.RepeatMode int testRepeatMode = Player.REPEAT_MODE_ALL; int testCurrentAdGroupIndex = 33; int testCurrentAdIndexInAdGroup = 11; - AtomicInteger stateRef = new AtomicInteger(); AtomicReference timelineRef = new AtomicReference<>(); AtomicReference playlistMetadataRef = new AtomicReference<>(); @@ -351,7 +350,7 @@ public void onAudioAttributesChanged(AudioAttributes attributes) { } @Override - public void onPlaybackStateChanged(@State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { stateRef.set(playbackState); latch.countDown(); } @@ -373,7 +372,7 @@ public void onPlaylistMetadataChanged(MediaMetadata playlistMetadata) { public void onPositionDiscontinuity( PositionInfo oldPosition, PositionInfo newPosition, - @DiscontinuityReason int reason) { + @Player.DiscontinuityReason int reason) { isPlayingAdRef.set(controller.isPlayingAd()); currentAdGroupIndexRef.set(newPosition.adGroupIndex); currentAdIndexInAdGroupRef.set(newPosition.adIndexInAdGroup); @@ -387,7 +386,7 @@ public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { } @Override - public void onRepeatModeChanged(@RepeatMode int repeatMode) { + public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { repeatModeRef.set(repeatMode); latch.countDown(); } @@ -434,10 +433,8 @@ public void setPlayer_updatesGetters() throws Exception { int testCurrentAdIndexInAdGroup = 6; int testMediaItemIndex = 1; int testPeriodIndex = 2; - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicLong currentPositionMsRef = new AtomicLong(); AtomicLong contentPositionMsRef = new AtomicLong(); AtomicLong durationMsRef = new AtomicLong(); @@ -452,6 +449,21 @@ public void setPlayer_updatesGetters() throws Exception { AtomicInteger currentAdIndexInAdGroupRef = new AtomicInteger(); AtomicInteger currentMediaItemIndexRef = new AtomicInteger(); AtomicInteger currentPeriodIndexRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicLong onEventsCurrentPositionMsRef = new AtomicLong(); + AtomicLong onEventsContentPositionMsRef = new AtomicLong(); + AtomicLong onEventsDurationMsRef = new AtomicLong(); + AtomicLong onEventsBufferedPositionMsRef = new AtomicLong(); + AtomicInteger onEventsBufferedPercentageRef = new AtomicInteger(); + AtomicLong onEventsTotalBufferedDurationMsRef = new AtomicLong(); + AtomicLong onEventsCurrentLiveOffsetMsRef = new AtomicLong(); + AtomicLong onEventsContentDurationMsRef = new AtomicLong(); + AtomicLong onEventsContentBufferedPositionMsRef = new AtomicLong(); + AtomicBoolean onEventsIsPlayingAdRef = new AtomicBoolean(); + AtomicInteger onEventsCurrentAdGroupIndexRef = new AtomicInteger(); + AtomicInteger onEventsCurrentAdIndexInAdGroupRef = new AtomicInteger(); + AtomicInteger onEventsCurrentMediaItemIndexRef = new AtomicInteger(); + AtomicInteger onEventsCurrentPeriodIndexRef = new AtomicInteger(); threadTestRule .getHandler() .postAndSync( @@ -462,7 +474,7 @@ public void setPlayer_updatesGetters() throws Exception { public void onPositionDiscontinuity( PositionInfo oldPosition, PositionInfo newPosition, - @DiscontinuityReason int reason) { + @Player.DiscontinuityReason int reason) { currentPositionMsRef.set(controller.getCurrentPosition()); contentPositionMsRef.set(controller.getContentPosition()); durationMsRef.set(controller.getDuration()); @@ -479,7 +491,29 @@ public void onPositionDiscontinuity( currentPeriodIndexRef.set(controller.getCurrentPeriodIndex()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsCurrentPositionMsRef.set(player.getCurrentPosition()); + onEventsContentPositionMsRef.set(player.getContentPosition()); + onEventsDurationMsRef.set(player.getDuration()); + onEventsBufferedPositionMsRef.set(player.getBufferedPosition()); + onEventsBufferedPercentageRef.set(player.getBufferedPercentage()); + onEventsTotalBufferedDurationMsRef.set(player.getTotalBufferedDuration()); + onEventsCurrentLiveOffsetMsRef.set(player.getCurrentLiveOffset()); + onEventsContentDurationMsRef.set(player.getContentDuration()); + onEventsContentBufferedPositionMsRef.set( + player.getContentBufferedPosition()); + onEventsIsPlayingAdRef.set(player.isPlayingAd()); + onEventsCurrentAdGroupIndexRef.set(player.getCurrentAdGroupIndex()); + onEventsCurrentAdIndexInAdGroupRef.set(player.getCurrentAdIndexInAdGroup()); + onEventsCurrentMediaItemIndexRef.set(player.getCurrentMediaItemIndex()); + onEventsCurrentPeriodIndexRef.set(player.getCurrentPeriodIndex()); + latch.countDown(); + } })); + Bundle playerConfig = new RemoteMediaSession.MockPlayerConfigBuilder() .setPlaybackState(Player.STATE_READY) @@ -502,19 +536,34 @@ public void onPositionDiscontinuity( assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(currentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); + assertThat(onEventsCurrentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); assertThat(contentPositionMsRef.get()).isEqualTo(testContentPositionMs); + assertThat(onEventsContentPositionMsRef.get()).isEqualTo(testContentPositionMs); assertThat(durationMsRef.get()).isEqualTo(testDurationMs); + assertThat(onEventsDurationMsRef.get()).isEqualTo(testDurationMs); assertThat(bufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); + assertThat(onEventsBufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); assertThat(bufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); + assertThat(onEventsBufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); assertThat(totalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); + assertThat(onEventsTotalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); assertThat(currentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); + assertThat(onEventsCurrentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); assertThat(contentDurationMsRef.get()).isEqualTo(testContentDurationMs); + assertThat(onEventsContentDurationMsRef.get()).isEqualTo(testContentDurationMs); assertThat(contentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(onEventsContentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); assertThat(isPlayingAdRef.get()).isEqualTo(testIsPlayingAd); + assertThat(onEventsIsPlayingAdRef.get()).isEqualTo(testIsPlayingAd); assertThat(currentAdGroupIndexRef.get()).isEqualTo(testCurrentAdGroupIndex); + assertThat(onEventsCurrentAdGroupIndexRef.get()).isEqualTo(testCurrentAdGroupIndex); assertThat(currentAdIndexInAdGroupRef.get()).isEqualTo(testCurrentAdIndexInAdGroup); + assertThat(onEventsCurrentAdIndexInAdGroupRef.get()).isEqualTo(testCurrentAdIndexInAdGroup); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); + assertThat(onEventsCurrentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); + assertThat(onEventsCurrentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_POSITION_DISCONTINUITY); } @Test @@ -530,11 +579,12 @@ public void onMediaItemTransition() throws Exception { .getMockPlayer() .notifyMediaItemTransition( currentIndex, Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); - AtomicReference mediaItemFromParamRef = new AtomicReference<>(); AtomicReference mediaItemFromGetterRef = new AtomicReference<>(); + AtomicReference mediaItemFromOnEventsRef = new AtomicReference<>(); AtomicInteger reasonRef = new AtomicInteger(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); threadTestRule .getHandler() @@ -551,18 +601,28 @@ public void onMediaItemTransition( reasonRef.set(reason); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + mediaItemFromOnEventsRef.set(player.getCurrentMediaItem()); + latch.countDown(); + } })); int testIndex = 3; int testReason = Player.MEDIA_ITEM_TRANSITION_REASON_SEEK; + remoteSession.getMockPlayer().setCurrentMediaItemIndex(testIndex); remoteSession.getMockPlayer().notifyMediaItemTransition(testIndex, testReason); + Timeline.Window window = new Timeline.Window(); MediaItem currentMediaItem = timeline.getWindow(testIndex, window).mediaItem; - assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(mediaItemFromParamRef.get()).isEqualTo(currentMediaItem); assertThat(mediaItemFromGetterRef.get()).isEqualTo(currentMediaItem); + assertThat(mediaItemFromOnEventsRef.get()).isEqualTo(currentMediaItem); assertThat(reasonRef.get()).isEqualTo(testReason); + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_MEDIA_ITEM_TRANSITION); } @Test @@ -573,9 +633,11 @@ public void onMediaItemTransition_withNullMediaItem() throws Exception { remoteSession .getMockPlayer() .notifyMediaItemTransition(0, Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); - - AtomicReference mediaItemRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference mediaItemFromParamRef = new AtomicReference<>(); + AtomicReference mediaItemFromGetterRef = new AtomicReference<>(); + AtomicReference mediaItemOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); threadTestRule .getHandler() @@ -587,10 +649,19 @@ public void onMediaItemTransition_withNullMediaItem() throws Exception { public void onMediaItemTransition( @Nullable MediaItem mediaItem, @Player.MediaItemTransitionReason int reason) { - mediaItemRef.set(mediaItem); + mediaItemFromParamRef.set(mediaItem); + mediaItemFromGetterRef.set(controller.getCurrentMediaItem()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + mediaItemOnEventsRef.set(player.getCurrentMediaItem()); latch.countDown(); } })); + remoteSession.getMockPlayer().setTimeline(Timeline.EMPTY); remoteSession .getMockPlayer() @@ -601,7 +672,10 @@ public void onMediaItemTransition( C.INDEX_UNSET, Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(mediaItemRef.get()).isNull(); + assertThat(mediaItemFromParamRef.get()).isNull(); + assertThat(mediaItemFromGetterRef.get()).isNull(); + assertThat(mediaItemOnEventsRef.get()).isNull(); + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_MEDIA_ITEM_TRANSITION); } /** This also tests {@link MediaController#getPlaybackParameters()}. */ @@ -610,15 +684,25 @@ public void onPlaybackParametersChanged_isNotified() throws Exception { PlaybackParameters testPlaybackParameters = new PlaybackParameters(/* speed= */ 3.2f, /* pitch= */ 2.1f); remoteSession.getMockPlayer().setPlaybackParameters(PlaybackParameters.DEFAULT); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); - AtomicReference playbackParametersRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); + AtomicReference playbackParametersFromParamRef = new AtomicReference<>(); + AtomicReference playbackParametersFromGetterRef = new AtomicReference<>(); + AtomicReference playbackParametersFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - playbackParametersRef.set(playbackParameters); + playbackParametersFromParamRef.set(playbackParameters); + playbackParametersFromGetterRef.set(controller.getPlaybackParameters()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + playbackParametersFromOnEventsRef.set(controller.getPlaybackParameters()); latch.countDown(); } }; @@ -627,7 +711,11 @@ public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { remoteSession.getMockPlayer().notifyPlaybackParametersChanged(testPlaybackParameters); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(playbackParametersRef.get()).isEqualTo(testPlaybackParameters); + assertThat(playbackParametersFromParamRef.get()).isEqualTo(testPlaybackParameters); + assertThat(playbackParametersFromGetterRef.get()).isEqualTo(testPlaybackParameters); + assertThat(playbackParametersFromOnEventsRef.get()).isEqualTo(testPlaybackParameters); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_PARAMETERS_CHANGED); } @Test @@ -641,23 +729,25 @@ public void onPlaybackParametersChanged_updatesGetters() throws Exception { long testTotalBufferedDurationMs = 120; long testCurrentLiveOffsetMs = 10; long testContentBufferedPositionMs = 240; - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference playbackParametersRef = new AtomicReference<>(); AtomicLong currentPositionMsRef = new AtomicLong(); AtomicLong contentPositionMsRef = new AtomicLong(); - AtomicLong durationMsRef = new AtomicLong(); AtomicLong bufferedPositionMsRef = new AtomicLong(); AtomicInteger bufferedPercentageRef = new AtomicInteger(); AtomicLong totalBufferedDurationMsRef = new AtomicLong(); AtomicLong currentLiveOffsetMsRef = new AtomicLong(); - AtomicLong contentDurationMsRef = new AtomicLong(); AtomicLong contentBufferedPositionMsRef = new AtomicLong(); - AtomicBoolean isPlayingAdRef = new AtomicBoolean(); - AtomicInteger currentAdGroupIndexRef = new AtomicInteger(); - AtomicInteger currentAdIndexInAdGroupRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicReference onEventsPlaybackParametersRef = new AtomicReference<>(); + AtomicLong onEventsCurrentPositionMsRef = new AtomicLong(); + AtomicLong onEventsContentPositionMsRef = new AtomicLong(); + AtomicLong onEventsBufferedPositionMsRef = new AtomicLong(); + AtomicInteger onEventsBufferedPercentageRef = new AtomicInteger(); + AtomicLong onEventsTotalBufferedDurationMsRef = new AtomicLong(); + AtomicLong onEventsCurrentLiveOffsetMsRef = new AtomicLong(); + AtomicLong onEventsContentBufferedPositionMsRef = new AtomicLong(); threadTestRule .getHandler() .postAndSync( @@ -677,7 +767,23 @@ public void onPlaybackParametersChanged( contentBufferedPositionMsRef.set(controller.getContentBufferedPosition()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsPlaybackParametersRef.set(player.getPlaybackParameters()); + onEventsCurrentPositionMsRef.set(player.getCurrentPosition()); + onEventsContentPositionMsRef.set(player.getContentPosition()); + onEventsBufferedPositionMsRef.set(player.getBufferedPosition()); + onEventsBufferedPercentageRef.set(player.getBufferedPercentage()); + onEventsTotalBufferedDurationMsRef.set(player.getTotalBufferedDuration()); + onEventsCurrentLiveOffsetMsRef.set(player.getCurrentLiveOffset()); + onEventsContentBufferedPositionMsRef.set( + player.getContentBufferedPosition()); + latch.countDown(); + } })); + remoteSession.getMockPlayer().setCurrentPosition(testCurrentPositionMs); remoteSession.getMockPlayer().setContentPosition(testContentPositionMs); remoteSession.getMockPlayer().setBufferedPosition(testBufferedPositionMs); @@ -689,23 +795,35 @@ public void onPlaybackParametersChanged( assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playbackParametersRef.get()).isEqualTo(testPlaybackParameters); + assertThat(onEventsPlaybackParametersRef.get()).isEqualTo(testPlaybackParameters); assertThat(currentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); + assertThat(onEventsCurrentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); assertThat(contentPositionMsRef.get()).isEqualTo(testContentPositionMs); + assertThat(onEventsContentPositionMsRef.get()).isEqualTo(testContentPositionMs); assertThat(bufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); + assertThat(onEventsBufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); assertThat(bufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); + assertThat(onEventsBufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); assertThat(totalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); + assertThat(onEventsTotalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); assertThat(currentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); + assertThat(onEventsCurrentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); assertThat(contentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(onEventsContentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_PARAMETERS_CHANGED); } /** This also tests {@link MediaController#getCurrentTimeline()}. */ @Test public void onTimelineChanged() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference timelineFromParamRef = new AtomicReference<>(); AtomicReference timelineFromGetterRef = new AtomicReference<>(); + AtomicReference timelineFromOnEventsRef = new AtomicReference<>(); AtomicInteger reasonRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -716,6 +834,13 @@ public void onTimelineChanged( reasonRef.set(reason); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + timelineFromOnEventsRef.set(player.getCurrentTimeline()); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -727,56 +852,87 @@ public void onTimelineChanged( assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); MediaTestUtils.assertMediaIdEquals(timeline, timelineFromParamRef.get()); MediaTestUtils.assertMediaIdEquals(timeline, timelineFromGetterRef.get()); + MediaTestUtils.assertMediaIdEquals(timeline, timelineFromOnEventsRef.get()); assertThat(reasonRef.get()).isEqualTo(reason); + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_TIMELINE_CHANGED); } @Test @LargeTest public void onTimelineChanged_withLongPlaylist() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - AtomicReference timelineRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference timelineFromParamRef = new AtomicReference<>(); + AtomicReference timelineFromGetterRef = new AtomicReference<>(); + AtomicReference timelineFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { - timelineRef.set(timeline); + timelineFromParamRef.set(timeline); + timelineFromGetterRef.set(controller.getCurrentTimeline()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + timelineFromOnEventsRef.set(player.getCurrentTimeline()); latch.countDown(); } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); - int windowCount = 5_000; + remoteSession.getMockPlayer().createAndSetFakeTimeline(windowCount); remoteSession .getMockPlayer() .notifyTimelineChanged(Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED); assertThat(latch.await(LONG_TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(timelineRef.get().getWindowCount()).isEqualTo(windowCount); + assertThat(timelineFromParamRef.get().getWindowCount()).isEqualTo(windowCount); + assertThat(timelineFromGetterRef.get().getWindowCount()).isEqualTo(windowCount); + assertThat(timelineFromOnEventsRef.get().getWindowCount()).isEqualTo(windowCount); Timeline.Window window = new Timeline.Window(); for (int i = 0; i < windowCount; i++) { - assertThat(timelineRef.get().getWindow(i, window).mediaItem.mediaId) + assertThat(timelineFromParamRef.get().getWindow(i, window).mediaItem.mediaId) + .isEqualTo(TestUtils.getMediaIdInFakeTimeline(i)); + assertThat(timelineFromGetterRef.get().getWindow(i, window).mediaItem.mediaId) + .isEqualTo(TestUtils.getMediaIdInFakeTimeline(i)); + assertThat(timelineFromOnEventsRef.get().getWindow(i, window).mediaItem.mediaId) .isEqualTo(TestUtils.getMediaIdInFakeTimeline(i)); } + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_TIMELINE_CHANGED); } @Test public void onTimelineChanged_withEmptyTimeline() throws Exception { remoteSession.getMockPlayer().createAndSetFakeTimeline(/* windowCount= */ 1); - CountDownLatch latch = new CountDownLatch(1); - AtomicReference timelineRef = new AtomicReference<>(); + MediaController controller = controllerTestRule.createController(remoteSession.getToken()); + CountDownLatch latch = new CountDownLatch(2); + AtomicReference timelineFromParamRef = new AtomicReference<>(); + AtomicReference timelineFromGetterRef = new AtomicReference<>(); + AtomicReference timelineFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { - timelineRef.set(timeline); + timelineFromParamRef.set(timeline); + timelineFromGetterRef.set(controller.getCurrentTimeline()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + timelineFromOnEventsRef.set(player.getCurrentTimeline()); latch.countDown(); } }; - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); remoteSession.getMockPlayer().setTimeline(Timeline.EMPTY); @@ -785,8 +941,13 @@ public void onTimelineChanged( .notifyTimelineChanged(Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(timelineRef.get().getWindowCount()).isEqualTo(0); - assertThat(timelineRef.get().getPeriodCount()).isEqualTo(0); + assertThat(timelineFromParamRef.get().getWindowCount()).isEqualTo(0); + assertThat(timelineFromParamRef.get().getPeriodCount()).isEqualTo(0); + assertThat(timelineFromGetterRef.get().getWindowCount()).isEqualTo(0); + assertThat(timelineFromGetterRef.get().getPeriodCount()).isEqualTo(0); + assertThat(timelineFromOnEventsRef.get().getWindowCount()).isEqualTo(0); + assertThat(timelineFromOnEventsRef.get().getPeriodCount()).isEqualTo(0); + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_TIMELINE_CHANGED); } /** This also tests {@link MediaController#getPlaylistMetadata()}. */ @@ -795,7 +956,9 @@ public void onPlaylistMetadataChanged() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); AtomicReference metadataFromParamRef = new AtomicReference<>(); AtomicReference metadataFromGetterRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference metadataFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -804,6 +967,13 @@ public void onPlaylistMetadataChanged(MediaMetadata metadata) { metadataFromGetterRef.set(controller.getPlaylistMetadata()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + metadataFromOnEventsRef.set(player.getPlaylistMetadata()); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -815,6 +985,8 @@ public void onPlaylistMetadataChanged(MediaMetadata metadata) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(metadataFromParamRef.get()).isEqualTo(playlistMetadata); assertThat(metadataFromGetterRef.get()).isEqualTo(playlistMetadata); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_PLAYLIST_METADATA_CHANGED); } /** This also tests {@link MediaController#getTrackSelectionParameters()}. */ @@ -822,11 +994,12 @@ public void onPlaylistMetadataChanged(MediaMetadata metadata) { public void onTrackSelectionParametersChanged() throws Exception { RemoteMediaSession.RemoteMockPlayer player = remoteSession.getMockPlayer(); player.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); AtomicReference parametersFromParamRef = new AtomicReference<>(); AtomicReference parametersFromGetterRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference parametersFromOnEventsrRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -835,6 +1008,13 @@ public void onTrackSelectionParametersChanged(TrackSelectionParameters parameter parametersFromGetterRef.set(controller.getTrackSelectionParameters()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + parametersFromOnEventsrRef.set(controller.getTrackSelectionParameters()); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -848,6 +1028,9 @@ public void onTrackSelectionParametersChanged(TrackSelectionParameters parameter assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(parametersFromParamRef.get()).isEqualTo(parameters); assertThat(parametersFromGetterRef.get()).isEqualTo(parameters); + assertThat(parametersFromOnEventsrRef.get()).isEqualTo(parameters); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED); } @Test @@ -869,7 +1052,9 @@ public void onTracksChanged() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); AtomicReference changedCurrentTracksFromParamRef = new AtomicReference<>(); AtomicReference changedCurrentTracksFromGetterRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference changedCurrentTracksFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -878,6 +1063,13 @@ public void onTracksChanged(Tracks currentTracks) { changedCurrentTracksFromGetterRef.set(controller.getCurrentTracks()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + changedCurrentTracksFromOnEventsRef.set(player.getCurrentTracks()); + latch.countDown(); + } }; AtomicReference initialCurrentTracksRef = new AtomicReference<>(); threadTestRule @@ -894,6 +1086,8 @@ public void onTracksChanged(Tracks currentTracks) { assertThat(initialCurrentTracksRef.get()).isEqualTo(Tracks.EMPTY); assertThat(changedCurrentTracksFromParamRef.get()).isEqualTo(currentTracks); assertThat(changedCurrentTracksFromGetterRef.get()).isEqualTo(currentTracks); + assertThat(changedCurrentTracksFromOnEventsRef.get()).isEqualTo(currentTracks); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_TRACKS_CHANGED); } @Test @@ -1004,13 +1198,16 @@ public void onShuffleModeEnabledChanged() throws Exception { player.setCurrentMediaItemIndex(2); player.setShuffleModeEnabled(false); player.notifyShuffleModeEnabledChanged(); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicBoolean shuffleModeEnabledFromParamRef = new AtomicBoolean(); AtomicBoolean shuffleModeEnabledFromGetterRef = new AtomicBoolean(); AtomicInteger previousIndexRef = new AtomicInteger(); AtomicInteger nextIndexRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicBoolean onEventsShuffleModeEnabledRef = new AtomicBoolean(); + AtomicInteger onEventsPreviousIndexRef = new AtomicInteger(); + AtomicInteger onEventsNextIndexRef = new AtomicInteger(); Player.Listener listener = new Player.Listener() { @Override @@ -1021,6 +1218,15 @@ public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { nextIndexRef.set(controller.getNextMediaItemIndex()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsShuffleModeEnabledRef.set(player.getShuffleModeEnabled()); + onEventsPreviousIndexRef.set(player.getPreviousMediaItemIndex()); + onEventsNextIndexRef.set(player.getNextMediaItemIndex()); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -1030,8 +1236,13 @@ public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(shuffleModeEnabledFromParamRef.get()).isTrue(); assertThat(shuffleModeEnabledFromGetterRef.get()).isTrue(); + assertThat(onEventsShuffleModeEnabledRef.get()).isTrue(); assertThat(previousIndexRef.get()).isEqualTo(0); + assertThat(onEventsPreviousIndexRef.get()).isEqualTo(0); assertThat(nextIndexRef.get()).isEqualTo(1); + assertThat(onEventsNextIndexRef.get()).isEqualTo(1); + assertThat(getEventsAsList(eventsRef.get())) + .contains(Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED); } /** This also tests {@link MediaController#getRepeatMode()}. */ @@ -1044,35 +1255,51 @@ public void onRepeatModeChanged() throws Exception { player.setCurrentMediaItemIndex(2); player.setRepeatMode(Player.REPEAT_MODE_OFF); player.notifyRepeatModeChanged(); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicInteger repeatModeFromParamRef = new AtomicInteger(); AtomicInteger repeatModeFromGetterRef = new AtomicInteger(); AtomicInteger previousIndexRef = new AtomicInteger(); AtomicInteger nextIndexRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicInteger onEventsRepeatModeRef = new AtomicInteger(); + AtomicInteger onEventsPreviousIndexRef = new AtomicInteger(); + AtomicInteger onEventsNextIndexRef = new AtomicInteger(); Player.Listener listener = new Player.Listener() { @Override - public void onRepeatModeChanged(@RepeatMode int repeatMode) { + public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { repeatModeFromParamRef.set(repeatMode); repeatModeFromGetterRef.set(controller.getRepeatMode()); previousIndexRef.set(controller.getPreviousMediaItemIndex()); nextIndexRef.set(controller.getNextMediaItemIndex()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsRepeatModeRef.set(player.getRepeatMode()); + onEventsPreviousIndexRef.set(player.getPreviousMediaItemIndex()); + onEventsNextIndexRef.set(player.getNextMediaItemIndex()); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); + int testRepeatMode = Player.REPEAT_MODE_ALL; - int testRepeatMode = REPEAT_MODE_ALL; player.setRepeatMode(testRepeatMode); player.notifyRepeatModeChanged(); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(repeatModeFromParamRef.get()).isEqualTo(testRepeatMode); assertThat(repeatModeFromGetterRef.get()).isEqualTo(testRepeatMode); + assertThat(onEventsRepeatModeRef.get()).isEqualTo(testRepeatMode); assertThat(previousIndexRef.get()).isEqualTo(1); + assertThat(onEventsPreviousIndexRef.get()).isEqualTo(1); assertThat(nextIndexRef.get()).isEqualTo(0); + assertThat(onEventsNextIndexRef.get()).isEqualTo(0); + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_REPEAT_MODE_CHANGED); } /** This also tests {@link MediaController#getSeekBackIncrement()}. */ @@ -1080,11 +1307,12 @@ public void onRepeatModeChanged(@RepeatMode int repeatMode) { public void onSeekBackIncrementChanged() throws Exception { RemoteMediaSession.RemoteMockPlayer player = remoteSession.getMockPlayer(); player.notifySeekBackIncrementChanged(1_000); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicLong incrementFromParamRef = new AtomicLong(); AtomicLong incrementFromGetterRef = new AtomicLong(); + AtomicLong incrementFromOnEventsRef = new AtomicLong(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1093,6 +1321,13 @@ public void onSeekBackIncrementChanged(long seekBackIncrementMs) { incrementFromGetterRef.set(controller.getSeekBackIncrement()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + incrementFromOnEventsRef.set(player.getSeekBackIncrement()); + latch.countDown(); + } }; controller.addListener(listener); @@ -1102,6 +1337,9 @@ public void onSeekBackIncrementChanged(long seekBackIncrementMs) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(incrementFromParamRef.get()).isEqualTo(testSeekBackIncrementMs); assertThat(incrementFromGetterRef.get()).isEqualTo(testSeekBackIncrementMs); + assertThat(incrementFromOnEventsRef.get()).isEqualTo(testSeekBackIncrementMs); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_SEEK_BACK_INCREMENT_CHANGED); } /** This also tests {@link MediaController#getSeekForwardIncrement()}. */ @@ -1109,11 +1347,12 @@ public void onSeekBackIncrementChanged(long seekBackIncrementMs) { public void onSeekForwardIncrementChanged() throws Exception { RemoteMediaSession.RemoteMockPlayer player = remoteSession.getMockPlayer(); player.notifySeekForwardIncrementChanged(1_000); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicLong incrementFromParamRef = new AtomicLong(); AtomicLong incrementFromGetterRef = new AtomicLong(); + AtomicLong incrementFromOnEventsRef = new AtomicLong(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1122,6 +1361,13 @@ public void onSeekForwardIncrementChanged(long seekForwardIncrementMs) { incrementFromGetterRef.set(controller.getSeekForwardIncrement()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + incrementFromOnEventsRef.set(player.getSeekForwardIncrement()); + latch.countDown(); + } }; controller.addListener(listener); @@ -1131,6 +1377,9 @@ public void onSeekForwardIncrementChanged(long seekForwardIncrementMs) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(incrementFromParamRef.get()).isEqualTo(testSeekForwardIncrementMs); assertThat(incrementFromGetterRef.get()).isEqualTo(testSeekForwardIncrementMs); + assertThat(incrementFromOnEventsRef.get()).isEqualTo(testSeekForwardIncrementMs); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_SEEK_FORWARD_INCREMENT_CHANGED); } @Test @@ -1143,24 +1392,38 @@ public void onPlayWhenReadyChanged_isNotified() throws Exception { remoteSession .getMockPlayer() .setPlayWhenReady(false, Player.PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(2); - AtomicBoolean playWhenReadyRef = new AtomicBoolean(); - AtomicInteger playWhenReadyReasonRef = new AtomicInteger(); - AtomicInteger playbackSuppressionReasonRef = new AtomicInteger(); + CountDownLatch latch = new CountDownLatch(3); + AtomicBoolean playWhenReadyParamRef = new AtomicBoolean(); + AtomicBoolean playWhenReadyGetterRef = new AtomicBoolean(); + AtomicInteger playWhenReadyReasonParamRef = new AtomicInteger(); + AtomicInteger playbackSuppressionReasonParamRef = new AtomicInteger(); + AtomicInteger playbackSuppressionReasonGetterRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicBoolean onEventsPlayWhenReadyRef = new AtomicBoolean(); + AtomicInteger onEventsPlaybackSuppressionReasonRef = new AtomicInteger(); Player.Listener listener = new Player.Listener() { @Override public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { - playWhenReadyRef.set(playWhenReady); - playWhenReadyReasonRef.set(reason); + playWhenReadyParamRef.set(playWhenReady); + playWhenReadyGetterRef.set(controller.getPlayWhenReady()); + playWhenReadyReasonParamRef.set(reason); latch.countDown(); } @Override public void onPlaybackSuppressionReasonChanged(int playbackSuppressionReason) { - playbackSuppressionReasonRef.set(playbackSuppressionReason); + playbackSuppressionReasonParamRef.set(playbackSuppressionReason); + playbackSuppressionReasonGetterRef.set(controller.getPlaybackSuppressionReason()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsPlayWhenReadyRef.set(player.getPlayWhenReady()); + onEventsPlaybackSuppressionReasonRef.set(player.getPlaybackSuppressionReason()); latch.countDown(); } }; @@ -1169,9 +1432,16 @@ public void onPlaybackSuppressionReasonChanged(int playbackSuppressionReason) { remoteSession.getMockPlayer().notifyPlayWhenReadyChanged(testPlayWhenReady, testReason); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(playWhenReadyRef.get()).isEqualTo(testPlayWhenReady); - assertThat(playWhenReadyReasonRef.get()).isEqualTo(testReason); - assertThat(playbackSuppressionReasonRef.get()).isEqualTo(testSuppressionReason); + assertThat(playWhenReadyParamRef.get()).isEqualTo(testPlayWhenReady); + assertThat(playWhenReadyGetterRef.get()).isEqualTo(testPlayWhenReady); + assertThat(onEventsPlayWhenReadyRef.get()).isEqualTo(testPlayWhenReady); + assertThat(playWhenReadyReasonParamRef.get()).isEqualTo(testReason); + assertThat(playbackSuppressionReasonParamRef.get()).isEqualTo(testSuppressionReason); + assertThat(playbackSuppressionReasonGetterRef.get()).isEqualTo(testSuppressionReason); + assertThat(onEventsPlaybackSuppressionReasonRef.get()).isEqualTo(testSuppressionReason); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly( + Player.EVENT_PLAY_WHEN_READY_CHANGED, Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED); } @Test @@ -1188,10 +1458,8 @@ public void onPlayWhenReadyChanged_updatesGetters() throws Exception { long testTotalBufferedDurationMs = 120; long testCurrentLiveOffsetMs = 10; long testContentBufferedPositionMs = 240; - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicBoolean playWhenReadyRef = new AtomicBoolean(); AtomicInteger playbackSuppressionReasonRef = new AtomicInteger(); AtomicLong currentPositionMsRef = new AtomicLong(); @@ -1201,6 +1469,16 @@ public void onPlayWhenReadyChanged_updatesGetters() throws Exception { AtomicLong totalBufferedDurationMsRef = new AtomicLong(); AtomicLong currentLiveOffsetMsRef = new AtomicLong(); AtomicLong contentBufferedPositionMsRef = new AtomicLong(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicBoolean onEventsPlayWhenReadyRef = new AtomicBoolean(); + AtomicInteger onEventsPlaybackSuppressionReasonRef = new AtomicInteger(); + AtomicLong onEventsCurrentPositionMsRef = new AtomicLong(); + AtomicLong onEventsContentPositionMsRef = new AtomicLong(); + AtomicLong onEventsBufferedPositionMsRef = new AtomicLong(); + AtomicInteger onEventsBufferedPercentageRef = new AtomicInteger(); + AtomicLong onEventsTotalBufferedDurationMsRef = new AtomicLong(); + AtomicLong onEventsCurrentLiveOffsetMsRef = new AtomicLong(); + AtomicLong onEventsContentBufferedPositionMsRef = new AtomicLong(); threadTestRule .getHandler() .postAndSync( @@ -1209,7 +1487,7 @@ public void onPlayWhenReadyChanged_updatesGetters() throws Exception { new Player.Listener() { @Override public void onPlayWhenReadyChanged( - boolean playWhenReady, @PlayWhenReadyChangeReason int reason) { + boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) { playWhenReadyRef.set(controller.getPlayWhenReady()); playbackSuppressionReasonRef.set(controller.getPlaybackSuppressionReason()); currentPositionMsRef.set(controller.getCurrentPosition()); @@ -1221,7 +1499,25 @@ public void onPlayWhenReadyChanged( contentBufferedPositionMsRef.set(controller.getContentBufferedPosition()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsPlayWhenReadyRef.set(player.getPlayWhenReady()); + onEventsPlaybackSuppressionReasonRef.set( + player.getPlaybackSuppressionReason()); + onEventsCurrentPositionMsRef.set(player.getCurrentPosition()); + onEventsContentPositionMsRef.set(player.getContentPosition()); + onEventsBufferedPositionMsRef.set(player.getBufferedPosition()); + onEventsBufferedPercentageRef.set(player.getBufferedPercentage()); + onEventsTotalBufferedDurationMsRef.set(player.getTotalBufferedDuration()); + onEventsCurrentLiveOffsetMsRef.set(player.getCurrentLiveOffset()); + onEventsContentBufferedPositionMsRef.set( + player.getContentBufferedPosition()); + latch.countDown(); + } })); + remoteSession.getMockPlayer().setCurrentPosition(testCurrentPositionMs); remoteSession.getMockPlayer().setContentPosition(testContentPositionMs); remoteSession.getMockPlayer().setBufferedPosition(testBufferedPositionMs); @@ -1233,13 +1529,22 @@ public void onPlayWhenReadyChanged( assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playWhenReadyRef.get()).isEqualTo(testPlayWhenReady); + assertThat(onEventsPlayWhenReadyRef.get()).isEqualTo(testPlayWhenReady); assertThat(playbackSuppressionReasonRef.get()).isEqualTo(testReason); + assertThat(onEventsPlaybackSuppressionReasonRef.get()).isEqualTo(testReason); assertThat(currentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); + assertThat(onEventsCurrentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); assertThat(bufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); + assertThat(onEventsBufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); assertThat(bufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); + assertThat(onEventsBufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); assertThat(totalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); + assertThat(onEventsTotalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); assertThat(currentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); + assertThat(onEventsCurrentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); assertThat(contentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(onEventsContentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(getEventsAsList(eventsRef.get())).contains(Player.EVENT_PLAY_WHEN_READY_CHANGED); } @Test @@ -1250,15 +1555,25 @@ public void onPlaybackSuppressionReasonChanged_isNotified() throws Exception { remoteSession .getMockPlayer() .setPlayWhenReady(testPlayWhenReady, Player.PLAYBACK_SUPPRESSION_REASON_NONE); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); - AtomicInteger playbackSuppressionReasonRef = new AtomicInteger(); + CountDownLatch latch = new CountDownLatch(2); + AtomicInteger playbackSuppressionReasonParamRef = new AtomicInteger(); + AtomicInteger playbackSuppressionReasonGetterRef = new AtomicInteger(); + AtomicInteger playbackSuppressionReasonOnEventsRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onPlaybackSuppressionReasonChanged(int reason) { - playbackSuppressionReasonRef.set(reason); + playbackSuppressionReasonParamRef.set(reason); + playbackSuppressionReasonGetterRef.set(controller.getPlaybackSuppressionReason()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + playbackSuppressionReasonOnEventsRef.set(player.getPlaybackSuppressionReason()); latch.countDown(); } }; @@ -1267,7 +1582,11 @@ public void onPlaybackSuppressionReasonChanged(int reason) { remoteSession.getMockPlayer().notifyPlayWhenReadyChanged(testPlayWhenReady, testReason); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(playbackSuppressionReasonRef.get()).isEqualTo(testReason); + assertThat(playbackSuppressionReasonParamRef.get()).isEqualTo(testReason); + assertThat(playbackSuppressionReasonGetterRef.get()).isEqualTo(testReason); + assertThat(playbackSuppressionReasonOnEventsRef.get()).isEqualTo(testReason); + assertThat(getEventsAsList(eventsRef.get())) + .contains(Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED); } @Test @@ -1285,9 +1604,8 @@ public void onPlaybackSuppressionReasonChanged_updatesGetters() throws Exception remoteSession .getMockPlayer() .setPlayWhenReady(testPlayWhenReady, Player.PLAYBACK_SUPPRESSION_REASON_NONE); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicInteger playbackSuppressionReasonRef = new AtomicInteger(); AtomicLong currentPositionMsRef = new AtomicLong(); AtomicLong contentPositionMsRef = new AtomicLong(); @@ -1296,6 +1614,15 @@ public void onPlaybackSuppressionReasonChanged_updatesGetters() throws Exception AtomicLong totalBufferedDurationMsRef = new AtomicLong(); AtomicLong currentLiveOffsetMsRef = new AtomicLong(); AtomicLong contentBufferedPositionMsRef = new AtomicLong(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicInteger onEventsPlaybackSuppressionReasonRef = new AtomicInteger(); + AtomicLong onEventsCurrentPositionMsRef = new AtomicLong(); + AtomicLong onEventsContentPositionMsRef = new AtomicLong(); + AtomicLong onEventsBufferedPositionMsRef = new AtomicLong(); + AtomicInteger onEventsBufferedPercentageRef = new AtomicInteger(); + AtomicLong onEventsTotalBufferedDurationMsRef = new AtomicLong(); + AtomicLong onEventsCurrentLiveOffsetMsRef = new AtomicLong(); + AtomicLong onEventsContentBufferedPositionMsRef = new AtomicLong(); Player.Listener listener = new Player.Listener() { @Override @@ -1310,6 +1637,20 @@ public void onPlaybackSuppressionReasonChanged(int reason) { contentBufferedPositionMsRef.set(controller.getContentBufferedPosition()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsPlaybackSuppressionReasonRef.set(player.getPlaybackSuppressionReason()); + onEventsCurrentPositionMsRef.set(player.getCurrentPosition()); + onEventsContentPositionMsRef.set(player.getContentPosition()); + onEventsBufferedPositionMsRef.set(player.getBufferedPosition()); + onEventsBufferedPercentageRef.set(player.getBufferedPercentage()); + onEventsTotalBufferedDurationMsRef.set(player.getTotalBufferedDuration()); + onEventsCurrentLiveOffsetMsRef.set(player.getCurrentLiveOffset()); + onEventsContentBufferedPositionMsRef.set(player.getContentBufferedPosition()); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -1324,28 +1665,48 @@ public void onPlaybackSuppressionReasonChanged(int reason) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playbackSuppressionReasonRef.get()).isEqualTo(testReason); + assertThat(onEventsPlaybackSuppressionReasonRef.get()).isEqualTo(testReason); assertThat(currentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); + assertThat(onEventsCurrentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); assertThat(contentPositionMsRef.get()).isEqualTo(testContentPositionMs); + assertThat(onEventsContentPositionMsRef.get()).isEqualTo(testContentPositionMs); assertThat(bufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); + assertThat(onEventsBufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); assertThat(bufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); + assertThat(onEventsBufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); assertThat(totalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); + assertThat(onEventsTotalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); assertThat(currentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); + assertThat(onEventsCurrentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); assertThat(contentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(onEventsContentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(getEventsAsList(eventsRef.get())) + .contains(Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED); } @Test public void onPlaybackStateChanged_isNotified() throws Exception { - @Player.State int testPlaybackState = STATE_BUFFERING; + @Player.State int testPlaybackState = Player.EVENT_PLAYER_ERROR; remoteSession.getMockPlayer().notifyPlaybackStateChanged(Player.STATE_IDLE); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); - AtomicInteger playbackStateRef = new AtomicInteger(); + CountDownLatch latch = new CountDownLatch(2); + AtomicInteger playbackStateParamRef = new AtomicInteger(); + AtomicInteger playbackStateGetterRef = new AtomicInteger(); + AtomicInteger playbackStateOnEventsRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onPlaybackStateChanged(int playbackState) { - playbackStateRef.set(playbackState); + playbackStateParamRef.set(playbackState); + playbackStateGetterRef.set(controller.getPlaybackState()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + playbackStateOnEventsRef.set(player.getPlaybackState()); latch.countDown(); } }; @@ -1354,12 +1715,16 @@ public void onPlaybackStateChanged(int playbackState) { remoteSession.getMockPlayer().notifyPlaybackStateChanged(testPlaybackState); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(playbackStateRef.get()).isEqualTo(testPlaybackState); + assertThat(playbackStateParamRef.get()).isEqualTo(testPlaybackState); + assertThat(playbackStateGetterRef.get()).isEqualTo(testPlaybackState); + assertThat(playbackStateOnEventsRef.get()).isEqualTo(testPlaybackState); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_STATE_CHANGED); } @Test public void onPlaybackStateChanged_updatesGetters() throws Exception { - @Player.State int testPlaybackState = STATE_BUFFERING; + @Player.State int testPlaybackState = Player.EVENT_PLAYER_ERROR; long testCurrentPositionMs = 11; long testContentPositionMs = 33; long testBufferedPositionMs = 100; @@ -1368,10 +1733,10 @@ public void onPlaybackStateChanged_updatesGetters() throws Exception { long testCurrentLiveOffsetMs = 10; long testContentBufferedPositionMs = 240; remoteSession.getMockPlayer().notifyPlaybackStateChanged(Player.STATE_IDLE); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); - AtomicInteger playbackStateRef = new AtomicInteger(); + CountDownLatch latch = new CountDownLatch(2); + AtomicInteger playbackStateParamRef = new AtomicInteger(); + AtomicInteger playbackStateGetterRef = new AtomicInteger(); AtomicLong currentPositionMsRef = new AtomicLong(); AtomicLong contentPositionMsRef = new AtomicLong(); AtomicLong bufferedPositionMsRef = new AtomicLong(); @@ -1379,11 +1744,21 @@ public void onPlaybackStateChanged_updatesGetters() throws Exception { AtomicLong totalBufferedDurationMsRef = new AtomicLong(); AtomicLong currentLiveOffsetMsRef = new AtomicLong(); AtomicLong contentBufferedPositionMsRef = new AtomicLong(); + AtomicReference eventsRef = new AtomicReference<>(); + AtomicInteger onEventsPlaybackStateRef = new AtomicInteger(); + AtomicLong onEventsCurrentPositionMsRef = new AtomicLong(); + AtomicLong onEventsContentPositionMsRef = new AtomicLong(); + AtomicLong onEventsBufferedPositionMsRef = new AtomicLong(); + AtomicInteger onEventsBufferedPercentageRef = new AtomicInteger(); + AtomicLong onEventsTotalBufferedDurationMsRef = new AtomicLong(); + AtomicLong onEventsCurrentLiveOffsetMsRef = new AtomicLong(); + AtomicLong onEventsContentBufferedPositionMsRef = new AtomicLong(); Player.Listener listener = new Player.Listener() { @Override public void onPlaybackStateChanged(int playbackState) { - playbackStateRef.set(controller.getPlaybackState()); + playbackStateParamRef.set(playbackState); + playbackStateGetterRef.set(controller.getPlaybackState()); currentPositionMsRef.set(controller.getCurrentPosition()); contentPositionMsRef.set(controller.getContentPosition()); bufferedPositionMsRef.set(controller.getBufferedPosition()); @@ -1393,6 +1768,20 @@ public void onPlaybackStateChanged(int playbackState) { contentBufferedPositionMsRef.set(controller.getContentBufferedPosition()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + onEventsPlaybackStateRef.set(player.getPlaybackState()); + onEventsCurrentPositionMsRef.set(player.getCurrentPosition()); + onEventsContentPositionMsRef.set(player.getContentPosition()); + onEventsBufferedPositionMsRef.set(player.getBufferedPosition()); + onEventsBufferedPercentageRef.set(player.getBufferedPercentage()); + onEventsTotalBufferedDurationMsRef.set(player.getTotalBufferedDuration()); + onEventsCurrentLiveOffsetMsRef.set(player.getCurrentLiveOffset()); + onEventsContentBufferedPositionMsRef.set(player.getContentBufferedPosition()); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -1406,38 +1795,62 @@ public void onPlaybackStateChanged(int playbackState) { remoteSession.getMockPlayer().notifyPlaybackStateChanged(testPlaybackState); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(playbackStateRef.get()).isEqualTo(testPlaybackState); + assertThat(playbackStateParamRef.get()).isEqualTo(testPlaybackState); + assertThat(playbackStateGetterRef.get()).isEqualTo(testPlaybackState); + assertThat(onEventsPlaybackStateRef.get()).isEqualTo(testPlaybackState); assertThat(currentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); + assertThat(onEventsCurrentPositionMsRef.get()).isEqualTo(testCurrentPositionMs); assertThat(contentPositionMsRef.get()).isEqualTo(testContentPositionMs); + assertThat(onEventsContentPositionMsRef.get()).isEqualTo(testContentPositionMs); assertThat(bufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); + assertThat(onEventsBufferedPositionMsRef.get()).isEqualTo(testBufferedPositionMs); assertThat(bufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); + assertThat(onEventsBufferedPercentageRef.get()).isEqualTo(testBufferedPercentage); assertThat(totalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); + assertThat(onEventsTotalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); assertThat(currentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); + assertThat(onEventsCurrentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); assertThat(contentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(onEventsContentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_STATE_CHANGED); } @Test public void onIsPlayingChanged_isNotified() throws Exception { boolean testIsPlaying = true; remoteSession.getMockPlayer().notifyIsPlayingChanged(false); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); - AtomicBoolean isPlayingRef = new AtomicBoolean(); + CountDownLatch latch = new CountDownLatch(2); + AtomicBoolean isPlayingGetterRef = new AtomicBoolean(); + AtomicBoolean isPlayingParamRef = new AtomicBoolean(); + AtomicBoolean isPlayingOnEventsRef = new AtomicBoolean(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onIsPlayingChanged(boolean isPlaying) { - isPlayingRef.set(isPlaying); + isPlayingGetterRef.set(controller.isPlaying()); + isPlayingParamRef.set(isPlaying); latch.countDown(); } - }; + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + isPlayingOnEventsRef.set(player.isPlaying()); + latch.countDown(); + } + }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); remoteSession.getMockPlayer().notifyIsPlayingChanged(testIsPlaying); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(isPlayingRef.get()).isEqualTo(testIsPlaying); + assertThat(isPlayingParamRef.get()).isEqualTo(testIsPlaying); + assertThat(isPlayingGetterRef.get()).isEqualTo(testIsPlaying); + assertThat(isPlayingOnEventsRef.get()).isEqualTo(testIsPlaying); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_IS_PLAYING_CHANGED); } @Test @@ -1451,11 +1864,9 @@ public void onIsPlayingChanged_updatesGetters() throws Exception { long testCurrentLiveOffsetMs = 10; long testContentBufferedPositionMs = 240; remoteSession.getMockPlayer().notifyIsPlayingChanged(false); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); threadTestRule.getHandler().postAndSync(() -> controller.setTimeDiffMs(/* timeDiff= */ 0L)); - - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicBoolean isPlayingRef = new AtomicBoolean(); AtomicLong currentPositionMsRef = new AtomicLong(); AtomicLong contentPositionMsRef = new AtomicLong(); @@ -1464,6 +1875,7 @@ public void onIsPlayingChanged_updatesGetters() throws Exception { AtomicLong totalBufferedDurationMsRef = new AtomicLong(); AtomicLong currentLiveOffsetMsRef = new AtomicLong(); AtomicLong contentBufferedPositionMsRef = new AtomicLong(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1478,6 +1890,12 @@ public void onIsPlayingChanged(boolean isPlaying) { contentBufferedPositionMsRef.set(controller.getContentBufferedPosition()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -1499,17 +1917,19 @@ public void onIsPlayingChanged(boolean isPlaying) { assertThat(totalBufferedDurationMsRef.get()).isEqualTo(testTotalBufferedDurationMs); assertThat(currentLiveOffsetMsRef.get()).isEqualTo(testCurrentLiveOffsetMs); assertThat(contentBufferedPositionMsRef.get()).isEqualTo(testContentBufferedPositionMs); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_IS_PLAYING_CHANGED); } @Test public void onIsLoadingChanged_isNotified() throws Exception { boolean testIsLoading = true; remoteSession.getMockPlayer().notifyIsLoadingChanged(false); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicBoolean isLoadingFromParamRef = new AtomicBoolean(); AtomicBoolean isLoadingFromGetterRef = new AtomicBoolean(); + AtomicBoolean isLoadingOnEventsRef = new AtomicBoolean(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1518,6 +1938,13 @@ public void onIsLoadingChanged(boolean isLoading) { isLoadingFromGetterRef.set(controller.isLoading()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + isLoadingOnEventsRef.set(player.isLoading()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -1526,6 +1953,8 @@ public void onIsLoadingChanged(boolean isLoading) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(isLoadingFromParamRef.get()).isEqualTo(testIsLoading); assertThat(isLoadingFromGetterRef.get()).isEqualTo(testIsLoading); + assertThat(isLoadingOnEventsRef.get()).isEqualTo(testIsLoading); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_IS_LOADING_CHANGED); } @Test @@ -1552,23 +1981,31 @@ public void onPositionDiscontinuity_isNotified() throws Exception { /* contentPositionMs= */ 0L, /* adGroupIndex= */ C.INDEX_UNSET, /* adIndexInAdGroup= */ C.INDEX_UNSET); - @DiscontinuityReason int testReason = Player.DISCONTINUITY_REASON_INTERNAL; - + @Player.DiscontinuityReason int testReason = Player.DISCONTINUITY_REASON_INTERNAL; MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference oldPositionRef = new AtomicReference<>(); AtomicReference newPositionRef = new AtomicReference<>(); AtomicInteger positionDiscontinuityReasonRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onPositionDiscontinuity( - PositionInfo oldPosition, PositionInfo newPosition, @DiscontinuityReason int reason) { + PositionInfo oldPosition, + PositionInfo newPosition, + @Player.DiscontinuityReason int reason) { oldPositionRef.set(oldPosition); newPositionRef.set(newPosition); positionDiscontinuityReasonRef.set(reason); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -1580,6 +2017,8 @@ public void onPositionDiscontinuity( assertThat(positionDiscontinuityReasonRef.get()).isEqualTo(testReason); assertThat(oldPositionRef.get()).isEqualTo(testOldPosition); assertThat(newPositionRef.get()).isEqualTo(testNewPosition); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); } @Test @@ -1609,7 +2048,7 @@ public void onPositionDiscontinuity_updatesGetters() throws Exception { testCurrentAdIndexInAdGroup); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicLong currentPositionMsRef = new AtomicLong(); AtomicLong contentPositionMsRef = new AtomicLong(); AtomicLong durationMsRef = new AtomicLong(); @@ -1622,11 +2061,14 @@ public void onPositionDiscontinuity_updatesGetters() throws Exception { AtomicBoolean isPlayingAdRef = new AtomicBoolean(); AtomicInteger currentAdGroupIndexRef = new AtomicInteger(); AtomicInteger currentAdIndexInAdGroupRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onPositionDiscontinuity( - PositionInfo oldPosition, PositionInfo newPosition, @DiscontinuityReason int reason) { + PositionInfo oldPosition, + PositionInfo newPosition, + @Player.DiscontinuityReason int reason) { currentPositionMsRef.set(controller.getCurrentPosition()); contentPositionMsRef.set(controller.getContentPosition()); durationMsRef.set(controller.getDuration()); @@ -1641,6 +2083,12 @@ public void onPositionDiscontinuity( currentAdIndexInAdGroupRef.set(controller.getCurrentAdIndexInAdGroup()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -1675,6 +2123,8 @@ public void onPositionDiscontinuity( assertThat(isPlayingAdRef.get()).isEqualTo(testIsPlayingAd); assertThat(currentAdGroupIndexRef.get()).isEqualTo(testCurrentAdGroupIndex); assertThat(currentAdIndexInAdGroupRef.get()).isEqualTo(testCurrentAdIndexInAdGroup); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); } /** This also tests {@link MediaController#getAvailableSessionCommands()}. */ @@ -1700,7 +2150,7 @@ public void onAvailableSessionCommandsChanged( SessionCommands commands = new SessionCommands.Builder() .addAllSessionCommands() - .remove(COMMAND_CODE_SESSION_SET_RATING) + .remove(SessionCommand.COMMAND_CODE_SESSION_SET_RATING) .build(); remoteSession.setAvailableCommands(commands, Player.Commands.EMPTY); @@ -1717,10 +2167,11 @@ public void onAvailableCommandsChanged_isCalledByPlayerChange() throws Exception MediaController controller = controllerTestRule.createController( remoteSession.getToken(), /* connectionHints= */ null, /* listener= */ null); - AtomicReference availableCommandsFromParamRef = new AtomicReference<>(); AtomicReference availableCommandsFromGetterRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference availableCommandsOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -1729,15 +2180,24 @@ public void onAvailableCommandsChanged(Commands availableCommands) { availableCommandsFromGetterRef.set(controller.getAvailableCommands()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + availableCommandsOnEventsRef.set(player.getAvailableCommands()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); - Commands commandsWithSetRepeat = createPlayerCommandsWith(COMMAND_SET_REPEAT_MODE); + Commands commandsWithSetRepeat = createPlayerCommandsWith(Player.COMMAND_SET_REPEAT_MODE); remoteSession.getMockPlayer().notifyAvailableCommandsChanged(commandsWithSetRepeat); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(availableCommandsFromParamRef.get()).isEqualTo(commandsWithSetRepeat); assertThat(availableCommandsFromGetterRef.get()).isEqualTo(commandsWithSetRepeat); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_AVAILABLE_COMMANDS_CHANGED); } @Test @@ -1750,11 +2210,13 @@ public void onTimelineChanged_emptyMediaItemAndMediaMetadata_whenCommandUnavaila new RemoteMediaSession.MockPlayerConfigBuilder().setTimeline(testTimeline).build(); remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(3); AtomicReference timelineFromParamRef = new AtomicReference<>(); AtomicReference timelineFromGetterRef = new AtomicReference<>(); + List onEventsTimelines = new ArrayList<>(); AtomicReference metadataFromGetterRef = new AtomicReference<>(); AtomicReference currentMediaItemGetterRef = new AtomicReference<>(); + List eventsList = new ArrayList<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1765,6 +2227,14 @@ public void onTimelineChanged(Timeline timeline, int reason) { currentMediaItemGetterRef.set(controller.getCurrentMediaItem()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + // onEvents is called twice. + onEventsTimelines.add(player.getCurrentTimeline()); + eventsList.add(events); + latch.countDown(); + } }; controller.addListener(listener); @@ -1790,8 +2260,21 @@ public void onTimelineChanged(Timeline timeline, int reason) { .mediaItem) .isEqualTo(MediaItem.EMPTY); } + assertThat(onEventsTimelines).hasSize(2); + for (int i = 0; i < onEventsTimelines.get(1).getWindowCount(); i++) { + assertThat( + onEventsTimelines + .get(1) + .getWindow(/* windowIndex= */ i, new Timeline.Window()) + .mediaItem) + .isEqualTo(MediaItem.EMPTY); + } assertThat(metadataFromGetterRef.get()).isEqualTo(MediaMetadata.EMPTY); assertThat(currentMediaItemGetterRef.get()).isEqualTo(MediaItem.EMPTY); + assertThat(eventsList).hasSize(2); + assertThat(getEventsAsList(eventsList.get(0))) + .containsExactly(Player.EVENT_AVAILABLE_COMMANDS_CHANGED); + assertThat(getEventsAsList(eventsList.get(1))).contains(Player.EVENT_TIMELINE_CHANGED); } @Test @@ -1804,11 +2287,12 @@ public void onTimelineChanged_emptyMediaItemAndMediaMetadata_whenCommandUnavaila new RemoteMediaSession.MockPlayerConfigBuilder().setTimeline(testTimeline).build(); remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(3); AtomicReference timelineFromParamRef = new AtomicReference<>(); AtomicReference timelineFromGetterRef = new AtomicReference<>(); AtomicReference metadataFromGetterRef = new AtomicReference<>(); AtomicReference currentMediaItemGetterRef = new AtomicReference<>(); + List eventsList = new ArrayList<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1819,6 +2303,13 @@ public void onTimelineChanged(Timeline timeline, int reason) { currentMediaItemGetterRef.set(controller.getCurrentMediaItem()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + // onEvents is called twice. + eventsList.add(events); + latch.countDown(); + } }; controller.addListener(listener); @@ -1846,6 +2337,10 @@ public void onTimelineChanged(Timeline timeline, int reason) { } assertThat(metadataFromGetterRef.get()).isEqualTo(MediaMetadata.EMPTY); assertThat(currentMediaItemGetterRef.get()).isEqualTo(MediaItem.EMPTY); + assertThat(eventsList).hasSize(2); + assertThat(getEventsAsList(eventsList.get(0))) + .containsExactly(Player.EVENT_AVAILABLE_COMMANDS_CHANGED); + assertThat(getEventsAsList(eventsList.get(1))).contains(Player.EVENT_TIMELINE_CHANGED); } /** This also tests {@link MediaController#getAvailableCommands()}. */ @@ -1856,10 +2351,11 @@ public void onAvailableCommandsChanged_isCalledBySessionChange() throws Exceptio MediaController controller = controllerTestRule.createController( remoteSession.getToken(), /* connectionHints= */ null, /* listener= */ null); - - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference availableCommandsFromParamRef = new AtomicReference<>(); AtomicReference availableCommandsFromGetterRef = new AtomicReference<>(); + AtomicReference availableCommandsFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1868,15 +2364,25 @@ public void onAvailableCommandsChanged(Commands availableCommands) { availableCommandsFromGetterRef.set(controller.getAvailableCommands()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + availableCommandsFromOnEventsRef.set(player.getAvailableCommands()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); - Commands commandsWithSetRepeat = createPlayerCommandsWith(COMMAND_SET_REPEAT_MODE); + Commands commandsWithSetRepeat = createPlayerCommandsWith(Player.COMMAND_SET_REPEAT_MODE); remoteSession.setAvailableCommands(SessionCommands.EMPTY, commandsWithSetRepeat); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(availableCommandsFromParamRef.get()).isEqualTo(commandsWithSetRepeat); assertThat(availableCommandsFromGetterRef.get()).isEqualTo(commandsWithSetRepeat); + assertThat(availableCommandsFromOnEventsRef.get()).isEqualTo(commandsWithSetRepeat); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_AVAILABLE_COMMANDS_CHANGED); } @Test @@ -1894,7 +2400,7 @@ public ListenableFuture onCustomCommand( assertThat(command).isEqualTo(testCommand); assertThat(TestUtils.equals(testArgs, args)).isTrue(); latch.countDown(); - return Futures.immediateFuture(new SessionResult(RESULT_SUCCESS)); + return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS)); } }; MediaController controller = @@ -1949,7 +2455,7 @@ public ListenableFuture onSetCustomLayout( receivedIconResIds.add(button.iconResId); } latch.countDown(); - return Futures.immediateFuture(new SessionResult(RESULT_SUCCESS)); + return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS)); } }; RemoteMediaSession session = createRemoteMediaSession(TEST_WITH_CUSTOM_COMMANDS); @@ -2028,11 +2534,11 @@ public void onVideoSizeChanged() throws Exception { /* height= */ 42, /* unappliedRotationDegrees= */ 90, /* pixelWidthHeightRatio= */ 1.2f); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference videoSizeFromParamRef = new AtomicReference<>(); AtomicReference videoSizeFromGetterRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -2041,6 +2547,12 @@ public void onVideoSizeChanged(VideoSize videoSize) { videoSizeFromGetterRef.set(controller.getVideoSize()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2049,6 +2561,7 @@ public void onVideoSizeChanged(VideoSize videoSize) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(videoSizeFromParamRef.get()).isEqualTo(testVideoSize); assertThat(videoSizeFromGetterRef.get()).isEqualTo(testVideoSize); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_VIDEO_SIZE_CHANGED); } @Test @@ -2058,18 +2571,26 @@ public void onAudioAttributesChanged_isCalledAndUpdatesGetter() throws Exception .setUsage(C.USAGE_MEDIA) .setContentType(C.AUDIO_CONTENT_TYPE_MOVIE) .build(); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); - AtomicReference attributesRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); + AtomicReference attributesFromGetterRef = new AtomicReference<>(); + AtomicReference attributesFromParamRef = new AtomicReference<>(); + AtomicReference attributesFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override public void onAudioAttributesChanged(AudioAttributes attributes) { - if (testAttributes.equals(attributes)) { - attributesRef.set(controller.getAudioAttributes()); - latch.countDown(); - } + attributesFromParamRef.set(attributes); + attributesFromGetterRef.set(controller.getAudioAttributes()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + attributesFromOnEventsRef.set(player.getAudioAttributes()); + eventsRef.set(events); + latch.countDown(); } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2077,7 +2598,11 @@ public void onAudioAttributesChanged(AudioAttributes attributes) { remoteSession.getMockPlayer().notifyAudioAttributesChanged(testAttributes); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(attributesRef.get()).isEqualTo(testAttributes); + assertThat(attributesFromParamRef.get()).isEqualTo(testAttributes); + assertThat(attributesFromGetterRef.get()).isEqualTo(testAttributes); + assertThat(attributesFromOnEventsRef.get()).isEqualTo(testAttributes); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_AUDIO_ATTRIBUTES_CHANGED); } @Test @@ -2103,18 +2628,17 @@ public void onCues_emptyList_whenCommandUnavailable() throws Exception { Cue testCue1 = new Cue.Builder().setText(SpannedString.valueOf("cue1")).build(); Cue testCue2 = new Cue.Builder().setText(SpannedString.valueOf("cue2")).build(); List testCues = ImmutableList.of(testCue1, testCue2); - Bundle playerConfig = new RemoteMediaSession.MockPlayerConfigBuilder() .setCurrentCues(new CueGroup(testCues, /* presentationTimeUs= */ 1_230_000)) .build(); remoteSession.setPlayer(playerConfig); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(3); List cuesFromGetter = new ArrayList<>(); List cuesFromParam = new ArrayList<>(); - + List onEventsCues = new ArrayList<>(); + List eventsList = new ArrayList<>(); Player.Listener listener = new Player.Listener() { @Override @@ -2125,6 +2649,14 @@ public void onCues(CueGroup cueGroup) { cuesFromGetter.addAll(controller.getCurrentCues().cues); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + // onEvents is called twice. + eventsList.add(events); + onEventsCues.add(player.getCurrentCues()); + latch.countDown(); + } }; controller.addListener(listener); @@ -2134,6 +2666,11 @@ public void onCues(CueGroup cueGroup) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(cuesFromParam).isEqualTo(ImmutableList.of()); assertThat(cuesFromGetter).isEqualTo(ImmutableList.of()); + assertThat(onEventsCues).hasSize(2); + assertThat(onEventsCues.get(1).cues).hasSize(0); + assertThat(getEventsAsList(eventsList.get(0))) + .containsExactly(Player.EVENT_AVAILABLE_COMMANDS_CHANGED); + assertThat(getEventsAsList(eventsList.get(1))).containsExactly(Player.EVENT_CUES); } @Test @@ -2141,11 +2678,12 @@ public void onCues_isCalledByPlayerChange() throws Exception { Cue testCue1 = new Cue.Builder().setText(SpannedString.valueOf("cue1")).build(); Cue testCue2 = new Cue.Builder().setText(SpannedString.valueOf("cue2")).build(); List testCues = ImmutableList.of(testCue1, testCue2); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); List cuesFromParam = new ArrayList<>(); List cuesFromGetter = new ArrayList<>(); - CountDownLatch latch = new CountDownLatch(1); + List cuesFromOnEvents = new ArrayList<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -2154,6 +2692,13 @@ public void onCues(CueGroup cueGroup) { cuesFromGetter.addAll(controller.getCurrentCues().cues); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + cuesFromOnEvents.addAll(player.getCurrentCues().cues); + eventsRef.set(events); + latch.countDown(); + } }; controller.addListener(listener); @@ -2166,6 +2711,8 @@ public void onCues(CueGroup cueGroup) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(cuesFromParam).isEqualTo(testCues); assertThat(cuesFromGetter).isEqualTo(testCues); + assertThat(cuesFromOnEvents).isEqualTo(testCues); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_CUES); } @Test @@ -2173,11 +2720,12 @@ public void onCues_isCalledByCuesChange() throws Exception { Cue testCue1 = new Cue.Builder().setText(SpannedString.valueOf("cue1")).build(); Cue testCue2 = new Cue.Builder().setText(SpannedString.valueOf("cue2")).build(); List testCues = ImmutableList.of(testCue1, testCue2); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); List cuesFromParam = new ArrayList<>(); List cuesFromGetter = new ArrayList<>(); - CountDownLatch latch = new CountDownLatch(1); + List cuesFromOnEvents = new ArrayList<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -2186,6 +2734,13 @@ public void onCues(CueGroup cueGroup) { cuesFromGetter.addAll(controller.getCurrentCues().cues); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + cuesFromOnEvents.addAll(player.getCurrentCues().cues); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2196,6 +2751,8 @@ public void onCues(CueGroup cueGroup) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(cuesFromParam).isEqualTo(testCues); assertThat(cuesFromGetter).isEqualTo(testCues); + assertThat(cuesFromOnEvents).isEqualTo(testCues); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_CUES); } @Test @@ -2203,7 +2760,9 @@ public void onDeviceInfoChanged_isCalledByPlayerChange() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); AtomicReference deviceInfoFromParamRef = new AtomicReference<>(); AtomicReference deviceInfoFromGetterRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference deviceInfoFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -2212,6 +2771,13 @@ public void onDeviceInfoChanged(DeviceInfo deviceInfo) { deviceInfoFromGetterRef.set(controller.getDeviceInfo()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + deviceInfoFromOnEventsRef.set(player.getDeviceInfo()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2224,6 +2790,8 @@ public void onDeviceInfoChanged(DeviceInfo deviceInfo) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceInfoFromParamRef.get()).isEqualTo(deviceInfo); assertThat(deviceInfoFromGetterRef.get()).isEqualTo(deviceInfo); + assertThat(deviceInfoFromOnEventsRef.get()).isEqualTo(deviceInfo); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_DEVICE_INFO_CHANGED); } @Test @@ -2231,7 +2799,9 @@ public void onDeviceInfoChanged_isCalledByDeviceInfoChange() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); AtomicReference deviceInfoFromParamRef = new AtomicReference<>(); AtomicReference deviceInfoFromGetterRef = new AtomicReference<>(); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference deviceInfoFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -2240,6 +2810,13 @@ public void onDeviceInfoChanged(DeviceInfo deviceInfo) { deviceInfoFromGetterRef.set(controller.getDeviceInfo()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + deviceInfoFromOnEventsRef.set(player.getDeviceInfo()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2250,6 +2827,8 @@ public void onDeviceInfoChanged(DeviceInfo deviceInfo) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceInfoFromParamRef.get()).isEqualTo(deviceInfo); assertThat(deviceInfoFromGetterRef.get()).isEqualTo(deviceInfo); + assertThat(deviceInfoFromOnEventsRef.get()).isEqualTo(deviceInfo); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_DEVICE_INFO_CHANGED); } @Test @@ -2262,11 +2841,12 @@ public void onDeviceVolumeChanged_isCalledByDeviceVolumeChange() throws Exceptio .setDeviceVolume(23) .build(); remoteSession.setPlayer(playerConfig); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); AtomicInteger deviceVolumeFromParamRef = new AtomicInteger(); AtomicInteger deviceVolumeFromGetterRef = new AtomicInteger(); - CountDownLatch latch = new CountDownLatch(1); + AtomicInteger deviceVolumeFromOnEventsRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -2275,6 +2855,13 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { deviceVolumeFromGetterRef.set(controller.getDeviceVolume()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + deviceVolumeFromOnEventsRef.set(player.getDeviceVolume()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2284,6 +2871,9 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceVolumeFromParamRef.get()).isEqualTo(targetVolume); assertThat(deviceVolumeFromGetterRef.get()).isEqualTo(targetVolume); + assertThat(deviceVolumeFromOnEventsRef.get()).isEqualTo(targetVolume); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); } @Test @@ -2291,11 +2881,12 @@ public void onDeviceVolumeChanged_isCalledByDeviceMutedChange() throws Exception Bundle playerConfig = new RemoteMediaSession.MockPlayerConfigBuilder().setDeviceMuted(false).build(); remoteSession.setPlayer(playerConfig); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); AtomicBoolean deviceMutedFromParamRef = new AtomicBoolean(); AtomicBoolean deviceMutedFromGetterRef = new AtomicBoolean(); - CountDownLatch latch = new CountDownLatch(1); + AtomicBoolean deviceMutedFromOnEventsRef = new AtomicBoolean(); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override @@ -2304,6 +2895,13 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { deviceMutedFromGetterRef.set(controller.isDeviceMuted()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + deviceMutedFromOnEventsRef.set(player.isDeviceMuted()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2312,94 +2910,174 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceMutedFromParamRef.get()).isTrue(); assertThat(deviceMutedFromGetterRef.get()).isTrue(); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); } @Test - public void onMaxSeekToPreviousPositionChanged_isCalled() throws Exception { - long testMaxSeekToPreviousPositionMs = 100L; + public void onDeviceVolumeChanged_isCalledByDecreaseDeviceVolume() throws Exception { Bundle playerConfig = - new RemoteMediaSession.MockPlayerConfigBuilder() - .setMaxSeekToPreviousPositionMs(30L) - .build(); + new RemoteMediaSession.MockPlayerConfigBuilder().setDeviceVolume(10).build(); remoteSession.setPlayer(playerConfig); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(2); - AtomicLong maxSeekToPreviousPositionMsFromParamRef = new AtomicLong(); - AtomicLong maxSeekToPreviousPositionMsFromGetterRef = new AtomicLong(); + AtomicInteger deviceVolumeFromParamRef = new AtomicInteger(); + AtomicInteger deviceVolumeFromGetterRef = new AtomicInteger(); + AtomicInteger deviceVolumeFromOnEventsRef = new AtomicInteger(); AtomicReference eventsRef = new AtomicReference<>(); - controller.addListener( + CountDownLatch latch = new CountDownLatch(2); + Player.Listener listener = new Player.Listener() { @Override - public void onMaxSeekToPreviousPositionChanged(long maxSeekToPreviousPositionMs) { - maxSeekToPreviousPositionMsFromParamRef.set(maxSeekToPreviousPositionMs); - maxSeekToPreviousPositionMsFromGetterRef.set(controller.getMaxSeekToPreviousPosition()); + public void onDeviceVolumeChanged(int volume, boolean muted) { + deviceVolumeFromParamRef.set(volume); + deviceVolumeFromGetterRef.set(controller.getDeviceVolume()); latch.countDown(); } @Override public void onEvents(Player player, Player.Events events) { + deviceVolumeFromOnEventsRef.set(player.getDeviceVolume()); eventsRef.set(events); latch.countDown(); } - }); + }; + threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); - remoteSession - .getMockPlayer() - .notifyMaxSeekToPreviousPositionChanged(testMaxSeekToPreviousPositionMs); + remoteSession.getMockPlayer().decreaseDeviceVolume(); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(maxSeekToPreviousPositionMsFromParamRef.get()) - .isEqualTo(testMaxSeekToPreviousPositionMs); - assertThat(maxSeekToPreviousPositionMsFromGetterRef.get()) - .isEqualTo(testMaxSeekToPreviousPositionMs); - assertThat(eventsRef.get().contains(Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED)) - .isTrue(); + assertThat(deviceVolumeFromParamRef.get()).isEqualTo(9); + assertThat(deviceVolumeFromGetterRef.get()).isEqualTo(9); + assertThat(deviceVolumeFromOnEventsRef.get()).isEqualTo(9); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); } @Test - public void onEvents_whenOnRepeatModeChanges_isCalledAfterOtherMethods() throws Exception { - Player.Events testEvents = - new Player.Events(new FlagSet.Builder().add(EVENT_REPEAT_MODE_CHANGED).build()); - List listenerEventCodes = new ArrayList<>(); - + public void onDeviceVolumeChanged_isCalledByIncreaseDeviceVolume() throws Exception { + Bundle playerConfig = + new RemoteMediaSession.MockPlayerConfigBuilder().setDeviceVolume(10).build(); + remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); + AtomicInteger deviceVolumeFromParamRef = new AtomicInteger(); + AtomicInteger deviceVolumeFromGetterRef = new AtomicInteger(); + AtomicInteger deviceVolumeFromOnEventsRef = new AtomicInteger(); + AtomicReference eventsRef = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(2); + Player.Listener listener = + new Player.Listener() { + @Override + public void onDeviceVolumeChanged(int volume, boolean muted) { + deviceVolumeFromParamRef.set(volume); + deviceVolumeFromGetterRef.set(controller.getDeviceVolume()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + deviceVolumeFromOnEventsRef.set(player.getDeviceVolume()); + eventsRef.set(events); + latch.countDown(); + } + }; + threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); + + remoteSession.getMockPlayer().increaseDeviceVolume(); + + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(deviceVolumeFromParamRef.get()).isEqualTo(11); + assertThat(deviceVolumeFromGetterRef.get()).isEqualTo(11); + assertThat(deviceVolumeFromOnEventsRef.get()).isEqualTo(11); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); + } + + @Test + public void onVolumeChanged() throws Exception { + Bundle playerConfig = new RemoteMediaSession.MockPlayerConfigBuilder().build(); + remoteSession.setPlayer(playerConfig); + MediaController controller = controllerTestRule.createController(remoteSession.getToken()); + AtomicReference volumeFromParamRef = new AtomicReference<>(); + AtomicReference volumeFromGetterRef = new AtomicReference<>(); + AtomicReference volumeFromOnEventsRef = new AtomicReference<>(); AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override - public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { - listenerEventCodes.add(EVENT_REPEAT_MODE_CHANGED); + public void onVolumeChanged(float volume) { + volumeFromParamRef.set(volume); + volumeFromGetterRef.set(controller.getVolume()); latch.countDown(); } @Override public void onEvents(Player player, Player.Events events) { - listenerEventCodes.add(EVENT_ON_EVENTS); + volumeFromOnEventsRef.set(player.getVolume()); eventsRef.set(events); latch.countDown(); } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); - remoteSession.getMockPlayer().setRepeatMode(REPEAT_MODE_ONE); - remoteSession.getMockPlayer().notifyRepeatModeChanged(); + + remoteSession.getMockPlayer().setVolume(0.5f); + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(volumeFromParamRef.get()).isEqualTo(0.5f); + assertThat(volumeFromGetterRef.get()).isEqualTo(0.5f); + assertThat(volumeFromOnEventsRef.get()).isEqualTo(0.5f); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_VOLUME_CHANGED); + } - assertThat(listenerEventCodes).containsExactly(EVENT_REPEAT_MODE_CHANGED, EVENT_ON_EVENTS); - assertThat(eventsRef.get()).isEqualTo(testEvents); + @Test + public void onMaxSeekToPreviousPositionChanged_isCalled() throws Exception { + long testMaxSeekToPreviousPositionMs = 100L; + Bundle playerConfig = + new RemoteMediaSession.MockPlayerConfigBuilder() + .setMaxSeekToPreviousPositionMs(30L) + .build(); + remoteSession.setPlayer(playerConfig); + MediaController controller = controllerTestRule.createController(remoteSession.getToken()); + CountDownLatch latch = new CountDownLatch(2); + AtomicLong maxSeekToPreviousPositionMsFromParamRef = new AtomicLong(); + AtomicLong maxSeekToPreviousPositionMsFromGetterRef = new AtomicLong(); + AtomicLong maxSeekToPreviousPositionMsFromOnEventsRef = new AtomicLong(); + AtomicReference eventsRef = new AtomicReference<>(); + controller.addListener( + new Player.Listener() { + @Override + public void onMaxSeekToPreviousPositionChanged(long maxSeekToPreviousPositionMs) { + maxSeekToPreviousPositionMsFromParamRef.set(maxSeekToPreviousPositionMs); + maxSeekToPreviousPositionMsFromGetterRef.set(controller.getMaxSeekToPreviousPosition()); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + maxSeekToPreviousPositionMsFromOnEventsRef.set(player.getMaxSeekToPreviousPosition()); + eventsRef.set(events); + latch.countDown(); + } + }); + + remoteSession + .getMockPlayer() + .notifyMaxSeekToPreviousPositionChanged(testMaxSeekToPreviousPositionMs); + + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(maxSeekToPreviousPositionMsFromParamRef.get()) + .isEqualTo(testMaxSeekToPreviousPositionMs); + assertThat(maxSeekToPreviousPositionMsFromGetterRef.get()) + .isEqualTo(testMaxSeekToPreviousPositionMs); + assertThat(maxSeekToPreviousPositionMsFromOnEventsRef.get()) + .isEqualTo(testMaxSeekToPreviousPositionMs); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED); } @Test public void onEvents_whenNewCommandIsCalledInsideListener_containsEventFromNewCommand() throws Exception { - Player.Events testEvents = - new Player.Events( - new FlagSet.Builder() - .addAll(EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED) - .build()); - List listenerEventCodes = new ArrayList<>(); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(3); AtomicReference eventsRef = new AtomicReference<>(); @@ -2408,97 +3086,78 @@ public void onEvents_whenNewCommandIsCalledInsideListener_containsEventFromNewCo @Override public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { controller.setShuffleModeEnabled(true); - listenerEventCodes.add(EVENT_REPEAT_MODE_CHANGED); latch.countDown(); } @Override public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - listenerEventCodes.add(EVENT_SHUFFLE_MODE_ENABLED_CHANGED); latch.countDown(); } @Override public void onEvents(Player player, Player.Events events) { - listenerEventCodes.add(EVENT_ON_EVENTS); eventsRef.set(events); latch.countDown(); } }; controller.addListener(listener); - remoteSession.getMockPlayer().setRepeatMode(REPEAT_MODE_ONE); + remoteSession.getMockPlayer().setRepeatMode(Player.REPEAT_MODE_ONE); remoteSession.getMockPlayer().notifyRepeatModeChanged(); - assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(listenerEventCodes) - .containsExactly( - EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_ON_EVENTS); - assertThat(eventsRef.get()).isEqualTo(testEvents); + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(getEventsAsList(eventsRef.get())) + .containsAtLeast( + Player.EVENT_REPEAT_MODE_CHANGED, Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED); } @Test public void onEvents_whenNewCommandIsCalledInsideOnEvents_isCalledFromNewLooperIterationSet() throws Exception { - Player.Events firstLooperIterationSetTestEvents = - new Player.Events(new FlagSet.Builder().add(EVENT_REPEAT_MODE_CHANGED).build()); - Player.Events secondLooperIterationSetTestEvents = - new Player.Events(new FlagSet.Builder().add(EVENT_SHUFFLE_MODE_ENABLED_CHANGED).build()); - List listenerEventCodes = new ArrayList<>(); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(4); - AtomicReference firstLooperIterationSetEventsRef = new AtomicReference<>(); - AtomicReference secondLooperIterationSetEventsRef = new AtomicReference<>(); + List eventsList = new ArrayList<>(); Player.Listener listener = new Player.Listener() { @Override - public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { - listenerEventCodes.add(EVENT_REPEAT_MODE_CHANGED); + public void onRepeatModeChanged(int repeatMode) { latch.countDown(); } @Override public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - listenerEventCodes.add(EVENT_SHUFFLE_MODE_ENABLED_CHANGED); latch.countDown(); } @Override public void onEvents(Player player, Player.Events events) { - listenerEventCodes.add(EVENT_ON_EVENTS); - if (!controller.getShuffleModeEnabled()) { - controller.setShuffleModeEnabled(true); - firstLooperIterationSetEventsRef.set(events); - } else { - secondLooperIterationSetEventsRef.set(events); - } + // onEvents is called twice. + eventsList.add(events); + controller.setShuffleModeEnabled(true); latch.countDown(); } }; controller.addListener(listener); - remoteSession.getMockPlayer().setRepeatMode(REPEAT_MODE_ONE); + remoteSession.getMockPlayer().setRepeatMode(Player.REPEAT_MODE_ONE); remoteSession.getMockPlayer().notifyRepeatModeChanged(); - assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(listenerEventCodes) - .containsExactly( - EVENT_REPEAT_MODE_CHANGED, - EVENT_ON_EVENTS, - EVENT_SHUFFLE_MODE_ENABLED_CHANGED, - EVENT_ON_EVENTS); - assertThat(firstLooperIterationSetEventsRef.get()).isEqualTo(firstLooperIterationSetTestEvents); - assertThat(secondLooperIterationSetEventsRef.get()) - .isEqualTo(secondLooperIterationSetTestEvents); + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(eventsList).hasSize(2); + assertThat(getEventsAsList(eventsList.get(0))) + .containsExactly(Player.EVENT_REPEAT_MODE_CHANGED); + assertThat(getEventsAsList(eventsList.get(1))) + .containsExactly(Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED); } @Test public void onMediaMetadataChanged_isNotifiedAndUpdatesGetter() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference mediaMetadataFromParamRef = new AtomicReference<>(); AtomicReference mediaMetadataFromGetterRef = new AtomicReference<>(); + AtomicReference mediaMetadataFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -2507,6 +3166,13 @@ public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { mediaMetadataFromGetterRef.set(controller.getMediaMetadata()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + mediaMetadataFromOnEventsRef.set(player.getMediaMetadata()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2516,14 +3182,19 @@ public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(mediaMetadataFromParamRef.get()).isEqualTo(testMediaMetadata); assertThat(mediaMetadataFromGetterRef.get()).isEqualTo(testMediaMetadata); + assertThat(mediaMetadataFromOnEventsRef.get()).isEqualTo(testMediaMetadata); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_MEDIA_METADATA_CHANGED); } @Test public void onMediaMetadataChanged_isCalledByPlayerChange() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference mediaMetadataFromParamRef = new AtomicReference<>(); AtomicReference mediaMetadataFromGetterRef = new AtomicReference<>(); + AtomicReference mediaMetadataFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -2532,6 +3203,13 @@ public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { mediaMetadataFromGetterRef.set(controller.getMediaMetadata()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + mediaMetadataFromOnEventsRef.set(player.getMediaMetadata()); + eventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2545,6 +3223,9 @@ public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(mediaMetadataFromParamRef.get()).isEqualTo(testMediaMetadata); assertThat(mediaMetadataFromGetterRef.get()).isEqualTo(testMediaMetadata); + assertThat(mediaMetadataFromOnEventsRef.get()).isEqualTo(testMediaMetadata); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_MEDIA_METADATA_CHANGED); } /** @@ -2559,10 +3240,11 @@ public void timelineIsPreserved_whenUnrelatedListenerMethodIsCalled() throws Exc Bundle playerConfig = new RemoteMediaSession.MockPlayerConfigBuilder().setTimeline(testTimeline).build(); remoteSession.setPlayer(playerConfig); - MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicReference timelineFromGetterRef = new AtomicReference<>(); + AtomicReference timelineFromOnEventsRef = new AtomicReference<>(); + AtomicReference eventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -2570,6 +3252,13 @@ public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { timelineFromGetterRef.set(controller.getCurrentTimeline()); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + timelineFromOnEventsRef.set(player.getCurrentTimeline()); + eventsRef.set(events); + latch.countDown(); + } }; controller.addListener(listener); @@ -2577,25 +3266,36 @@ public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { remoteSession.getMockPlayer().notifyMediaMetadataChanged(testMediaMetadata); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_MEDIA_METADATA_CHANGED); MediaTestUtils.assertMediaIdEquals(testTimeline, timelineFromGetterRef.get()); + MediaTestUtils.assertMediaIdEquals(testTimeline, timelineFromOnEventsRef.get()); } @Test public void onRenderedFirstFrame_isNotified() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + AtomicReference eventsRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(2); Player.Listener listener = new Player.Listener() { @Override public void onRenderedFirstFrame() { latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + latch.countDown(); + } }; controller.addListener(listener); remoteSession.getMockPlayer().notifyRenderedFirstFrame(); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(getEventsAsList(eventsRef.get())).containsExactly(Player.EVENT_RENDERED_FIRST_FRAME); } private void testControllerAfterSessionIsClosed(String id) throws Exception { 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 257284b47d4..e7ffef7880a 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 @@ -15,16 +15,12 @@ */ package androidx.media3.session; -import static androidx.media3.common.DeviceInfo.PLAYBACK_TYPE_LOCAL; -import static androidx.media3.common.Player.REPEAT_MODE_ALL; -import static androidx.media3.common.Player.REPEAT_MODE_ONE; -import static androidx.media3.common.Player.STATE_ENDED; -import static androidx.media3.common.Player.STATE_READY; import static androidx.media3.session.MediaTestUtils.createMediaItems; import static androidx.media3.session.MediaTestUtils.createTimeline; import static androidx.media3.test.session.common.CommonConstants.DEFAULT_TEST_NAME; import static androidx.media3.test.session.common.TestUtils.NO_RESPONSE_TIMEOUT_MS; import static androidx.media3.test.session.common.TestUtils.TIMEOUT_MS; +import static androidx.media3.test.session.common.TestUtils.getEventsAsList; import static com.google.common.truth.Truth.assertThat; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -43,8 +39,10 @@ import androidx.media3.common.Timeline; import androidx.media3.common.Timeline.Period; import androidx.media3.common.Timeline.Window; +import androidx.media3.common.TrackSelectionParameters; import androidx.media3.test.session.common.HandlerThreadTestRule; import androidx.media3.test.session.common.MainLooperTestRule; +import androidx.media3.test.session.common.TestUtils; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; @@ -161,10 +159,11 @@ public void onEvents(Player player, Player.Events events) { assertThat(playWhenReadyFromCallbackRef.get()).isEqualTo(testPlayWhenReady); assertThat(playbackSuppressionReasonFromCallbackRef.get()).isEqualTo(testReason); assertThat(isPlayingFromCallbackRef.get()).isEqualTo(testIsPlaying); - assertThat(onEventsRef.get().contains(Player.EVENT_PLAY_WHEN_READY_CHANGED)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED)) - .isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_IS_PLAYING_CHANGED)).isTrue(); + assertThat(TestUtils.getEventsAsList(onEventsRef.get())) + .containsExactly( + Player.EVENT_PLAY_WHEN_READY_CHANGED, + Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, + Player.EVENT_IS_PLAYING_CHANGED); assertThat(playWhenReadyFromGetterRef.get()).isEqualTo(testPlayWhenReady); assertThat(playbackSuppressionReasonFromGetterRef.get()).isEqualTo(testReason); assertThat(isPlayingFromGetterRef.get()).isEqualTo(testIsPlaying); @@ -208,15 +207,18 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(shuffleModeEnabledFromCallbackRef.get()).isEqualTo(testShuffleModeEnabled); - assertThat(onEventsRef.get().contains(Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED); assertThat(shuffleModeEnabledFromGetterRef.get()).isEqualTo(testShuffleModeEnabled); } @Test public void setRepeatMode() throws Exception { - int testRepeatMode = REPEAT_MODE_ALL; + int testRepeatMode = Player.REPEAT_MODE_ALL; Bundle playerConfig = - new RemoteMediaSession.MockPlayerConfigBuilder().setRepeatMode(REPEAT_MODE_ONE).build(); + new RemoteMediaSession.MockPlayerConfigBuilder() + .setRepeatMode(Player.REPEAT_MODE_ONE) + .build(); remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); @@ -250,7 +252,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(repeatModeFromCallbackRef.get()).isEqualTo(testRepeatMode); - assertThat(onEventsRef.get().contains(Player.EVENT_REPEAT_MODE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_REPEAT_MODE_CHANGED); assertThat(repeatModeFromGetterRef.get()).isEqualTo(testRepeatMode); } @@ -294,7 +297,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playbackParametersFromCallbackRef.get()).isEqualTo(testPlaybackParameters); - assertThat(onEventsRef.get().contains(Player.EVENT_PLAYBACK_PARAMETERS_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_PARAMETERS_CHANGED); assertThat(playbackParametersFromGetterRef.get()).isEqualTo(testPlaybackParameters); } @@ -338,7 +342,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playbackParametersFromCallbackRef.get().speed).isEqualTo(testPlaybackSpeed); - assertThat(onEventsRef.get().contains(Player.EVENT_PLAYBACK_PARAMETERS_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_PARAMETERS_CHANGED); assertThat(playbackParametersFromGetterRef.get().speed).isEqualTo(testPlaybackSpeed); } @@ -354,6 +359,7 @@ public void setPlaylistMetadata() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(2); AtomicReference playlistMetadataFromCallbackRef = new AtomicReference<>(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -364,6 +370,7 @@ public void onPlaylistMetadataChanged(MediaMetadata mediaMetadata) { @Override public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); latch.countDown(); } }; @@ -381,6 +388,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playlistMetadataFromCallbackRef.get()).isEqualTo(testPlaylistMetadata); assertThat(playlistMetadataFromGetterRef.get()).isEqualTo(testPlaylistMetadata); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_PLAYLIST_METADATA_CHANGED); } @Test @@ -392,6 +401,7 @@ public void setVolume() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(2); AtomicReference volumeFromCallbackRef = new AtomicReference<>(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -402,6 +412,7 @@ public void onVolumeChanged(float volume) { @Override public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); latch.countDown(); } }; @@ -419,6 +430,7 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(volumeFromCallbackRef.get()).isEqualTo(testVolume); assertThat(volumeFromGetterRef.get()).isEqualTo(testVolume); + assertThat(getEventsAsList(onEventsRef.get())).containsExactly(Player.EVENT_VOLUME_CHANGED); } @Test @@ -431,6 +443,7 @@ public void setDeviceVolume() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(2); AtomicInteger deviceVolumeFromCallbackRef = new AtomicInteger(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -441,6 +454,7 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { @Override public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); latch.countDown(); } }; @@ -458,6 +472,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceVolumeFromCallbackRef.get()).isEqualTo(testDeviceVolume); assertThat(deviceVolumeFromGetterRef.get()).isEqualTo(testDeviceVolume); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); } @Test @@ -467,13 +483,15 @@ public void increaseDeviceVolume() throws Exception { new RemoteMediaSession.MockPlayerConfigBuilder() .setDeviceVolume(1) .setDeviceInfo( - new DeviceInfo(PLAYBACK_TYPE_LOCAL, /* minVolume= */ 0, /* maxVolume= */ 2)) + new DeviceInfo( + DeviceInfo.PLAYBACK_TYPE_LOCAL, /* minVolume= */ 0, /* maxVolume= */ 2)) .build(); remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(2); AtomicInteger deviceVolumeFromCallbackRef = new AtomicInteger(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -484,6 +502,7 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { @Override public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); latch.countDown(); } }; @@ -501,6 +520,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceVolumeFromCallbackRef.get()).isEqualTo(testDeviceVolume); assertThat(deviceVolumeFromGetterRef.get()).isEqualTo(testDeviceVolume); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); } @Test @@ -513,6 +534,7 @@ public void decreaseDeviceVolume() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(2); AtomicInteger deviceVolumeFromCallbackRef = new AtomicInteger(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -523,6 +545,7 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { @Override public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); latch.countDown(); } }; @@ -540,6 +563,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceVolumeFromCallbackRef.get()).isEqualTo(testDeviceVolume); assertThat(deviceVolumeFromGetterRef.get()).isEqualTo(testDeviceVolume); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); } @Test @@ -552,6 +577,7 @@ public void setDeviceMuted() throws Exception { MediaController controller = controllerTestRule.createController(remoteSession.getToken()); CountDownLatch latch = new CountDownLatch(2); AtomicBoolean deviceMutedFromCallbackRef = new AtomicBoolean(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -562,6 +588,7 @@ public void onDeviceVolumeChanged(int volume, boolean muted) { @Override public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); latch.countDown(); } }; @@ -579,6 +606,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(deviceMutedFromCallbackRef.get()).isEqualTo(testDeviceMuted); assertThat(deviceMutedFromGetterRef.get()).isEqualTo(testDeviceMuted); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_DEVICE_VOLUME_CHANGED); } @Test @@ -628,11 +657,57 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playbackStateFromCallbackRef.get()).isEqualTo(testPlaybackState); - assertThat(onEventsRef.get().contains(Player.EVENT_PLAYBACK_STATE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_STATE_CHANGED); assertThat(playbackStateFromGetterRef.get()).isEqualTo(testPlaybackState); assertThat(playerErrorRef.get()).isNull(); } + @Test + public void setTrackSelectionParameters() throws Exception { + Context context = ApplicationProvider.getApplicationContext(); + remoteSession.setPlayer(new RemoteMediaSession.MockPlayerConfigBuilder().build()); + MediaController controller = controllerTestRule.createController(remoteSession.getToken()); + CountDownLatch latch = new CountDownLatch(2); + AtomicReference trackSelectionParametersCallbackRef = + new AtomicReference<>(); + AtomicReference trackSelectionParametersGetterRef = + new AtomicReference<>(); + AtomicReference onEventsRef = new AtomicReference<>(); + Player.Listener listener = + new Player.Listener() { + @Override + public void onTrackSelectionParametersChanged(TrackSelectionParameters parameters) { + trackSelectionParametersCallbackRef.set(parameters); + latch.countDown(); + } + + @Override + public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); + latch.countDown(); + } + }; + threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); + + threadTestRule + .getHandler() + .postAndSync( + () -> { + controller.setTrackSelectionParameters( + new TrackSelectionParameters.Builder(context).setMaxVideoBitrate(1234).build()); + trackSelectionParametersGetterRef.set(controller.getTrackSelectionParameters()); + }); + + TrackSelectionParameters expectedParameters = + new TrackSelectionParameters.Builder(context).setMaxVideoBitrate(1234).build(); + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + assertThat(trackSelectionParametersCallbackRef.get()).isEqualTo(expectedParameters); + assertThat(trackSelectionParametersGetterRef.get()).isEqualTo(expectedParameters); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED); + } + @Test public void seekToNextMediaItem() throws Exception { int initialMediaItemIndex = 1; @@ -694,8 +769,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(newMediaItemRef.get().mediaId).isEqualTo(testCurrentMediaId); assertThat(oldPositionInfoRef.get().mediaItemIndex).isEqualTo(initialMediaItemIndex); assertThat(newPositionInfoRef.get().mediaItemIndex).isEqualTo(testMediaItemIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_MEDIA_ITEM_TRANSITION)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_MEDIA_ITEM_TRANSITION, Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); } @@ -760,8 +835,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(newMediaItemRef.get().mediaId).isEqualTo(testCurrentMediaId); assertThat(oldPositionInfoRef.get().mediaItemIndex).isEqualTo(initialMediaItemIndex); assertThat(newPositionInfoRef.get().mediaItemIndex).isEqualTo(testMediaItemIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_MEDIA_ITEM_TRANSITION)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_MEDIA_ITEM_TRANSITION, Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); } @@ -827,7 +902,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newPositionInfoRef.get().positionMs).isEqualTo(testPosition); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentPositionRef.get()).isEqualTo(testPosition); assertThat(bufferedPositionRef.get()).isEqualTo(testBufferedPosition); assertThat(totalBufferedDurationRef.get()).isEqualTo(testTotalBufferedDuration); @@ -896,7 +972,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newPositionInfoRef.get().positionMs).isEqualTo(testPosition); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentPositionRef.get()).isEqualTo(testPosition); assertThat(bufferedPositionRef.get()).isEqualTo(testBufferedPosition); assertThat(totalBufferedDurationRef.get()).isEqualTo(testTotalBufferedDuration); @@ -965,7 +1042,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newPositionInfoRef.get().positionMs).isEqualTo(testPosition); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentPositionRef.get()).isEqualTo(testPosition); assertThat(bufferedPositionRef.get()).isEqualTo(testBufferedPosition); assertThat(totalBufferedDurationRef.get()).isEqualTo(testTotalBufferedDuration); @@ -1035,7 +1113,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newPositionInfoRef.get().positionMs).isEqualTo(testPosition); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); assertThat(currentPositionRef.get()).isEqualTo(testPosition); assertThat(bufferedPositionRef.get()).isEqualTo(testBufferedPosition); @@ -1145,7 +1224,7 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newPositionInfoRef.get().positionMs).isEqualTo(testPosition); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())).contains(Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); assertThat(currentPositionRef.get()).isEqualTo(testPosition); @@ -1282,7 +1361,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newPositionInfoRef.get().positionMs).isEqualTo(testSeekPositionMs); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); assertThat(currentPositionRef.get()).isEqualTo(testPosition); @@ -1326,9 +1406,10 @@ public void seekBack_seeksToOffsetBySeekBackIncrement() throws Exception { remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicLong oldPositionRef = new AtomicLong(); AtomicLong newPositionRef = new AtomicLong(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1338,6 +1419,12 @@ public void onPositionDiscontinuity( newPositionRef.set(newPosition.positionMs); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); + latch.countDown(); + } }; controller.addListener(listener); @@ -1346,6 +1433,8 @@ public void onPositionDiscontinuity( assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(oldPositionRef.get()).isEqualTo(testCurrentPosition); assertThat(newPositionRef.get()).isEqualTo(testCurrentPosition - testSeekBackIncrement); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); } @Test @@ -1361,9 +1450,10 @@ public void seekForward_seeksToOffsetBySeekForwardIncrement() throws Exception { remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicLong oldPositionRef = new AtomicLong(); AtomicLong newPositionRef = new AtomicLong(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -1373,6 +1463,12 @@ public void onPositionDiscontinuity( newPositionRef.set(newPosition.positionMs); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); + latch.countDown(); + } }; controller.addListener(listener); @@ -1381,6 +1477,8 @@ public void onPositionDiscontinuity( assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(oldPositionRef.get()).isEqualTo(testCurrentPosition); assertThat(newPositionRef.get()).isEqualTo(testCurrentPosition + testSeekForwardIncrement); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_POSITION_DISCONTINUITY); } @Test @@ -1462,7 +1560,11 @@ public void onEvents(Player player, Player.Events events) { testMediaItemIndex, /* testFirstPeriodIndex= */ testPeriodIndex, /* testLastPeriodIndex= */ testPeriodIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly( + Player.EVENT_TIMELINE_CHANGED, + Player.EVENT_MEDIA_ITEM_TRANSITION, + Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); assertThat(currentPositionRef.get()).isEqualTo(testPosition); @@ -1561,9 +1663,11 @@ public void onEvents(Player player, Player.Events events) { /* testFirstPeriodIndex= */ testPeriodIndex, /* testLastPeriodIndex= */ testPeriodIndex); assertThat(newMediaItemRef.get().mediaId).isEqualTo(testMediaItemIndexMediaId); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_MEDIA_ITEM_TRANSITION)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly( + Player.EVENT_POSITION_DISCONTINUITY, + Player.EVENT_TIMELINE_CHANGED, + Player.EVENT_MEDIA_ITEM_TRANSITION); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); assertThat(currentPositionRef.get()).isEqualTo(testPosition); @@ -1655,9 +1759,11 @@ public void onEvents(Player player, Player.Events events) { assertThat(newPositionInfoRef.get().positionMs).isEqualTo(testPosition); assertThat(newTimelineRef.get().isEmpty()).isTrue(); assertThat(newMediaItemRef.get()).isNull(); - assertThat(onEventsRef.get().contains(Player.EVENT_POSITION_DISCONTINUITY)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_MEDIA_ITEM_TRANSITION)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly( + Player.EVENT_POSITION_DISCONTINUITY, + Player.EVENT_TIMELINE_CHANGED, + Player.EVENT_MEDIA_ITEM_TRANSITION); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testPeriodIndex); assertThat(currentPositionRef.get()).isEqualTo(testPosition); @@ -1751,7 +1857,8 @@ public void onEvents(Player player, Player.Events events) { testCurrentMediaItemIndex, /* testFirstPeriodIndex= */ testCurrentPeriodIndex, /* testLastPeriodIndex= */ testCurrentPeriodIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_TIMELINE_CHANGED, Player.EVENT_MEDIA_ITEM_TRANSITION); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(nextMediaItemIndexRef.get()).isEqualTo(testNextMediaItemIndex); assertThat(previousMediaItemIndexRef.get()).isEqualTo(testPreviousMediaItemIndex); @@ -1819,7 +1926,7 @@ public void onEvents(Player player, Player.Events events) { testCurrentMediaItemIndex, /* testFirstPeriodIndex= */ testCurrentPeriodIndex, /* testLastPeriodIndex= */ testCurrentPeriodIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())).containsExactly(Player.EVENT_TIMELINE_CHANGED); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(nextMediaItemIndexRef.get()).isEqualTo(testNextMediaItemIndex); assertThat(previousMediaItemIndexRef.get()).isEqualTo(testPreviousMediaItemIndex); @@ -1937,7 +2044,7 @@ public void onEvents(Player player, Player.Events events) { testCurrentMediaItemIndex, /* testFirstPeriodIndex= */ testCurrentWindowFirstPeriodIndex, /* testLastPeriodIndex= */ testCurrentWindowLastPeriodIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())).containsExactly(Player.EVENT_TIMELINE_CHANGED); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(nextMediaItemIndexRef.get()).isEqualTo(testNextMediaItemIndex); assertThat(previousMediaItemIndexRef.get()).isEqualTo(testPreviousMediaItemIndex); @@ -2026,8 +2133,11 @@ public void onEvents(Player player, Player.Events events) { /* testLastPeriodIndex= */ testCurrentMediaItemIndex); assertThat(newMediaItemRef.get().mediaId).isEqualTo(testCurrentMediaId); assertThat(newPositionInfoRef.get().mediaItemIndex).isEqualTo(testCurrentMediaItemIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_MEDIA_ITEM_TRANSITION)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly( + Player.EVENT_TIMELINE_CHANGED, + Player.EVENT_MEDIA_ITEM_TRANSITION, + Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(nextMediaItemIndexRef.get()).isEqualTo(testNextMediaItemIndex); assertThat(previousMediaItemIndexRef.get()).isEqualTo(testPreviousMediaItemIndex); @@ -2101,7 +2211,7 @@ public void onEvents(Player player, Player.Events events) { Window window = new Window(); assertThat(newTimelineRef.get().getWindow(testCurrentMediaItemIndex, window).mediaItem.mediaId) .isEqualTo(testCurrentMediaId); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())).containsExactly(Player.EVENT_TIMELINE_CHANGED); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(nextMediaItemIndexRef.get()).isEqualTo(testNextMediaItemIndex); assertThat(previousMediaItemIndexRef.get()).isEqualTo(testPreviousMediaItemIndex); @@ -2171,7 +2281,7 @@ public void onEvents(Player player, Player.Events events) { testCurrentMediaItemIndex, /* testFirstPeriodIndex= */ testCurrentWindowFirstPeriodIndex, /* testLastPeriodIndex= */ testCurrentWindowLastPeriodIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())).containsExactly(Player.EVENT_TIMELINE_CHANGED); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testCurrentPeriodIndex); } @@ -2179,7 +2289,7 @@ public void onEvents(Player player, Player.Events events) { @Test public void removeMediaItems_removeAllItems() throws Exception { int initialMediaItemIndex = 1; - int initialPlaybackState = STATE_READY; + int initialPlaybackState = Player.STATE_READY; long initialCurrentPosition = 3_000; String firstMediaId = "firstMediaId"; String secondMediaId = "secondMediaId"; @@ -2190,7 +2300,7 @@ public void removeMediaItems_removeAllItems() throws Exception { int testCurrentMediaItemIndex = 0; int testNextMediaItemIndex = C.INDEX_UNSET; int testPreviousMediaItemIndex = C.INDEX_UNSET; - int testPlaybackState = STATE_ENDED; + int testPlaybackState = Player.STATE_ENDED; long testCurrentPosition = 0; Bundle playerConfig = @@ -2264,9 +2374,12 @@ public void onEvents(Player player, Player.Events events) { /* ignored= */ C.INDEX_UNSET); assertThat(newMediaItemRef.get()).isNull(); assertThat(newPlaybackStateRef.get()).isEqualTo(testPlaybackState); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_MEDIA_ITEM_TRANSITION)).isTrue(); - assertThat(onEventsRef.get().contains(Player.EVENT_PLAYBACK_STATE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly( + Player.EVENT_TIMELINE_CHANGED, + Player.EVENT_MEDIA_ITEM_TRANSITION, + Player.EVENT_PLAYBACK_STATE_CHANGED, + Player.EVENT_POSITION_DISCONTINUITY); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(nextMediaItemIndexRef.get()).isEqualTo(testNextMediaItemIndex); assertThat(previousMediaItemIndexRef.get()).isEqualTo(testPreviousMediaItemIndex); @@ -2277,10 +2390,10 @@ public void onEvents(Player player, Player.Events events) { public void removeMediaItems_removedTailIncludesCurrentItem_callsOnPlaybackStateChanged() throws Exception { int initialMediaItemIndex = 1; - int initialPlaybackState = STATE_READY; + int initialPlaybackState = Player.STATE_READY; int testFromIndex = 1; int testToIndex = 3; - int testPlaybackState = STATE_ENDED; + int testPlaybackState = Player.STATE_ENDED; Timeline testTimeline = createTimeline(createMediaItems(/* size= */ 3)); Bundle playerConfig = @@ -2293,8 +2406,9 @@ public void removeMediaItems_removedTailIncludesCurrentItem_callsOnPlaybackState remoteSession.setPlayer(playerConfig); MediaController controller = controllerTestRule.createController(remoteSession.getToken()); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); AtomicInteger newPlaybackStateRef = new AtomicInteger(); + AtomicReference onEventsRef = new AtomicReference<>(); Player.Listener listener = new Player.Listener() { @Override @@ -2302,6 +2416,12 @@ public void onPlaybackStateChanged(int playbackState) { newPlaybackStateRef.set(playbackState); latch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + onEventsRef.set(events); + latch.countDown(); + } }; threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener)); @@ -2314,6 +2434,7 @@ public void onPlaybackStateChanged(int playbackState) { }); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newPlaybackStateRef.get()).isEqualTo(testPlaybackState); + assertThat(getEventsAsList(onEventsRef.get())).contains(Player.EVENT_PLAYBACK_STATE_CHANGED); } @Test @@ -2586,7 +2707,7 @@ public void onEvents(Player player, Player.Events events) { assertThat( newTimelineRef.get().getWindow(testNextMediaItemIndex, new Window()).mediaItem.mediaId) .isEqualTo(testNextMediaId); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())).containsExactly(Player.EVENT_TIMELINE_CHANGED); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); } @@ -2700,7 +2821,7 @@ public void onEvents(Player player, Player.Events events) { testCurrentMediaItemIndex, /* testFirstPeriodIndex= */ testCurrentWindowFirstPeriodIndex, /* testLastPeriodIndex= */ testCurrentWindowLastPeriodIndex); - assertThat(onEventsRef.get().contains(Player.EVENT_TIMELINE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())).containsExactly(Player.EVENT_TIMELINE_CHANGED); assertThat(currentMediaItemIndexRef.get()).isEqualTo(testCurrentMediaItemIndex); assertThat(currentPeriodIndexRef.get()).isEqualTo(testCurrentPeriodIndex); } @@ -2867,7 +2988,8 @@ public void onEvents(Player player, Player.Events events) { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playbackStateFromCallbackRef.get()).isEqualTo(testPlaybackState); - assertThat(onEventsRef.get().contains(Player.EVENT_PLAYBACK_STATE_CHANGED)).isTrue(); + assertThat(getEventsAsList(onEventsRef.get())) + .containsExactly(Player.EVENT_PLAYBACK_STATE_CHANGED); assertThat(playbackStateFromGetterRef.get()).isEqualTo(testPlaybackState); assertThat(playerErrorFromGetterRef.get().errorInfoEquals(testPlaybackException)).isTrue(); assertThat(timelineFromGetterRef.get().getWindowCount()) diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerSurfaceSizeChangeTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerSurfaceSizeChangeTest.java index 475059d462d..caa92975084 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerSurfaceSizeChangeTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerSurfaceSizeChangeTest.java @@ -35,6 +35,7 @@ import androidx.media3.test.session.common.HandlerThreadTestRule; import androidx.media3.test.session.common.PollingCheck; import androidx.media3.test.session.common.SurfaceActivity; +import androidx.media3.test.session.common.TestUtils; import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.LargeTest; import androidx.test.rule.ActivityTestRule; @@ -42,6 +43,7 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -140,6 +142,7 @@ public static List params() { private final CountDownLatch countDownLatch; private final AtomicInteger newSurfaceWidthRef; private final AtomicInteger newSurfaceHeightRef; + private final AtomicReference eventsRef; @Rule public ActivityTestRule activityRule = @@ -178,9 +181,10 @@ public MediaControllerSurfaceSizeChangeTest( this.sizeCondition = sizeCondition; this.surfaceSizeChangedShouldBeCalled = surfaceSizeChangedShouldBeCalled; - countDownLatch = new CountDownLatch(1); + countDownLatch = new CountDownLatch(2); newSurfaceWidthRef = new AtomicInteger(C.LENGTH_UNSET); newSurfaceHeightRef = new AtomicInteger(C.LENGTH_UNSET); + eventsRef = new AtomicReference<>(); } @Test @@ -252,6 +256,12 @@ public void onSurfaceSizeChanged(int width, int height) { newSurfaceHeightRef.set(height); countDownLatch.countDown(); } + + @Override + public void onEvents(Player player, Player.Events events) { + eventsRef.set(events); + countDownLatch.countDown(); + } })); } @@ -360,6 +370,8 @@ private void waitCallbackAndAssert() throws Exception { assertThat(countDownLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(newSurfaceWidthRef.get()).isEqualTo(expectedWidthFromCallback); assertThat(newSurfaceHeightRef.get()).isEqualTo(expectedHeightFromCallback); + assertThat(TestUtils.getEventsAsList(eventsRef.get())) + .containsExactly(Player.EVENT_SURFACE_SIZE_CHANGED); } else { assertThat(countDownLatch.await(NO_RESPONSE_TIMEOUT_MS, MILLISECONDS)).isFalse(); } diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java index 98da0c7c05c..2f91a3a2866 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java @@ -857,6 +857,17 @@ public void setTrackSelectionParameters(String sessionId, Bundle parameters) }); } + @Override + public void setVolume(String sessionId, float volume) throws RemoteException { + runOnHandler( + () -> { + MediaSession session = sessionMap.get(sessionId); + MockPlayer player = (MockPlayer) session.getPlayer(); + player.setVolume(volume); + player.notifyVolumeChanged(); + }); + } + @Override public void notifyAvailableCommandsChanged(String sessionId, Bundle commandsBundle) throws RemoteException { @@ -970,6 +981,28 @@ public void notifyDeviceVolumeChanged(String sessionId, int volume, boolean mute }); } + @Override + public void decreaseDeviceVolume(String sessionId) throws RemoteException { + runOnHandler( + () -> { + MediaSession session = sessionMap.get(sessionId); + MockPlayer player = (MockPlayer) session.getPlayer(); + player.decreaseDeviceVolume(); + player.notifyDeviceVolumeChanged(); + }); + } + + @Override + public void increaseDeviceVolume(String sessionId) throws RemoteException { + runOnHandler( + () -> { + MediaSession session = sessionMap.get(sessionId); + MockPlayer player = (MockPlayer) session.getPlayer(); + player.increaseDeviceVolume(); + player.notifyDeviceVolumeChanged(); + }); + } + @Override public void notifyCuesChanged(String sessionId, Bundle cueGroupBundle) throws RemoteException { CueGroup cueGroup = CueGroup.CREATOR.fromBundle(cueGroupBundle); 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 b4dcf94755c..d05caf57e78 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 @@ -655,11 +655,13 @@ public void setDeviceVolume(int volume) { @Override public void increaseDeviceVolume() { + deviceVolume += 1; checkNotNull(conditionVariables.get(METHOD_INCREASE_DEVICE_VOLUME)).open(); } @Override public void decreaseDeviceVolume() { + deviceVolume -= 1; checkNotNull(conditionVariables.get(METHOD_DECREASE_DEVICE_VOLUME)).open(); } @@ -1204,6 +1206,12 @@ public void notifyDeviceVolumeChanged() { } } + public void notifyVolumeChanged() { + for (Listener listener : listeners) { + listener.onVolumeChanged(volume); + } + } + @SuppressWarnings("deprecation") // Implementing and calling deprecated listener method. public void notifyCuesChanged() { for (Listener listener : listeners) { diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java index 4589a192fe3..e6647a6981e 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java @@ -282,6 +282,10 @@ public void setCurrentAdIndexInAdGroup(int currentAdIndexInAdGroup) throws Remot binder.setCurrentAdIndexInAdGroup(sessionId, currentAdIndexInAdGroup); } + public void setVolume(float volume) throws RemoteException { + binder.setVolume(sessionId, volume); + } + public void notifyPlayWhenReadyChanged( boolean playWhenReady, @Player.PlaybackSuppressionReason int reason) throws RemoteException { @@ -399,6 +403,14 @@ public void notifyDeviceVolumeChanged(int volume, boolean muted) throws RemoteEx binder.notifyDeviceVolumeChanged(sessionId, volume, muted); } + public void decreaseDeviceVolume() throws RemoteException { + binder.decreaseDeviceVolume(sessionId); + } + + public void increaseDeviceVolume() throws RemoteException { + binder.increaseDeviceVolume(sessionId); + } + public void notifyCuesChanged(CueGroup cueGroup) throws RemoteException { binder.notifyCuesChanged(sessionId, cueGroup.toBundle()); }