summaryrefslogtreecommitdiff
path: root/PermissionController/src
diff options
context:
space:
mode:
author Scarlett Song <scarlettsong@google.com> 2025-03-14 21:22:52 +0000
committer Scarlett Song <scarlettsong@google.com> 2025-03-20 17:07:23 -0700
commit46db55c94f2d851d78976f189d0dcd92a396ff51 (patch)
treeec9e63bd5c9f41f87bd5fd705b98a1a47959382b /PermissionController/src
parent77fd95aa28119818eeb18fae99f7c5836991bd96 (diff)
Support health split permission check for targetSdk<23 apps
Test: atest HealthConnectAppPermissionFragmentTest Bug: 403337565 Flag: android.permission.flags.replace_body_sensor_permission_enabled Relnote: Health permission split BODY_SENSORS to READ_HEART_RATE LOW_COVERAGE_REASON=b/405152547 Change-Id: I770fdf9a551bb53a6e0d7adccd39ea6bf285c57b
Diffstat (limited to 'PermissionController/src')
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java46
1 files changed, 16 insertions, 30 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
index 327142896..675a1049f 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
@@ -39,6 +39,7 @@ import static android.content.Intent.EXTRA_REASON;
import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT;
import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT;
import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_WHEN_REQUESTED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED;
@@ -82,6 +83,7 @@ import android.health.connect.HealthConnectManager;
import android.health.connect.HealthPermissions;
import android.os.Binder;
import android.os.Build;
+import android.os.Build.VERSION_CODES;
import android.os.Parcelable;
import android.os.UserHandle;
import android.os.UserManager;
@@ -1171,45 +1173,29 @@ public final class Utils {
}
}
- // Split permission only applies to READ_HEART_RATE.
- if (!requestedHealthPermissions.contains(HealthPermissions.READ_HEART_RATE)) {
+ if (!isValidSplitHealthPermissions(requestedHealthPermissions)) {
return false;
}
- // If there are other health permissions (other than READ_HEALTH_DATA_IN_BACKGROUND)
- // don't consider this a pure split-permission request.
- if (requestedHealthPermissions.size() > 2) {
- return false;
- }
-
- boolean isBackgroundPermissionRequested =
- requestedHealthPermissions.contains(
- HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND);
- // If there are two health permissions declared, make sure the other is
- // READ_HEALTH_DATA_IN_BACKGROUND.
- if (requestedHealthPermissions.size() == 2 && !isBackgroundPermissionRequested) {
- return false;
- }
-
- // If READ_HEALTH_DATA_IN_BACKGROUND is requested, check permission flag to see if is from
- // split permission.
- if (isBackgroundPermissionRequested) {
- int readHealthDataInBackgroundFlag =
- pm.getPermissionFlags(
- HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND, packageName, user);
- if (!isFromSplitPermission(readHealthDataInBackgroundFlag)) {
+ int targetSdk = packageInfo.getTargetSdkVersion();
+ for (String perm : requestedHealthPermissions) {
+ if (!isFromSplitPermission(pm.getPermissionFlags(perm, packageName, user), targetSdk)) {
return false;
}
}
+ return true;
+ }
- // Check READ_HEART_RATE permission flag to see if is from split permission.
- int readHeartRateFlag =
- pm.getPermissionFlags(HealthPermissions.READ_HEART_RATE, packageName, user);
- return isFromSplitPermission(readHeartRateFlag);
+ private static boolean isValidSplitHealthPermissions(List<String> permissions) {
+ return (permissions.size() == 1 && permissions.contains(HealthPermissions.READ_HEART_RATE))
+ || (permissions.size() == 2 && permissions.contains(HealthPermissions.READ_HEART_RATE)
+ && permissions.contains(HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND));
}
- private static boolean isFromSplitPermission(int permissionFlag) {
- return (permissionFlag & FLAG_PERMISSION_REVOKE_WHEN_REQUESTED) != 0;
+ private static boolean isFromSplitPermission(int permissionFlag, int targetSdk) {
+ return (targetSdk >= Build.VERSION_CODES.M)
+ ? (permissionFlag & PackageManager.FLAG_PERMISSION_REVOKE_WHEN_REQUESTED) != 0
+ : (permissionFlag & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) != 0;
}
/**