diff options
4 files changed, 89 insertions, 61 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt b/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt index 6ffd894ce..a69b78a06 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt @@ -27,6 +27,7 @@ import android.provider.DeviceConfig import android.safetycenter.SafetyCenterManager import android.service.quicksettings.Tile import android.service.quicksettings.TileService +import android.text.TextUtils import android.util.Log import com.android.modules.utils.build.SdkLevel import com.android.permissioncontroller.R @@ -68,6 +69,7 @@ class SafetyCenterQsTileService : TileService() { qsTile.label = getString(R.string.safety_privacy_qs_tile_title) qsTile.subtitle = getString(R.string.safety_privacy_qs_tile_subtitle) + qsTile.contentDescription = TextUtils.concat(qsTile.label, ", ", qsTile.subtitle) qsTile.state = Tile.STATE_ACTIVE qsTile.updateTile() } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java index aedfe4715..7c7de5716 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java @@ -881,10 +881,12 @@ public class GrantPermissionsActivity extends SettingsActivity super.onSaveInstanceState(outState); if (SdkLevel.isAtLeastV() && Flags.enhancedConfirmationModeApisEnabled()) { - outState.putStringArrayList(KEY_RESTRICTED_REQUESTED_PERMISSIONS, new ArrayList<>( - mRestrictedRequestedPermissionGroups)); - outState.putStringArrayList(KEY_UNRESTRICTED_REQUESTED_PERMISSIONS, new ArrayList<>( - mUnrestrictedRequestedPermissions)); + outState.putStringArrayList(KEY_RESTRICTED_REQUESTED_PERMISSIONS, + mRestrictedRequestedPermissionGroups != null ? new ArrayList<>( + mRestrictedRequestedPermissionGroups) : null); + outState.putStringArrayList(KEY_UNRESTRICTED_REQUESTED_PERMISSIONS, + mUnrestrictedRequestedPermissions != null ? new ArrayList<>( + mUnrestrictedRequestedPermissions) : null); outState.putStringArray(KEY_ORIGINAL_REQUESTED_PERMISSIONS, mOriginalRequestedPermissions); } diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt index 6b28f766f..00df03e51 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt @@ -36,7 +36,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.By -import androidx.test.uiautomator.UiObject2 import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import com.android.compatibility.common.util.SystemUtil.eventually @@ -129,10 +128,11 @@ class AppPermissionsTest { verifyPermissionMessage() - val radioButtons = getRadioButtons() - assertEquals(true, radioButtons["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["ASK_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["DENY_RADIO_BUTTON"]!!.isChecked) + verifyRadioButtonStates( + allowForegroundChecked = true, + askChecked = false, + denyChecked = false + ) } @RequiresFlagsEnabled( @@ -145,7 +145,8 @@ class AppPermissionsTest { openAppPermissionsScreen() clickPermissionItem(externalDeviceCameraText) - getRadioButtons()["ASK_RADIO_BUTTON"]!!.click() + clickAskButton() + verifyAskSelection() } @@ -159,7 +160,8 @@ class AppPermissionsTest { openAppPermissionsScreen() clickPermissionItem(externalDeviceCameraText) - getRadioButtons()["DENY_RADIO_BUTTON"]!!.click() + clickDenyButton() + verifyDenySelection() } @@ -173,13 +175,14 @@ class AppPermissionsTest { openAppPermissionsScreen() clickPermissionItem(externalDeviceCameraText) - getRadioButtons()["ASK_RADIO_BUTTON"]!!.click() - val radioButtons = getRadioButtons() - assertEquals(false, radioButtons["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"]!!.isChecked) - assertEquals(true, radioButtons["ASK_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["DENY_RADIO_BUTTON"]!!.isChecked) + clickAskButton() + verifyRadioButtonStates( + allowForegroundChecked = false, + askChecked = true, + denyChecked = false + ) - radioButtons["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"]!!.click() + clickAllowForegroundButton() verifyAllowedSelection() } @@ -212,12 +215,13 @@ class AppPermissionsTest { clickPermissionItem(externalDeviceCameraText) - val radioButtons = getRadioButtons() - assertEquals(true, radioButtons["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["ASK_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["DENY_RADIO_BUTTON"]!!.isChecked) + verifyRadioButtonStates( + allowForegroundChecked = true, + askChecked = false, + denyChecked = false + ) - radioButtons["DENY_RADIO_BUTTON"]!!.click() + clickDenyButton() UiAutomatorUtils2.getUiDevice().pressBack() @@ -235,10 +239,11 @@ class AppPermissionsTest { private fun verifyAskSelection() { verifyPermissionMessage() - val radioButtons = getRadioButtons() - assertEquals(false, radioButtons["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"]!!.isChecked) - assertEquals(true, radioButtons["ASK_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["DENY_RADIO_BUTTON"]!!.isChecked) + verifyRadioButtonStates( + allowForegroundChecked = false, + askChecked = true, + denyChecked = false + ) UiAutomatorUtils2.getUiDevice().pressBack() @@ -261,10 +266,11 @@ class AppPermissionsTest { private fun verifyDenySelection() { verifyPermissionMessage() - val radioButtons = getRadioButtons() - assertEquals(false, radioButtons["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["ASK_RADIO_BUTTON"]!!.isChecked) - assertEquals(true, radioButtons["DENY_RADIO_BUTTON"]!!.isChecked) + verifyRadioButtonStates( + allowForegroundChecked = false, + askChecked = false, + denyChecked = true + ) UiAutomatorUtils2.getUiDevice().pressBack() @@ -287,10 +293,11 @@ class AppPermissionsTest { private fun verifyAllowedSelection() { verifyPermissionMessage() - val radioButtons = getRadioButtons() - assertEquals(true, radioButtons["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["ASK_RADIO_BUTTON"]!!.isChecked) - assertEquals(false, radioButtons["DENY_RADIO_BUTTON"]!!.isChecked) + verifyRadioButtonStates( + allowForegroundChecked = true, + askChecked = false, + denyChecked = false + ) UiAutomatorUtils2.getUiDevice().pressBack() @@ -350,45 +357,60 @@ class AppPermissionsTest { return grantInfoMap } - // Use of "eventually" and invoking "isChecked" is to mitigate StaleObjectException that - // intermittently observed on cf_x86_64_tablet_hsum-trunk_staging-userdebug - private fun getRadioButtons(): Map<String, UiObject2> { - val map = mutableMapOf<String, UiObject2>() + private fun verifyRadioButtonStates( + allowForegroundChecked: Boolean, + askChecked: Boolean, + denyChecked: Boolean + ) { eventually { - val allowButton = + assertEquals( + allowForegroundChecked, UiAutomatorUtils2.waitFindObject(By.res(ALLOW_FOREGROUND_ONLY_RADIO_BUTTON)) - allowButton.isChecked - map["ALLOW_FOREGROUND_ONLY_RADIO_BUTTON"] = allowButton - - val askButton = UiAutomatorUtils2.waitFindObject(By.res(ASK_RADIO_BUTTON)) - askButton.isChecked - map["ASK_RADIO_BUTTON"] = askButton - - val denyButton = UiAutomatorUtils2.waitFindObject(By.res(DENY_RADIO_BUTTON)) - denyButton.isChecked - map["DENY_RADIO_BUTTON"] = denyButton + .isChecked + ) + assertEquals( + askChecked, + UiAutomatorUtils2.waitFindObject(By.res(ASK_RADIO_BUTTON)).isChecked + ) + assertEquals( + denyChecked, + UiAutomatorUtils2.waitFindObject(By.res(DENY_RADIO_BUTTON)).isChecked + ) } - return map } private fun openAppPermissionsScreen() { - instrumentation.context.startActivity( - Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = Uri.fromParts("package", APP_PACKAGE_NAME, null) - addCategory(Intent.CATEGORY_DEFAULT) - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - } - ) - eventually { UiAutomatorUtils.click(By.text("Permissions")) } + eventually { + instrumentation.context.startActivity( + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", APP_PACKAGE_NAME, null) + addCategory(Intent.CATEGORY_DEFAULT) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + } + ) + UiAutomatorUtils2.waitFindObject(By.text("Permissions"), 12000).click() + } } - private fun getScrollableRecyclerView(): UiScrollable = - UiScrollable(UiSelector().resourceId(RECYCLER_VIEW)) + private fun getScrollableRecyclerView(): UiScrollable { + // Wait for object to load + UiAutomatorUtils2.waitFindObject(By.res(RECYCLER_VIEW)) + return UiScrollable(UiSelector().resourceId(RECYCLER_VIEW)) + } private fun clickPermissionItem(permissionItemName: String) = UiAutomatorUtils2.waitFindObject(By.text(permissionItemName)).click() + private fun clickAllowForegroundButton() = + UiAutomatorUtils2.waitFindObject(By.res(ALLOW_FOREGROUND_ONLY_RADIO_BUTTON)).click() + + private fun clickAskButton() = + UiAutomatorUtils2.waitFindObject(By.res(ASK_RADIO_BUTTON)).click() + + private fun clickDenyButton() = + UiAutomatorUtils2.waitFindObject(By.res(DENY_RADIO_BUTTON)).click() + private fun grantRunTimePermission() = permissionManager.grantRuntimePermission( APP_PACKAGE_NAME, 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 e6b27382f..2e32a3f90 100644 --- a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java +++ b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java @@ -255,6 +255,7 @@ public class RoleManagerTest { @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED) @FlakyTest(bugId = 288468003, detail = "CtsRoleTestCases is breaching 20min SLO") public void requestRoleThenBlockRequestRoleDialogByRestrictedSettingDialog() throws Exception { + assumeTrue(sRoleManager.isRoleAvailable(RoleManager.ROLE_SMS)); assumeFalse(sIsWatch || sIsAutomotive || sIsTelevision); runWithShellPermissionIdentity( () -> setEnhancedConfirmationRestrictedAppOpMode(sContext, APP_PACKAGE_NAME, @@ -675,6 +676,7 @@ public class RoleManagerTest { @FlakyTest(bugId = 288468003, detail = "CtsRoleTestCases is breaching 20min SLO") public void openDefaultAppDetailsOnHandHeldThenRestrictedAppIsNotSelectableAsDefaultApp() throws Exception { + assumeTrue(sRoleManager.isRoleAvailable(RoleManager.ROLE_DIALER)); assumeFalse(sIsWatch || sIsAutomotive || sIsTelevision); runWithShellPermissionIdentity( () -> setEnhancedConfirmationRestrictedAppOpMode(sContext, APP_PACKAGE_NAME, |