diff --git a/core/api/current.txt b/core/api/current.txt index 653dda3d721fb..d632de89c3c3d 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -24035,6 +24035,7 @@ package android.media { method public void registerTransferCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaRouter2.TransferCallback); method public void setOnGetControllerHintsListener(@Nullable android.media.MediaRouter2.OnGetControllerHintsListener); method public void setRouteListingPreference(@Nullable android.media.RouteListingPreference); + method public void showSystemOutputSwitcher(); method public void stop(); method public void transferTo(@NonNull android.media.MediaRoute2Info); method public void unregisterControllerCallback(@NonNull android.media.MediaRouter2.ControllerCallback); diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl index aa7e4df181861..f739365169067 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -94,4 +94,5 @@ interface IMediaRouterService { void setSessionVolumeWithManager(IMediaRouter2Manager manager, int requestId, String sessionId, int volume); void releaseSessionWithManager(IMediaRouter2Manager manager, int requestId, String sessionId); + void showMediaOutputSwitcher(String packageName); } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index a7959c5dabdda..24ec2270a7c5f 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -460,6 +460,19 @@ public final class MediaRouter2 { } } + /** + * Shows the system UI output switcher. + */ + public void showSystemOutputSwitcher() { + synchronized (mLock) { + try { + mMediaRouterService.showMediaOutputSwitcher(mPackageName); + } catch (RemoteException ex) { + ex.rethrowFromSystemServer(); + } + } + } + /** * Sets the {@link RouteListingPreference} of the app associated to this media router. * diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index 3ad0e44e6ea35..a9b9b54d10012 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -69,6 +69,7 @@ import com.android.internal.util.DumpUtils; import com.android.server.LocalServices; import com.android.server.Watchdog; import com.android.server.pm.UserManagerInternal; +import com.android.server.statusbar.StatusBarManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -245,6 +246,24 @@ public final class MediaRouterService extends IMediaRouterService.Stub } } + // Binder call + @Override + public void showMediaOutputSwitcher(String packageName) { + if (!validatePackageName(Binder.getCallingUid(), packageName)) { + throw new SecurityException("packageName must match the calling identity"); + } + final long token = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + StatusBarManagerInternal statusBar = + LocalServices.getService(StatusBarManagerInternal.class); + statusBar.showMediaOutputSwitcher(packageName); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + // Binder call @Override public MediaRouterClientState getState(IMediaRouterClient client) {