Merge "Add health connect permissions to FGS type "health""
This commit is contained in:
@@ -54,6 +54,7 @@ import android.content.pm.ServiceInfo.ForegroundServiceType;
|
||||
import android.hardware.usb.UsbAccessory;
|
||||
import android.hardware.usb.UsbDevice;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.healthconnect.HealthConnectManager;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.util.ArraySet;
|
||||
@@ -66,8 +67,10 @@ import com.android.internal.util.ArrayUtils;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* This class enforces the policies around the foreground service types.
|
||||
@@ -655,11 +658,12 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
*
|
||||
* For test only.
|
||||
*/
|
||||
public @NonNull Optional<String[]> getRequiredAllOfPermissionsForTest() {
|
||||
public @NonNull Optional<String[]> getRequiredAllOfPermissionsForTest(
|
||||
@NonNull Context context) {
|
||||
if (mAllOfPermissions == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(mAllOfPermissions.toStringArray());
|
||||
return Optional.of(mAllOfPermissions.toStringArray(context));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -668,11 +672,12 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
*
|
||||
* For test only.
|
||||
*/
|
||||
public @NonNull Optional<String[]> getRequiredAnyOfPermissionsForTest() {
|
||||
public @NonNull Optional<String[]> getRequiredAnyOfPermissionsForTest(
|
||||
@NonNull Context context) {
|
||||
if (mAnyOfPermissions == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(mAnyOfPermissions.toStringArray());
|
||||
return Optional.of(mAnyOfPermissions.toStringArray(context));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -808,12 +813,12 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@NonNull String[] toStringArray() {
|
||||
final String[] names = new String[mPermissions.length];
|
||||
@NonNull String[] toStringArray(Context context) {
|
||||
final ArrayList<String> list = new ArrayList<>();
|
||||
for (int i = 0; i < mPermissions.length; i++) {
|
||||
names[i] = mPermissions[i].mName;
|
||||
mPermissions[i].addToList(context, list);
|
||||
}
|
||||
return names;
|
||||
return list.toArray(new String[list.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -826,7 +831,7 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
/**
|
||||
* The name of this permission.
|
||||
*/
|
||||
final @NonNull String mName;
|
||||
protected final @NonNull String mName;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
@@ -846,6 +851,10 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
public String toString() {
|
||||
return mName;
|
||||
}
|
||||
|
||||
void addToList(@NonNull Context context, @NonNull ArrayList<String> list) {
|
||||
list.add(mName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -859,15 +868,23 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
@Override
|
||||
@SuppressLint("AndroidFrameworkRequiresPermission")
|
||||
@PackageManager.PermissionResult
|
||||
public int checkPermission(Context context, int callerUid, int callerPid,
|
||||
public int checkPermission(@NonNull Context context, int callerUid, int callerPid,
|
||||
String packageName, boolean allowWhileInUse) {
|
||||
return checkPermission(context, mName, callerUid, callerPid, packageName,
|
||||
allowWhileInUse);
|
||||
}
|
||||
|
||||
@SuppressLint("AndroidFrameworkRequiresPermission")
|
||||
@PackageManager.PermissionResult
|
||||
int checkPermission(@NonNull Context context, @NonNull String name, int callerUid,
|
||||
int callerPid, String packageName, boolean allowWhileInUse) {
|
||||
// Simple case, check if it's already granted.
|
||||
if (context.checkPermission(mName, callerPid, callerUid) == PERMISSION_GRANTED) {
|
||||
if (context.checkPermission(name, callerPid, callerUid) == PERMISSION_GRANTED) {
|
||||
return PERMISSION_GRANTED;
|
||||
}
|
||||
if (allowWhileInUse) {
|
||||
// Check its appops
|
||||
final int opCode = AppOpsManager.permissionToOpCode(mName);
|
||||
final int opCode = AppOpsManager.permissionToOpCode(name);
|
||||
final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
|
||||
if (opCode != AppOpsManager.OP_NONE) {
|
||||
final int currentMode = appOpsManager.unsafeCheckOpRawNoThrow(opCode, callerUid,
|
||||
@@ -895,7 +912,7 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
|
||||
@Override
|
||||
@PackageManager.PermissionResult
|
||||
public int checkPermission(Context context, int callerUid, int callerPid,
|
||||
public int checkPermission(@NonNull Context context, int callerUid, int callerPid,
|
||||
String packageName, boolean allowWhileInUse) {
|
||||
final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
|
||||
final int mode = appOpsManager.unsafeCheckOpRawNoThrow(mOpCode, callerUid, packageName);
|
||||
@@ -915,7 +932,7 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
@Override
|
||||
@SuppressLint("AndroidFrameworkRequiresPermission")
|
||||
@PackageManager.PermissionResult
|
||||
public int checkPermission(Context context, int callerUid, int callerPid,
|
||||
public int checkPermission(@NonNull Context context, int callerUid, int callerPid,
|
||||
String packageName, boolean allowWhileInUse) {
|
||||
final UsbManager usbManager = context.getSystemService(UsbManager.class);
|
||||
final HashMap<String, UsbDevice> devices = usbManager.getDeviceList();
|
||||
@@ -941,7 +958,7 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
@Override
|
||||
@SuppressLint("AndroidFrameworkRequiresPermission")
|
||||
@PackageManager.PermissionResult
|
||||
public int checkPermission(Context context, int callerUid, int callerPid,
|
||||
public int checkPermission(@NonNull Context context, int callerUid, int callerPid,
|
||||
String packageName, boolean allowWhileInUse) {
|
||||
final UsbManager usbManager = context.getSystemService(UsbManager.class);
|
||||
final UsbAccessory[] accessories = usbManager.getAccessoryList();
|
||||
@@ -956,6 +973,45 @@ public abstract class ForegroundServiceTypePolicy {
|
||||
}
|
||||
}
|
||||
|
||||
static class HealthConnectPermission extends RegularPermission {
|
||||
private @Nullable String[] mPermissionNames;
|
||||
|
||||
HealthConnectPermission() {
|
||||
super("Health Connect");
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressLint("AndroidFrameworkRequiresPermission")
|
||||
@PackageManager.PermissionResult
|
||||
public int checkPermission(@NonNull Context context, int callerUid, int callerPid,
|
||||
String packageName, boolean allowWhileInUse) {
|
||||
final String[] perms = getPermissions(context);
|
||||
for (String perm : perms) {
|
||||
if (checkPermission(context, perm, callerUid, callerPid,
|
||||
packageName, allowWhileInUse) == PERMISSION_GRANTED) {
|
||||
return PERMISSION_GRANTED;
|
||||
}
|
||||
}
|
||||
return PERMISSION_DENIED;
|
||||
}
|
||||
|
||||
@Override
|
||||
void addToList(@NonNull Context context, @NonNull ArrayList<String> list) {
|
||||
final String[] perms = getPermissions(context);
|
||||
for (String perm : perms) {
|
||||
list.add(perm);
|
||||
}
|
||||
}
|
||||
|
||||
private @NonNull String[] getPermissions(@NonNull Context context) {
|
||||
if (mPermissionNames != null) {
|
||||
return mPermissionNames;
|
||||
}
|
||||
final Set<String> healthPerms = HealthConnectManager.getHealthPermissions(context);
|
||||
return mPermissionNames = healthPerms.toArray(new String[healthPerms.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The default policy for the foreground service types.
|
||||
*
|
||||
|
||||
@@ -308,7 +308,9 @@ public class ServiceInfo extends ComponentInfo
|
||||
* permissions:
|
||||
* {@link android.Manifest.permission#ACTIVITY_RECOGNITION},
|
||||
* {@link android.Manifest.permission#BODY_SENSORS},
|
||||
* {@link android.Manifest.permission#HIGH_SAMPLING_RATE_SENSORS}.
|
||||
* {@link android.Manifest.permission#HIGH_SAMPLING_RATE_SENSORS},
|
||||
* or one of the {@code "android.permission.health.*"} permissions defined in the
|
||||
* {@link android.healthconnect.HealthPermissions}.
|
||||
*/
|
||||
@RequiresPermission(
|
||||
allOf = {
|
||||
@@ -424,7 +426,7 @@ public class ServiceInfo extends ComponentInfo
|
||||
* android:name=".MySpecialForegroundService"
|
||||
* android:foregroundServiceType="specialUse|foo">
|
||||
* <property
|
||||
* android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE""
|
||||
* android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||
* android:value="foo"
|
||||
* />
|
||||
* </service>
|
||||
|
||||
@@ -771,6 +771,80 @@
|
||||
<!-- Permissions required for CTS test - CtsAppFgsTestCases -->
|
||||
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
|
||||
|
||||
<!-- Permissions required for CTS test - CtsAppFgsTestCases -->
|
||||
<uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED" />
|
||||
<uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE" />
|
||||
<uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE" />
|
||||
<uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE" />
|
||||
<uses-permission android:name="android.permission.health.READ_BLOOD_PRESSURE" />
|
||||
<uses-permission android:name="android.permission.health.READ_BODY_FAT" />
|
||||
<uses-permission android:name="android.permission.health.READ_BODY_TEMPERATURE" />
|
||||
<uses-permission android:name="android.permission.health.READ_BODY_WATER_MASS" />
|
||||
<uses-permission android:name="android.permission.health.READ_BONE_MASS" />
|
||||
<uses-permission android:name="android.permission.health.READ_CERVICAL_MUCUS" />
|
||||
<uses-permission android:name="android.permission.health.READ_DISTANCE" />
|
||||
<uses-permission android:name="android.permission.health.READ_ELEVATION_GAINED" />
|
||||
<uses-permission android:name="android.permission.health.READ_EXERCISE" />
|
||||
<uses-permission android:name="android.permission.health.READ_FLOORS_CLIMBED" />
|
||||
<uses-permission android:name="android.permission.health.READ_HEART_RATE" />
|
||||
<uses-permission android:name="android.permission.health.READ_HEART_RATE_VARIABILITY" />
|
||||
<uses-permission android:name="android.permission.health.READ_HEIGHT" />
|
||||
<uses-permission android:name="android.permission.health.READ_HIP_CIRCUMFERENCE" />
|
||||
<uses-permission android:name="android.permission.health.READ_HYDRATION" />
|
||||
<uses-permission android:name="android.permission.health.READ_LEAN_BODY_MASS" />
|
||||
<uses-permission android:name="android.permission.health.READ_MENSTRUATION" />
|
||||
<uses-permission android:name="android.permission.health.READ_NUTRITION" />
|
||||
<uses-permission android:name="android.permission.health.READ_OVULATION_TEST" />
|
||||
<uses-permission android:name="android.permission.health.READ_OXYGEN_SATURATION" />
|
||||
<uses-permission android:name="android.permission.health.READ_POWER" />
|
||||
<uses-permission android:name="android.permission.health.READ_RESPIRATORY_RATE" />
|
||||
<uses-permission android:name="android.permission.health.READ_RESTING_HEART_RATE" />
|
||||
<uses-permission android:name="android.permission.health.READ_SEXUAL_ACTIVITY" />
|
||||
<uses-permission android:name="android.permission.health.READ_SLEEP" />
|
||||
<uses-permission android:name="android.permission.health.READ_SPEED" />
|
||||
<uses-permission android:name="android.permission.health.READ_STEPS" />
|
||||
<uses-permission android:name="android.permission.health.READ_TOTAL_CALORIES_BURNED" />
|
||||
<uses-permission android:name="android.permission.health.READ_VO2_MAX" />
|
||||
<uses-permission android:name="android.permission.health.READ_WAIST_CIRCUMFERENCE" />
|
||||
<uses-permission android:name="android.permission.health.READ_WEIGHT" />
|
||||
<uses-permission android:name="android.permission.health.READ_WHEELCHAIR_PUSHES" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BASAL_BODY_TEMPERATURE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BLOOD_PRESSURE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BODY_FAT" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BODY_TEMPERATURE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BODY_WATER_MASS" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_BONE_MASS" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_CERVICAL_MUCUS" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_DISTANCE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_ELEVATION_GAINED" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_EXERCISE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_HEART_RATE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_HEART_RATE_VARIABILITY" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_HEIGHT" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_HIP_CIRCUMFERENCE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_HYDRATION" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_LEAN_BODY_MASS" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_MENSTRUATION" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_NUTRITION" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_OVULATION_TEST" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_OXYGEN_SATURATION" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_POWER" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_RESPIRATORY_RATE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_RESTING_HEART_RATE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_SEXUAL_ACTIVITY" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_SLEEP" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_SPEED" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_STEPS" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_VO2_MAX" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_WAIST_CIRCUMFERENCE" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_WEIGHT" />
|
||||
<uses-permission android:name="android.permission.health.WRITE_WHEELCHAIR_PUSHES" />
|
||||
|
||||
<!-- Permission required for CTS test - ApplicationExemptionsTests -->
|
||||
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_APP_EXEMPTIONS" />
|
||||
|
||||
|
||||
Reference in New Issue
Block a user