diff options
author | Michael Mikhail <michaelmikhil@google.com> | 2023-04-03 11:40:47 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2023-04-03 11:40:47 +0000 |
commit | 9587fcef86226cda303577025629af0f52979dbe (patch) | |
tree | 391b67bf767bb06a2f61bca1897f27146a961b0f | |
parent | 0c702a76a3eb705594c4cd9be5b0db25b8f658f5 (diff) | |
parent | 3c3056c16970d561175192e7a8909a9de784ae54 (diff) | |
download | base-9587fcef86226cda303577025629af0f52979dbe.tar.gz |
Merge "Fix issues with setRemotePlaybackInfo" into tm-dev
4 files changed, 88 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index e6c4226e1e2f..c0efb6c9ca97 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -505,12 +505,15 @@ public class MediaControlPanel { } mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId); if (device.getIntent() != null) { - if (device.getIntent().isActivity()) { - mActivityStarter.startActivity( - device.getIntent().getIntent(), true); + PendingIntent deviceIntent = device.getIntent(); + boolean showOverLockscreen = mKeyguardStateController.isShowing() + && mActivityIntentHelper.wouldPendingShowOverLockscreen( + deviceIntent, mLockscreenUserManager.getCurrentUserId()); + if (deviceIntent.isActivity() && !showOverLockscreen) { + mActivityStarter.postStartActivityDismissingKeyguard(deviceIntent); } else { try { - device.getIntent().send(); + deviceIntent.send(); } catch (PendingIntent.CanceledException e) { Log.e(TAG, "Device pending intent was canceled"); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index 14d34e4284f1..f740a96021ca 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -1896,6 +1896,48 @@ public class MediaControlPanelTest : SysuiTestCase() { assertThat(expandedSet.getVisibility(recSubtitle3.id)).isEqualTo(ConstraintSet.GONE) } + @Test + fun outputSwitcher_hasCustomIntent_openOverLockscreen() { + // When the device for a media player has an intent that opens over lockscreen + val pendingIntent = mock(PendingIntent::class.java) + whenever(pendingIntent.isActivity).thenReturn(true) + whenever(keyguardStateController.isShowing).thenReturn(true) + whenever(activityIntentHelper.wouldPendingShowOverLockscreen(any(), any())).thenReturn(true) + + val customDevice = device.copy(intent = pendingIntent) + val dataWithDevice = mediaData.copy(device = customDevice) + player.attachPlayer(viewHolder) + player.bindPlayer(dataWithDevice, KEY) + + // When the user taps on the output switcher, + seamless.callOnClick() + + // Then we send the pending intent as is, without modifying the original intent + verify(pendingIntent).send() + verify(pendingIntent, never()).getIntent() + } + + @Test + fun outputSwitcher_hasCustomIntent_requiresUnlock() { + // When the device for a media player has an intent that cannot open over lockscreen + val pendingIntent = mock(PendingIntent::class.java) + whenever(pendingIntent.isActivity).thenReturn(true) + whenever(keyguardStateController.isShowing).thenReturn(true) + whenever(activityIntentHelper.wouldPendingShowOverLockscreen(any(), any())) + .thenReturn(false) + + val customDevice = device.copy(intent = pendingIntent) + val dataWithDevice = mediaData.copy(device = customDevice) + player.attachPlayer(viewHolder) + player.bindPlayer(dataWithDevice, KEY) + + // When the user taps on the output switcher, + seamless.callOnClick() + + // Then we request keyguard dismissal + verify(activityStarter).postStartActivityDismissingKeyguard(eq(pendingIntent)) + } + private fun getScrubbingChangeListener(): SeekBarViewModel.ScrubbingChangeListener = withArgCaptor { verify(seekBarViewModel).setScrubbingChangeListener(capture()) } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index e355e2076514..c39c722170c1 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -6658,7 +6658,8 @@ public class NotificationManagerService extends SystemService { } // Ensure MediaStyle has correct permissions for remote device extras - if (notification.isStyle(Notification.MediaStyle.class)) { + if (notification.isStyle(Notification.MediaStyle.class) + || notification.isStyle(Notification.DecoratedMediaCustomViewStyle.class)) { int hasMediaContentControlPermission = mPackageManager.checkPermission( android.Manifest.permission.MEDIA_CONTENT_CONTROL, pkg, userId); if (hasMediaContentControlPermission != PERMISSION_GRANTED) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 0c190b8556c0..c72bd4e91b8d 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -4236,6 +4236,43 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertFalse(posted.getNotification().extras .containsKey(Notification.EXTRA_MEDIA_REMOTE_DEVICE)); + assertFalse(posted.getNotification().extras + .containsKey(Notification.EXTRA_MEDIA_REMOTE_ICON)); + assertFalse(posted.getNotification().extras + .containsKey(Notification.EXTRA_MEDIA_REMOTE_INTENT)); + } + + @Test + public void testCustomMediaStyleRemote_noPermission() throws RemoteException { + String deviceName = "device"; + when(mPackageManager.checkPermission( + eq(android.Manifest.permission.MEDIA_CONTENT_CONTROL), any(), anyInt())) + .thenReturn(PERMISSION_DENIED); + Notification.DecoratedMediaCustomViewStyle style = + new Notification.DecoratedMediaCustomViewStyle(); + style.setRemotePlaybackInfo(deviceName, 0, null); + Notification.Builder nb = new Notification.Builder(mContext, + mTestNotificationChannel.getId()) + .setStyle(style); + + StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, + "testCustomMediaStyleRemoteNoPermission", mUid, 0, + nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0); + NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel); + + mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(), + nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); + waitForIdle(); + + NotificationRecord posted = mService.findNotificationLocked( + PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId()); + + assertFalse(posted.getNotification().extras + .containsKey(Notification.EXTRA_MEDIA_REMOTE_DEVICE)); + assertFalse(posted.getNotification().extras + .containsKey(Notification.EXTRA_MEDIA_REMOTE_ICON)); + assertFalse(posted.getNotification().extras + .containsKey(Notification.EXTRA_MEDIA_REMOTE_INTENT)); } @Test |