summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Mikhail <michaelmikhil@google.com>2023-04-03 11:40:47 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2023-04-03 11:40:47 +0000
commit9587fcef86226cda303577025629af0f52979dbe (patch)
tree391b67bf767bb06a2f61bca1897f27146a961b0f
parent0c702a76a3eb705594c4cd9be5b0db25b8f658f5 (diff)
parent3c3056c16970d561175192e7a8909a9de784ae54 (diff)
downloadbase-9587fcef86226cda303577025629af0f52979dbe.tar.gz
Merge "Fix issues with setRemotePlaybackInfo" into tm-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt42
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java3
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java37
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