diff options
Diffstat (limited to 'tests')
17 files changed, 249 insertions, 125 deletions
diff --git a/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java b/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java index 166a5dbd1..024a89f2e 100644 --- a/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java +++ b/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java @@ -77,6 +77,7 @@ import androidx.test.filters.SdkSuppress; import androidx.test.runner.AndroidJUnit4; import com.android.compatibility.common.util.DeviceConfigStateChangerRule; +import com.android.compatibility.common.util.UserHelper; import com.android.compatibility.common.util.mainline.MainlineModule; import com.android.compatibility.common.util.mainline.ModuleDetector; import com.android.modules.utils.build.SdkLevel; @@ -199,6 +200,8 @@ public class LocationAccessCheckTest { private static boolean sWasLocationEnabled = true; + private UserHelper mUserHelper = new UserHelper(sContext); + @BeforeClass public static void beforeClassSetup() throws Exception { reduceDelays(); @@ -465,6 +468,14 @@ public class LocationAccessCheckTest { @Before public void beforeEachTestSetup() throws Throwable { assumeIsNotLowRamDevice(); + + // TODO(b/380297485): Remove this assumption once NotificationListeners are supported on + // visible background users. + // Skipping each test for visible background users as all test cases depend on + // NotificationListeners. + assumeFalse("NotificationListeners are not yet supported on visible background users", + mUserHelper.isVisibleBackgroundUser()); + wakeUpAndDismissKeyguard(); bindService(); resetPermissionControllerBeforeEachTest(); diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt index 687234582..44eef2144 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt @@ -93,7 +93,7 @@ class DeviceAwarePermissionGrantTest { val displayConfigBuilder = VirtualDeviceRule.createDefaultVirtualDisplayConfigBuilder( DISPLAY_WIDTH, - DISPLAY_HEIGHT + DISPLAY_HEIGHT, ) .setFlags( DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC or @@ -114,7 +114,7 @@ class DeviceAwarePermissionGrantTest { @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun onHostDevice_requestPermissionForHostDevice_shouldGrantPermission() { @@ -124,13 +124,13 @@ class DeviceAwarePermissionGrantTest { false, "", expectPermissionGrantedOnDefaultDevice = true, - expectPermissionGrantedOnRemoteDevice = false + expectPermissionGrantedOnRemoteDevice = false, ) } @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun onHostDevice_requestPermissionForRemoteDevice_shouldGrantPermission() { @@ -140,13 +140,13 @@ class DeviceAwarePermissionGrantTest { true, deviceDisplayName, expectPermissionGrantedOnDefaultDevice = false, - expectPermissionGrantedOnRemoteDevice = true + expectPermissionGrantedOnRemoteDevice = true, ) } @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @RequiresFlagsDisabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES) @Test @@ -160,8 +160,9 @@ class DeviceAwarePermissionGrantTest { @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, - Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES + Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES, ) + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") @Test fun onRemoteDevice_requestPermissionForHostDevice_shouldGrantPermission() { // Create a virtual device with default policy, so that camera permission request will @@ -176,16 +177,18 @@ class DeviceAwarePermissionGrantTest { virtualDisplay.display.displayId, virtualDevice.deviceId, true, - Settings.Global.getString(defaultDeviceContext.contentResolver, - Settings.Global.DEVICE_NAME), + Settings.Global.getString( + defaultDeviceContext.contentResolver, + Settings.Global.DEVICE_NAME, + ), expectPermissionGrantedOnDefaultDevice = true, - expectPermissionGrantedOnRemoteDevice = false + expectPermissionGrantedOnRemoteDevice = false, ) } @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun onRemoteDevice_requestPermissionForRemoteDevice_shouldGrantPermission() { @@ -195,7 +198,7 @@ class DeviceAwarePermissionGrantTest { true, deviceDisplayName, expectPermissionGrantedOnDefaultDevice = false, - expectPermissionGrantedOnRemoteDevice = true + expectPermissionGrantedOnRemoteDevice = true, ) } @@ -205,7 +208,7 @@ class DeviceAwarePermissionGrantTest { showDeviceName: Boolean, expectedDeviceNameInDialog: String, expectPermissionGrantedOnDefaultDevice: Boolean, - expectPermissionGrantedOnRemoteDevice: Boolean + expectPermissionGrantedOnRemoteDevice: Boolean, ) { // Assert no permission granted to either default device or virtual device at the beginning assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false) @@ -240,13 +243,13 @@ class DeviceAwarePermissionGrantTest { assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, expectPermissionGrantedOnDefaultDevice) assertAppHasPermissionForDevice( virtualDevice.deviceId, - expectPermissionGrantedOnRemoteDevice + expectPermissionGrantedOnRemoteDevice, ) } private fun requestPermissionOnDevice( displayId: Int, - targetDeviceId: Int + targetDeviceId: Int, ): CompletableFuture<Bundle> { val future = CompletableFuture<Bundle>() val callback = RemoteCallback { result: Bundle? -> future.complete(result) } diff --git a/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt index d8eb153bf..b2da92d22 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt @@ -121,7 +121,7 @@ abstract class BasePermissionTest { /* PackageManager.FEATURE_CAR_SPLITSCREEN_MULTITASKING */ "android.software.car.splitscreen_multitasking") @JvmStatic - private val isAutomotiveVisibleBackgroundUser = isAutomotive && + protected val isAutomotiveVisibleBackgroundUser = isAutomotive && UserHelper(context).isVisibleBackgroundUser() // TODO(b/382327037):find a way to avoid specifying the display ID for each UiSelector. diff --git a/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt index 8e91a00ce..9ec09dab7 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt @@ -78,20 +78,14 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun installedAppStartsWithModeDefault() { installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST) - eventually { - runWithShellPermissionIdentity { - assertEquals( - getAppEcmState(context, appOpsManager, APP_PACKAGE_NAME), - AppOpsManager.MODE_DEFAULT - ) - } - } + waitForModeDefault() } @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED) @Test fun givenStoreAppThenIsNotRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } } @@ -101,6 +95,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenLocalAppThenIsRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromLocalFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } } @@ -110,6 +105,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenDownloadedThenAppIsRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } } @@ -119,6 +115,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenExplicitlyRestrictedAppThenIsRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST) + waitForModeDefault() eventually { runWithShellPermissionIdentity { assertEquals( @@ -138,6 +135,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenRestrictedAppThenIsNotRestrictedFromNonProtectedSetting() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, NON_PROTECTED_SETTING)) } } @@ -147,6 +145,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenRestrictedAppThenClearRestrictionNotAllowedByDefault() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertFalse(ecm.isClearRestrictionAllowed(APP_PACKAGE_NAME)) } } @@ -156,6 +155,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun givenRestrictedAppWhenClearRestrictionThenNotRestrictedFromProtectedSetting() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() runWithShellPermissionIdentity { eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) } ecm.setClearRestrictionAllowed(APP_PACKAGE_NAME) @@ -169,6 +169,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { @Test fun createRestrictedSettingDialogIntentReturnsIntent() { installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST) + waitForModeDefault() val intent = ecm.createRestrictedSettingDialogIntent(APP_PACKAGE_NAME, PROTECTED_SETTING) @@ -181,6 +182,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() val permissionAndExpectedGrantResults = arrayOf( GROUP_2_PERMISSION_1_RESTRICTED to false, @@ -207,6 +209,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() requestAppPermissionsAndAssertResult( GROUP_3_PERMISSION_1_UNRESTRICTED to false, @@ -236,6 +239,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() requestAppPermissionsAndAssertResult( GROUP_3_PERMISSION_1_UNRESTRICTED to true, @@ -254,6 +258,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms( APP_APK_NAME_LATEST ) + waitForModeDefault() requestAppPermissionsAndAssertResult( GROUP_4_PERMISSION_1_UNRESTRICTED to true, @@ -287,6 +292,18 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { ) } + private fun waitForModeDefault() { + eventually { + runWithShellPermissionIdentity { + assertEquals( + "Timed out waiting for package mode to change to MODE_DEFAULT", + getAppEcmState(context, appOpsManager, APP_PACKAGE_NAME), + AppOpsManager.MODE_DEFAULT + ) + } + } + } + companion object { private const val GROUP_2_PERMISSION_1_RESTRICTED = Manifest.permission.SEND_SMS private const val GROUP_2_PERMISSION_2_RESTRICTED = Manifest.permission.READ_SMS @@ -294,7 +311,7 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { Manifest.permission.ACCESS_FINE_LOCATION private const val GROUP_3_PERMISSION_2_UNRESTRICTED = Manifest.permission.ACCESS_COARSE_LOCATION - private const val GROUP_4_PERMISSION_1_UNRESTRICTED = Manifest.permission.BODY_SENSORS + private const val GROUP_4_PERMISSION_1_UNRESTRICTED = Manifest.permission.CAMERA private const val NON_PROTECTED_SETTING = "example_setting_which_is_not_protected" private const val PROTECTED_SETTING = "android:bind_accessibility_service" diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionSplitTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionSplitTest.kt index e71ac32a5..4af2890ab 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionSplitTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionSplitTest.kt @@ -17,6 +17,8 @@ package android.permissionui.cts import android.os.Build +import android.permission.flags.Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED +import android.platform.test.annotations.RequiresFlagsDisabled import android.platform.test.flag.junit.DeviceFlagsValueProvider import androidx.test.filters.FlakyTest import androidx.test.filters.SdkSuppress @@ -60,32 +62,80 @@ class PermissionSplitTest : BaseUsePermissionTest() { testLocationPermissionSplit(false) } + // TODO: b/388596433 - Update maxSdkVersion to VANILLA_ICE_CREAM after SDK bumps. + // TODO: b/383440585 - Remove this test when flag annotation issue is fixed. @SdkSuppress( minSdkVersion = Build.VERSION_CODES.TIRAMISU, - maxSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, + maxSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, ) @Test - fun testBodySensorSplitOnTToV() { + fun testBodySensorSplitOnTToU() { installPackage(APP_APK_PATH_31) testBodySensorPermissionSplit(true) } + // Before SDK_INT bumps to 36, the in-development B images are using SDK_INT=35(V). This will + // cause test failures on main builds where replaceBodySensor flag is enabled to remove Sensor + // group UI. As a workaround, we move SDK_INT=35 tests out and requires replaceBodySensor flag + // disabled when running on these images. + // TODO: b/388596433 - Update minSdkVersion to BAKLAVA after SDK bumps. + // TODO: b/383440585 - Update minSdkVersion to TIRAMISU when flag annotation issue is fixed. + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM) + @RequiresFlagsDisabled(FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED) + @Test + fun testBodySensorSplitPostV_replaceBodySensorFlagDisabled() { + installPackage(APP_APK_PATH_31) + testBodySensorPermissionSplit(true) + } + + // TODO: b/388596433 - Update maxSdkVersion to VANILLA_ICE_CREAM after SDK bumps. + // TODO: b/383440585 - Remove this test when flag annotation issue is fixed. @SdkSuppress( minSdkVersion = Build.VERSION_CODES.TIRAMISU, - maxSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, + maxSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, ) @Test - fun testBodySensorSplit32OnTToV() { + fun testBodySensorSplit32OnTToU() { installPackage(APP_APK_PATH_32) testBodySensorPermissionSplit(true) } + // Before SDK_INT bumps to 36, the in-development B images are using SDK_INT=35(V). This will + // cause test failures on main builds where replaceBodySensor flag is enabled to remove Sensor + // group UI. As a workaround, we move SDK_INT=35 tests out and requires replaceBodySensor flag + // disabled when running on these images. + // TODO: b/388596433 - Update minSdkVersion to BAKLAVA after SDK bumps. + // TODO: b/383440585 - Update minSdkVersion to TIRAMISU when flag annotation issue is fixed. + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM) + @RequiresFlagsDisabled(FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED) + @Test + fun testBodySensorSplit32PostV_replaceBodySensorFlagDisabled() { + installPackage(APP_APK_PATH_32) + testBodySensorPermissionSplit(true) + } + + // TODO: b/388596433 - Update maxSdkVersion to VANILLA_ICE_CREAM after SDK bumps. + // TODO: b/383440585 - Remove this test when flag annotation issue is fixed. @SdkSuppress( minSdkVersion = Build.VERSION_CODES.TIRAMISU, - maxSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, + maxSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, ) @Test - fun testBodySensorNonSplitonTToV() { + fun testBodySensorNonSplitOnTToU() { + installPackage(APP_APK_PATH_LATEST) + testBodySensorPermissionSplit(false) + } + + // Before SDK_INT bumps to 36, the in-development B images are using SDK_INT=35(V). This will + // cause test failures on main builds where replaceBodySensor flag is enabled to remove Sensor + // group UI. As a workaround, we move SDK_INT=35 tests out and requires replaceBodySensor flag + // disabled when running on these images. + // TODO: b/388596433 - Update minSdkVersion to BAKLAVA after SDK bumps. + // TODO: b/383440585 - Update minSdkVersion to TIRAMISU when flag annotation issue is fixed. + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM) + @RequiresFlagsDisabled(FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED) + @Test + fun testBodySensorNonSplitPostV_replaceBodySensorFlagDisabled() { installPackage(APP_APK_PATH_LATEST) testBodySensorPermissionSplit(false) } diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt index baebfe06f..68af60dde 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt @@ -52,14 +52,17 @@ class PermissionTapjackingTest : BaseUsePermissionTest() { requestAppPermissionsForNoResult(ACCESS_FINE_LOCATION) {} val buttonCenter = - waitFindObject(By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)) - .displayId(displayId)) + waitFindObject( + By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)) + .displayId(displayId) + ) .visibleCenter // Wait for overlay to hide the dialog context.sendBroadcast(Intent(ACTION_SHOW_OVERLAY).putExtra(EXTRA_FULL_OVERLAY, true)) waitFindObject( - By.res("android.permissionui.cts.usepermission:id/overlay").displayId(displayId)) + By.res("android.permissionui.cts.usepermission:id/overlay").displayId(displayId) + ) tryClicking(buttonCenter) } @@ -76,18 +79,19 @@ class PermissionTapjackingTest : BaseUsePermissionTest() { assertAppHasPermission(ACCESS_FINE_LOCATION, false) requestAppPermissionsForNoResult(ACCESS_FINE_LOCATION) {} - val foregroundButtonCenter = - waitFindObject(By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)) - .displayId(displayId)) - .visibleCenter val oneTimeButton = - waitFindObjectOrNull(By.text(getPermissionControllerString(ALLOW_ONE_TIME_BUTTON_TEXT)) - .displayId(displayId)) + waitFindObjectOrNull( + By.text(getPermissionControllerString(ALLOW_ONE_TIME_BUTTON_TEXT)) + .displayId(displayId) + ) + // If one-time button is not available, fallback to deny button val overlayButtonBounds = oneTimeButton?.visibleBounds - ?: waitFindObject(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)) - .displayId(displayId)) + ?: waitFindObject( + By.text(getPermissionControllerString(DENY_BUTTON_TEXT)) + .displayId(displayId) + ) .visibleBounds // Wait for overlay to hide the dialog @@ -100,7 +104,15 @@ class PermissionTapjackingTest : BaseUsePermissionTest() { .putExtra(OVERLAY_BOTTOM, overlayButtonBounds.bottom) ) waitFindObject( - By.res("android.permissionui.cts.usepermission:id/overlay").displayId(displayId)) + By.res("android.permissionui.cts.usepermission:id/overlay").displayId(displayId) + ) + + val foregroundButtonCenter = + waitFindObject( + By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)) + .displayId(displayId) + ) + .visibleCenter tryClicking(foregroundButtonCenter) } @@ -119,7 +131,7 @@ class PermissionTapjackingTest : BaseUsePermissionTest() { } assertAppHasPermission(ACCESS_FINE_LOCATION, true) }, - 10000 + 10000, ) } catch (e: RuntimeException) { // expected @@ -140,22 +152,26 @@ class PermissionTapjackingTest : BaseUsePermissionTest() { } assertAppHasPermission(ACCESS_FINE_LOCATION, true) }, - 10000 + 10000, ) } private fun click(buttonCenter: Point) { - val downTime = SystemClock.uptimeMillis() - val x= buttonCenter.x.toFloat() - val y = buttonCenter.y.toFloat() - var event = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN,x , y, 0) - event.displayId = displayId - uiAutomation.injectInputEvent(event, true) - - val upTime = SystemClock.uptimeMillis() - event = MotionEvent.obtain(upTime, upTime, MotionEvent.ACTION_UP, x, y, 0) - event.displayId = displayId - uiAutomation.injectInputEvent(event, true) + if (isAutomotiveVisibleBackgroundUser) { + val downTime = SystemClock.uptimeMillis() + val x = buttonCenter.x.toFloat() + val y = buttonCenter.y.toFloat() + var event = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0) + event.displayId = displayId + uiAutomation.injectInputEvent(event, true) + + val upTime = SystemClock.uptimeMillis() + event = MotionEvent.obtain(upTime, upTime, MotionEvent.ACTION_UP, x, y, 0) + event.displayId = displayId + uiAutomation.injectInputEvent(event, true) + } else { + uiDevice.click(buttonCenter.x, buttonCenter.y) + } } companion object { diff --git a/tests/cts/role/Android.bp b/tests/cts/role/Android.bp index 9f1e6cff6..ea9af5d8e 100644 --- a/tests/cts/role/Android.bp +++ b/tests/cts/role/Android.bp @@ -37,7 +37,9 @@ android_test { "bedstead-multiuser", "flag-junit", "platform-test-annotations", + "platform-test-rules", "truth", + "uiautomator-helpers", ], test_suites: [ @@ -48,9 +50,17 @@ android_test { ], data: [ + ":CtsDefaultNotesApp", ":CtsRoleTestApp", ":CtsRoleTestApp28", ":CtsRoleTestApp33WithoutInCallService", ":CtsRoleTestAppClone", ], } + +filegroup { + name: "CtsRoleTestUtils", + srcs: [ + "src/android/app/role/cts/RoleManagerUtil.kt", + ], +} diff --git a/tests/cts/role/AndroidManifest.xml b/tests/cts/role/AndroidManifest.xml index a8c8c8e3d..7ea4287dc 100644 --- a/tests/cts/role/AndroidManifest.xml +++ b/tests/cts/role/AndroidManifest.xml @@ -22,6 +22,7 @@ <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> + <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <application> diff --git a/tests/cts/role/AndroidTest.xml b/tests/cts/role/AndroidTest.xml index 73f23dd1b..9a60b09e3 100644 --- a/tests/cts/role/AndroidTest.xml +++ b/tests/cts/role/AndroidTest.xml @@ -32,6 +32,8 @@ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> <option name="test-file-name" value="CtsRoleTestCases.apk" /> + <option name="install-arg" value="-t" /> + <option name="test-file-name" value="CtsDefaultNotesApp.apk" /> </target_preparer> <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> @@ -40,6 +42,7 @@ </target_preparer> <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher"> <option name="cleanup" value="true" /> + <option name="push" value="CtsDefaultNotesApp.apk->/data/local/tmp/cts-role/CtsDefaultNotesApp.apk" /> <option name="push" value="CtsRoleTestApp.apk->/data/local/tmp/cts-role/CtsRoleTestApp.apk" /> <option name="push" value="CtsRoleTestApp28.apk->/data/local/tmp/cts-role/CtsRoleTestApp28.apk" /> <option name="push" value="CtsRoleTestApp33WithoutInCallService.apk->/data/local/tmp/cts-role/CtsRoleTestApp33WithoutInCallService.apk" /> diff --git a/tests/cts/role/src/android/app/role/cts/ChooseNoteRoleAppTest.kt b/tests/cts/role/src/android/app/role/cts/ChooseNoteRoleAppTest.kt new file mode 100644 index 000000000..18003d1d9 --- /dev/null +++ b/tests/cts/role/src/android/app/role/cts/ChooseNoteRoleAppTest.kt @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.role.cts + +import android.content.Intent +import android.platform.test.rule.NotesRoleManagerRule +import android.platform.uiautomatorhelpers.WaitUtils.ensureThat +import android.provider.Settings +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.By.text +import com.android.compatibility.common.util.UiAutomatorUtils2.getUiDevice +import com.android.compatibility.common.util.UiAutomatorUtils2.waitFindObject +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class ChooseNoteRoleAppTest { + + @[Rule JvmField] + val rule = NotesRoleManagerRule(requiredNotesRoleHolderPackage = NOTES_APP_PACKAGE_NAME) + + @Before + fun setUp() { + rule.utils.clearRoleHolder() + InstrumentationRegistry.getInstrumentation() + .context + .startActivity( + Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS) + .addCategory(Intent.CATEGORY_DEFAULT) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + ) + } + + @After + fun after() { + getUiDevice().pressHome() + } + + @Test + fun chooseNoteRoleHolderApp() { + ensureThat { rule.utils.getRoleHolderPackageName().isEmpty() } + + // Scroll to "Notes app" item in Default apps screen and click on it + waitFindObject(text("Notes app")).click() + // Scroll to "CtsDefaultNotesApp" item and click on it + waitFindObject(text("CtsDefaultNotesApp")).click() + + assertEquals(rule.utils.getRoleHolderPackageName(), NOTES_APP_PACKAGE_NAME) + } + + private companion object { + const val NOTES_APP_PACKAGE_NAME = "com.android.cts.notesapp" + } +} diff --git a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java index f26bc0eb5..c55fbf779 100644 --- a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java +++ b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java @@ -1402,16 +1402,6 @@ public class RoleManagerTest { }); } - @RequiresFlagsDisabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") - @Test - public void cannotGetDefaultHoldersForTestFlagDisabled() throws Exception { - runWithShellPermissionIdentity(() -> { - assertThrows(IllegalStateException.class, () -> - sRoleManager.getDefaultHoldersForTest(PROFILE_GROUP_EXCLUSIVE_ROLE_NAME)); - }); - } - @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") @Test @@ -1441,18 +1431,6 @@ public class RoleManagerTest { }); } - @RequiresFlagsDisabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") - @Test - public void cannotSetDefaultHoldersForTestFlagDisabled() throws Exception { - List<String> testRoleHolders = List.of("a", "b", "c"); - runWithShellPermissionIdentity(() -> { - assertThrows(IllegalStateException.class, () -> - sRoleManager.setDefaultHoldersForTest(PROFILE_GROUP_EXCLUSIVE_ROLE_NAME, - testRoleHolders)); - }); - } - @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") @Test @@ -1528,16 +1506,6 @@ public class RoleManagerTest { }); } - @RequiresFlagsDisabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") - @Test - public void cannotGetIsRoleVisibleForTestFlagDisabled() throws Exception { - runWithShellPermissionIdentity(() -> { - assertThrows(IllegalStateException.class, () -> - sRoleManager.isRoleVisibleForTest(PROFILE_GROUP_EXCLUSIVE_ROLE_NAME)); - }); - } - @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") @Test @@ -1566,16 +1534,6 @@ public class RoleManagerTest { }); } - @RequiresFlagsDisabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") - @Test - public void cannotSetRoleVisibleForTestFlagDisabled() throws Exception { - runWithShellPermissionIdentity(() -> { - assertThrows(IllegalStateException.class, () -> - sRoleManager.setRoleVisibleForTest(PROFILE_GROUP_EXCLUSIVE_ROLE_NAME, false)); - }); - } - @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_CROSS_USER_ROLE_ENABLED) @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") @Test diff --git a/tests/cts/rolemultiuser/Android.bp b/tests/cts/rolemultiuser/Android.bp index 7a49bc4e5..51eff83b9 100644 --- a/tests/cts/rolemultiuser/Android.bp +++ b/tests/cts/rolemultiuser/Android.bp @@ -24,6 +24,7 @@ android_test { srcs: [ "src/**/*.kt", + ":CtsRoleTestUtils", ], static_libs: [ diff --git a/tests/cts/rolemultiuser/TEST_MAPPING b/tests/cts/rolemultiuser/TEST_MAPPING index 323e3094c..b45469e14 100644 --- a/tests/cts/rolemultiuser/TEST_MAPPING +++ b/tests/cts/rolemultiuser/TEST_MAPPING @@ -1,12 +1,17 @@ { - "postsubmit": [ + "presubmit": [ { "name": "CtsRoleMultiUserTestCases" } ], - "mainline-postsubmit": [ + "mainline-presubmit": [ { "name": "CtsRoleMultiUserTestCases[com.google.android.permission.apex]" } + ], + "permission-mainline-presubmit": [ + { + "name": "CtsRoleMultiUserTestCases" + } ] } diff --git a/tests/cts/rolemultiuser/src/android/app/rolemultiuser/cts/RoleManagerMultiUserTest.kt b/tests/cts/rolemultiuser/src/android/app/rolemultiuser/cts/RoleManagerMultiUserTest.kt index ee00c2c39..e8aaddf4c 100644 --- a/tests/cts/rolemultiuser/src/android/app/rolemultiuser/cts/RoleManagerMultiUserTest.kt +++ b/tests/cts/rolemultiuser/src/android/app/rolemultiuser/cts/RoleManagerMultiUserTest.kt @@ -16,6 +16,7 @@ package android.app.rolemultiuser.cts import android.app.Activity +import android.app.role.cts.RoleManagerUtil import android.app.role.RoleManager import android.content.ComponentName import android.content.Context @@ -70,6 +71,7 @@ import java.util.function.Consumer import org.junit.After import org.junit.Assert.assertThrows import org.junit.Assume.assumeFalse +import org.junit.Assume.assumeTrue import org.junit.Before import org.junit.ClassRule import org.junit.Rule @@ -88,6 +90,7 @@ class RoleManagerMultiUserTest { @Before @Throws(java.lang.Exception::class) fun setUp() { + assumeTrue(RoleManagerUtil.isCddCompliantScreenSize()); installAppForAllUsers() } diff --git a/tests/utils/safetycenter/AndroidManifest.xml b/tests/utils/safetycenter/AndroidManifest.xml index f0a4fcbb6..ce3724318 100644 --- a/tests/utils/safetycenter/AndroidManifest.xml +++ b/tests/utils/safetycenter/AndroidManifest.xml @@ -39,7 +39,6 @@ android:exported="false"/> <activity android:name=".TestActivity" - android:theme="@style/OptOutEdgeToEdgeEnforcement" android:exported="false"> <intent-filter android:priority="-1"> <action android:name="com.android.safetycenter.testing.action.TEST_ACTIVITY"/> diff --git a/tests/utils/safetycenter/res/layout/test_activity.xml b/tests/utils/safetycenter/res/layout/test_activity.xml index edbe3641a..b0b7523c8 100644 --- a/tests/utils/safetycenter/res/layout/test_activity.xml +++ b/tests/utils/safetycenter/res/layout/test_activity.xml @@ -19,6 +19,7 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" + android:fitsSystemWindows="true" android:orientation="vertical" > <Button android:id="@+id/button" android:layout_width="wrap_content" diff --git a/tests/utils/safetycenter/res/values/styles.xml b/tests/utils/safetycenter/res/values/styles.xml deleted file mode 100644 index ce54568ed..000000000 --- a/tests/utils/safetycenter/res/values/styles.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2024 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<resources xmlns:android="http://schemas.android.com/apk/res/android"> - <!-- - TODO(b/309578419): Make activities handle insets properly and then remove this. - --> - <style name="OptOutEdgeToEdgeEnforcement"> - <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item> - </style> -</resources> |