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

Commit e82458ab authored by Justin Lannin's avatar Justin Lannin Committed by Android (Google) Code Review
Browse files

Merge "ForegroundService: Include HR, SkinTemp, Spo2 permissions for health fgs." into main

parents 8e712d6a acba22d7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -13809,7 +13809,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, android.Manifest.permission.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 @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled") @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_HEALTH}, anyOf={android.Manifest.permission.ACTIVITY_RECOGNITION, android.Manifest.permission.HIGH_SAMPLING_RATE_SENSORS, android.health.connect.HealthPermissions.READ_HEART_RATE, android.health.connect.HealthPermissions.READ_SKIN_TEMPERATURE, android.health.connect.HealthPermissions.READ_OXYGEN_SATURATION}) 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
+30 −15
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import android.content.pm.ServiceInfo.ForegroundServiceType;
import android.hardware.usb.UsbAccessory;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.health.connect.HealthPermissions;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -487,18 +488,32 @@ public abstract class ForegroundServiceTypePolicy {
                    FOREGROUND_SERVICE_TYPE_HEALTH,
                    ForegroundServiceTypePolicyInfo.INVALID_CHANGE_ID,
                    ForegroundServiceTypePolicyInfo.INVALID_CHANGE_ID,
            new ForegroundServiceTypePermissions(new ForegroundServiceTypePermission[] {
                    new ForegroundServiceTypePermissions(
                            new ForegroundServiceTypePermission[] {
                                new RegularPermission(Manifest.permission.FOREGROUND_SERVICE_HEALTH)
            }, true),
            new ForegroundServiceTypePermissions(new ForegroundServiceTypePermission[] {
                new RegularPermission(Manifest.permission.ACTIVITY_RECOGNITION),
                new RegularPermission(Manifest.permission.BODY_SENSORS),
                new RegularPermission(Manifest.permission.HIGH_SAMPLING_RATE_SENSORS),
            }, false),
                            },
                            true),
                    new ForegroundServiceTypePermissions(getAllowedHealthPermissions(), false),
                    FGS_TYPE_PERM_ENFORCEMENT_FLAG_HEALTH /* permissionEnforcementFlag */,
                    true /* permissionEnforcementFlagDefaultValue */,
            false /* foregroundOnlyPermission */
    );
                    false /* foregroundOnlyPermission */);

    /** Returns the permissions needed for the policy of the health foreground service type. */
    private static ForegroundServiceTypePermission[] getAllowedHealthPermissions() {
        final ArrayList<ForegroundServiceTypePermission> permissions = new ArrayList<>();
        permissions.add(new RegularPermission(Manifest.permission.ACTIVITY_RECOGNITION));
        permissions.add(new RegularPermission(Manifest.permission.HIGH_SAMPLING_RATE_SENSORS));

        if (android.permission.flags.Flags.replaceBodySensorPermissionEnabled()) {
            permissions.add(new RegularPermission(HealthPermissions.READ_HEART_RATE));
            permissions.add(new RegularPermission(HealthPermissions.READ_SKIN_TEMPERATURE));
            permissions.add(new RegularPermission(HealthPermissions.READ_OXYGEN_SATURATION));
        } else {
            permissions.add(new RegularPermission(Manifest.permission.BODY_SENSORS));
        }

        return permissions.toArray(new ForegroundServiceTypePermission[permissions.size()]);
    }

    /**
     * The policy for the {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING}.
+8 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.Manifest;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.RequiresPermission;
import android.health.connect.HealthPermissions;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Printer;
@@ -361,8 +362,10 @@ public class ServiceInfo extends ComponentInfo
     * {@link android.Manifest.permission#FOREGROUND_SERVICE_HEALTH} and one of the following
     * permissions:
     * {@link android.Manifest.permission#ACTIVITY_RECOGNITION},
     * {@link android.Manifest.permission#BODY_SENSORS},
     * {@link android.Manifest.permission#HIGH_SAMPLING_RATE_SENSORS}.
     * {@link android.health.connect.HealthPermissions#READ_HEART_RATE},
     * {@link android.health.connect.HealthPermissions#READ_SKIN_TEMPERATURE},
     * {@link android.health.connect.HealthPermissions#READ_OXYGEN_SATURATION},
     */
    @RequiresPermission(
            allOf = {
@@ -370,10 +373,13 @@ public class ServiceInfo extends ComponentInfo
            },
            anyOf = {
                Manifest.permission.ACTIVITY_RECOGNITION,
                Manifest.permission.BODY_SENSORS,
                Manifest.permission.HIGH_SAMPLING_RATE_SENSORS,
                HealthPermissions.READ_HEART_RATE,
                HealthPermissions.READ_SKIN_TEMPERATURE,
                HealthPermissions.READ_OXYGEN_SATURATION,
            }
    )
    @FlaggedApi(android.permission.flags.Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
    public static final int FOREGROUND_SERVICE_TYPE_HEALTH = 1 << 8;

    /**