Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 813816a4 authored by Jing Ji's avatar Jing Ji Committed by Android (Google) Code Review
Browse files

Merge "Add health connect permissions to FGS type "health""

parents df0e8296 2d49689f
Loading
Loading
Loading
Loading
+71 −15
Original line number Diff line number Diff line
@@ -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.
     *
+4 −2
Original line number Diff line number Diff line
@@ -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"&gt;
     *      &lt;property
     *          android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE""
     *          android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
     *          android:value="foo"
     *      /&gt;
     * &lt;/service&gt;
+74 −0
Original line number Diff line number Diff line
@@ -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" />