Store the existence of home and previous process

WindowProcessController can already know whether there is a home
or previous process. Though a refresh of the states require a
full oom-adj update, trimApplicationsLocked and appDiedLocked
should be frequently enough to update.

This removes potential lock contention when memFactor becomes
not ADJ_MEM_FACTOR_NORMAL when updating oom-adj. This also
reduces the dependency of internal interface across packages.

Bug: 159104503
Bug: 171989664
Test: Launch several apps and run memeater to trigger low mem.
      Check the output of "adb shell dumpsys activity processes"
      and set break point at AppProfiler to observe the values.
Change-Id: I2fe0eeccdde3ea687ce0d5d856beb3aee886c185
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index 5e59a35..cace260 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -247,6 +247,9 @@
     private int mMemWatchDumpUid;
     private boolean mMemWatchIsUserInitiated;
 
+    boolean mHasHomeProcess;
+    boolean mHasPreviousProcess;
+
     /**
      * Used to collect per-process CPU use for ANRs, battery stats, etc.
      * Must acquire this object's lock when accessing it.
@@ -961,8 +964,8 @@
             }
             int factor = numTrimming / 3;
             int minFactor = 2;
-            if (mService.mAtmInternal.getHomeProcess() != null) minFactor++;
-            if (mService.mAtmInternal.getPreviousProcess() != null) minFactor++;
+            if (mHasHomeProcess) minFactor++;
+            if (mHasPreviousProcess) minFactor++;
             if (factor < minFactor) factor = minFactor;
             int curLevel = ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
             for (int i = 0; i < numOfLru; i++) {
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 9d49236..01d0a6d 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -500,6 +500,7 @@
         final ProcessRecord topApp = mService.getTopAppLocked();
         // Clear any pending ones because we are doing a full update now.
         mPendingProcessSet.clear();
+        mService.mAppProfiler.mHasPreviousProcess = mService.mAppProfiler.mHasHomeProcess = false;
         updateOomAdjLockedInner(oomAdjReason, topApp , null, null, true, true);
     }
 
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index ccdd6a7..463ba6d 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -1875,16 +1875,24 @@
 
     boolean getCachedIsHomeProcess() {
         if (mCachedIsHomeProcess == VALUE_INVALID) {
-            mCachedIsHomeProcess = getWindowProcessController().isHomeProcess()
-                    ? VALUE_TRUE : VALUE_FALSE;
+            if (getWindowProcessController().isHomeProcess()) {
+                mCachedIsHomeProcess = VALUE_TRUE;
+                mService.mAppProfiler.mHasHomeProcess = true;
+            } else {
+                mCachedIsHomeProcess = VALUE_FALSE;
+            }
         }
         return mCachedIsHomeProcess == VALUE_TRUE;
     }
 
     boolean getCachedIsPreviousProcess() {
         if (mCachedIsPreviousProcess == VALUE_INVALID) {
-            mCachedIsPreviousProcess = getWindowProcessController().isPreviousProcess()
-                    ? VALUE_TRUE : VALUE_FALSE;
+            if (getWindowProcessController().isPreviousProcess()) {
+                mCachedIsPreviousProcess = VALUE_TRUE;
+                mService.mAppProfiler.mHasPreviousProcess = true;
+            } else {
+                mCachedIsPreviousProcess = VALUE_FALSE;
+            }
         }
         return mCachedIsPreviousProcess == VALUE_TRUE;
     }
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index c7d716d82..7ce8821 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -533,9 +533,6 @@
     /** Flush recent tasks to disk. */
     public abstract void flushRecentTasks();
 
-    public abstract WindowProcessController getHomeProcess();
-    public abstract WindowProcessController getPreviousProcess();
-
     public abstract void clearLockedTasks(String reason);
     public abstract void updateUserConfiguration();
     public abstract boolean canShowErrorDialogs();
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index a02701f..12c677f 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -7362,20 +7362,6 @@
         }
 
         @Override
-        public WindowProcessController getHomeProcess() {
-            synchronized (mGlobalLock) {
-                return mHomeProcess;
-            }
-        }
-
-        @Override
-        public WindowProcessController getPreviousProcess() {
-            synchronized (mGlobalLock) {
-                return mPreviousProcess;
-            }
-        }
-
-        @Override
         public void clearLockedTasks(String reason) {
             synchronized (mGlobalLock) {
                 getLockTaskController().clearLockedTasks(reason);