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

Commit 8ca69dbf authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Automerger Merge Worker
Browse files

Merge "Add new network process capability." into sc-dev am: 5d8fc4ab

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13608074

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I7355c823339deea4710d095a907cf21715cbe11a
parents 994641b9 5d8fc4ab
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -100,7 +100,7 @@ package android.app {
    method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public boolean updateMccMncConfiguration(@NonNull String, @NonNull String);
    method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public boolean updateMccMncConfiguration(@NonNull String, @NonNull String);
    field public static final long DROP_CLOSE_SYSTEM_DIALOGS = 174664120L; // 0xa6929b8L
    field public static final long DROP_CLOSE_SYSTEM_DIALOGS = 174664120L; // 0xa6929b8L
    field public static final long LOCK_DOWN_CLOSE_SYSTEM_DIALOGS = 174664365L; // 0xa692aadL
    field public static final long LOCK_DOWN_CLOSE_SYSTEM_DIALOGS = 174664365L; // 0xa692aadL
    field public static final int PROCESS_CAPABILITY_ALL = 7; // 0x7
    field public static final int PROCESS_CAPABILITY_ALL = 15; // 0xf
    field public static final int PROCESS_CAPABILITY_ALL_EXPLICIT = 1; // 0x1
    field public static final int PROCESS_CAPABILITY_ALL_EXPLICIT = 1; // 0x1
    field public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = 6; // 0x6
    field public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = 6; // 0x6
    field public static final int PROCESS_CAPABILITY_FOREGROUND_CAMERA = 2; // 0x2
    field public static final int PROCESS_CAPABILITY_FOREGROUND_CAMERA = 2; // 0x2
+97 −2
Original line number Original line Diff line number Diff line
@@ -616,11 +616,15 @@ public class ActivityManager {
    @TestApi
    @TestApi
    public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 2;
    public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 2;


    /** @hide Process can access network despite any power saving resrictions */
    public static final int PROCESS_CAPABILITY_NETWORK = 1 << 3;

    /** @hide all capabilities, the ORing of all flags in {@link ProcessCapability}*/
    /** @hide all capabilities, the ORing of all flags in {@link ProcessCapability}*/
    @TestApi
    @TestApi
    public static final int PROCESS_CAPABILITY_ALL = PROCESS_CAPABILITY_FOREGROUND_LOCATION
    public static final int PROCESS_CAPABILITY_ALL = PROCESS_CAPABILITY_FOREGROUND_LOCATION
            | PROCESS_CAPABILITY_FOREGROUND_CAMERA
            | PROCESS_CAPABILITY_FOREGROUND_CAMERA
            | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
            | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE
            | PROCESS_CAPABILITY_NETWORK;
    /**
    /**
     * All explicit capabilities. These are capabilities that need to be specified from manifest
     * All explicit capabilities. These are capabilities that need to be specified from manifest
     * file.
     * file.
@@ -646,6 +650,15 @@ public class ActivityManager {
        pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0 ? 'L' : '-');
        pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0 ? 'L' : '-');
        pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0 ? 'C' : '-');
        pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0 ? 'C' : '-');
        pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-');
        pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-');
        pw.print((caps & PROCESS_CAPABILITY_NETWORK) != 0 ? 'N' : '-');
    }

    /** @hide */
    public static void printCapabilitiesSummary(StringBuilder sb, @ProcessCapability int caps) {
        sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0 ? 'L' : '-');
        sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0 ? 'C' : '-');
        sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-');
        sb.append((caps & PROCESS_CAPABILITY_NETWORK) != 0 ? 'N' : '-');
    }
    }


    /**
    /**
@@ -656,13 +669,21 @@ public class ActivityManager {
        printCapabilitiesSummary(pw, caps);
        printCapabilitiesSummary(pw, caps);
        final int remain = caps & ~(PROCESS_CAPABILITY_FOREGROUND_LOCATION
        final int remain = caps & ~(PROCESS_CAPABILITY_FOREGROUND_LOCATION
                | PROCESS_CAPABILITY_FOREGROUND_CAMERA
                | PROCESS_CAPABILITY_FOREGROUND_CAMERA
                | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE);
                | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE
                | PROCESS_CAPABILITY_NETWORK);
        if (remain != 0) {
        if (remain != 0) {
            pw.print('+');
            pw.print('+');
            pw.print(remain);
            pw.print(remain);
        }
        }
    }
    }


    /** @hide */
    public static String getCapabilitiesSummary(@ProcessCapability int caps) {
        final StringBuilder sb = new StringBuilder();
        printCapabilitiesSummary(sb, caps);
        return sb.toString();
    }

    // NOTE: If PROCESS_STATEs are added, then new fields must be added
    // 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
    // to frameworks/base/core/proto/android/app/enums.proto and the following method must
    // be updated to correctly map between them.
    // be updated to correctly map between them.
@@ -4485,6 +4506,80 @@ public class ActivityManager {
        }
        }
    }
    }


    /** @hide */
    public static String procStateToString(int procState) {
        final String procStateStr;
        switch (procState) {
            case ActivityManager.PROCESS_STATE_PERSISTENT:
                procStateStr = "PER ";
                break;
            case ActivityManager.PROCESS_STATE_PERSISTENT_UI:
                procStateStr = "PERU";
                break;
            case ActivityManager.PROCESS_STATE_TOP:
                procStateStr = "TOP ";
                break;
            case ActivityManager.PROCESS_STATE_BOUND_TOP:
                procStateStr = "BTOP";
                break;
            case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
                procStateStr = "FGS ";
                break;
            case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
                procStateStr = "BFGS";
                break;
            case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
                procStateStr = "IMPF";
                break;
            case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
                procStateStr = "IMPB";
                break;
            case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
                procStateStr = "TRNB";
                break;
            case ActivityManager.PROCESS_STATE_BACKUP:
                procStateStr = "BKUP";
                break;
            case ActivityManager.PROCESS_STATE_SERVICE:
                procStateStr = "SVC ";
                break;
            case ActivityManager.PROCESS_STATE_RECEIVER:
                procStateStr = "RCVR";
                break;
            case ActivityManager.PROCESS_STATE_TOP_SLEEPING:
                procStateStr = "TPSL";
                break;
            case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT:
                procStateStr = "HVY ";
                break;
            case ActivityManager.PROCESS_STATE_HOME:
                procStateStr = "HOME";
                break;
            case ActivityManager.PROCESS_STATE_LAST_ACTIVITY:
                procStateStr = "LAST";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
                procStateStr = "CAC ";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
                procStateStr = "CACC";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_RECENT:
                procStateStr = "CRE ";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
                procStateStr = "CEM ";
                break;
            case ActivityManager.PROCESS_STATE_NONEXISTENT:
                procStateStr = "NONE";
                break;
            default:
                procStateStr = "??";
                break;
        }
        return procStateStr;
    }

    /**
    /**
     * The AppTask allows you to manage your own application's tasks.
     * The AppTask allows you to manage your own application's tasks.
     * See {@link android.app.ActivityManager#getAppTasks()}
     * See {@link android.app.ActivityManager#getAppTasks()}
+48 −2
Original line number Original line Diff line number Diff line
@@ -16,14 +16,17 @@


package android.net;
package android.net;


import static android.app.ActivityManager.procStateToString;
import static android.content.pm.PackageManager.GET_SIGNATURES;
import static android.content.pm.PackageManager.GET_SIGNATURES;


import android.annotation.IntDef;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.ActivityManager.ProcessCapability;
import android.compat.annotation.UnsupportedAppUsage;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
@@ -617,8 +620,18 @@ public class NetworkPolicyManager {
     * to access network when the device is idle or in battery saver mode. Otherwise, false.
     * to access network when the device is idle or in battery saver mode. Otherwise, false.
     * @hide
     * @hide
     */
     */
    public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(int procState) {
    public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(@Nullable UidState uidState) {
        return procState <= FOREGROUND_THRESHOLD_STATE;
        if (uidState == null) {
            return false;
        }
        return isProcStateAllowedWhileIdleOrPowerSaveMode(uidState.procState, uidState.capability);
    }

    /** @hide */
    public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(
            int procState, @ProcessCapability int capability) {
        return procState <= FOREGROUND_THRESHOLD_STATE
                || (capability & ActivityManager.PROCESS_CAPABILITY_NETWORK) != 0;
    }
    }


    /**
    /**
@@ -626,10 +639,43 @@ public class NetworkPolicyManager {
     * to access network when the device is in data saver mode. Otherwise, false.
     * to access network when the device is in data saver mode. Otherwise, false.
     * @hide
     * @hide
     */
     */
    public static boolean isProcStateAllowedWhileOnRestrictBackground(@Nullable UidState uidState) {
        if (uidState == null) {
            return false;
        }
        return isProcStateAllowedWhileOnRestrictBackground(uidState.procState);
    }

    /** @hide */
    public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
    public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
        // Data saver and bg policy restrictions will only take procstate into account.
        return procState <= FOREGROUND_THRESHOLD_STATE;
        return procState <= FOREGROUND_THRESHOLD_STATE;
    }
    }


    /** @hide */
    public static final class UidState {
        public int uid;
        public int procState;
        public int capability;

        public UidState(int uid, int procState, int capability) {
            this.uid = uid;
            this.procState = procState;
            this.capability = capability;
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder();
            sb.append("{procState=");
            sb.append(procStateToString(procState));
            sb.append(",cap=");
            ActivityManager.printCapabilitiesSummary(sb, capability);
            sb.append("}");
            return sb.toString();
        }
    }

    /** @hide */
    /** @hide */
    @TestApi
    @TestApi
    @NonNull
    @NonNull
+5 −72
Original line number Original line Diff line number Diff line
@@ -1054,76 +1054,7 @@ public final class ProcessList {
    }
    }


    public static String makeProcStateString(int curProcState) {
    public static String makeProcStateString(int curProcState) {
        String procState;
        return ActivityManager.procStateToString(curProcState);
        switch (curProcState) {
            case ActivityManager.PROCESS_STATE_PERSISTENT:
                procState = "PER ";
                break;
            case ActivityManager.PROCESS_STATE_PERSISTENT_UI:
                procState = "PERU";
                break;
            case ActivityManager.PROCESS_STATE_TOP:
                procState = "TOP ";
                break;
            case ActivityManager.PROCESS_STATE_BOUND_TOP:
                procState = "BTOP";
                break;
            case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
                procState = "FGS ";
                break;
            case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
                procState = "BFGS";
                break;
            case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
                procState = "IMPF";
                break;
            case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
                procState = "IMPB";
                break;
            case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
                procState = "TRNB";
                break;
            case ActivityManager.PROCESS_STATE_BACKUP:
                procState = "BKUP";
                break;
            case ActivityManager.PROCESS_STATE_SERVICE:
                procState = "SVC ";
                break;
            case ActivityManager.PROCESS_STATE_RECEIVER:
                procState = "RCVR";
                break;
            case ActivityManager.PROCESS_STATE_TOP_SLEEPING:
                procState = "TPSL";
                break;
            case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT:
                procState = "HVY ";
                break;
            case ActivityManager.PROCESS_STATE_HOME:
                procState = "HOME";
                break;
            case ActivityManager.PROCESS_STATE_LAST_ACTIVITY:
                procState = "LAST";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
                procState = "CAC ";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
                procState = "CACC";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_RECENT:
                procState = "CRE ";
                break;
            case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
                procState = "CEM ";
                break;
            case ActivityManager.PROCESS_STATE_NONEXISTENT:
                procState = "NONE";
                break;
            default:
                procState = "??";
                break;
        }
        return procState;
    }
    }


    public static int makeProcStateProtoEnum(int curProcState) {
    public static int makeProcStateProtoEnum(int curProcState) {
@@ -4768,11 +4699,13 @@ public final class ProcessList {
    int getBlockStateForUid(UidRecord uidRec) {
    int getBlockStateForUid(UidRecord uidRec) {
        // Denotes whether uid's process state is currently allowed network access.
        // Denotes whether uid's process state is currently allowed network access.
        final boolean isAllowed =
        final boolean isAllowed =
                isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.getCurProcState())
                isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.getCurProcState(),
                        uidRec.getCurCapability())
                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getCurProcState());
                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getCurProcState());
        // Denotes whether uid's process state was previously allowed network access.
        // Denotes whether uid's process state was previously allowed network access.
        final boolean wasAllowed =
        final boolean wasAllowed =
                isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.getSetProcState())
                isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.getSetProcState(),
                        uidRec.getSetCapability())
                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getSetProcState());
                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getSetProcState());


        // When the uid is coming to foreground, AMS should inform the app thread that it should
        // When the uid is coming to foreground, AMS should inform the app thread that it should
+12 −6
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT;
import static android.os.Process.INVALID_UID;
import static android.os.Process.INVALID_UID;


import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.ActivityManager.ProcessCapability;
import android.net.NetworkPolicyManager;
import android.net.NetworkPolicyManager;
import android.os.UserHandle;
import android.os.UserHandle;
import android.util.Log;
import android.util.Log;
@@ -97,13 +98,15 @@ public class NetworkPolicyLogger {
        }
        }
    }
    }


    void uidStateChanged(int uid, int procState, long procStateSeq) {
    void uidStateChanged(int uid, int procState, long procStateSeq,
            @ProcessCapability int capability) {
        synchronized (mLock) {
        synchronized (mLock) {
            if (LOGV || uid == mDebugUid) {
            if (LOGV || uid == mDebugUid) {
                Slog.v(TAG, uid + " state changed to "
                Slog.v(TAG, uid + " state changed to "
                        + ProcessList.makeProcStateString(procState) + " with seq=" + procStateSeq);
                        + ProcessList.makeProcStateString(procState) + ",seq=" + procStateSeq
                        + ",cap=" + ActivityManager.getCapabilitiesSummary(capability));
            }
            }
            mUidStateChangeBuffer.uidStateChanged(uid, procState, procStateSeq);
            mUidStateChangeBuffer.uidStateChanged(uid, procState, procStateSeq, capability);
        }
        }
    }
    }


@@ -373,7 +376,8 @@ public class NetworkPolicyLogger {
            super(Data.class, capacity);
            super(Data.class, capacity);
        }
        }


        public void uidStateChanged(int uid, int procState, long procStateSeq) {
        public void uidStateChanged(int uid, int procState, long procStateSeq,
                @ProcessCapability int capability) {
            final Data data = getNextSlot();
            final Data data = getNextSlot();
            if (data == null) return;
            if (data == null) return;


@@ -381,6 +385,7 @@ public class NetworkPolicyLogger {
            data.type = EVENT_UID_STATE_CHANGED;
            data.type = EVENT_UID_STATE_CHANGED;
            data.ifield1 = uid;
            data.ifield1 = uid;
            data.ifield2 = procState;
            data.ifield2 = procState;
            data.ifield3 = capability;
            data.lfield1 = procStateSeq;
            data.lfield1 = procStateSeq;
            data.timeStamp = System.currentTimeMillis();
            data.timeStamp = System.currentTimeMillis();
        }
        }
@@ -546,8 +551,9 @@ public class NetworkPolicyLogger {
                case EVENT_NETWORK_BLOCKED:
                case EVENT_NETWORK_BLOCKED:
                    return data.ifield1 + "-" + getBlockedReason(data.ifield2);
                    return data.ifield1 + "-" + getBlockedReason(data.ifield2);
                case EVENT_UID_STATE_CHANGED:
                case EVENT_UID_STATE_CHANGED:
                    return data.ifield1 + "-" + ProcessList.makeProcStateString(data.ifield2)
                    return data.ifield1 + ":" + ProcessList.makeProcStateString(data.ifield2)
                            + "-" + data.lfield1;
                            + ":" + ActivityManager.getCapabilitiesSummary(data.ifield3)
                            + ":" + data.lfield1;
                case EVENT_POLICIES_CHANGED:
                case EVENT_POLICIES_CHANGED:
                    return getPolicyChangedLog(data.ifield1, data.ifield2, data.ifield3);
                    return getPolicyChangedLog(data.ifield1, data.ifield2, data.ifield3);
                case EVENT_METEREDNESS_CHANGED:
                case EVENT_METEREDNESS_CHANGED:
Loading