Merge "Fix issues with setRemotePlaybackInfo" into tm-dev am: 9587fcef86

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22204857

Change-Id: I88322d32ce3405a2f114e3bd3321579a15b7529d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Michael Mikhail
2023-04-03 12:11:49 +00:00
committed by Automerger Merge Worker
4 changed files with 88 additions and 5 deletions

View File

@@ -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");
}

View File

@@ -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()) }

View File

@@ -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) {

View File

@@ -4171,6 +4171,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