diff options
2 files changed, 233 insertions, 93 deletions
diff --git a/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt b/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt index 2efc6718e..b800d7e17 100644 --- a/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt +++ b/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt @@ -21,6 +21,7 @@ import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE import android.app.Instrumentation import android.companion.virtual.VirtualDeviceManager +import android.companion.virtual.VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT import android.companion.virtual.VirtualDeviceManager.VirtualDevice import android.companion.virtual.VirtualDeviceParams import android.content.Context @@ -63,6 +64,7 @@ class DevicePermissionsTest { private lateinit var virtualDevice: VirtualDevice private lateinit var virtualDeviceContext: Context + private lateinit var persistentDeviceId: String private lateinit var permissionManager: PermissionManager @@ -75,7 +77,8 @@ class DevicePermissionsTest { Manifest.permission.CREATE_VIRTUAL_DEVICE, Manifest.permission.GRANT_RUNTIME_PERMISSIONS, Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS, - Manifest.permission.REVOKE_RUNTIME_PERMISSIONS + Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, + Manifest.permission.GET_RUNTIME_PERMISSIONS ) @Rule @JvmField val mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() @@ -92,6 +95,7 @@ class DevicePermissionsTest { ) virtualDeviceContext = defaultDeviceContext.createDeviceContext(virtualDevice.deviceId) permissionManager = virtualDeviceContext.getSystemService(PermissionManager::class.java)!! + persistentDeviceId = virtualDevice.persistentDeviceId!! runShellCommandOrThrow("pm install -r $TEST_APK") } @@ -120,13 +124,9 @@ class DevicePermissionsTest { @Test fun testNonDeviceAwareRuntimePermissionGrantIsInherited() { - grantPermissionAndAssertGranted(Manifest.permission.READ_CONTACTS, defaultDeviceContext) + grantPermissionAndAssertGranted(NON_DEVICE_AWARE_PERMISSION, defaultDeviceContext) - assertPermission( - Manifest.permission.READ_CONTACTS, - PERMISSION_GRANTED, - virtualDeviceContext - ) + assertPermission(NON_DEVICE_AWARE_PERMISSION, PERMISSION_GRANTED, virtualDeviceContext) } @RequiresFlagsEnabled( @@ -135,22 +135,18 @@ class DevicePermissionsTest { ) @Test fun testDeviceAwareRuntimePermissionIsRevoked() { - grantPermissionAndAssertGranted(Manifest.permission.RECORD_AUDIO, virtualDeviceContext) + grantPermissionAndAssertGranted(DEVICE_AWARE_PERMISSION, virtualDeviceContext) - revokePermissionAndAssertDenied(Manifest.permission.RECORD_AUDIO, virtualDeviceContext) + revokePermissionAndAssertDenied(DEVICE_AWARE_PERMISSION, virtualDeviceContext) } @Test fun testNonDeviceAwareRuntimePermissionIsRevokedForDefaultDevice() { - grantPermissionAndAssertGranted(Manifest.permission.READ_CONTACTS, defaultDeviceContext) - assertPermission( - Manifest.permission.READ_CONTACTS, - PERMISSION_GRANTED, - virtualDeviceContext - ) + grantPermissionAndAssertGranted(NON_DEVICE_AWARE_PERMISSION, defaultDeviceContext) + assertPermission(NON_DEVICE_AWARE_PERMISSION, PERMISSION_GRANTED, virtualDeviceContext) // Revoke call from virtualDeviceContext should revoke for default device as well. - revokePermissionAndAssertDenied(Manifest.permission.READ_CONTACTS, virtualDeviceContext) - assertPermission(Manifest.permission.READ_CONTACTS, PERMISSION_DENIED, defaultDeviceContext) + revokePermissionAndAssertDenied(NON_DEVICE_AWARE_PERMISSION, virtualDeviceContext) + assertPermission(NON_DEVICE_AWARE_PERMISSION, PERMISSION_DENIED, defaultDeviceContext) } @Test @@ -165,9 +161,9 @@ class DevicePermissionsTest { @Test fun testOneTimePermissionIsRevoked() { - grantPermissionAndAssertGranted(Manifest.permission.RECORD_AUDIO, virtualDeviceContext) + grantPermissionAndAssertGranted(DEVICE_AWARE_PERMISSION, virtualDeviceContext) virtualDeviceContext.packageManager.updatePermissionFlags( - Manifest.permission.RECORD_AUDIO, + DEVICE_AWARE_PERMISSION, TEST_PACKAGE_NAME, FLAG_PERMISSION_ONE_TIME, FLAG_PERMISSION_ONE_TIME, @@ -182,11 +178,7 @@ class DevicePermissionsTest { IMPORTANCE_FOREGROUND_SERVICE ) eventually { - assertPermission( - Manifest.permission.RECORD_AUDIO, - PERMISSION_DENIED, - virtualDeviceContext - ) + assertPermission(DEVICE_AWARE_PERMISSION, PERMISSION_DENIED, virtualDeviceContext) } } @@ -196,15 +188,11 @@ class DevicePermissionsTest { ) @Test fun testRevokeSelfPermissionOnKill() { - grantPermissionAndAssertGranted(Manifest.permission.RECORD_AUDIO, virtualDeviceContext) + grantPermissionAndAssertGranted(DEVICE_AWARE_PERMISSION, virtualDeviceContext) - revokeSelfPermission(Manifest.permission.RECORD_AUDIO, virtualDeviceContext) + revokeSelfPermission(DEVICE_AWARE_PERMISSION, virtualDeviceContext) eventually { - assertPermission( - Manifest.permission.RECORD_AUDIO, - PERMISSION_DENIED, - virtualDeviceContext - ) + assertPermission(DEVICE_AWARE_PERMISSION, PERMISSION_DENIED, virtualDeviceContext) } } @@ -214,19 +202,19 @@ class DevicePermissionsTest { ) @Test fun testGrantAndRevokeDeviceAwarePermissionByPersistentDeviceId() { - val deviceAwarePermission = Manifest.permission.RECORD_AUDIO + val deviceAwarePermission = DEVICE_AWARE_PERMISSION permissionManager.grantRuntimePermission( TEST_PACKAGE_NAME, deviceAwarePermission, - virtualDevice.persistentDeviceId!! + persistentDeviceId ) assertThat( PermissionManager.checkPermission( deviceAwarePermission, TEST_PACKAGE_NAME, - virtualDevice.persistentDeviceId!!, + persistentDeviceId, virtualDeviceContext.userId ) ) @@ -236,7 +224,7 @@ class DevicePermissionsTest { PermissionManager.checkPermission( deviceAwarePermission, TEST_PACKAGE_NAME, - VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT, + PERSISTENT_DEVICE_ID_DEFAULT, defaultDeviceContext.userId ) ) @@ -245,7 +233,7 @@ class DevicePermissionsTest { permissionManager.revokeRuntimePermission( TEST_PACKAGE_NAME, deviceAwarePermission, - virtualDevice.persistentDeviceId!!, + persistentDeviceId, "test" ) @@ -253,7 +241,7 @@ class DevicePermissionsTest { PermissionManager.checkPermission( deviceAwarePermission, TEST_PACKAGE_NAME, - virtualDevice.persistentDeviceId!!, + persistentDeviceId, virtualDeviceContext.userId ) ) @@ -266,7 +254,7 @@ class DevicePermissionsTest { ) @Test fun testUpdateAndGetPermissionFlagsByPersistentDeviceId() { - val deviceAwarePermission = Manifest.permission.RECORD_AUDIO + val deviceAwarePermission = DEVICE_AWARE_PERMISSION val flagMask = FLAG_PERMISSION_USER_SET or FLAG_PERMISSION_USER_FIXED val flag = FLAG_PERMISSION_USER_SET @@ -274,7 +262,7 @@ class DevicePermissionsTest { permissionManager.getPermissionFlags( TEST_PACKAGE_NAME, deviceAwarePermission, - virtualDevice.persistentDeviceId!! + persistentDeviceId ) ) .isEqualTo(0) @@ -282,7 +270,7 @@ class DevicePermissionsTest { permissionManager.updatePermissionFlags( TEST_PACKAGE_NAME, deviceAwarePermission, - virtualDevice.persistentDeviceId!!, + persistentDeviceId, flagMask, flag ) @@ -291,12 +279,213 @@ class DevicePermissionsTest { permissionManager.getPermissionFlags( TEST_PACKAGE_NAME, deviceAwarePermission, - virtualDevice.persistentDeviceId!! + persistentDeviceId ) ) .isEqualTo(FLAG_PERMISSION_USER_SET) } + @RequiresFlagsEnabled( + Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + ) + @Test + fun testAllPermissionStatesApiGrantForVirtualDevice() { + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId) + .isEmpty() + ) + .isTrue() + + permissionManager.grantRuntimePermission( + TEST_PACKAGE_NAME, + DEVICE_AWARE_PERMISSION, + persistentDeviceId + ) + + val permissionStateMap = + permissionManager.getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId) + assertThat(permissionStateMap.size).isEqualTo(1) + assertThat(permissionStateMap[DEVICE_AWARE_PERMISSION]!!.isGranted).isTrue() + assertThat(permissionStateMap[DEVICE_AWARE_PERMISSION]!!.flags).isEqualTo(0) + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT) + .contains(DEVICE_AWARE_PERMISSION) + ) + .isFalse() + + permissionManager.revokeRuntimePermission( + TEST_PACKAGE_NAME, + DEVICE_AWARE_PERMISSION, + persistentDeviceId, + "test" + ) + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId) + .contains(DEVICE_AWARE_PERMISSION) + ) + .isFalse() + } + + @RequiresFlagsEnabled( + Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + ) + @Test + fun testAllPermissionStatesApiFlagsForVirtualDevice() { + val flagMask = FLAG_PERMISSION_USER_SET or FLAG_PERMISSION_USER_FIXED + val flag = FLAG_PERMISSION_USER_SET + + assertThat(permissionManager.getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)) + .isEmpty() + + permissionManager.updatePermissionFlags( + TEST_PACKAGE_NAME, + DEVICE_AWARE_PERMISSION, + persistentDeviceId, + flagMask, + flag + ) + + assertThat( + hasPermission( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)[ + DEVICE_AWARE_PERMISSION]!! + .flags, + flag + ) + ) + .isTrue() + + assertThat( + hasPermission( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)[ + DEVICE_AWARE_PERMISSION]!! + .flags, + FLAG_PERMISSION_USER_FIXED + ) + ) + .isFalse() + } + + @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED) + @Test + fun testAllPermissionStatesApiGrantForDefaultDevice() { + permissionManager.grantRuntimePermission( + TEST_PACKAGE_NAME, + DEVICE_AWARE_PERMISSION, + PERSISTENT_DEVICE_ID_DEFAULT + ) + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[ + DEVICE_AWARE_PERMISSION]!! + .isGranted + ) + .isTrue() + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId) + .contains(DEVICE_AWARE_PERMISSION) + ) + .isFalse() + + permissionManager.revokeRuntimePermission( + TEST_PACKAGE_NAME, + DEVICE_AWARE_PERMISSION, + PERSISTENT_DEVICE_ID_DEFAULT, + "test" + ) + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT) + .contains(DEVICE_AWARE_PERMISSION) + ) + .isFalse() + } + + @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED) + @Test + fun testAllPermissionStatesApiFlagsForDefaultDevice() { + val flagMask = FLAG_PERMISSION_USER_SET or FLAG_PERMISSION_USER_FIXED + val flag = FLAG_PERMISSION_USER_SET + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT) + .contains(DEVICE_AWARE_PERMISSION) + ) + .isFalse() + + permissionManager.updatePermissionFlags( + TEST_PACKAGE_NAME, + DEVICE_AWARE_PERMISSION, + PERSISTENT_DEVICE_ID_DEFAULT, + flagMask, + flag + ) + + assertThat( + hasPermission( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[ + DEVICE_AWARE_PERMISSION]!! + .flags, + flag + ) + ) + .isTrue() + + assertThat( + hasPermission( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[ + DEVICE_AWARE_PERMISSION]!! + .flags, + FLAG_PERMISSION_USER_FIXED + ) + ) + .isFalse() + } + + @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED) + @Test + fun testAllPermissionStatesApiThatNonDeviceAwareRuntimePermissionGrantIsNotInherited() { + permissionManager.grantRuntimePermission( + TEST_PACKAGE_NAME, + NON_DEVICE_AWARE_PERMISSION, + PERSISTENT_DEVICE_ID_DEFAULT + ) + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[ + NON_DEVICE_AWARE_PERMISSION]!! + .isGranted + ) + .isTrue() + + assertThat( + permissionManager + .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId) + .contains(NON_DEVICE_AWARE_PERMISSION) + ) + .isFalse() + } + + private fun hasPermission(permissionFlags: Int, permissionBit: Int): Boolean = + permissionFlags and permissionBit != 0 + private fun revokeSelfPermission(permissionName: String, context: Context) { val intent = Intent(PERMISSION_SELF_REVOKE_INTENT) intent.setClassName(TEST_PACKAGE_NAME, PERMISSION_SELF_REVOKE_RECEIVER) @@ -345,5 +534,8 @@ class DevicePermissionsTest { "android.permission.cts.appthatrequestpermission.REVOKE_SELF_PERMISSION" private const val PERMISSION_SELF_REVOKE_RECEIVER = "android.permission.cts.appthatrequestpermission.RevokeSelfPermissionReceiver" + + private const val DEVICE_AWARE_PERMISSION = Manifest.permission.RECORD_AUDIO + private const val NON_DEVICE_AWARE_PERMISSION = Manifest.permission.READ_CONTACTS } } diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt index e97d9a9e6..c199c7660 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt @@ -175,16 +175,6 @@ class DeviceAwarePermissionGrantTest { mFakeVirtualDeviceRule.virtualDevice.deviceId, expectPermissionGrantedOnRemoteDevice ) - - assertAppHasPermissionForDeviceUsingAllPermissionStatesApi( - defaultDeviceContext, - expectPermissionGrantedOnRemoteDevice - ) - - assertAppHasPermissionForDefaultDeviceUsingAllPermissionStatesApi( - defaultDeviceContext, - expectPermissionGrantedOnDefaultDevice - ) } private fun requestPermissionOnDevice(displayId: Int, targetDeviceId: Int) { @@ -224,48 +214,6 @@ class DeviceAwarePermissionGrantTest { } } - private fun assertAppHasPermissionForDeviceUsingAllPermissionStatesApi( - context: Context, - expectPermissionGranted: Boolean - ) { - val vdm = context.getSystemService(VirtualDeviceManager::class.java)!! - val persistentDeviceIds = vdm.allPersistentDeviceIds - - if (persistentDeviceIds.isEmpty()) { - Assert.assertEquals(expectPermissionGranted, false) - } else { - Assert.assertEquals(1, persistentDeviceIds.size) - val permMap = - PermissionUtils.getAllPermissionStates( - context, - APP_PACKAGE_NAME, - persistentDeviceIds.toList()[0] - ) - val grantedList = - permMap.filter { it.key == Manifest.permission.CAMERA }.map { it.value.isGranted } - if (grantedList.isNotEmpty()) { - Assert.assertEquals(1, grantedList.size) - Assert.assertEquals(expectPermissionGranted, grantedList[0]) - } else { - Assert.assertFalse(expectPermissionGranted) - } - } - } - - private fun assertAppHasPermissionForDefaultDeviceUsingAllPermissionStatesApi( - context: Context, - expectPermissionGranted: Boolean - ) { - val permMap = - PermissionUtils.getAllPermissionStates( - context, - APP_PACKAGE_NAME, - PERSISTENT_DEVICE_ID_DEFAULT - ) - Assert.assertNotNull(permMap[Manifest.permission.CAMERA]) - Assert.assertEquals(expectPermissionGranted, permMap[Manifest.permission.CAMERA]?.isGranted) - } - companion object { const val APK_DIRECTORY = "/data/local/tmp/cts-permissionmultidevice" const val APP_APK_PATH_STREAMING = "${APK_DIRECTORY}/CtsAccessRemoteDeviceCamera.apk" |