summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java11
-rw-r--r--tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt33
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt2
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt35
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionSplitTest.kt62
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt66
-rw-r--r--tests/cts/role/Android.bp10
-rw-r--r--tests/cts/role/AndroidManifest.xml1
-rw-r--r--tests/cts/role/AndroidTest.xml3
-rw-r--r--tests/cts/role/src/android/app/role/cts/ChooseNoteRoleAppTest.kt70
-rw-r--r--tests/cts/role/src/android/app/role/cts/RoleManagerTest.java42
-rw-r--r--tests/cts/rolemultiuser/Android.bp1
-rw-r--r--tests/cts/rolemultiuser/TEST_MAPPING9
-rw-r--r--tests/cts/rolemultiuser/src/android/app/rolemultiuser/cts/RoleManagerMultiUserTest.kt3
-rw-r--r--tests/utils/safetycenter/AndroidManifest.xml1
-rw-r--r--tests/utils/safetycenter/res/layout/test_activity.xml1
-rw-r--r--tests/utils/safetycenter/res/values/styles.xml24
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>