From bf7b4e0d8c3f6bd103e873b47bcb345f01749128 Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 14 May 2024 10:16:20 -0700 Subject: [PATCH] Reset platform playback state immediately after sending custom error This change resets the error in the platform error state immediately to make sure that the custom error is reflected only very briefly and then gets back to the playback state that actually reflects the player state. Issue: androidx/media#543 PiperOrigin-RevId: 633626180 --- .../session/MediaSessionLegacyStub.java | 1 + ...lerCompatCallbackWithMediaSessionTest.java | 46 +++++++++++++------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionLegacyStub.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionLegacyStub.java index 7761bcf09d..37600890d3 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionLegacyStub.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionLegacyStub.java @@ -1082,6 +1082,7 @@ import org.checkerframework.checker.initialization.qual.Initialized; playerWrapper.setLegacyErrorStatus(errorCode, errorMessage, errorExtras); sessionCompat.setPlaybackState(playerWrapper.createPlaybackStateCompat()); playerWrapper.clearLegacyErrorStatus(); + sessionCompat.setPlaybackState(playerWrapper.createPlaybackStateCompat()); } @Override diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java index 1bf5c95093..8f784fdcc3 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java @@ -1024,7 +1024,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { @Test public void sendError_toAllControllers_onPlaybackStateChangedToErrorStateAndWithCorrectErrorData() throws Exception { - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); List playbackStates = new ArrayList<>(); MediaControllerCompat.Callback callback = new MediaControllerCompat.Callback() { @@ -1035,6 +1035,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { } }; controllerCompat.registerCallback(callback, handler); + PlaybackStateCompat initialPlaybackStateCompat = controllerCompat.getPlaybackState(); Bundle errorBundle = new Bundle(); errorBundle.putInt("intKey", 99); @@ -1045,20 +1046,27 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { errorBundle); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(playbackStates).hasSize(1); - PlaybackStateCompat playbackStateCompat = playbackStates.get(0); - assertThat(playbackStateCompat.getState()).isEqualTo(PlaybackStateCompat.STATE_ERROR); - assertThat(playbackStateCompat.getErrorCode()).isEqualTo(1); - assertThat(playbackStateCompat.getErrorMessage().toString()) + assertThat(playbackStates).hasSize(2); + PlaybackStateCompat errorPlaybackStateCompat = playbackStates.get(0); + assertThat(errorPlaybackStateCompat.getState()).isEqualTo(PlaybackStateCompat.STATE_ERROR); + assertThat(errorPlaybackStateCompat.getErrorCode()).isEqualTo(1); + assertThat(errorPlaybackStateCompat.getErrorMessage().toString()) .isEqualTo(context.getString(R.string.authentication_required)); - assertThat(TestUtils.equals(playbackStateCompat.getExtras(), errorBundle)).isTrue(); + PlaybackStateCompat resolvedPlaybackStateCompat = playbackStates.get(1); + assertThat(resolvedPlaybackStateCompat.getState()) + .isEqualTo(initialPlaybackStateCompat.getState()); + assertThat(resolvedPlaybackStateCompat.getErrorCode()) + .isEqualTo(initialPlaybackStateCompat.getErrorCode()); + assertThat(resolvedPlaybackStateCompat.getErrorMessage()).isNull(); + assertThat(resolvedPlaybackStateCompat.getActions()) + .isEqualTo(initialPlaybackStateCompat.getActions()); } @Test public void sendError_toMediaNotificationControllers_onPlaybackStateChangedToErrorStateAndWithCorrectErrorData() throws Exception { - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(2); List playbackStates = new ArrayList<>(); MediaControllerCompat.Callback callback = new MediaControllerCompat.Callback() { @@ -1069,6 +1077,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { } }; controllerCompat.registerCallback(callback, handler); + PlaybackStateCompat initialPlaybackStateCompat = controllerCompat.getPlaybackState(); Bundle errorBundle = new Bundle(); errorBundle.putInt("intKey", 99); @@ -1079,13 +1088,22 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { errorBundle); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(playbackStates).hasSize(1); - PlaybackStateCompat playbackStateCompat = playbackStates.get(0); - assertThat(playbackStateCompat.getState()).isEqualTo(PlaybackStateCompat.STATE_ERROR); - assertThat(playbackStateCompat.getErrorCode()).isEqualTo(1); - assertThat(playbackStateCompat.getErrorMessage().toString()) + assertThat(playbackStates).hasSize(2); + PlaybackStateCompat errorPlaybackStateCompat = playbackStates.get(0); + assertThat(errorPlaybackStateCompat.getState()).isEqualTo(PlaybackStateCompat.STATE_ERROR); + assertThat(errorPlaybackStateCompat.getErrorCode()).isEqualTo(1); + assertThat(errorPlaybackStateCompat.getErrorMessage().toString()) .isEqualTo(context.getString(R.string.authentication_required)); - assertThat(TestUtils.equals(playbackStateCompat.getExtras(), errorBundle)).isTrue(); + assertThat(errorPlaybackStateCompat.getActions()).isEqualTo(0); + assertThat(TestUtils.equals(errorPlaybackStateCompat.getExtras(), errorBundle)).isTrue(); + PlaybackStateCompat resolvedPlaybackStateCompat = playbackStates.get(1); + assertThat(resolvedPlaybackStateCompat.getState()) + .isEqualTo(initialPlaybackStateCompat.getState()); + assertThat(resolvedPlaybackStateCompat.getErrorCode()) + .isEqualTo(initialPlaybackStateCompat.getErrorCode()); + assertThat(resolvedPlaybackStateCompat.getErrorMessage()).isNull(); + assertThat(resolvedPlaybackStateCompat.getActions()) + .isEqualTo(initialPlaybackStateCompat.getActions()); } @Test