summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Manjeet Rulhania <mrulhania@google.com> 2022-11-15 05:42:30 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-11-15 05:42:30 +0000
commit9ae00a02adeafa3fff8316d1bf5d97973d76cb33 (patch)
treea6814b4fa5583adcf08db3bf7a39cd6718d49712
parentefd00e60eb6c39952b463aeaec2e7010f5698d6f (diff)
parentfdf43f3d277e1ae9a28679556513051e9d547004 (diff)
Merge "Add health connect read/write app-op"
-rw-r--r--core/api/system-current.txt1
-rw-r--r--core/java/android/app/AppOpsManager.java42
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java4
3 files changed, 40 insertions, 7 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index db1e4e094257..4cead54ed0bf 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -588,6 +588,7 @@ package android.app {
field public static final String OPSTR_READ_MEDIA_IMAGES = "android:read_media_images";
field public static final String OPSTR_READ_MEDIA_VIDEO = "android:read_media_video";
field public static final String OPSTR_READ_MEDIA_VISUAL_USER_SELECTED = "android:read_media_visual_user_selected";
+ field public static final String OPSTR_READ_WRITE_HEALTH_DATA = "android:read_write_health_data";
field public static final String OPSTR_RECEIVE_AMBIENT_TRIGGER_AUDIO = "android:receive_ambient_trigger_audio";
field public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
field public static final String OPSTR_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO = "android:receive_explicit_user_interaction_audio";
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 860bfc5d2f4c..0f4644c63b8d 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -42,6 +42,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.database.DatabaseUtils;
+import android.healthconnect.HealthConnectManager;
import android.media.AudioAttributes.AttributeUsage;
import android.os.Binder;
import android.os.Build;
@@ -1390,9 +1391,16 @@ public class AppOpsManager {
public static final int OP_SYSTEM_EXEMPT_FROM_FORCED_APP_STANDBY =
AppProtoEnums.APP_OP_SYSTEM_EXEMPT_FROM_FORCED_APP_STANDBY;
+ /**
+ * An app op for reading/writing health connect data.
+ *
+ * @hide
+ */
+ public static final int OP_READ_WRITE_HEALTH_DATA = AppProtoEnums.APP_OP_READ_WRITE_HEALTH_DATA;
+
/** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public static final int _NUM_OP = 126;
+ public static final int _NUM_OP = 127;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -1873,6 +1881,15 @@ public class AppOpsManager {
"android:read_media_visual_user_selected";
/**
+ * An app op for reading/writing health connect data.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String OPSTR_READ_WRITE_HEALTH_DATA =
+ "android:read_write_health_data";
+
+ /**
* Record audio from near-field microphone (ie. TV remote)
* Allows audio recording regardless of sensor privacy state,
* as it is an intentional user interaction: hold-to-talk
@@ -2400,7 +2417,9 @@ public class AppOpsManager {
"SYSTEM_EXEMPT_FROM_APP_STANDBY").build(),
new AppOpInfo.Builder(OP_SYSTEM_EXEMPT_FROM_FORCED_APP_STANDBY,
OPSTR_SYSTEM_EXEMPT_FROM_FORCED_APP_STANDBY,
- "SYSTEM_EXEMPT_FROM_FORCED_APP_STANDBY").build()
+ "SYSTEM_EXEMPT_FROM_FORCED_APP_STANDBY").build(),
+ new AppOpInfo.Builder(OP_READ_WRITE_HEALTH_DATA, OPSTR_READ_WRITE_HEALTH_DATA,
+ "READ_WRITE_HEALTH_DATA").setDefaultMode(AppOpsManager.MODE_ALLOWED).build()
};
// The number of longs needed to form a full bitmask of app ops
@@ -2560,7 +2579,14 @@ public class AppOpsManager {
@TestApi
public static int permissionToOpCode(String permission) {
Integer boxedOpCode = sPermToOp.get(permission);
- return boxedOpCode != null ? boxedOpCode : OP_NONE;
+ if (boxedOpCode != null) {
+ return boxedOpCode;
+ }
+ if (HealthConnectManager.isHealthPermission(ActivityThread.currentApplication(),
+ permission)) {
+ return OP_READ_WRITE_HEALTH_DATA;
+ }
+ return OP_NONE;
}
/**
@@ -7224,10 +7250,14 @@ public class AppOpsManager {
*/
public static @Nullable String permissionToOp(@NonNull String permission) {
final Integer opCode = sPermToOp.get(permission);
- if (opCode == null) {
- return null;
+ if (opCode != null) {
+ return sAppOpInfos[opCode].name;
}
- return sAppOpInfos[opCode].name;
+ if (HealthConnectManager.isHealthPermission(ActivityThread.currentApplication(),
+ permission)) {
+ return sAppOpInfos[OP_READ_WRITE_HEALTH_DATA].name;
+ }
+ return null;
}
/**
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 5f9ab959f80a..5a638bbd5abd 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -50,6 +50,7 @@ import android.content.pm.ParceledListSlice;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.permission.SplitPermissionInfoParcelable;
+import android.healthconnect.HealthConnectManager;
import android.os.Binder;
import android.os.IBinder;
import android.os.Process;
@@ -1156,7 +1157,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
if (permissionInfo == null) {
try {
permissionInfo = context.getPackageManager().getPermissionInfo(permission, 0);
- if (PLATFORM_PACKAGE_NAME.equals(permissionInfo.packageName)) {
+ if (PLATFORM_PACKAGE_NAME.equals(permissionInfo.packageName)
+ || HealthConnectManager.isHealthPermission(context, permission)) {
// Double addition due to concurrency is fine - the backing
// store is concurrent.
sPlatformPermissions.put(permission, permissionInfo);