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 4121904955..0f476641f5 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionLegacyStub.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionLegacyStub.java @@ -189,6 +189,16 @@ import org.checkerframework.checker.initialization.qual.Initialized; }); } + @Override + public void onCustomAction(String action, @Nullable Bundle extras) { + Bundle args = extras == null ? Bundle.EMPTY : extras; + SessionCommand command = new SessionCommand(action, args); + dispatchSessionTaskWithSessionCommand( + command, + controller -> + ignoreFuture(sessionImpl.onCustomCommandOnHandler(controller, command, args))); + } + @Override public boolean onMediaButtonEvent(Intent mediaButtonEvent) { @Nullable KeyEvent keyEvent = mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); @@ -457,11 +467,6 @@ import org.checkerframework.checker.initialization.qual.Initialized; }); } - @Override - public void onCustomAction(String action, @Nullable Bundle extras) { - // no-op - } - @Override public void onSetCaptioningEnabled(boolean enabled) { // no-op diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java index d328869726..4e9b368b87 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java @@ -701,6 +701,58 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); } + @Test + public void sendCustomCommand() throws Exception { + String testCommand = "test_custom_command"; + Bundle testArgs = new Bundle(); + testArgs.putString("args", "test_custom_args"); + SessionCommand customCommand = new SessionCommand(testCommand, /* extras= */ Bundle.EMPTY); + CountDownLatch latch = new CountDownLatch(1); + SessionCallback callback = + new SessionCallback() { + @Override + public MediaSession.ConnectionResult onConnect( + MediaSession session, ControllerInfo controller) { + if (EXPECTED_CONTROLLER_PACKAGE_NAME.equals(controller.getPackageName())) { + MediaSession.ConnectionResult connectionResult = + SessionCallback.super.onConnect(session, controller); + SessionCommands.Builder builder = + connectionResult.availableSessionCommands.buildUpon().add(customCommand); + return MediaSession.ConnectionResult.accept( + /* availableSessionCommands= */ builder.build(), + connectionResult.availablePlayerCommands); + } else { + return MediaSession.ConnectionResult.reject(); + } + } + + @Override + public ListenableFuture onCustomCommand( + MediaSession session, + ControllerInfo controller, + SessionCommand sessionCommand, + Bundle args) { + if (sessionCommand.customAction.equals(testCommand) + && TestUtils.equals(testArgs, args)) { + latch.countDown(); + } + return Futures.immediateFuture(new SessionResult(RESULT_SUCCESS)); + } + }; + session = + new MediaSession.Builder(context, player) + .setId("sendCommand") + .setSessionCallback(callback) + .build(); + controller = + new RemoteMediaControllerCompat( + context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + + controller.sendCustomCommand(customCommand, testArgs); + + assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); + } + @Test public void controllerCallback_sessionRejects() throws Exception { SessionCallback sessionCallback = diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaControllerCompat.java b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaControllerCompat.java index 679cc82b02..9d496bf30e 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaControllerCompat.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaControllerCompat.java @@ -120,6 +120,11 @@ public class RemoteMediaControllerCompat { binder.sendCommand(controllerId, command, params, cb); } + public void sendCustomCommand(SessionCommand customCommand, Bundle params) + throws RemoteException { + binder.sendCustomActionWithName(controllerId, customCommand.customAction, params); + } + //////////////////////////////////////////////////////////////////////////////// // MediaControllerCompat.TransportControls methods ////////////////////////////////////////////////////////////////////////////////