Move permission checks to HealthPermissionRequestContract#createIntent.
This unifies the check and simplifies logic in each delegate.
Test: added
Fix: 289357856
Change-Id: I143fc7dda5445d529278425025ff598a573a3205
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContractTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContractTest.kt
index 0c7cdb5d..370aadb 100644
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContractTest.kt
+++ b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContractTest.kt
@@ -27,6 +27,7 @@
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
+import kotlin.test.assertFailsWith
import org.junit.Test
import org.junit.runner.RunWith
@@ -38,8 +39,27 @@
private val context: Context = ApplicationProvider.getApplicationContext()
@Test
+ fun createIntent_nonHealthPermission_throwsIAE() {
+ val requestPermissionContract = HealthPermissionsRequestContract()
+ assertFailsWith<IllegalArgumentException> {
+ requestPermissionContract.createIntent(
+ context,
+ setOf(HealthPermission.READ_STEPS, "NON_HEALTH_PERMISSION")
+ )
+ }
+ }
+
+ @Test
+ fun createIntent_noPermissions_throwsIAE() {
+ val requestPermissionContract = HealthPermissionsRequestContract()
+ assertFailsWith<IllegalArgumentException> {
+ requestPermissionContract.createIntent(context, setOf())
+ }
+ }
+
+ @Test
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
- fun requestHealthPermissions_createIntent_hasPlatformIntentAction() {
+ fun createIntent_hasPlatformIntentAction() {
val intent =
HealthPermissionsRequestContract()
.createIntent(context, setOf(HealthPermission.READ_STEPS))
@@ -51,7 +71,7 @@
@Test
@SdkSuppress(maxSdkVersion = Build.VERSION_CODES.TIRAMISU)
- fun requestHealthPermissions_createIntent_hasApkIntentAction() {
+ fun createIntent_hasApkIntentAction() {
val intent =
HealthPermissionsRequestContract()
.createIntent(context, setOf(HealthPermission.READ_STEPS))
@@ -61,7 +81,7 @@
@Test
@SdkSuppress(maxSdkVersion = Build.VERSION_CODES.TIRAMISU)
- fun requestHealthPermissions_createIntent_hasApkIntentActionAndProvider() {
+ fun createIntent_hasApkIntentActionAndProvider() {
val intent =
HealthPermissionsRequestContract("some.provider")
.createIntent(context, setOf(HealthPermission.READ_STEPS))
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContract.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContract.kt
index 1251304..679412f 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContract.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/contracts/HealthPermissionsRequestContract.kt
@@ -22,6 +22,7 @@
import androidx.activity.result.contract.ActivityResultContract
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.permission.HealthDataRequestPermissionsInternal
+import androidx.health.connect.client.permission.HealthPermission
import androidx.health.connect.client.permission.platform.HealthDataRequestPermissionsUpsideDownCake
/**
@@ -50,6 +51,10 @@
* @see ActivityResultContract.createIntent
*/
override fun createIntent(context: Context, input: Set<String>): Intent {
+ require(input.all { it.startsWith(HealthPermission.PERMISSION_PREFIX) }) {
+ "Unsupported health connect permission"
+ }
+ require(input.isNotEmpty()) { "At least one permission is required!" }
return delegate.createIntent(context, input)
}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsInternal.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsInternal.kt
index 28c1ee5..6ddad08 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsInternal.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsInternal.kt
@@ -32,8 +32,7 @@
* An [ActivityResultContract] to request Health Connect permissions.
*
* @param providerPackageName Optional provider package name for the backing implementation of
- * choice.
- *
+ * choice.
* @see androidx.activity.ComponentActivity.registerForActivityResult
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
@@ -42,8 +41,6 @@
) : ActivityResultContract<Set<String>, Set<String>>() {
override fun createIntent(context: Context, input: Set<String>): Intent {
- require(input.isNotEmpty()) { "At least one permission is required!" }
-
val protoPermissionList =
input
.asSequence()
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCake.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCake.kt
index e6994c5..e4dd720 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCake.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCake.kt
@@ -20,7 +20,6 @@
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
import androidx.annotation.RestrictTo
-import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_PREFIX
/**
* An [ActivityResultContract] to request Health Connect system permissions.
@@ -33,12 +32,8 @@
private val requestPermissions = RequestMultiplePermissions()
- override fun createIntent(context: Context, input: Set<String>): Intent {
- require(input.all { it.startsWith(PERMISSION_PREFIX) }) {
- "Unsupported health connect permission"
- }
- return requestPermissions.createIntent(context, input.toTypedArray())
- }
+ override fun createIntent(context: Context, input: Set<String>): Intent =
+ requestPermissions.createIntent(context, input.toTypedArray())
override fun parseResult(resultCode: Int, intent: Intent?): Set<String> =
requestPermissions.parseResult(resultCode, intent).filterValues { it }.keys
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCakeTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCakeTest.kt
index 2bbd4f4..f284bd6a 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCakeTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/platform/HealthDataRequestPermissionsUpsideDownCakeTest.kt
@@ -25,7 +25,6 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
-import kotlin.test.assertFailsWith
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -45,7 +44,9 @@
val requestPermissionContract = HealthDataRequestPermissionsUpsideDownCake()
val intent =
requestPermissionContract.createIntent(
- context, setOf(HealthPermission.READ_STEPS, HealthPermission.WRITE_DISTANCE))
+ context,
+ setOf(HealthPermission.READ_STEPS, HealthPermission.WRITE_DISTANCE)
+ )
assertThat(intent.action).isEqualTo(RequestMultiplePermissions.ACTION_REQUEST_PERMISSIONS)
assertThat(intent.getStringArrayExtra(RequestMultiplePermissions.EXTRA_PERMISSIONS))
@@ -54,15 +55,6 @@
}
@Test
- fun createIntent_nonHealthPermission_throwsIAE() {
- val requestPermissionContract = HealthDataRequestPermissionsUpsideDownCake()
- assertFailsWith<IllegalArgumentException> {
- requestPermissionContract.createIntent(
- context, setOf(HealthPermission.READ_STEPS, "NON_HEALTH_PERMISSION"))
- }
- }
-
- @Test
fun parseIntent() {
val requestPermissionContract = HealthDataRequestPermissionsUpsideDownCake()
@@ -73,14 +65,18 @@
HealthPermission.READ_STEPS,
HealthPermission.WRITE_STEPS,
HealthPermission.WRITE_DISTANCE,
- HealthPermission.READ_HEART_RATE))
+ HealthPermission.READ_HEART_RATE
+ )
+ )
intent.putExtra(
RequestMultiplePermissions.EXTRA_PERMISSION_GRANT_RESULTS,
intArrayOf(
PackageManager.PERMISSION_GRANTED,
PackageManager.PERMISSION_DENIED,
PackageManager.PERMISSION_GRANTED,
- PackageManager.PERMISSION_DENIED))
+ PackageManager.PERMISSION_DENIED
+ )
+ )
val result = requestPermissionContract.parseResult(Activity.RESULT_OK, intent)