Modify UidRecord.CHANGE_PROCSTATE such that it behaves like a bit mask.

UidRecord.CHANGE_PROCSTATE was allocated the value 0, since it is
assumed that if there is any change to a UidRecord it includes a proc
state change. This is a valid assumption, but is not an unusual design
for a bitmask. This change adds a bit specifically for proc state
changes.

At the time of this change, CHANGE_PROCSTATE should always be set.
However the intention is to pre-empt change
I68d964f474d20f819f54b614a4e314ce00aac8fb, which breaks the assumption
that all UidRecord changes will include proc state. To avoid verbosity,
additional constants have been defined which combine the other change
bits with CHANGE_PROCSTATE for external users to reference.

Change-Id: Iae7e6601938d1b3ee5c4c9b339ae06029eb598e6
Bug: 124224342
Test: -- ActivityManagerServiceTest
      -- ActivityManagerProcessStateTest
      -- ActivityManagerFgsBgStartTest
      -- UidObserverControllerTest
      -- CtsAppTestCases
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 17dc4589..2bb8912 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -779,6 +779,7 @@
         CHANGE_CACHED = 3;
         CHANGE_UNCACHED = 4;
         CHANGE_CAPABILITY = 5;
+        CHANGE_PROCSTATE = 6;
     }
     repeated Change last_reported_changes = 8;
     optional int32 num_procs = 9;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index c40f65f..45f06c74 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -15528,7 +15528,7 @@
     @GuardedBy("this")
     final void doStopUidLocked(int uid, final UidRecord uidRec) {
         mServices.stopInBackgroundLocked(uid);
-        enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE);
+        enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE | UidRecord.CHANGE_PROCSTATE);
     }
 
     /**
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 9626bbe..85d3d5d 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1191,7 +1191,7 @@
         }
         for (int i = activeUids.size() - 1; i >= 0; i--) {
             final UidRecord uidRec = activeUids.valueAt(i);
-            int uidChange = UidRecord.CHANGE_PROCSTATE;
+            int uidChange = 0;
             if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
                     && (uidRec.getSetProcState() != uidRec.getCurProcState()
                     || uidRec.getSetCapability() != uidRec.getCurCapability()
@@ -1219,12 +1219,12 @@
                         }
                     }
                     if (uidRec.isIdle() && !uidRec.isSetIdle()) {
-                        uidChange = UidRecord.CHANGE_IDLE;
+                        uidChange |= UidRecord.CHANGE_IDLE;
                         becameIdle.add(uidRec);
                     }
                 } else {
                     if (uidRec.isIdle()) {
-                        uidChange = UidRecord.CHANGE_ACTIVE;
+                        uidChange |= UidRecord.CHANGE_ACTIVE;
                         EventLogTags.writeAmUidActive(uidRec.getUid());
                         uidRec.setIdle(false);
                     }
@@ -1241,6 +1241,9 @@
                 if (uidRec.getSetCapability() != uidRec.getCurCapability()) {
                     uidChange |= UidRecord.CHANGE_CAPABILITY;
                 }
+                if (uidRec.getSetProcState() != uidRec.getCurProcState()) {
+                    uidChange |= UidRecord.CHANGE_PROCSTATE;
+                }
                 uidRec.setSetProcState(uidRec.getCurProcState());
                 uidRec.setSetCapability(uidRec.getCurCapability());
                 uidRec.setSetAllowListed(uidRec.isCurAllowListed());
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 253686c..a8612fd 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -3031,7 +3031,7 @@
                             Slog.i(TAG_UID_OBSERVERS, "No more processes in " + uidRecord);
                         }
                         mService.enqueueUidChangeLocked(uidRecord, -1,
-                                UidRecord.CHANGE_GONE);
+                                UidRecord.CHANGE_GONE | UidRecord.CHANGE_PROCSTATE);
                         EventLogTags.writeAmUidStopped(uid);
                         mActiveUids.remove(uid);
                         mService.mFgsStartTempAllowList.removeUid(record.info.uid);
diff --git a/services/core/java/com/android/server/am/UidObserverController.java b/services/core/java/com/android/server/am/UidObserverController.java
index f6a1841..c3a232a 100644
--- a/services/core/java/com/android/server/am/UidObserverController.java
+++ b/services/core/java/com/android/server/am/UidObserverController.java
@@ -154,6 +154,9 @@
         if ((pendingChange & UidRecord.CHANGE_CAPABILITY) != 0) {
             currentChange |= UidRecord.CHANGE_CAPABILITY;
         }
+        if ((pendingChange & UidRecord.CHANGE_PROCSTATE) != 0) {
+            currentChange |= UidRecord.CHANGE_PROCSTATE;
+        }
         return currentChange;
     }
 
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index 6101e26..606e6fc 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -117,13 +117,16 @@
      */
     final Object networkStateLock = new Object();
 
-    static final int CHANGE_PROCSTATE = 0;
-    static final int CHANGE_GONE = 1<<0;
-    static final int CHANGE_IDLE = 1<<1;
-    static final int CHANGE_ACTIVE = 1<<2;
-    static final int CHANGE_CACHED = 1<<3;
-    static final int CHANGE_UNCACHED = 1<<4;
-    static final int CHANGE_CAPABILITY = 1<<5;
+    /*
+     * Change bitmask flags.
+     */
+    static final int CHANGE_GONE = 1 << 0;
+    static final int CHANGE_IDLE = 1 << 1;
+    static final int CHANGE_ACTIVE = 1 << 2;
+    static final int CHANGE_CACHED = 1 << 3;
+    static final int CHANGE_UNCACHED = 1 << 4;
+    static final int CHANGE_CAPABILITY = 1 << 5;
+    static final int CHANGE_PROCSTATE = 1 << 31;
 
     // Keep the enum lists in sync
     private static int[] ORIG_ENUMS = new int[] {
@@ -133,6 +136,7 @@
             CHANGE_CACHED,
             CHANGE_UNCACHED,
             CHANGE_CAPABILITY,
+            CHANGE_PROCSTATE,
     };
     private static int[] PROTO_ENUMS = new int[] {
             UidRecordProto.CHANGE_GONE,
@@ -141,6 +145,7 @@
             UidRecordProto.CHANGE_CACHED,
             UidRecordProto.CHANGE_UNCACHED,
             UidRecordProto.CHANGE_CAPABILITY,
+            UidRecordProto.CHANGE_PROCSTATE,
     };
 
     // UidObserverController is the only thing that should modify this.
@@ -417,6 +422,12 @@
                 }
                 sb.append("uncached");
             }
+            if ((mLastReportedChange & CHANGE_PROCSTATE) != 0) {
+                if (printed) {
+                    sb.append("|");
+                }
+                sb.append("procstate");
+            }
         }
         sb.append(" procs:");
         sb.append(mNumProcs);