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)