diff options
| author | 2024-10-08 15:36:05 +0000 | |
|---|---|---|
| committer | 2024-10-08 15:36:05 +0000 | |
| commit | b28ca2857a82364d075ebcb90d4e400ce4b17977 (patch) | |
| tree | d5b25e7137377a17be4c02bff647580c8be9c0fe | |
| parent | 3529fe0d96ecf2eae87cb2df52998ed3746d8e16 (diff) | |
| parent | 0de80ea0c8a2b62aec2a433e215436b961f2619b (diff) | |
Merge "Revert^2 "Drop VDM permissions from Shell"" into main
8 files changed, 53 insertions, 97 deletions
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 456fedf912ff..408ed1e861c3 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -743,12 +743,6 @@ <uses-permission android:name="android.permission.READ_SAFETY_CENTER_STATUS" /> <uses-permission android:name="android.permission.MANAGE_SAFETY_CENTER" /> - <!-- Permissions required for CTS test - CtsVirtualDevicesTestCases --> - <uses-permission android:name="android.permission.CREATE_VIRTUAL_DEVICE" /> - <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" /> - <uses-permission android:name="android.permission.ADD_ALWAYS_UNLOCKED_DISPLAY" /> - - <!-- Permission required for CTS test - Notification test suite --> <uses-permission android:name="android.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL" /> diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml index 2724149d859f..c645c0852f1b 100644 --- a/services/tests/servicestests/AndroidManifest.xml +++ b/services/tests/servicestests/AndroidManifest.xml @@ -113,6 +113,7 @@ <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> + <uses-permission android:name="android.permission.CREATE_VIRTUAL_DEVICE" /> <queries> <package android:name="com.android.servicestests.apps.suspendtestapp" /> diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java index c970a3e34d12..840e5c58078b 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java @@ -65,7 +65,6 @@ public class AppOpsActiveWatcherTest { VirtualDeviceRule.withAdditionalPermissions( Manifest.permission.GRANT_RUNTIME_PERMISSIONS, Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, - Manifest.permission.CREATE_VIRTUAL_DEVICE, Manifest.permission.GET_APP_OPS_STATS ); private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000; diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java index 7f2327aa4f24..e3eca6d5fd83 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsDeviceAwareServiceTest.java @@ -58,7 +58,6 @@ public class AppOpsDeviceAwareServiceTest { VirtualDeviceRule.withAdditionalPermissions( Manifest.permission.GRANT_RUNTIME_PERMISSIONS, Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, - Manifest.permission.CREATE_VIRTUAL_DEVICE, Manifest.permission.GET_APP_OPS_STATS); private static final String ATTRIBUTION_TAG_1 = "attributionTag1"; diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java index 1abd4eb6157f..b0846f62628c 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java @@ -22,16 +22,14 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity; import android.app.AppOpsManager; import android.app.AppOpsManager.OnOpNotedListener; import android.companion.virtual.VirtualDeviceManager; -import android.companion.virtual.VirtualDeviceParams; import android.content.AttributionSource; import android.content.Context; import android.os.Process; -import android.virtualdevice.cts.common.FakeAssociationRule; +import android.virtualdevice.cts.common.VirtualDeviceRule; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -42,8 +40,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; -import java.util.concurrent.atomic.AtomicInteger; - /** * Tests watching noted ops. */ @@ -51,7 +47,7 @@ import java.util.concurrent.atomic.AtomicInteger; @RunWith(AndroidJUnit4.class) public class AppOpsNotedWatcherTest { @Rule - public FakeAssociationRule mFakeAssociationRule = new FakeAssociationRule(); + public VirtualDeviceRule mVirtualDeviceRule = VirtualDeviceRule.createDefault(); private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000; @Test @@ -119,19 +115,12 @@ public class AppOpsNotedWatcherTest { public void testWatchNotedOpsForExternalDevice() { final AppOpsManager.OnOpNotedListener listener = mock( AppOpsManager.OnOpNotedListener.class); - final VirtualDeviceManager virtualDeviceManager = getContext().getSystemService( - VirtualDeviceManager.class); - AtomicInteger virtualDeviceId = new AtomicInteger(); - runWithShellPermissionIdentity(() -> { - final VirtualDeviceManager.VirtualDevice virtualDevice = - virtualDeviceManager.createVirtualDevice( - mFakeAssociationRule.getAssociationInfo().getId(), - new VirtualDeviceParams.Builder().setName("virtual_device").build()); - virtualDeviceId.set(virtualDevice.getDeviceId()); - }); + final VirtualDeviceManager.VirtualDevice virtualDevice = + mVirtualDeviceRule.createManagedVirtualDevice(); + final int virtualDeviceId = virtualDevice.getDeviceId(); AttributionSource attributionSource = new AttributionSource(Process.myUid(), getContext().getOpPackageName(), getContext().getAttributionTag(), - virtualDeviceId.get()); + virtualDeviceId); final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class); appOpsManager.startWatchingNoted(new int[]{AppOpsManager.OP_FINE_LOCATION, @@ -142,7 +131,7 @@ public class AppOpsNotedWatcherTest { verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(1)).onOpNoted(eq(AppOpsManager.OPSTR_FINE_LOCATION), eq(Process.myUid()), eq(getContext().getOpPackageName()), - eq(getContext().getAttributionTag()), eq(virtualDeviceId.get()), + eq(getContext().getAttributionTag()), eq(virtualDeviceId), eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED)); appOpsManager.finishOp(getContext().getAttributionSource().getToken(), diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java index 8a6ba4d484f7..d46fb90f40d6 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java @@ -16,8 +16,6 @@ package com.android.server.appop; -import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity; - import static org.mockito.Mockito.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; @@ -28,11 +26,10 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import android.app.AppOpsManager; import android.app.AppOpsManager.OnOpStartedListener; import android.companion.virtual.VirtualDeviceManager; -import android.companion.virtual.VirtualDeviceParams; import android.content.AttributionSource; import android.content.Context; import android.os.Process; -import android.virtualdevice.cts.common.FakeAssociationRule; +import android.virtualdevice.cts.common.VirtualDeviceRule; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -43,15 +40,13 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; -import java.util.concurrent.atomic.AtomicInteger; - /** Tests watching started ops. */ @SmallTest @RunWith(AndroidJUnit4.class) public class AppOpsStartedWatcherTest { @Rule - public FakeAssociationRule mFakeAssociationRule = new FakeAssociationRule(); + public VirtualDeviceRule mVirtualDeviceRule = VirtualDeviceRule.createDefault(); private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000; @Test @@ -124,20 +119,13 @@ public class AppOpsStartedWatcherTest { @Test public void testWatchStartedOpsForExternalDevice() { - final VirtualDeviceManager virtualDeviceManager = getContext().getSystemService( - VirtualDeviceManager.class); - AtomicInteger virtualDeviceId = new AtomicInteger(); - runWithShellPermissionIdentity(() -> { - final VirtualDeviceManager.VirtualDevice virtualDevice = - virtualDeviceManager.createVirtualDevice( - mFakeAssociationRule.getAssociationInfo().getId(), - new VirtualDeviceParams.Builder().setName("virtual_device").build()); - virtualDeviceId.set(virtualDevice.getDeviceId()); - }); + final VirtualDeviceManager.VirtualDevice virtualDevice = + mVirtualDeviceRule.createManagedVirtualDevice(); + final int virtualDeviceId = virtualDevice.getDeviceId(); final OnOpStartedListener listener = mock(OnOpStartedListener.class); AttributionSource attributionSource = new AttributionSource(Process.myUid(), getContext().getOpPackageName(), getContext().getAttributionTag(), - virtualDeviceId.get()); + virtualDeviceId); final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class); appOpsManager.startWatchingStarted(new int[]{AppOpsManager.OP_FINE_LOCATION, @@ -150,7 +138,7 @@ public class AppOpsStartedWatcherTest { verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(1)).onOpStarted(eq(AppOpsManager.OP_FINE_LOCATION), eq(Process.myUid()), eq(getContext().getOpPackageName()), - eq(getContext().getAttributionTag()), eq(virtualDeviceId.get()), + eq(getContext().getAttributionTag()), eq(virtualDeviceId), eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED), eq(OnOpStartedListener.START_TYPE_STARTED), eq(AppOpsManager.ATTRIBUTION_FLAGS_NONE), diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java index e6c34ca68c75..98b11918c13b 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java @@ -50,7 +50,6 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.testng.Assert.assertThrows; -import android.Manifest; import android.app.WindowConfiguration; import android.app.admin.DevicePolicyManager; import android.companion.AssociationInfo; @@ -113,10 +112,11 @@ import android.view.Display; import android.view.DisplayInfo; import android.view.KeyEvent; import android.view.WindowManager; +import android.virtualdevice.cts.common.VirtualDeviceRule; import androidx.test.platform.app.InstrumentationRegistry; -import com.android.compatibility.common.util.AdoptShellPermissionsRule; +import com.android.compatibility.common.util.SystemUtil; import com.android.internal.app.BlockedAppStreamingActivity; import com.android.internal.os.BackgroundThread; import com.android.server.LocalServices; @@ -224,9 +224,7 @@ public class VirtualDeviceManagerServiceTest { public SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Rule - public AdoptShellPermissionsRule mAdoptShellPermissionsRule = new AdoptShellPermissionsRule( - InstrumentationRegistry.getInstrumentation().getUiAutomation(), - Manifest.permission.CREATE_VIRTUAL_DEVICE); + public VirtualDeviceRule mVirtualDeviceRule = VirtualDeviceRule.createDefault(); private Context mContext; private InputManagerMockHelper mInputManagerMockHelper; @@ -1069,64 +1067,65 @@ public class VirtualDeviceManagerServiceTest { @Test public void createVirtualDpad_noPermission_failsSecurityException() { addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); - try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { - assertThrows(SecurityException.class, - () -> mDeviceImpl.createVirtualDpad(DPAD_CONFIG, BINDER)); - } + // Shell doesn't have CREATE_VIRTUAL_DEVICE permission. + SystemUtil.runWithShellPermissionIdentity(() -> + assertThrows(SecurityException.class, + () -> mDeviceImpl.createVirtualDpad(DPAD_CONFIG, BINDER))); } @Test public void createVirtualKeyboard_noPermission_failsSecurityException() { addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); - try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { - assertThrows(SecurityException.class, - () -> mDeviceImpl.createVirtualKeyboard(KEYBOARD_CONFIG, BINDER)); - } + // Shell doesn't have CREATE_VIRTUAL_DEVICE permission. + SystemUtil.runWithShellPermissionIdentity(() -> + assertThrows(SecurityException.class, + () -> mDeviceImpl.createVirtualKeyboard(KEYBOARD_CONFIG, BINDER))); } @Test public void createVirtualMouse_noPermission_failsSecurityException() { addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); - try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { - assertThrows(SecurityException.class, - () -> mDeviceImpl.createVirtualMouse(MOUSE_CONFIG, BINDER)); - } + // Shell doesn't have CREATE_VIRTUAL_DEVICE permission. + SystemUtil.runWithShellPermissionIdentity(() -> + assertThrows(SecurityException.class, + () -> mDeviceImpl.createVirtualMouse(MOUSE_CONFIG, BINDER))); } @Test public void createVirtualTouchscreen_noPermission_failsSecurityException() { addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); - try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { - assertThrows(SecurityException.class, - () -> mDeviceImpl.createVirtualTouchscreen(TOUCHSCREEN_CONFIG, BINDER)); - } + // Shell doesn't have CREATE_VIRTUAL_DEVICE permission. + SystemUtil.runWithShellPermissionIdentity(() -> + assertThrows(SecurityException.class, + () -> mDeviceImpl.createVirtualTouchscreen(TOUCHSCREEN_CONFIG, BINDER))); } @Test public void createVirtualNavigationTouchpad_noPermission_failsSecurityException() { addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); - try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { - assertThrows(SecurityException.class, - () -> mDeviceImpl.createVirtualNavigationTouchpad(NAVIGATION_TOUCHPAD_CONFIG, - BINDER)); - } + // Shell doesn't have CREATE_VIRTUAL_DEVICE permission. + SystemUtil.runWithShellPermissionIdentity(() -> + assertThrows(SecurityException.class, + () -> mDeviceImpl.createVirtualNavigationTouchpad( + NAVIGATION_TOUCHPAD_CONFIG, + BINDER))); } @Test public void onAudioSessionStarting_noPermission_failsSecurityException() { addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); - try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { - assertThrows(SecurityException.class, - () -> mDeviceImpl.onAudioSessionStarting( - DISPLAY_ID_1, mRoutingCallback, mConfigChangedCallback)); - } + // Shell doesn't have CREATE_VIRTUAL_DEVICE permission. + SystemUtil.runWithShellPermissionIdentity(() -> + assertThrows(SecurityException.class, + () -> mDeviceImpl.onAudioSessionStarting( + DISPLAY_ID_1, mRoutingCallback, mConfigChangedCallback))); } @Test public void onAudioSessionEnded_noPermission_failsSecurityException() { - try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { - assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionEnded()); - } + // Shell doesn't have CREATE_VIRTUAL_DEVICE permission. + SystemUtil.runWithShellPermissionIdentity(() -> + assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionEnded())); } @Test @@ -2001,18 +2000,4 @@ public class VirtualDeviceManagerServiceTest { /* notifyOnDeviceNearby= */ false, /* revoked= */ false, /* pending= */ false, /* timeApprovedMs= */0, /* lastTimeConnectedMs= */0, /* systemDataSyncFlags= */ -1); } - - /** Helper class to drop permissions temporarily and restore them at the end of a test. */ - static final class DropShellPermissionsTemporarily implements AutoCloseable { - DropShellPermissionsTemporarily() { - InstrumentationRegistry.getInstrumentation().getUiAutomation() - .dropShellPermissionIdentity(); - } - - @Override - public void close() { - InstrumentationRegistry.getInstrumentation().getUiAutomation() - .adoptShellPermissionIdentity(); - } - } } diff --git a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java index 425bb158f997..7e22d74c64e1 100644 --- a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java @@ -1256,7 +1256,8 @@ public class MediaProjectionManagerServiceTest { Manifest.permission.BYPASS_ROLE_QUALIFICATION); roleManager.setBypassingRoleQualification(true); - roleManager.addRoleHolderAsUser(role, packageName, /* flags = */ 0, user, + roleManager.addRoleHolderAsUser(role, packageName, + /* flags= */ RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP, user, mContext.getMainExecutor(), success -> { if (success) { latch.countDown(); @@ -1271,9 +1272,9 @@ public class MediaProjectionManagerServiceTest { } catch (InterruptedException e) { throw new RuntimeException(e); } finally { - roleManager.removeRoleHolderAsUser(role, packageName, 0, user, - mContext.getMainExecutor(), (aBool) -> { - }); + roleManager.removeRoleHolderAsUser(role, packageName, + /* flags= */ RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP, user, + mContext.getMainExecutor(), (aBool) -> {}); roleManager.setBypassingRoleQualification(false); instrumentation.getUiAutomation() .dropShellPermissionIdentity(); |