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

Commit a0a30a1a authored by Amith Yamasani's avatar Amith Yamasani
Browse files

Introduce a new process state for location fg service

A foreground service of type "location" gets a higher
process state PROCESS_STATE_FOREGROUND_SERVICE_LOCATION,
which is then propagated to AppOpsService, allowing it
to grant "while-in-use" permission to the process.

This changes the minimum bar for no-restriction to
UID_STATE_FOREGROUND_SERVICE_LOCATION.

Bug: 111453223
Test: atest CtsAppTestCases:ActivityManagerProcessStateTest
Change-Id: I25333bb2d524a6ae6d39efee088e6c94971b5db2
parent e54b7b54
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -345,10 +345,11 @@ package android.app {
    field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
    field public static final String OPSTR_WRITE_SMS = "android:write_sms";
    field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
    field public static final int UID_STATE_BACKGROUND = 4; // 0x4
    field public static final int UID_STATE_CACHED = 5; // 0x5
    field public static final int UID_STATE_FOREGROUND = 3; // 0x3
    field public static final int UID_STATE_FOREGROUND_SERVICE = 2; // 0x2
    field public static final int UID_STATE_BACKGROUND = 5; // 0x5
    field public static final int UID_STATE_CACHED = 6; // 0x6
    field public static final int UID_STATE_FOREGROUND = 4; // 0x4
    field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
    field public static final int UID_STATE_PERSISTENT = 0; // 0x0
    field public static final int UID_STATE_TOP = 1; // 0x1
  }
+5 −4
Original line number Diff line number Diff line
@@ -157,10 +157,11 @@ package android.app {
    field public static final int OP_COARSE_LOCATION = 0; // 0x0
    field public static final int OP_RECORD_AUDIO = 27; // 0x1b
    field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18
    field public static final int UID_STATE_BACKGROUND = 4; // 0x4
    field public static final int UID_STATE_CACHED = 5; // 0x5
    field public static final int UID_STATE_FOREGROUND = 3; // 0x3
    field public static final int UID_STATE_FOREGROUND_SERVICE = 2; // 0x2
    field public static final int UID_STATE_BACKGROUND = 5; // 0x5
    field public static final int UID_STATE_CACHED = 6; // 0x6
    field public static final int UID_STATE_FOREGROUND = 4; // 0x4
    field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
    field public static final int UID_STATE_PERSISTENT = 0; // 0x0
    field public static final int UID_STATE_TOP = 1; // 0x1
  }
+29 −18
Original line number Diff line number Diff line
@@ -505,71 +505,74 @@ public class ActivityManager {
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_TOP = 2;

    /** @hide Process is hosting a foreground service with location type. */
    public static final int PROCESS_STATE_FOREGROUND_SERVICE_LOCATION = 3;

    /** @hide Process is hosting a foreground service. */
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_FOREGROUND_SERVICE = 3;
    public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4;

    /** @hide Process is hosting a foreground service due to a system binding. */
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 4;
    public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 5;

    /** @hide Process is important to the user, and something they are aware of. */
    public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 5;
    public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;

    /** @hide Process is important to the user, but not something they are aware of. */
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 6;
    public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;

    /** @hide Process is in the background transient so we will try to keep running. */
    public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 7;
    public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 8;

    /** @hide Process is in the background running a backup/restore operation. */
    public static final int PROCESS_STATE_BACKUP = 8;
    public static final int PROCESS_STATE_BACKUP = 9;

    /** @hide Process is in the background running a service.  Unlike oom_adj, this level
     * is used for both the normal running in background state and the executing
     * operations state. */
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_SERVICE = 9;
    public static final int PROCESS_STATE_SERVICE = 10;

    /** @hide Process is in the background running a receiver.   Note that from the
     * perspective of oom_adj, receivers run at a higher foreground level, but for our
     * prioritization here that is not necessary and putting them below services means
     * many fewer changes in some process states as they receive broadcasts. */
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_RECEIVER = 10;
    public static final int PROCESS_STATE_RECEIVER = 11;

    /** @hide Same as {@link #PROCESS_STATE_TOP} but while device is sleeping. */
    public static final int PROCESS_STATE_TOP_SLEEPING = 11;
    public static final int PROCESS_STATE_TOP_SLEEPING = 12;

    /** @hide Process is in the background, but it can't restore its state so we want
     * to try to avoid killing it. */
    public static final int PROCESS_STATE_HEAVY_WEIGHT = 12;
    public static final int PROCESS_STATE_HEAVY_WEIGHT = 13;

    /** @hide Process is in the background but hosts the home activity. */
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_HOME = 13;
    public static final int PROCESS_STATE_HOME = 14;

    /** @hide Process is in the background but hosts the last shown activity. */
    public static final int PROCESS_STATE_LAST_ACTIVITY = 14;
    public static final int PROCESS_STATE_LAST_ACTIVITY = 15;

    /** @hide Process is being cached for later use and contains activities. */
    @UnsupportedAppUsage
    public static final int PROCESS_STATE_CACHED_ACTIVITY = 15;
    public static final int PROCESS_STATE_CACHED_ACTIVITY = 16;

    /** @hide Process is being cached for later use and is a client of another cached
     * process that contains activities. */
    public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 16;
    public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 17;

    /** @hide Process is being cached for later use and has an activity that corresponds
     * to an existing recent task. */
    public static final int PROCESS_STATE_CACHED_RECENT = 17;
    public static final int PROCESS_STATE_CACHED_RECENT = 18;

    /** @hide Process is being cached for later use and is empty. */
    public static final int PROCESS_STATE_CACHED_EMPTY = 18;
    public static final int PROCESS_STATE_CACHED_EMPTY = 19;

    /** @hide Process does not exist. */
    public static final int PROCESS_STATE_NONEXISTENT = 19;
    public static final int PROCESS_STATE_NONEXISTENT = 20;

    // NOTE: If PROCESS_STATEs are added, then new fields must be added
    // to frameworks/base/core/proto/android/app/enums.proto and the following method must
@@ -594,6 +597,7 @@ public class ActivityManager {
                return AppProtoEnums.PROCESS_STATE_PERSISTENT_UI;
            case PROCESS_STATE_TOP:
                return AppProtoEnums.PROCESS_STATE_TOP;
            case PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
            case PROCESS_STATE_FOREGROUND_SERVICE:
                return AppProtoEnums.PROCESS_STATE_FOREGROUND_SERVICE;
            case PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
@@ -646,6 +650,12 @@ public class ActivityManager {
        return procState >= PROCESS_STATE_TRANSIENT_BACKGROUND;
    }

    /** @hide Is this a foreground service type? */
    public static boolean isForegroundService(int procState) {
        return procState == PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
                || procState == PROCESS_STATE_FOREGROUND_SERVICE;
    }

    /** @hide requestType for assist context: only basic information. */
    public static final int ASSIST_CONTEXT_BASIC = 0;

@@ -2874,7 +2884,7 @@ public class ActivityManager {
                return IMPORTANCE_PERCEPTIBLE;
            } else if (procState >= PROCESS_STATE_IMPORTANT_FOREGROUND) {
                return IMPORTANCE_VISIBLE;
            } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE) {
            } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE_LOCATION) {
                return IMPORTANCE_FOREGROUND_SERVICE;
            } else {
                return IMPORTANCE_FOREGROUND;
@@ -2936,6 +2946,7 @@ public class ActivityManager {
                return PROCESS_STATE_IMPORTANT_FOREGROUND;
            } else if (importance >= IMPORTANCE_FOREGROUND_SERVICE) {
                return PROCESS_STATE_FOREGROUND_SERVICE;
                // TODO: Asymmetrical mapping for LOCATION service type. Ok?
            } else {
                return PROCESS_STATE_TOP;
            }
+22 −7
Original line number Diff line number Diff line
@@ -41,9 +41,9 @@ import android.os.RemoteException;
import android.os.UserManager;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import android.util.SparseArray;
import com.android.internal.app.IAppOpsActiveCallback;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsNotedCallback;
@@ -216,6 +216,7 @@ public class AppOpsManager {
    @IntDef(flag = true, prefix = { "UID_STATE_" }, value = {
            UID_STATE_PERSISTENT,
            UID_STATE_TOP,
            UID_STATE_FOREGROUND_SERVICE_LOCATION,
            UID_STATE_FOREGROUND_SERVICE,
            UID_STATE_FOREGROUND,
            UID_STATE_BACKGROUND,
@@ -245,19 +246,27 @@ public class AppOpsManager {
    @SystemApi
    public static final int UID_STATE_TOP = 1;

    /**
     * Metrics about an op when its uid is running a foreground service with location type.
     * @hide
     */
    @TestApi
    @SystemApi
    public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2;

    /**
     * Metrics about an op when its uid is running a foreground service.
     * @hide
     */
    @TestApi
    @SystemApi
    public static final int UID_STATE_FOREGROUND_SERVICE = 2;
    public static final int UID_STATE_FOREGROUND_SERVICE = 3;

    /**
     * Last UID state in which we don't restrict what an op can do.
     * @hide
     */
    public static final int UID_STATE_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE;
    public static final int UID_STATE_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE_LOCATION;

    /**
     * Metrics about an op when its uid is in the foreground for any other reasons.
@@ -265,7 +274,7 @@ public class AppOpsManager {
     */
    @TestApi
    @SystemApi
    public static final int UID_STATE_FOREGROUND = 3;
    public static final int UID_STATE_FOREGROUND = 4;

    /**
     * Metrics about an op when its uid is in the background for any reason.
@@ -273,7 +282,7 @@ public class AppOpsManager {
     */
    @TestApi
    @SystemApi
    public static final int UID_STATE_BACKGROUND = 4;
    public static final int UID_STATE_BACKGROUND = 5;

    /**
     * Metrics about an op when its uid is cached.
@@ -281,13 +290,13 @@ public class AppOpsManager {
     */
    @TestApi
    @SystemApi
    public static final int UID_STATE_CACHED = 5;
    public static final int UID_STATE_CACHED = 6;

    /**
     * Number of uid states we track.
     * @hide
     */
    public static final int _NUM_UID_STATE = 6;
    public static final int _NUM_UID_STATE = 7;

    // when adding one of these:
    //  - increment _NUM_OP
@@ -3250,6 +3259,7 @@ public class AppOpsManager {
         *
         * @param uidState The UID state for which to query. Could be one of
         * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
         * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
         * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
         * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
         *
@@ -3300,6 +3310,7 @@ public class AppOpsManager {
         *
         * @param uidState The UID state for which to query. Could be one of
         * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
         * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
         * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
         * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
         *
@@ -3350,6 +3361,7 @@ public class AppOpsManager {
         *
         * @param uidState The UID state for which to query. Could be one of
         * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
         * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
         * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
         * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
         *
@@ -4766,6 +4778,9 @@ public class AppOpsManager {
            case UID_STATE_TOP: {
                return "UID_STATE_TOP";
            }
            case UID_STATE_FOREGROUND_SERVICE_LOCATION: {
                return "UID_STATE_FOREGROUND_SERVICE_LOCATION";
            }
            case UID_STATE_FOREGROUND_SERVICE: {
                return "UID_STATE_FOREGROUND_SERVICE";
            }
+6 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.os;

import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION;

import android.app.ActivityManager;
import android.app.job.JobParameters;
import android.content.Context;
@@ -578,7 +580,7 @@ public abstract class BatteryStats implements Parcelable {
            return ActivityManager.PROCESS_STATE_NONEXISTENT;
        } else if (procState == ActivityManager.PROCESS_STATE_TOP) {
            return Uid.PROCESS_STATE_TOP;
        } else if (procState == ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
        } else if (ActivityManager.isForegroundService(procState)) {
            // State when app has put itself in the foreground.
            return Uid.PROCESS_STATE_FOREGROUND_SERVICE;
        } else if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
@@ -818,7 +820,9 @@ public abstract class BatteryStats implements Parcelable {
         * is not attributed to any non-critical process states.
         */
        public static final int[] CRITICAL_PROC_STATES = {
            PROCESS_STATE_TOP, PROCESS_STATE_FOREGROUND_SERVICE, PROCESS_STATE_FOREGROUND
                PROCESS_STATE_TOP,
                PROCESS_STATE_FOREGROUND_SERVICE_LOCATION, PROCESS_STATE_FOREGROUND_SERVICE,
                PROCESS_STATE_FOREGROUND
        };

        public abstract long getProcessStateTime(int state, long elapsedRealtimeUs, int which);
Loading