Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7e8db04 authored by Michael Mikhail's avatar Michael Mikhail Committed by Automerger Merge Worker
Browse files

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

parents 93694f3f 9587fcef
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -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");
                            }
+42 −0
Original line number Diff line number Diff line
@@ -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()) }

+2 −1
Original line number Diff line number Diff line
@@ -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) {
+37 −0
Original line number Diff line number Diff line
@@ -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