summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Android Build Coastguard Worker <android-build-coastguard-worker@google.com> 2025-03-19 16:44:32 -0700
committer Android Build Coastguard Worker <android-build-coastguard-worker@google.com> 2025-03-19 16:44:32 -0700
commitbee09828303e4ee750de01f7f265464dfae943cb (patch)
tree95f5c7b6f00b9bf5adf260ccec25bf4bf086838f
parent144640b42ca0569e4821bb418fc90fb44e5358f5 (diff)
parentf7a9f1d3124f422b31c651a7c606752ea473be0b (diff)
Snap for 13241370 from f7a9f1d3124f422b31c651a7c606752ea473be0b to 25Q2-release
Change-Id: Id1dca0658fe5085a1426b73d19c00730cb2fcc7d
-rw-r--r--PermissionController/res/layout-v33/safety_center_toggle_button.xml2
-rw-r--r--PermissionController/res/values-ldrtl/integers.xml18
-rw-r--r--PermissionController/res/values/integers.xml18
-rw-r--r--PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAllAppPermissionFragmentTest.kt54
-rw-r--r--PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt21
-rw-r--r--service/java/com/android/ecm/EnhancedConfirmationService.java2
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt294
7 files changed, 277 insertions, 132 deletions
diff --git a/PermissionController/res/layout-v33/safety_center_toggle_button.xml b/PermissionController/res/layout-v33/safety_center_toggle_button.xml
index f790e734e..52d62a7ed 100644
--- a/PermissionController/res/layout-v33/safety_center_toggle_button.xml
+++ b/PermissionController/res/layout-v33/safety_center_toggle_button.xml
@@ -35,8 +35,10 @@
android:text="@string/available"/>
</LinearLayout>
+ <!-- The X scale controls the direction of the arrow, based on the language direction -->
<ImageView
android:id="@+id/arrow_icon"
style="@style/SafetyCenterQsToggleArrow"
+ android:scaleX="@integer/mirror_x_scale"
android:visibility="gone"/>
</LinearLayout>
diff --git a/PermissionController/res/values-ldrtl/integers.xml b/PermissionController/res/values-ldrtl/integers.xml
new file mode 100644
index 000000000..ca998ad16
--- /dev/null
+++ b/PermissionController/res/values-ldrtl/integers.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<resources>
+ <integer name="mirror_x_scale">-1</integer>
+</resources>
diff --git a/PermissionController/res/values/integers.xml b/PermissionController/res/values/integers.xml
new file mode 100644
index 000000000..c65ec99de
--- /dev/null
+++ b/PermissionController/res/values/integers.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<resources>
+ <integer name="mirror_x_scale">1</integer>
+</resources>
diff --git a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAllAppPermissionFragmentTest.kt b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAllAppPermissionFragmentTest.kt
index ecc7e161f..10670c5d5 100644
--- a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAllAppPermissionFragmentTest.kt
+++ b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAllAppPermissionFragmentTest.kt
@@ -54,6 +54,11 @@ class HealthConnectAllAppPermissionFragmentTest : BasePermissionUiTest() {
fun uninstallTestApp() {
uninstallTestApps()
}
+
+ @SdkSuppress(
+ minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
+ maxSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM,
+ )
@Test
fun usedHealthConnectPermissionsAreListed() {
installTestAppThatUsesHealthConnectPermission()
@@ -67,6 +72,24 @@ class HealthConnectAllAppPermissionFragmentTest : BasePermissionUiTest() {
}
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @Test
+ fun usedHealthConnectPermissionsAreListed_healthFitnessBrand() {
+ installTestAppThatUsesHealthConnectPermission()
+
+ startManageAppPermissionsActivity()
+
+ eventually {
+ waitFindObject(By.text(HEALTH_FITNESS_LABEL))
+ waitFindObject(By.text(HEALTH_CONNECT_PERMISSION_READ_FLOORS_CLIMBED_LABEL))
+ waitFindObject(By.text(HEALTH_CONNECT_PERMISSION_READ_STEPS_LABEL))
+ }
+ }
+
+ @SdkSuppress(
+ minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
+ maxSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM,
+ )
@Test
fun invalidUngrantedUsedHealthConnectPermissionsAreNotListed() {
installInvalidTestAppThatUsesHealthConnectPermission()
@@ -78,13 +101,37 @@ class HealthConnectAllAppPermissionFragmentTest : BasePermissionUiTest() {
assertNull(
waitFindObjectOrNull(
By.text(HEALTH_CONNECT_PERMISSION_READ_FLOORS_CLIMBED_LABEL),
- TIMEOUT_SHORT
+ TIMEOUT_SHORT,
+ )
+ )
+ assertNull(
+ waitFindObjectOrNull(
+ By.text(HEALTH_CONNECT_PERMISSION_READ_STEPS_LABEL),
+ TIMEOUT_SHORT,
+ )
+ )
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @Test
+ fun invalidUngrantedUsedHealthConnectPermissionsAreNotListed_healthFitnessBrand() {
+ installInvalidTestAppThatUsesHealthConnectPermission()
+
+ startManageAppPermissionsActivity()
+
+ eventually {
+ assertNull(waitFindObjectOrNull(By.text(HEALTH_FITNESS_LABEL), TIMEOUT_SHORT))
+ assertNull(
+ waitFindObjectOrNull(
+ By.text(HEALTH_CONNECT_PERMISSION_READ_FLOORS_CLIMBED_LABEL),
+ TIMEOUT_SHORT,
)
)
assertNull(
waitFindObjectOrNull(
By.text(HEALTH_CONNECT_PERMISSION_READ_STEPS_LABEL),
- TIMEOUT_SHORT
+ TIMEOUT_SHORT,
)
)
}
@@ -104,7 +151,7 @@ class HealthConnectAllAppPermissionFragmentTest : BasePermissionUiTest() {
}
},
Until.newWindow(),
- TIMEOUT_SHORT
+ TIMEOUT_SHORT,
)
waitFindObject(By.descContains(MORE_OPTIONS)).click()
@@ -114,6 +161,7 @@ class HealthConnectAllAppPermissionFragmentTest : BasePermissionUiTest() {
companion object {
// Health connect label uses a non breaking space
private const val HEALTH_CONNECT_LABEL = "Health\u00A0Connect"
+ private const val HEALTH_FITNESS_LABEL = "Health, fitness and wellness"
private const val HEALTH_CONNECT_PERMISSION_READ_FLOORS_CLIMBED =
"android.permission.health.READ_FLOORS_CLIMBED"
private const val HEALTH_CONNECT_PERMISSION_READ_FLOORS_CLIMBED_LABEL =
diff --git a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt
index d4d4be6ec..a0de2f7cd 100644
--- a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt
+++ b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt
@@ -68,6 +68,10 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
uninstallTestApps()
}
+ @SdkSuppress(
+ minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
+ maxSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM,
+ )
@Test
fun usedHealthConnectPermissionsAreListed_handHeldDevices() {
assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
@@ -78,6 +82,17 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
eventually { waitFindObject(By.text(HEALTH_CONNECT_LABEL)) }
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @Test
+ fun usedHealthConnectPermissionsAreListed_handHeldDevices_healthFitnessBrand() {
+ assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+ installTestAppThatUsesHealthConnectPermission()
+
+ startManageAppPermissionsActivity()
+
+ eventually { waitFindObject(By.text(HEALTH_FITNESS_LABEL)) }
+ }
+
@Test
fun invalidUngrantedUsedHealthConnectPermissionsAreNotListed_handHeldDevices() {
assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
@@ -86,6 +101,7 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
startManageAppPermissionsActivity()
waitUntilObjectGone(By.text(HEALTH_CONNECT_LABEL), TIMEOUT_SHORT)
+ waitUntilObjectGone(By.text(HEALTH_FITNESS_LABEL), TIMEOUT_SHORT)
}
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
@@ -121,7 +137,7 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
startManageAppPermissionsActivity()
- eventually { waitFindObject(By.text(HEALTH_CONNECT_LABEL)) }
+ eventually { waitFindObject(By.text(HEALTH_FITNESS_LABEL)) }
}
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
@@ -133,7 +149,7 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
startManageAppPermissionsActivity()
- waitUntilObjectGone(By.text(HEALTH_CONNECT_LABEL), TIMEOUT_SHORT)
+ waitUntilObjectGone(By.text(HEALTH_FITNESS_LABEL), TIMEOUT_SHORT)
}
private fun startManageAppPermissionsActivity() {
@@ -152,6 +168,7 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
private const val FITNESS_AND_WELLNESS_LABEL = "Fitness and wellness"
// Health connect label uses a non breaking space
private const val HEALTH_CONNECT_LABEL = "Health\u00A0Connect"
+ private const val HEALTH_FITNESS_LABEL = "Health, fitness and wellness"
private const val HEALTH_CONNECT_PERMISSION_READ_FLOORS_CLIMBED =
"android.permission.health.READ_FLOORS_CLIMBED"
diff --git a/service/java/com/android/ecm/EnhancedConfirmationService.java b/service/java/com/android/ecm/EnhancedConfirmationService.java
index 1a6b80a3c..1cc3a743e 100644
--- a/service/java/com/android/ecm/EnhancedConfirmationService.java
+++ b/service/java/com/android/ecm/EnhancedConfirmationService.java
@@ -685,7 +685,7 @@ public class EnhancedConfirmationService extends SystemService {
if (number != null && mTelephonyManager.isEmergencyNumber(number)) {
return CALL_TYPE_EMERGENCY;
}
- } catch (IllegalStateException | UnsupportedOperationException e) {
+ } catch (RuntimeException e) {
// If either of these are thrown, the telephony service is not available on the
// current device, either because the device lacks telephony calling, or the
// telephony service is unavailable.
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
index 9ec09137e..eda6e92be 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
@@ -57,6 +57,7 @@ import com.android.compatibility.common.util.UiDumpUtils
import com.android.modules.utils.build.SdkLevel
import java.util.concurrent.CompletableFuture
import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
import java.util.regex.Pattern
import org.junit.After
import org.junit.Assert
@@ -64,7 +65,6 @@ import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Before
-import java.util.concurrent.TimeoutException
abstract class BaseUsePermissionTest : BasePermissionTest() {
companion object {
@@ -237,7 +237,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_PRIVACY,
PICKER_ENABLED_SETTING,
- true
+ true,
)
}
}
@@ -246,7 +246,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
enum class PermissionState {
ALLOWED,
DENIED,
- DENIED_WITH_PREJUDICE
+ DENIED_WITH_PREJUDICE,
}
private val windowManagerStateHelper = WindowManagerStateHelper()
@@ -311,7 +311,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
android.Manifest.permission.READ_MEDIA_IMAGES to
"@android:string/permgrouplab_readMediaVisual",
android.Manifest.permission.READ_MEDIA_VIDEO to
- "@android:string/permgrouplab_readMediaVisual"
+ "@android:string/permgrouplab_readMediaVisual",
)
@Before
@@ -333,7 +333,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
grantRuntimePermissions,
expectSuccess,
installSource,
- false
+ false,
)
}
@@ -350,7 +350,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
reinstall,
grantRuntimePermissions,
expectSuccess,
- installSource
+ installSource,
)
val targetSdk = getTargetSdk()
@@ -397,9 +397,9 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
uiDevice.wait(
Until.hasObject(
By.textStartsWith("This app was built for an older version of Android")
- .displayId(displayId)
+ .displayId(displayId)
),
- timeoutMillis
+ timeoutMillis,
)
if (targetSdkWarningVisible) {
try {
@@ -425,8 +425,8 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (isAutomotive || isWatch) {
clickAndWaitForWindowTransition(
By.text(getPermissionControllerString("review_button_continue"))
- .displayId(displayId),
- TIMEOUT_MILLIS * 2
+ .displayId(displayId),
+ TIMEOUT_MILLIS * 2,
)
} else {
clickAndWaitForWindowTransition(
@@ -452,7 +452,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
installPackageViaSession(
apkName,
AppMetadata.createDefaultAppMetadata(),
- PACKAGE_SOURCE_STORE
+ PACKAGE_SOURCE_STORE,
)
}
@@ -460,7 +460,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
installPackageViaSession(
apkName,
AppMetadata.createDefaultAppMetadata(),
- PACKAGE_SOURCE_LOCAL_FILE
+ PACKAGE_SOURCE_LOCAL_FILE,
)
}
@@ -468,18 +468,18 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
installPackageViaSession(
apkName,
AppMetadata.createDefaultAppMetadata(),
- PACKAGE_SOURCE_DOWNLOADED_FILE
+ PACKAGE_SOURCE_DOWNLOADED_FILE,
)
}
protected fun installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms(
- apkName: String,
+ apkName: String
) {
installPackageViaSession(
apkName,
AppMetadata.createDefaultAppMetadata(),
PACKAGE_SOURCE_DOWNLOADED_FILE,
- allowlistedRestrictedPermissions = SessionParams.RESTRICTED_PERMISSIONS_ALL
+ allowlistedRestrictedPermissions = SessionParams.RESTRICTED_PERMISSIONS_ALL,
)
}
@@ -487,7 +487,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
installPackageViaSession(
apkName,
AppMetadata.createDefaultAppMetadata(),
- PACKAGE_SOURCE_OTHER
+ PACKAGE_SOURCE_OTHER,
)
}
@@ -516,38 +516,38 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
protected fun installPackageWithInstallSourceAndMetadataWithoutTopLevelVersion(
- apkName: String,
+ apkName: String
) {
installPackageViaSession(
apkName,
- AppMetadata.createInvalidAppMetadataWithoutTopLevelVersion()
+ AppMetadata.createInvalidAppMetadataWithoutTopLevelVersion(),
)
}
protected fun installPackageWithInstallSourceAndMetadataWithInvalidTopLevelVersion(
- apkName: String,
+ apkName: String
) {
installPackageViaSession(
apkName,
- AppMetadata.createInvalidAppMetadataWithInvalidTopLevelVersion()
+ AppMetadata.createInvalidAppMetadataWithInvalidTopLevelVersion(),
)
}
protected fun installPackageWithInstallSourceAndMetadataWithoutSafetyLabelVersion(
- apkName: String,
+ apkName: String
) {
installPackageViaSession(
apkName,
- AppMetadata.createInvalidAppMetadataWithoutSafetyLabelVersion()
+ AppMetadata.createInvalidAppMetadataWithoutSafetyLabelVersion(),
)
}
protected fun installPackageWithInstallSourceAndMetadataWithInvalidSafetyLabelVersion(
- apkName: String,
+ apkName: String
) {
installPackageViaSession(
apkName,
- AppMetadata.createInvalidAppMetadataWithInvalidSafetyLabelVersion()
+ AppMetadata.createInvalidAppMetadataWithInvalidSafetyLabelVersion(),
)
}
@@ -557,12 +557,14 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
protected fun assertPermissionRationaleActivityTitleIsVisible(expected: Boolean) {
- findView(By.res(PERMISSION_RATIONALE_ACTIVITY_TITLE_VIEW).displayId(displayId),
- expected = expected)
+ findView(
+ By.res(PERMISSION_RATIONALE_ACTIVITY_TITLE_VIEW).displayId(displayId),
+ expected = expected,
+ )
}
protected fun assertPermissionRationaleActivityDataSharingSourceSectionVisible(
- expected: Boolean,
+ expected: Boolean
) {
findView(By.res(DATA_SHARING_SOURCE_TITLE_ID).displayId(displayId), expected = expected)
findView(By.res(DATA_SHARING_SOURCE_MESSAGE_ID).displayId(displayId), expected = expected)
@@ -579,8 +581,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
protected fun assertPermissionRationaleActivitySettingsSectionVisible(expected: Boolean) {
- findView(By.res(PERMISSION_RATIONALE_SETTINGS_SECTION).displayId(displayId),
- expected = expected)
+ findView(
+ By.res(PERMISSION_RATIONALE_SETTINGS_SECTION).displayId(displayId),
+ expected = expected,
+ )
findView(By.res(SETTINGS_TITLE_ID).displayId(displayId), expected = expected)
findView(By.res(SETTINGS_MESSAGE_ID).displayId(displayId), expected = expected)
}
@@ -599,8 +603,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
protected fun assertPermissionRationaleContainerOnGrantDialogIsVisible(expected: Boolean) {
- findView(By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW).displayId(displayId),
- expected = expected)
+ findView(
+ By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW).displayId(displayId),
+ expected = expected,
+ )
}
protected fun clickPermissionReviewCancel() {
@@ -645,7 +651,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
block()
assertEquals(
expectedResultCode,
- future.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS).resultCode
+ future.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS).resultCode,
)
}
@@ -660,7 +666,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
component =
ComponentName(
APP_PACKAGE_NAME,
- "$APP_PACKAGE_NAME.RequestPermissionsActivity"
+ "$APP_PACKAGE_NAME.RequestPermissionsActivity",
)
putExtra("$APP_PACKAGE_NAME.PERMISSIONS", permissions)
addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK)
@@ -678,20 +684,16 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
crossinline block: () -> Unit,
): Instrumentation.ActivityResult {
// Request the permissions
- val future =
- startActivityForFuture(
- Intent().apply {
- component =
- ComponentName(
- APP_PACKAGE_NAME,
- "$APP_PACKAGE_NAME.RequestPermissionsActivity"
- )
- putExtra("$APP_PACKAGE_NAME.PERMISSIONS", permissions)
- putExtra("$APP_PACKAGE_NAME.ASK_TWICE", askTwice)
- }
- )
-
- waitForPermissionRequestActivity()
+ lateinit var future: CompletableFuture<Instrumentation.ActivityResult>
+ // The WindowManagerStateHelper#waitForValidState only supports S+
+ if (SdkLevel.isAtLeastS()) {
+ future = startActivityForFuture(*permissions, askTwice = askTwice)
+ waitForPermissionRequestActivity()
+ } else {
+ doAndWaitForWindowTransition {
+ startActivityForFuture(*permissions, askTwice = askTwice)
+ }
+ }
// Notification permission prompt is shown first, so get it out of the way
clickNotificationPermissionRequestAllowButtonIfAvailable()
@@ -711,9 +713,22 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
}
+ fun startActivityForFuture(
+ vararg permissions: String?,
+ askTwice: Boolean,
+ ): CompletableFuture<Instrumentation.ActivityResult> =
+ startActivityForFuture(
+ Intent().apply {
+ component =
+ ComponentName(APP_PACKAGE_NAME, "$APP_PACKAGE_NAME.RequestPermissionsActivity")
+ putExtra("$APP_PACKAGE_NAME.PERMISSIONS", permissions)
+ putExtra("$APP_PACKAGE_NAME.ASK_TWICE", askTwice)
+ }
+ )
+
/**
- * This method waits for permission controller activity to be in a valid state, the timeout
- * is 5 seconds.
+ * This method waits for permission controller activity to be in a valid state, the timeout is 5
+ * seconds.
*/
fun waitForPermissionRequestActivity() {
val requestPermissionIntent = Intent(PackageManager.ACTION_REQUEST_PERMISSIONS)
@@ -757,12 +772,12 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
*permissions,
askTwice = askTwice,
waitForWindowTransition = shouldWaitForWindowTransition,
- block = block
+ block = block,
)
assertEquals(
"Permission request result had unexpected resultCode:",
Activity.RESULT_OK,
- result.resultCode
+ result.resultCode,
)
val responseSize: Int =
@@ -770,14 +785,14 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
assertEquals(
"Permission request result had unexpected number of grant results:",
responseSize,
- result.resultData!!.getIntArrayExtra("$APP_PACKAGE_NAME.GRANT_RESULTS")!!.size
+ result.resultData!!.getIntArrayExtra("$APP_PACKAGE_NAME.GRANT_RESULTS")!!.size,
)
// Note that the behavior around requesting `null` permissions changed in the platform
// in Android U. Currently, null permissions are ignored and left out of the result set.
assertTrue(
"Permission request result had fewer permissions than request",
- permissions.size >= responseSize
+ permissions.size >= responseSize,
)
assertEquals(
"Permission request result had unexpected grant results:",
@@ -789,7 +804,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
result.resultData!!.getIntArrayExtra("$APP_PACKAGE_NAME.GRANT_RESULTS")!!.map {
it == PackageManager.PERMISSION_GRANTED
}
- )
+ ),
)
permissionAndExpectedGrantResults.forEach {
@@ -808,7 +823,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
permissionAndExpectedGrantResults,
askTwice,
waitForWindowTransition,
- block
+ block,
)
}
@@ -819,7 +834,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
!uiDevice.performActionAndWait(
{ block() },
Until.newWindow(),
- NEW_WINDOW_TIMEOUT_MILLIS
+ NEW_WINDOW_TIMEOUT_MILLIS,
)
if (timeoutOccurred) {
@@ -832,8 +847,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
protected fun findPermissionRequestAllowButton(timeoutMillis: Long = 20000) {
if (isAutomotive || isWatch) {
- waitFindObject(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT))
- .displayId(displayId), timeoutMillis)
+ waitFindObject(
+ By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)).displayId(displayId),
+ timeoutMillis,
+ )
} else {
waitFindObject(By.res(ALLOW_BUTTON).displayId(displayId), timeoutMillis)
}
@@ -844,8 +861,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
isHealthPermission: Boolean = false,
) {
if (isAutomotive || isWatch || isHealthPermission) {
- click(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)).displayId(displayId),
- timeoutMillis)
+ click(
+ By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)).displayId(displayId),
+ timeoutMillis,
+ )
} else {
click(By.res(ALLOW_BUTTON).displayId(displayId), timeoutMillis)
}
@@ -864,14 +883,16 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
uiDevice.wait(
Until.hasObject(
By.text(getPermissionControllerString(NOTIF_TEXT, APP_PACKAGE_NAME))
- .displayId(displayId)
+ .displayId(displayId)
),
- 1000
+ 1000,
)
if (notificationPermissionRequestVisible) {
if (isAutomotive) {
- click(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT))
- .displayId(displayId))
+ click(
+ By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT))
+ .displayId(displayId)
+ )
} else {
click(By.res(ALLOW_BUTTON).displayId(displayId))
}
@@ -887,11 +908,15 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
protected fun clickAllowAlwaysInSettings() {
if (isAutomotive || isTv || isWatch) {
- click(By.text(getPermissionControllerString("app_permission_button_allow_always"))
- .displayId(displayId))
+ click(
+ By.text(getPermissionControllerString("app_permission_button_allow_always"))
+ .displayId(displayId)
+ )
} else {
- click(By.res("com.android.permissioncontroller:id/allow_always_radio_button")
- .displayId(displayId))
+ click(
+ By.res("com.android.permissioncontroller:id/allow_always_radio_button")
+ .displayId(displayId)
+ )
}
}
@@ -901,11 +926,14 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
protected fun clicksDenyInSettings() {
if (isAutomotive || isWatch) {
- click(By.text(getPermissionControllerString("app_permission_button_deny"))
- .displayId(displayId))
+ click(
+ By.text(getPermissionControllerString("app_permission_button_deny"))
+ .displayId(displayId)
+ )
} else {
- click(By.res("com.android.permissioncontroller:id/deny_radio_button")
- .displayId(displayId))
+ click(
+ By.res("com.android.permissioncontroller:id/deny_radio_button").displayId(displayId)
+ )
}
}
@@ -913,8 +941,8 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (isAutomotive || isWatch) {
waitFindObject(
By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT))
- .displayId(displayId),
- timeoutMillis
+ .displayId(displayId),
+ timeoutMillis,
)
} else {
waitFindObject(By.res(ALLOW_FOREGROUND_BUTTON).displayId(displayId), timeoutMillis)
@@ -925,8 +953,8 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (isAutomotive || isWatch) {
click(
By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT))
- .displayId(displayId),
- timeoutMillis
+ .displayId(displayId),
+ timeoutMillis,
)
} else {
click(By.res(ALLOW_FOREGROUND_BUTTON).displayId(displayId), timeoutMillis)
@@ -1004,7 +1032,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
val nextScreenNode: AccessibilityNodeInfo? =
findAccessibilityNodeInfosByTextForSurfaceView(
uiAutomation.rootInActiveWindow,
- "All the time"
+ "All the time",
)
if (nextScreenNode != null) {
clickedOnLink = true
@@ -1022,9 +1050,8 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (!isWatch) {
// Check "Allow all" button is visible.
val allowAllNode =
- uiAutomation.rootInActiveWindow.findAccessibilityNodeInfosByText(
- HEALTH_PERMISSION_ALLOW_ALL_PLAIN_TEXT
- )[0]
+ uiAutomation.rootInActiveWindow
+ .findAccessibilityNodeInfosByText(HEALTH_PERMISSION_ALLOW_ALL_PLAIN_TEXT)[0]
assertTrue(allowAllNode.isVisibleToUser)
// Select "Heart rate" toggle and click "Allow" button.
@@ -1050,7 +1077,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
scrollToBottom()
clickAndWaitForWindowTransition(
By.text(getPermissionControllerString(DENY_AND_DONT_ASK_AGAIN_BUTTON_TEXT))
- .displayId(displayId)
+ .displayId(displayId)
)
} else if (isWatch) {
click(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)).displayId(displayId))
@@ -1066,15 +1093,17 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
} else {
click(
By.res("com.android.permissioncontroller:id/permission_deny_dont_ask_again_button")
- .displayId(displayId)
+ .displayId(displayId)
)
}
}
protected fun clickPermissionRequestNoUpgradeAndDontAskAgainButton() {
if (isAutomotive || isWatch) {
- click(By.text(getPermissionControllerString(NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON_TEXT))
- .displayId(displayId))
+ click(
+ By.text(getPermissionControllerString(NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON_TEXT))
+ .displayId(displayId)
+ )
} else {
click(By.res(NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON).displayId(displayId))
}
@@ -1083,13 +1112,14 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
protected fun clickPermissionRationaleContentInAppPermission() {
clickAndWaitForWindowTransition(
By.text(getPermissionControllerString(APP_PERMISSION_RATIONALE_SUBTITLE_TEXT))
- .displayId(displayId)
+ .displayId(displayId)
)
}
protected fun clickPermissionRationaleViewInGrantDialog() {
clickAndWaitForWindowTransition(
- By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW).displayId(displayId))
+ By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW).displayId(displayId)
+ )
}
protected fun grantAppPermissionsByUi(vararg permissions: String) {
@@ -1109,7 +1139,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
setAppPermissionState(
*permissions,
state = PermissionState.DENIED,
- isLegacyApp = isLegacyApp
+ isLegacyApp = isLegacyApp,
)
}
@@ -1151,7 +1181,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
throw e
}
},
- TIMEOUT_MILLIS
+ TIMEOUT_MILLIS,
)
}
@@ -1164,6 +1194,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
}
}
+
protected fun navigateToIndividualPermissionSetting(
permission: String,
manuallyNavigate: Boolean = false,
@@ -1181,8 +1212,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
navigateToAppPermissionSettings()
val permissionLabel = getPermissionLabel(permission)
if (isWatch) {
- clickAndWaitForWindowTransition(By.text(permissionLabel).displayId(displayId),
- 40_000)
+ clickAndWaitForWindowTransition(
+ By.text(permissionLabel).displayId(displayId),
+ 40_000,
+ )
} else {
clickPermissionControllerUi(By.text(permissionLabel).displayId(displayId))
}
@@ -1280,24 +1313,28 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
// won't show an "Ask every time" message
!waitFindObject(
By.text(getPermissionControllerString("app_permission_button_deny"))
- .displayId(displayId)
+ .displayId(displayId)
)
.isChecked
} else if (isTv || isWatch) {
- !(waitFindObject(By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
- .displayId(displayId))
+ !(waitFindObject(
+ By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
+ .displayId(displayId)
+ )
.isChecked ||
(!isLegacyApp &&
hasAskButton(permission) &&
- waitFindObject(By.text(getPermissionControllerString(ASK_BUTTON_TEXT))
- .displayId(displayId))
+ waitFindObject(
+ By.text(getPermissionControllerString(ASK_BUTTON_TEXT))
+ .displayId(displayId)
+ )
.isChecked))
} else {
!(waitFindObject(By.res(DENY_RADIO_BUTTON).displayId(displayId)).isChecked ||
(!isLegacyApp &&
hasAskButton(permission) &&
waitFindObject(By.res(ASK_RADIO_BUTTON).displayId(displayId))
- .isChecked))
+ .isChecked))
}
var alreadyChecked = false
val button =
@@ -1309,50 +1346,55 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
PermissionState.ALLOWED ->
if (showsForegroundOnlyButton(permission)) {
By.text(
- getPermissionControllerString(
- "app_permission_button_allow_foreground"
+ getPermissionControllerString(
+ "app_permission_button_allow_foreground"
+ )
)
- ).displayId(displayId)
+ .displayId(displayId)
} else {
By.text(
- getPermissionControllerString("app_permission_button_allow")
- ).displayId(displayId)
+ getPermissionControllerString(
+ "app_permission_button_allow"
+ )
+ )
+ .displayId(displayId)
}
PermissionState.DENIED ->
By.text(getPermissionControllerString("app_permission_button_deny"))
- .displayId(displayId)
+ .displayId(displayId)
PermissionState.DENIED_WITH_PREJUDICE ->
By.text(getPermissionControllerString("app_permission_button_deny"))
- .displayId(displayId)
+ .displayId(displayId)
}
} else if (isTv || isWatch) {
when (state) {
PermissionState.ALLOWED ->
if (showsForegroundOnlyButton(permission)) {
By.text(
- getPermissionControllerString(
- ALLOW_FOREGROUND_PREFERENCE_TEXT
+ getPermissionControllerString(
+ ALLOW_FOREGROUND_PREFERENCE_TEXT
+ )
)
- ).displayId(displayId)
+ .displayId(displayId)
} else {
byAnyText(
getPermissionControllerResString(ALLOW_BUTTON_TEXT),
getPermissionControllerResString(
ALLOW_ALL_FILES_BUTTON_TEXT
- )
+ ),
)
}
PermissionState.DENIED ->
if (!isLegacyApp && hasAskButton(permission)) {
By.text(getPermissionControllerString(ASK_BUTTON_TEXT))
- .displayId(displayId)
+ .displayId(displayId)
} else {
By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
- .displayId(displayId)
+ .displayId(displayId)
}
PermissionState.DENIED_WITH_PREJUDICE ->
By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
- .displayId(displayId)
+ .displayId(displayId)
}
} else {
when (state) {
@@ -1370,8 +1412,8 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
} else {
By.res(DENY_RADIO_BUTTON).displayId(displayId)
}
- PermissionState.DENIED_WITH_PREJUDICE -> By.res(DENY_RADIO_BUTTON)
- .displayId(displayId)
+ PermissionState.DENIED_WITH_PREJUDICE ->
+ By.res(DENY_RADIO_BUTTON).displayId(displayId)
}
}
)
@@ -1388,8 +1430,11 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (isWatch) {
click(
By.desc(
- getPermissionControllerString("media_confirm_dialog_positive_button")
- ).displayId(displayId)
+ getPermissionControllerString(
+ "media_confirm_dialog_positive_button"
+ )
+ )
+ .displayId(displayId)
)
} else {
click(By.res(ALERT_DIALOG_OK_BUTTON).displayId(displayId))
@@ -1400,7 +1445,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (isWatch) {
waitFindObject(
By.text(getPermissionControllerString("old_sdk_deny_warning"))
- .displayId(displayId)
+ .displayId(displayId)
)
} else {
waitFindObject(By.res(ALERT_DIALOG_MESSAGE).displayId(displayId))
@@ -1421,7 +1466,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
resources.getIdentifier(
"com.android.permissioncontroller:string/grant_dialog_button_deny_anyway",
null,
- null
+ null,
)
val confirmText = resources.getString(confirmTextRes)
@@ -1447,8 +1492,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
android.Manifest.permission.RECORD_AUDIO,
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
- android.Manifest.permission.ACCESS_BACKGROUND_LOCATION,
- -> true
+ android.Manifest.permission.ACCESS_BACKGROUND_LOCATION -> true
else -> false
}
@@ -1459,8 +1503,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
return when (permission) {
Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED,
Manifest.permission.READ_MEDIA_IMAGES,
- Manifest.permission.READ_MEDIA_VIDEO,
- -> true
+ Manifest.permission.READ_MEDIA_VIDEO -> true
else -> false
}
}
@@ -1468,8 +1511,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
private fun showsForegroundOnlyButton(permission: String): Boolean =
when (permission) {
android.Manifest.permission.CAMERA,
- android.Manifest.permission.RECORD_AUDIO,
- -> true
+ android.Manifest.permission.RECORD_AUDIO -> true
else -> false
}
@@ -1515,7 +1557,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
private fun byTextRes(textRes: Int): BySelector =
- By.text(context.getString(textRes)).displayId(displayId)
+ By.text(context.getString(textRes)).displayId(displayId)
private fun byTextStartsWithCaseInsensitive(prefix: String): BySelector =
By.text(Pattern.compile("(?i)^${Pattern.quote(prefix)}.*$")).displayId(displayId)
@@ -1525,7 +1567,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
assertTrue(
"Invalid permission check result: $checkPermissionResult",
checkPermissionResult == PackageManager.PERMISSION_GRANTED ||
- checkPermissionResult == PackageManager.PERMISSION_DENIED
+ checkPermissionResult == PackageManager.PERMISSION_DENIED,
)
if (!expectPermission && checkPermissionResult == PackageManager.PERMISSION_GRANTED) {
Assert.fail(
@@ -1548,7 +1590,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
component =
ComponentName(
APP_PACKAGE_NAME,
- "$APP_PACKAGE_NAME.CheckCalendarAccessActivity"
+ "$APP_PACKAGE_NAME.CheckCalendarAccessActivity",
)
}
)
@@ -1558,7 +1600,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
assertTrue(result.resultData!!.hasExtra("$APP_PACKAGE_NAME.HAS_ACCESS"))
assertEquals(
expectAccess,
- result.resultData!!.getBooleanExtra("$APP_PACKAGE_NAME.HAS_ACCESS", false)
+ result.resultData!!.getBooleanExtra("$APP_PACKAGE_NAME.HAS_ACCESS", false),
)
}