From 2f6ff56681442e7050c4938b6c604f35c5cd7e0b Mon Sep 17 00:00:00 2001 From: Nagesh Pachorkar Date: Thu, 8 Dec 2022 19:48:28 +0000 Subject: Introduced granular skin temperature permissions Introduced granular permissions BODY_SENSORS_WRIST_TEMPERATURE and BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND similar to BODY_SENSORS and BODY_SENSORS_BACKGROUND for providing more controlled skin temperature data access using WearOS watches. Test: CTS Bug: 260639955 BYPASS_INCLUSIVE_LANGUAGE_REASON=Contains a legacy method name which violates the presubmit lint validation. Change-Id: I77923dab2c8568a5a58a4e2bb8a6822106ec12fd --- core/api/current.txt | 5 +++- core/java/android/app/AppOpsManager.java | 18 ++++++++++++-- .../android/app/ForegroundServiceTypePolicy.java | 1 + core/java/android/content/pm/ServiceInfo.java | 2 ++ core/res/AndroidManifest.xml | 28 ++++++++++++++++++++++ core/res/res/values/strings.xml | 10 ++++++++ packages/Shell/AndroidManifest.xml | 1 + .../permission/DefaultPermissionGrantPolicy.java | 2 ++ .../pm/permission/PermissionManagerService.java | 4 +++- 9 files changed, 67 insertions(+), 4 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 978713abe84d..d543e0ad0d50 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -64,6 +64,8 @@ package android { field public static final String BLUETOOTH_SCAN = "android.permission.BLUETOOTH_SCAN"; field public static final String BODY_SENSORS = "android.permission.BODY_SENSORS"; field public static final String BODY_SENSORS_BACKGROUND = "android.permission.BODY_SENSORS_BACKGROUND"; + field public static final String BODY_SENSORS_WRIST_TEMPERATURE = "android.permission.BODY_SENSORS_WRIST_TEMPERATURE"; + field public static final String BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND = "android.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND"; field public static final String BROADCAST_PACKAGE_REMOVED = "android.permission.BROADCAST_PACKAGE_REMOVED"; field public static final String BROADCAST_SMS = "android.permission.BROADCAST_SMS"; field public static final String BROADCAST_STICKY = "android.permission.BROADCAST_STICKY"; @@ -4845,6 +4847,7 @@ package android.app { field public static final String OPSTR_ADD_VOICEMAIL = "android:add_voicemail"; field public static final String OPSTR_ANSWER_PHONE_CALLS = "android:answer_phone_calls"; field public static final String OPSTR_BODY_SENSORS = "android:body_sensors"; + field public static final String OPSTR_BODY_SENSORS_WRIST_TEMPERATURE = "android:body_sensors_wrist_temperature"; field public static final String OPSTR_CALL_PHONE = "android:call_phone"; field public static final String OPSTR_CAMERA = "android:camera"; field public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -12738,7 +12741,7 @@ package android.content.pm { field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_CAMERA}, anyOf={android.Manifest.permission.CAMERA}, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_CAMERA = 64; // 0x40 field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE}, anyOf={android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.CHANGE_NETWORK_STATE, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, android.Manifest.permission.NFC, android.Manifest.permission.TRANSMIT_IR, android.Manifest.permission.UWB_RANGING}, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE = 16; // 0x10 field @RequiresPermission(value=android.Manifest.permission.FOREGROUND_SERVICE_DATA_SYNC, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_DATA_SYNC = 1; // 0x1 - field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_HEALTH}, anyOf={android.Manifest.permission.ACTIVITY_RECOGNITION, android.Manifest.permission.BODY_SENSORS, android.Manifest.permission.HIGH_SAMPLING_RATE_SENSORS}) public static final int FOREGROUND_SERVICE_TYPE_HEALTH = 256; // 0x100 + field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_HEALTH}, anyOf={android.Manifest.permission.ACTIVITY_RECOGNITION, android.Manifest.permission.BODY_SENSORS, android.Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE, android.Manifest.permission.HIGH_SAMPLING_RATE_SENSORS}) public static final int FOREGROUND_SERVICE_TYPE_HEALTH = 256; // 0x100 field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_LOCATION}, anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_LOCATION = 8; // 0x8 field public static final int FOREGROUND_SERVICE_TYPE_MANIFEST = -1; // 0xffffffff field @RequiresPermission(value=android.Manifest.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK = 2; // 0x2 diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 84320caf4abc..c89a769dfbfb 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1448,9 +1448,13 @@ public class AppOpsManager { public static final int OP_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD = AppProtoEnums.APP_OP_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD; + /** @hide Access to wrist temperature sensors. */ + public static final int OP_BODY_SENSORS_WRIST_TEMPERATURE = + AppProtoEnums.APP_OP_BODY_SENSORS_WRIST_TEMPERATURE; + /** @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public static final int _NUM_OP = 132; + public static final int _NUM_OP = 133; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -2030,6 +2034,10 @@ public class AppOpsManager { public static final String OPSTR_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD = "android:capture_consentless_bugreport_on_userdebug_build"; + /** Access to wrist temperature body sensors. */ + public static final String OPSTR_BODY_SENSORS_WRIST_TEMPERATURE = + "android:body_sensors_wrist_temperature"; + /** {@link #sAppOpsToNote} not initialized yet for this op */ private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0; /** Should not collect noting of this app-op in {@link #sAppOpsToNote} */ @@ -2128,6 +2136,7 @@ public class AppOpsManager { OP_READ_MEDIA_VISUAL_USER_SELECTED, OP_FOREGROUND_SERVICE_SPECIAL_USE, OP_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD, + OP_BODY_SENSORS_WRIST_TEMPERATURE, }; static final AppOpInfo[] sAppOpInfos = new AppOpInfo[]{ @@ -2541,7 +2550,12 @@ public class AppOpsManager { OPSTR_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD, "CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD") .setPermission(Manifest.permission.CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD) - .build() + .build(), + new AppOpInfo.Builder(OP_BODY_SENSORS_WRIST_TEMPERATURE, + OPSTR_BODY_SENSORS_WRIST_TEMPERATURE, + "BODY_SENSORS_WRIST_TEMPERATURE") + .setPermission(Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE) + .setDefaultMode(AppOpsManager.MODE_ALLOWED).build() }; // The number of longs needed to form a full bitmask of app ops diff --git a/core/java/android/app/ForegroundServiceTypePolicy.java b/core/java/android/app/ForegroundServiceTypePolicy.java index c19a8652c98d..20d19c16f8d1 100644 --- a/core/java/android/app/ForegroundServiceTypePolicy.java +++ b/core/java/android/app/ForegroundServiceTypePolicy.java @@ -350,6 +350,7 @@ public abstract class ForegroundServiceTypePolicy { new ForegroundServiceTypePermissions(new ForegroundServiceTypePermission[] { new RegularPermission(Manifest.permission.ACTIVITY_RECOGNITION), new RegularPermission(Manifest.permission.BODY_SENSORS), + new RegularPermission(Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE), new RegularPermission(Manifest.permission.HIGH_SAMPLING_RATE_SENSORS), }, false) ); diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java index a408ea69686b..f3209f9c7ea6 100644 --- a/core/java/android/content/pm/ServiceInfo.java +++ b/core/java/android/content/pm/ServiceInfo.java @@ -323,6 +323,7 @@ public class ServiceInfo extends ComponentInfo * permissions: * {@link android.Manifest.permission#ACTIVITY_RECOGNITION}, * {@link android.Manifest.permission#BODY_SENSORS}, + * {@link android.Manifest.permission#BODY_SENSORS_WRIST_TEMPERATURE}, * {@link android.Manifest.permission#HIGH_SAMPLING_RATE_SENSORS}. */ @RequiresPermission( @@ -332,6 +333,7 @@ public class ServiceInfo extends ComponentInfo anyOf = { Manifest.permission.ACTIVITY_RECOGNITION, Manifest.permission.BODY_SENSORS, + Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE, Manifest.permission.HIGH_SAMPLING_RATE_SENSORS, } ) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 077b0c576384..260113fffe7a 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1733,6 +1733,34 @@ android:protectionLevel="dangerous" android:permissionFlags="hardRestricted" /> + + + + + + Allows the app to access body sensor data, such as heart rate, temperature, and blood oxygen percentage, while the app is in the background. + + Access body sensor wrist temperature data while the app is in use. + + Allows the app to access body sensor wrist temperature data, while the app is in use. + + + Access body sensor wrist temperature data while the app is in the background. + + Allows the app to access body sensor wrist temperature data, while the app is in the background. + Read calendar events and details diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 0c97989cf207..64954b7bd70e 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -57,6 +57,7 @@ + diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 58f88c324354..e74b459a5231 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -206,6 +206,8 @@ final class DefaultPermissionGrantPolicy { static { SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS); SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS_BACKGROUND); + SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE); + SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND); } private static final Set STORAGE_PERMISSIONS = new ArraySet<>(); 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 8973adc9c07e..052c785ed350 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -1313,7 +1313,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { // Bg location is one-off runtime modifier permission and has no app op if (sPlatformPermissions.containsKey(permission) && !Manifest.permission.ACCESS_BACKGROUND_LOCATION.equals(permission) - && !Manifest.permission.BODY_SENSORS_BACKGROUND.equals(permission)) { + && !Manifest.permission.BODY_SENSORS_BACKGROUND.equals(permission) + && !Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND + .equals(permission)) { Slog.wtf(LOG_TAG, "Platform runtime permission " + permission + " with no app op defined!"); } -- cgit v1.2.3-59-g8ed1b