Fix display-level windowingMode change

This includes the following fixes:

It updates the ATM hierarchy and executes accumulated transitions
when display windowingMode changes. This was being skipped because
the mode change was being set on DC before reconfigureDisplayLocked.

Don't freeze the display when only window-effecting configs change

Don't cancel change transition on display change if the window
hasn't moved to a different display

Cancel change transition when app loses visibility.

Bug: 130755818
Test: Added test to AppChangeTransitionTests, manual test on chromeos
      for display windowing-mode change.
Change-Id: Ic1a0427f3e5ba940dc4c12765395e8ca050b0baf
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 2321898..a9903dd 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -508,6 +508,10 @@
         final DisplayContent displayContent = getDisplayContent();
         displayContent.mOpeningApps.remove(this);
         displayContent.mClosingApps.remove(this);
+        if (isInChangeTransition()) {
+            clearChangeLeash(getPendingTransaction(), true /* cancel */);
+        }
+        displayContent.mChangingApps.remove(this);
         waitingToShow = false;
         hiddenRequested = !visible;
         mDeferHidingClient = deferHidingClient;
@@ -1309,7 +1313,7 @@
     void onDisplayChanged(DisplayContent dc) {
         DisplayContent prevDc = mDisplayContent;
         super.onDisplayChanged(dc);
-        if (prevDc == null) {
+        if (prevDc == null || prevDc == mDisplayContent) {
             return;
         }
         if (prevDc.mChangingApps.contains(this)) {
@@ -1332,7 +1336,7 @@
             }
         }
 
-        if (prevDc != mDisplayContent && mLetterbox != null) {
+        if (mLetterbox != null) {
             mLetterbox.onMovedToDisplay(mDisplayContent.getDisplayId());
         }
     }