diff --git a/core/api/current.txt b/core/api/current.txt index dc2a8c2bb4f60..717f80ad8d66c 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -24427,7 +24427,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 boolean 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 f739365169067..7eb0c76fbf4e9 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -94,5 +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); + boolean showMediaOutputSwitcher(String packageName); } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 24ec2270a7c5f..c620229b59d09 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -461,16 +461,30 @@ public final class MediaRouter2 { } /** - * Shows the system UI output switcher. + * Shows the system output switcher dialog. + * + *

Should only be called when the context of MediaRouter2 is in the foreground and visible on + * the screen. + * + *

The appearance and precise behaviour of the system output switcher dialog may vary across + * different devices, OS versions, and form factors, but the basic functionality stays the same. + * + *

See Output + * Switcher documentation for more details. + * + * @return {@code true} if the output switcher dialog is being shown, or {@code false} if the + * call is ignored because the app is in the background. */ - public void showSystemOutputSwitcher() { + public boolean showSystemOutputSwitcher() { synchronized (mLock) { try { - mMediaRouterService.showMediaOutputSwitcher(mPackageName); + return mMediaRouterService.showMediaOutputSwitcher(mPackageName); } catch (RemoteException ex) { ex.rethrowFromSystemServer(); } } + return false; } /** diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index a9b9b54d10012..4d134b69811db 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -16,6 +16,8 @@ package com.android.server.media; +import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -248,12 +250,17 @@ public final class MediaRouterService extends IMediaRouterService.Stub // Binder call @Override - public void showMediaOutputSwitcher(String packageName) { + public boolean showMediaOutputSwitcher(String packageName) { if (!validatePackageName(Binder.getCallingUid(), packageName)) { throw new SecurityException("packageName must match the calling identity"); } final long token = Binder.clearCallingIdentity(); try { + if (mContext.getSystemService(ActivityManager.class).getPackageImportance(packageName) + > IMPORTANCE_FOREGROUND) { + Slog.w(TAG, "showMediaOutputSwitcher only works when called from foreground"); + return false; + } synchronized (mLock) { StatusBarManagerInternal statusBar = LocalServices.getService(StatusBarManagerInternal.class); @@ -262,6 +269,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub } finally { Binder.restoreCallingIdentity(token); } + return true; } // Binder call