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

Commit 1c8ffb0e authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Delegate mirror display permission check to VDM.

We'll need to do app compat check before checking for the permission
and we'll need the VD owner info for this, so it has to be done in VDM

Any future use cases for bypassing the permission due to user consent
need to be handled in VDM as well.

This also cleans up the DMS tests.

Bug: 370657575
Test: presubmit
Flag: EXEMPT no-op
Change-Id: Ie452b08933b564c0faf3b7a6329d019dd48b878c
parent bf504315
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.companion.virtual;

import static android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY;
import static android.Manifest.permission.ADD_MIRROR_DISPLAY;
import static android.Manifest.permission.ADD_TRUSTED_DISPLAY;
import static android.app.admin.DevicePolicyManager.NEARBY_STREAMING_ENABLED;
import static android.app.admin.DevicePolicyManager.NEARBY_STREAMING_NOT_CONTROLLED_BY_POLICY;
@@ -1380,8 +1381,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub

    @Override
    public boolean canCreateMirrorDisplays() {
        if (!android.companion.virtualdevice.flags.Flags.enableLimitedVdmRole()) {
            return DEVICE_PROFILES_ALLOWING_MIRROR_DISPLAYS.contains(getDeviceProfile());
        }
        return mContext.checkCallingOrSelfPermission(ADD_MIRROR_DISPLAY)
                == PackageManager.PERMISSION_GRANTED;
    }

    private boolean hasCustomAudioInputSupportInternal() {
        if (!android.media.audiopolicy.Flags.audioMixTestApi()) {
+0 −4
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.server.display;

import static android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY;
import static android.Manifest.permission.ADD_MIRROR_DISPLAY;
import static android.Manifest.permission.ADD_TRUSTED_DISPLAY;
import static android.Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT;
import static android.Manifest.permission.CAPTURE_VIDEO_OUTPUT;
@@ -1827,9 +1826,6 @@ public final class DisplayManagerService extends SystemService {
    }

    private boolean canCreateMirrorDisplays(IVirtualDevice virtualDevice) {
        if (android.companion.virtualdevice.flags.Flags.enableLimitedVdmRole()) {
            return checkCallingPermission(ADD_MIRROR_DISPLAY, "canCreateMirrorDisplays");
        }
        try {
            return virtualDevice != null && virtualDevice.canCreateMirrorDisplays();
        } catch (RemoteException e) {
+6 −32
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.server.display;

import static android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY;
import static android.Manifest.permission.ADD_MIRROR_DISPLAY;
import static android.Manifest.permission.ADD_TRUSTED_DISPLAY;
import static android.Manifest.permission.CAPTURE_VIDEO_OUTPUT;
import static android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS;
@@ -1487,7 +1486,7 @@ public class DisplayManagerServiceTest {

    /**
     * Tests that it is not allowed to create an auto-mirror virtual display for a virtual device
     * without ADD_MIRROR_DISPLAY permission / without the mirror display capability.
     * without mirror display creation capability.
     */
    @Test
    public void createAutoMirrorDisplay_withoutPermission_throwsException() throws Exception {
@@ -1497,12 +1496,7 @@ public class DisplayManagerServiceTest {
        when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
        IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
        when(virtualDevice.getDeviceId()).thenReturn(1);
        if (android.companion.virtualdevice.flags.Flags.enableLimitedVdmRole()) {
            when(mContext.checkCallingPermission(ADD_MIRROR_DISPLAY))
                    .thenReturn(PackageManager.PERMISSION_DENIED);
        } else {
        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(false);
        }
        when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);
        when(mContext.checkCallingPermission(CAPTURE_VIDEO_OUTPUT)).thenReturn(
                PackageManager.PERMISSION_DENIED);
@@ -1533,12 +1527,7 @@ public class DisplayManagerServiceTest {
        when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
        IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
        when(virtualDevice.getDeviceId()).thenReturn(1);
        if (android.companion.virtualdevice.flags.Flags.enableLimitedVdmRole()) {
            when(mContext.checkCallingPermission(ADD_MIRROR_DISPLAY))
                    .thenReturn(PackageManager.PERMISSION_GRANTED);
        } else {
        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
        }
        when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);

        // Create an auto-mirror virtual display using a virtual device.
@@ -1571,12 +1560,7 @@ public class DisplayManagerServiceTest {
        when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
        IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
        when(virtualDevice.getDeviceId()).thenReturn(1);
        if (android.companion.virtualdevice.flags.Flags.enableLimitedVdmRole()) {
            when(mContext.checkCallingPermission(ADD_MIRROR_DISPLAY))
                    .thenReturn(PackageManager.PERMISSION_GRANTED);
        } else {
        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
        }
        when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);

        // Create an auto-mirror virtual display using a virtual device.
@@ -1643,12 +1627,7 @@ public class DisplayManagerServiceTest {
        when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
        IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
        when(virtualDevice.getDeviceId()).thenReturn(1);
        if (android.companion.virtualdevice.flags.Flags.enableLimitedVdmRole()) {
            when(mContext.checkCallingPermission(ADD_MIRROR_DISPLAY))
                    .thenReturn(PackageManager.PERMISSION_GRANTED);
        } else {
        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
        }
        when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);
        when(mContext.checkCallingPermission(ADD_ALWAYS_UNLOCKED_DISPLAY))
                .thenReturn(PackageManager.PERMISSION_GRANTED);
@@ -1684,12 +1663,7 @@ public class DisplayManagerServiceTest {
        when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
        IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
        when(virtualDevice.getDeviceId()).thenReturn(1);
        if (android.companion.virtualdevice.flags.Flags.enableLimitedVdmRole()) {
            when(mContext.checkCallingPermission(ADD_MIRROR_DISPLAY))
                    .thenReturn(PackageManager.PERMISSION_GRANTED);
        } else {
        when(virtualDevice.canCreateMirrorDisplays()).thenReturn(true);
        }
        when(mIVirtualDeviceManager.isValidVirtualDeviceId(1)).thenReturn(true);

        // Create an auto-mirror virtual display using a virtual device.