diff options
22 files changed, 331 insertions, 119 deletions
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 5aa006bce000..c664d3d68b62 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -2713,7 +2713,7 @@ public final class MediaRouter2 { List<RoutingSessionInfo> sessionInfos = getRoutingSessions(); RoutingSessionInfo targetSession = sessionInfos.get(sessionInfos.size() - 1); - transfer(targetSession, route, Process.myUserHandle(), mContext.getPackageName()); + transfer(targetSession, route, mClientUser, mContext.getPackageName()); } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 9b1e4b7a633b..3e2987208444 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -52,6 +52,7 @@ import android.media.MediaRoute2Info; import android.media.RouteListingPreference; import android.media.RoutingSessionInfo; import android.os.Build; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; @@ -131,6 +132,7 @@ public abstract class InfoMediaManager { protected final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>(); @NonNull protected final Context mContext; @NonNull protected final String mPackageName; + @NonNull protected final UserHandle mUserHandle; private final Collection<MediaDeviceCallback> mCallbacks = new CopyOnWriteArrayList<>(); private MediaDevice mCurrentConnectedDevice; private final LocalBluetoothManager mBluetoothManager; @@ -140,16 +142,19 @@ public abstract class InfoMediaManager { /* package */ InfoMediaManager( @NonNull Context context, @NonNull String packageName, + @NonNull UserHandle userHandle, @NonNull LocalBluetoothManager localBluetoothManager) { mContext = context; mBluetoothManager = localBluetoothManager; mPackageName = packageName; + mUserHandle = userHandle; } /** Creates an instance of InfoMediaManager. */ public static InfoMediaManager createInstance( Context context, @Nullable String packageName, + @Nullable UserHandle userHandle, LocalBluetoothManager localBluetoothManager) { // The caller is only interested in system routes (headsets, built-in speakers, etc), and is @@ -159,16 +164,23 @@ public abstract class InfoMediaManager { packageName = context.getPackageName(); } + if (userHandle == null) { + userHandle = android.os.Process.myUserHandle(); + } + if (Flags.useMediaRouter2ForInfoMediaManager()) { try { - return new RouterInfoMediaManager(context, packageName, localBluetoothManager); + return new RouterInfoMediaManager( + context, packageName, userHandle, localBluetoothManager); } catch (PackageNotAvailableException ex) { // TODO: b/293578081 - Propagate this exception to callers for proper handling. Log.w(TAG, "Returning a no-op InfoMediaManager for package " + packageName); - return new NoOpInfoMediaManager(context, packageName, localBluetoothManager); + return new NoOpInfoMediaManager( + context, packageName, userHandle, localBluetoothManager); } } else { - return new ManagerInfoMediaManager(context, packageName, localBluetoothManager); + return new ManagerInfoMediaManager( + context, packageName, userHandle, localBluetoothManager); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index 63056b6dc8c3..0c2414c6a7a8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -138,7 +138,10 @@ public class LocalMediaManager implements BluetoothCallback { } mInfoMediaManager = - InfoMediaManager.createInstance(context, packageName, mLocalBluetoothManager); + // TODO: b/321969740 - Take the userHandle as a parameter and pass it through. The + // package name is not sufficient to unambiguously identify an app. + InfoMediaManager.createInstance( + context, packageName, /* userHandle */ null, mLocalBluetoothManager); } /** diff --git a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java index 23063da747af..d621751a2c29 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java @@ -21,6 +21,7 @@ import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; import android.media.RouteListingPreference; import android.media.RoutingSessionInfo; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; @@ -53,8 +54,9 @@ public class ManagerInfoMediaManager extends InfoMediaManager { /* package */ ManagerInfoMediaManager( Context context, @NonNull String packageName, + @NonNull UserHandle userHandle, LocalBluetoothManager localBluetoothManager) { - super(context, packageName, localBluetoothManager); + super(context, packageName, userHandle, localBluetoothManager); mRouterManager = MediaRouter2Manager.getInstance(context); } @@ -87,8 +89,7 @@ public class ManagerInfoMediaManager extends InfoMediaManager { @Override protected void transferToRoute(@NonNull MediaRoute2Info route) { - // TODO: b/279555229 - provide real user handle of a caller. - mRouterManager.transfer(mPackageName, route, android.os.Process.myUserHandle()); + mRouterManager.transfer(mPackageName, route, mUserHandle); } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java index cf11c6da737f..d2b018cd2299 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java @@ -20,6 +20,7 @@ import android.content.Context; import android.media.MediaRoute2Info; import android.media.RouteListingPreference; import android.media.RoutingSessionInfo; +import android.os.UserHandle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -58,8 +59,9 @@ import java.util.List; NoOpInfoMediaManager( Context context, @NonNull String packageName, + @NonNull UserHandle userHandle, LocalBluetoothManager localBluetoothManager) { - super(context, packageName, localBluetoothManager); + super(context, packageName, userHandle, localBluetoothManager); } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java index 0dceebab13f8..045c60dd1514 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java @@ -25,7 +25,7 @@ import android.media.MediaRouter2Manager; import android.media.RouteDiscoveryPreference; import android.media.RouteListingPreference; import android.media.RoutingSessionInfo; -import android.os.Process; +import android.os.UserHandle; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -70,15 +70,16 @@ public final class RouterInfoMediaManager extends InfoMediaManager { /* package */ RouterInfoMediaManager( Context context, @NonNull String packageName, + @NonNull UserHandle userHandle, LocalBluetoothManager localBluetoothManager) throws PackageNotAvailableException { - super(context, packageName, localBluetoothManager); + super(context, packageName, userHandle, localBluetoothManager); MediaRouter2 router = null; if (Flags.enableCrossUserRoutingInMediaRouter2()) { try { - router = MediaRouter2.getInstance(context, packageName, Process.myUserHandle()); + router = MediaRouter2.getInstance(context, packageName, userHandle); } catch (IllegalArgumentException ex) { // Do nothing } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/media/InfoMediaManagerIntegTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/media/InfoMediaManagerIntegTest.java index f0185b95e8f4..3bd37a2c59bf 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/media/InfoMediaManagerIntegTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/media/InfoMediaManagerIntegTest.java @@ -64,21 +64,23 @@ public class InfoMediaManagerIntegTest { @RequiresFlagsEnabled(FLAG_USE_MEDIA_ROUTER2_FOR_INFO_MEDIA_MANAGER) public void createInstance_withMR2FlagOn_returnsRouterInfoMediaManager() { InfoMediaManager manager = - InfoMediaManager.createInstance(mContext, mContext.getPackageName(), null); + InfoMediaManager.createInstance( + mContext, mContext.getPackageName(), mContext.getUser(), null); assertThat(manager).isInstanceOf(RouterInfoMediaManager.class); } @Test @RequiresFlagsEnabled(FLAG_USE_MEDIA_ROUTER2_FOR_INFO_MEDIA_MANAGER) public void createInstance_withMR2FlagOn_withFakePackage_returnsNoOpInfoMediaManager() { - InfoMediaManager manager = InfoMediaManager.createInstance(mContext, FAKE_PACKAGE, null); + InfoMediaManager manager = + InfoMediaManager.createInstance(mContext, FAKE_PACKAGE, null, null); assertThat(manager).isInstanceOf(NoOpInfoMediaManager.class); } @Test @RequiresFlagsEnabled(FLAG_USE_MEDIA_ROUTER2_FOR_INFO_MEDIA_MANAGER) public void createInstance_withMR2FlagOn_withNullPackage_returnsRouterInfoMediaManager() { - InfoMediaManager manager = InfoMediaManager.createInstance(mContext, null, null); + InfoMediaManager manager = InfoMediaManager.createInstance(mContext, null, null, null); assertThat(manager).isInstanceOf(RouterInfoMediaManager.class); } @@ -86,7 +88,8 @@ public class InfoMediaManagerIntegTest { @RequiresFlagsDisabled(FLAG_USE_MEDIA_ROUTER2_FOR_INFO_MEDIA_MANAGER) public void createInstance_withMR2FlagOff_returnsManagerInfoMediaManager() { InfoMediaManager manager = - InfoMediaManager.createInstance(mContext, mContext.getPackageName(), null); + InfoMediaManager.createInstance( + mContext, mContext.getPackageName(), mContext.getUser(), null); assertThat(manager).isInstanceOf(ManagerInfoMediaManager.class); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index d7938670c598..a4b87da9f7f6 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -144,7 +144,8 @@ public class InfoMediaManagerTest { doReturn(mMediaSessionManager).when(mContext).getSystemService( Context.MEDIA_SESSION_SERVICE); mInfoMediaManager = - new ManagerInfoMediaManager(mContext, TEST_PACKAGE_NAME, mLocalBluetoothManager); + new ManagerInfoMediaManager( + mContext, TEST_PACKAGE_NAME, mContext.getUser(), mLocalBluetoothManager); mShadowRouter2Manager = ShadowRouter2Manager.getShadow(); mInfoMediaManager.mRouterManager = MediaRouter2Manager.getInstance(mContext); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/NoOpInfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/NoOpInfoMediaManagerTest.java index d630301a083b..908f50deea78 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/NoOpInfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/NoOpInfoMediaManagerTest.java @@ -46,6 +46,7 @@ public class NoOpInfoMediaManagerTest { new NoOpInfoMediaManager( mContext, /* packageName */ "FAKE_PACKAGE_NAME", + mContext.getUser(), /* localBluetoothManager */ null); } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt index 1cba185600cc..d9224d7e3421 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt @@ -187,7 +187,12 @@ class MediaControlInteractorTest : SysuiTestCase() { underTest.startMediaOutputDialog(expandable, PACKAGE_NAME) verify(kosmos.mediaOutputDialogManager) - .createAndShowWithController(eq(PACKAGE_NAME), eq(true), eq(dialogTransitionController)) + .createAndShowWithController( + eq(PACKAGE_NAME), + eq(true), + eq(dialogTransitionController), + eq(null) + ) } @Test diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java index 66aeda63e222..207f7dbb5816 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java @@ -217,10 +217,13 @@ public class BroadcastDialogDelegate implements SystemUIDialog.Delegate { mSwitchBroadcast.setText(mContext.getString( R.string.bt_le_audio_broadcast_dialog_switch_app, switchBroadcastApp), null); mSwitchBroadcast.setOnClickListener((view) -> startSwitchBroadcast()); - changeOutput.setOnClickListener((view) -> { - mMediaOutputDialogManager.createAndShow(mOutputPackageName, true, null); - dialog.dismiss(); - }); + changeOutput.setOnClickListener( + (view) -> { + // TODO: b/321969740 - Take the userHandle as a parameter and pass it through. + // The package name is not sufficient to unambiguously identify an app. + mMediaOutputDialogManager.createAndShow(mOutputPackageName, true, null, null); + dialog.dismiss(); + }); cancelBtn.setOnClickListener((view) -> { if (DEBUG) { Log.d(TAG, "BroadcastDialog dismiss."); diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java index 1a56a9b1dda6..bd3893bd2701 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java @@ -738,8 +738,11 @@ public class MediaControlPanel { mPackageName, mMediaViewHolder.getSeamlessButton()); } else { mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId); - mMediaOutputDialogManager.createAndShow(mPackageName, true, - mMediaViewHolder.getSeamlessButton()); + // TODO: b/321969740 - Populate the userHandle parameter. The user + // handle is necessary to disambiguate the same package running on + // different users. + mMediaOutputDialogManager.createAndShow( + mPackageName, true, mMediaViewHolder.getSeamlessButton(), null); } } else { mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId); @@ -767,8 +770,11 @@ public class MediaControlPanel { Log.w(TAG, "Device pending intent is not an activity."); } } else { - mMediaOutputDialogManager.createAndShow(mPackageName, true, - mMediaViewHolder.getSeamlessButton()); + // TODO: b/321969740 - Populate the userHandle parameter. The user + // handle is necessary to disambiguate the same package running on + // different users. + mMediaOutputDialogManager.createAndShow( + mPackageName, true, mMediaViewHolder.getSeamlessButton(), null); } } }); diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/util/LocalMediaManagerFactory.kt b/packages/SystemUI/src/com/android/systemui/media/controls/util/LocalMediaManagerFactory.kt index 452cb7e29f20..ff8e903b6637 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/util/LocalMediaManagerFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/util/LocalMediaManagerFactory.kt @@ -31,8 +31,9 @@ constructor( ) { /** Creates a [LocalMediaManager] for the given package. */ fun create(packageName: String?): LocalMediaManager { - return InfoMediaManager.createInstance(context, packageName, localBluetoothManager).run { - LocalMediaManager(context, localBluetoothManager, this, packageName) - } + // TODO: b/321969740 - Populate the userHandle parameter in InfoMediaManager. The user + // handle is necessary to disambiguate the same package running on different users. + return InfoMediaManager.createInstance(context, packageName, null, localBluetoothManager) + .run { LocalMediaManager(context, localBluetoothManager, this, packageName) } } } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogManager.kt b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogManager.kt index 54d175c6a110..06267e243456 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogManager.kt @@ -38,7 +38,9 @@ constructor( // Dismiss the previous dialog, if any. mediaOutputBroadcastDialog?.dismiss() - val controller = mediaOutputControllerFactory.create(packageName) + // TODO: b/321969740 - Populate the userHandle parameter. The user handle is necessary to + // disambiguate the same package running on different users. + val controller = mediaOutputControllerFactory.create(packageName, /* userHandle= */ null) val dialog = MediaOutputBroadcastDialog(context, aboveStatusBar, broadcastSender, controller) mediaOutputBroadcastDialog = dialog diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java index 4db89d18ef7d..d6ca32079b09 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -124,6 +124,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, private static final String ALLOWLIST_REASON = "mediaoutput:remote_transfer"; private final String mPackageName; + private final UserHandle mUserHandle; private final Context mContext; private final MediaSessionManager mMediaSessionManager; private final LocalBluetoothManager mLocalBluetoothManager; @@ -177,6 +178,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, public MediaOutputController( Context context, @Assisted String packageName, + @Assisted @Nullable UserHandle userHandle, MediaSessionManager mediaSessionManager, @Nullable LocalBluetoothManager lbm, ActivityStarter starter, @@ -190,6 +192,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, UserTracker userTracker) { mContext = context; mPackageName = packageName; + mUserHandle = userHandle; mMediaSessionManager = mediaSessionManager; mLocalBluetoothManager = lbm; mActivityStarter = starter; @@ -199,7 +202,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, mKeyGuardManager = keyGuardManager; mFeatureFlags = featureFlags; mUserTracker = userTracker; - InfoMediaManager imm = InfoMediaManager.createInstance(mContext, packageName, lbm); + InfoMediaManager imm = + InfoMediaManager.createInstance(mContext, packageName, userHandle, lbm); mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName); mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName); mDialogTransitionAnimator = dialogTransitionAnimator; @@ -231,7 +235,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, @AssistedFactory public interface Factory { /** Construct a MediaOutputController */ - MediaOutputController create(String packageName); + MediaOutputController create(String packageName, UserHandle userHandle); } protected void start(@NonNull Callback cb) { @@ -946,11 +950,22 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } void launchMediaOutputBroadcastDialog(View mediaOutputDialog, BroadcastSender broadcastSender) { - MediaOutputController controller = new MediaOutputController(mContext, mPackageName, - mMediaSessionManager, mLocalBluetoothManager, mActivityStarter, - mNotifCollection, mDialogTransitionAnimator, mNearbyMediaDevicesManager, - mAudioManager, mPowerExemptionManager, mKeyGuardManager, mFeatureFlags, - mUserTracker); + MediaOutputController controller = + new MediaOutputController( + mContext, + mPackageName, + mUserHandle, + mMediaSessionManager, + mLocalBluetoothManager, + mActivityStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyGuardManager, + mFeatureFlags, + mUserTracker); MediaOutputBroadcastDialog dialog = new MediaOutputBroadcastDialog(mContext, true, broadcastSender, controller); dialog.show(); diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogManager.kt b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogManager.kt index e7816a40bb5e..04d1492ff656 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogManager.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.dialog import android.content.Context +import android.os.UserHandle import android.view.View import com.android.internal.jank.InteractionJankMonitor import com.android.internal.logging.UiEventLogger @@ -41,7 +42,15 @@ constructor( } /** Creates a [MediaOutputDialog] for the given package. */ - open fun createAndShow(packageName: String, aboveStatusBar: Boolean, view: View? = null) { + // TODO: b/321969740 - Make the userHandle non-optional, and place the parameter next to the + // package name. The user handle is necessary to disambiguate the same package running on + // different users. + open fun createAndShow( + packageName: String, + aboveStatusBar: Boolean, + view: View? = null, + userHandle: UserHandle? = null + ) { createAndShowWithController( packageName, aboveStatusBar, @@ -55,20 +64,26 @@ constructor( ) ) }, + userHandle = userHandle, ) } /** Creates a [MediaOutputDialog] for the given package. */ + // TODO: b/321969740 - Make the userHandle non-optional, and place the parameter next to the + // package name. The user handle is necessary to disambiguate the same package running on + // different users. open fun createAndShowWithController( packageName: String, aboveStatusBar: Boolean, controller: DialogTransitionAnimator.Controller?, + userHandle: UserHandle? = null, ) { createAndShow( packageName, aboveStatusBar, dialogTransitionAnimatorController = controller, - includePlaybackAndAppMetadata = true + includePlaybackAndAppMetadata = true, + userHandle = userHandle, ) } @@ -79,20 +94,25 @@ constructor( packageName = null, aboveStatusBar = false, dialogTransitionAnimatorController = null, - includePlaybackAndAppMetadata = false + includePlaybackAndAppMetadata = false, + userHandle = null, ) } + // TODO: b/321969740 - Make the userHandle non-optional, and place the parameter next to the + // package name. The user handle is necessary to disambiguate the same package running on + // different users. private fun createAndShow( packageName: String?, aboveStatusBar: Boolean, dialogTransitionAnimatorController: DialogTransitionAnimator.Controller?, - includePlaybackAndAppMetadata: Boolean = true + includePlaybackAndAppMetadata: Boolean = true, + userHandle: UserHandle? = null, ) { // Dismiss the previous dialog, if any. mediaOutputDialog?.dismiss() - val controller = mediaOutputControllerFactory.create(packageName) + val controller = mediaOutputControllerFactory.create(packageName, userHandle) val mediaOutputDialog = MediaOutputDialog( diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSwitcherDialogUI.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSwitcherDialogUI.java index da852348b4e6..9cc288899d45 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSwitcherDialogUI.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSwitcherDialogUI.java @@ -55,8 +55,8 @@ public class MediaOutputSwitcherDialogUI implements CoreStartable, CommandQueue. @MainThread public void showMediaOutputSwitcher(String packageName, UserHandle userHandle) { if (!TextUtils.isEmpty(packageName)) { - // TODO: b/279555229 - Pass the userHandle into the output dialog manager. - mMediaOutputDialogManager.createAndShow(packageName, false, null); + mMediaOutputDialogManager.createAndShow( + packageName, /* aboveStatusBar= */ false, /* view= */ null, userHandle); } else { Log.e(TAG, "Unable to launch media output dialog. Package name is empty."); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java index ca403e0addec..9bb21f020be8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java @@ -123,11 +123,22 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { mMediaControllers.add(mMediaController); when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers); - mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + mMediaOutputController = + new MediaOutputController( + mContext, + TEST_PACKAGE, + mContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); // Using a fake package will cause routing operations to fail, so we intercept // scanning-related operations. diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogTest.java index c9eb67e070ab..2e6388ae3914 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogTest.java @@ -124,11 +124,22 @@ public class MediaOutputBroadcastDialogTest extends SysuiTestCase { when(mLocalBluetoothLeBroadcast.getBroadcastCode()).thenReturn( BROADCAST_CODE_TEST.getBytes(StandardCharsets.UTF_8)); - mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + mMediaOutputController = + new MediaOutputController( + mContext, + TEST_PACKAGE, + mContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputBroadcastDialog = new MediaOutputBroadcastDialog(mContext, false, mBroadcastSender, mMediaOutputController); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java index 980eb5948615..4eb00385f857 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java @@ -194,11 +194,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn( mCachedBluetoothDeviceManager); - mMediaOutputController = new MediaOutputController(mSpyContext, mPackageName, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + mMediaOutputController = + new MediaOutputController( + mSpyContext, + mPackageName, + mContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager); when(mLocalMediaManager.isPreferenceRouteListingExist()).thenReturn(false); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; @@ -276,11 +287,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void start_withoutPackageName_verifyMediaControllerInit() { - mMediaOutputController = new MediaOutputController(mSpyContext, null, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + mMediaOutputController = + new MediaOutputController( + mSpyContext, + null, + mContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); mMediaOutputController.start(mCb); @@ -306,11 +328,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void stop_withoutPackageName_verifyMediaControllerDeinit() { - mMediaOutputController = new MediaOutputController(mSpyContext, null, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + mMediaOutputController = + new MediaOutputController( + mSpyContext, + null, + mSpyContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); mMediaOutputController.start(mCb); @@ -550,12 +583,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void getAppSourceName_packageNameIsNull_returnsNull() { - MediaOutputController testMediaOutputController = new MediaOutputController(mSpyContext, - "", - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + MediaOutputController testMediaOutputController = + new MediaOutputController( + mSpyContext, + "", + mSpyContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); testMediaOutputController.start(mCb); reset(mCb); @@ -573,12 +616,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void getNotificationSmallIcon_packageNameIsNull_returnsNull() { - MediaOutputController testMediaOutputController = new MediaOutputController(mSpyContext, - "", - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + MediaOutputController testMediaOutputController = + new MediaOutputController( + mSpyContext, + "", + mSpyContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); testMediaOutputController.start(mCb); reset(mCb); @@ -609,12 +662,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void addDeviceToPlayMedia_callsLocalMediaManager() { - MediaOutputController testMediaOutputController = new MediaOutputController(mSpyContext, - null, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + MediaOutputController testMediaOutputController = + new MediaOutputController( + mSpyContext, + null, + mSpyContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); LocalMediaManager mockLocalMediaManager = mock(LocalMediaManager.class); testMediaOutputController.mLocalMediaManager = mockLocalMediaManager; @@ -625,12 +688,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void removeDeviceFromPlayMedia_callsLocalMediaManager() { - MediaOutputController testMediaOutputController = new MediaOutputController(mSpyContext, - null, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + MediaOutputController testMediaOutputController = + new MediaOutputController( + mSpyContext, + null, + mSpyContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); LocalMediaManager mockLocalMediaManager = mock(LocalMediaManager.class); testMediaOutputController.mLocalMediaManager = mockLocalMediaManager; @@ -894,11 +967,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void getNotificationLargeIcon_withoutPackageName_returnsNull() { - mMediaOutputController = new MediaOutputController(mSpyContext, null, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + mMediaOutputController = + new MediaOutputController( + mSpyContext, + null, + mSpyContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); assertThat(mMediaOutputController.getNotificationIcon()).isNull(); } @@ -1085,12 +1169,22 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void setTemporaryAllowListExceptionIfNeeded_packageNameIsNull_NoAction() { - MediaOutputController testMediaOutputController = new MediaOutputController(mSpyContext, - null, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + MediaOutputController testMediaOutputController = + new MediaOutputController( + mSpyContext, + null, + mSpyContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); testMediaOutputController.setTemporaryAllowListExceptionIfNeeded(mMediaDevice2); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogReceiverTest.java index 83def8e47651..3b6a88af1ee0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogReceiverTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogReceiverTest.java @@ -18,6 +18,7 @@ package com.android.systemui.media.dialog; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -61,7 +62,7 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { mMediaOutputDialogReceiver.onReceive(getContext(), intent); verify(mMockMediaOutputDialogManager, times(1)) - .createAndShow(getContext().getPackageName(), false, null); + .createAndShow(eq(getContext().getPackageName()), eq(false), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } @@ -72,7 +73,8 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { intent.putExtra("Wrong Package Name Key", getContext().getPackageName()); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } @@ -82,7 +84,8 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { Intent intent = new Intent(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } @@ -95,7 +98,8 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { intent.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME, getContext().getPackageName()); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } @@ -108,9 +112,10 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { intent.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME, getContext().getPackageName()); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, times(1)) - .createAndShow(getContext().getPackageName(), true, null); + .createAndShow(eq(getContext().getPackageName()), eq(true), any()); } @Test @@ -121,7 +126,8 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { intent.putExtra("Wrong Package Name Key", getContext().getPackageName()); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } @@ -133,7 +139,8 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } @@ -145,7 +152,8 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { intent.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME, getContext().getPackageName()); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } @@ -155,7 +163,8 @@ public class MediaOutputDialogReceiverTest extends SysuiTestCase { Intent intent = new Intent("UnKnown Action"); mMediaOutputDialogReceiver.onReceive(getContext(), intent); - verify(mMockMediaOutputDialogManager, never()).createAndShow(any(), anyBoolean(), any()); + verify(mMockMediaOutputDialogManager, never()) + .createAndShow(any(), anyBoolean(), any(), any()); verify(mMockMediaOutputBroadcastDialogManager, never()) .createAndShow(any(), anyBoolean(), any()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java index 84300da82a30..cdef9644efa9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java @@ -137,11 +137,22 @@ public class MediaOutputDialogTest extends SysuiTestCase { Mockito.eq(userHandle))).thenReturn( mMediaControllers); - mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, - mMediaSessionManager, mLocalBluetoothManager, mStarter, - mNotifCollection, mDialogTransitionAnimator, - mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager, - mKeyguardManager, mFlags, mUserTracker); + mMediaOutputController = + new MediaOutputController( + mContext, + TEST_PACKAGE, + mContext.getUser(), + mMediaSessionManager, + mLocalBluetoothManager, + mStarter, + mNotifCollection, + mDialogTransitionAnimator, + mNearbyMediaDevicesManager, + mAudioManager, + mPowerExemptionManager, + mKeyguardManager, + mFlags, + mUserTracker); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputDialog = makeTestDialog(mMediaOutputController); mMediaOutputDialog.show(); |