Per-display focused stacks in AM

This switches to tracking focused stacks for each display instead of
a single focused stack in the system.

Now ActivityDisplay#getFocusedStack() will return the corresponding
instance, if present on display. Previously it was tracked in
ActivityStackSupervisor with a field. Now the getter searches for a
focusable stack starting from top. Usually it will be the first one
- only PiP stack can be on on top and not focused.

ActivityStackSupervisor#getFocusedStack() will search across displays
for the topmost focusable stack  based on the order provided by WM.

The assumption that there always exists a focused stack is still true
- ActivityStackSupervisor#getFocusedStack() should never return null.
There always exists a focusable home stack on the default display.

Bug: 111541062
Test: atest com.android.server.am
Change-Id: I92922e4298ebbe1c68791bf59406e8f387bcd564
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
index 3ed2875..461aaaf 100644
--- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -1371,7 +1371,7 @@
             r.immersive = immersive;
 
             // update associated state if we're frontmost
-            if (r == mStackSupervisor.getResumedActivityLocked()) {
+            if (r.isResumedActivityOnDisplay()) {
                 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r);
                 applyUpdateLockStateLocked(r);
             }
@@ -3703,7 +3703,7 @@
                 r.requestedVrComponent = (enabled) ? packageName : null;
 
                 // Update associated state if this activity is currently focused
-                if (r == mStackSupervisor.getResumedActivityLocked()) {
+                if (r.isResumedActivityOnDisplay()) {
                     applyUpdateVrModeLocked(r);
                 }
                 return 0;
@@ -4720,8 +4720,9 @@
         mH.post(mAmInternal::updateOomAdj);
     }
 
+    // TODO(b/111541062): Update app time tracking to make it aware of multiple resumed activities
     private void startTimeTrackingFocusedActivityLocked() {
-        final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked();
+        final ActivityRecord resumedActivity = mStackSupervisor.getTopResumedActivity();
         if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) {
             mCurAppTimeTracker.start(resumedActivity.packageName);
         }