Merge "Integrate LogicalDisplayMapper with DisplayFoldController."
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index a86c5cb..defcab7 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -267,12 +267,6 @@
     public abstract void ignoreProximitySensorUntilChanged();
 
     /**
-     * Sets the folded state of the device.
-     * TODO: b/168208522 - Remove in favor of DisplayStatePolicy when that is available.
-     */
-    public abstract void setDeviceFolded(boolean isFolded);
-
-    /**
      * Describes the requested power state of the display.
      *
      * This object is intended to describe the general characteristics of the
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index a600292..60c83905e 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -91,6 +91,7 @@
 import android.util.Spline;
 import android.view.Display;
 import android.view.DisplayInfo;
+import android.view.IDisplayFoldListener;
 import android.view.Surface;
 import android.view.SurfaceControl;
 
@@ -103,6 +104,7 @@
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
 import com.android.server.UiThread;
+import com.android.server.policy.WindowManagerPolicy;
 import com.android.server.wm.SurfaceAnimationThread;
 import com.android.server.wm.WindowManagerInternal;
 
@@ -312,6 +314,9 @@
     // Receives notifications about changes to Settings.
     private SettingsObserver mSettingsObserver;
 
+    // Received notifications of the display-fold action
+    private DisplayFoldListener mDisplayFoldListener;
+
     public DisplayManagerService(Context context) {
         this(context, new Injector());
     }
@@ -429,6 +434,11 @@
         synchronized (mSyncRoot) {
             mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
             mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
+            WindowManagerPolicy policy = LocalServices.getService(WindowManagerPolicy.class);
+
+            mDisplayFoldListener = new DisplayFoldListener();
+            policy.registerDisplayFoldListener(mDisplayFoldListener);
+
             scheduleTraversalLocked(false);
         }
     }
@@ -2563,13 +2573,6 @@
         public void ignoreProximitySensorUntilChanged() {
             mDisplayPowerController.ignoreProximitySensorUntilChanged();
         }
-
-        @Override
-        public void setDeviceFolded(boolean isFolded) {
-            synchronized (mSyncRoot) {
-                mLogicalDisplayMapper.setDeviceFoldedLocked(isFolded);
-            }
-        }
     }
 
     class DesiredDisplayModeSpecsObserver
@@ -2606,4 +2609,17 @@
             }
         }
     }
+
+    class DisplayFoldListener extends IDisplayFoldListener.Stub {
+        @Override
+        public void onDisplayFoldChanged(int displayId, boolean folded) {
+            // TODO: multi-display - IDisplayFoldListener callback only really works for the
+            // Display.DEFAULT_DISPLAY.
+            if (displayId == Display.DEFAULT_DISPLAY) {
+                synchronized (mSyncRoot) {
+                    mLogicalDisplayMapper.setDeviceFoldedLocked(folded);
+                }
+            }
+        }
+    };
 }
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index 942a12e..fc3ba35 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -167,7 +167,31 @@
         }
     }
 
-    public void setDeviceFoldedLocked(boolean isFolded) {
+    public void dumpLocked(PrintWriter pw) {
+        pw.println("LogicalDisplayMapper:");
+        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
+        ipw.increaseIndent();
+
+        ipw.println("mSingleDisplayDemoMode=" + mSingleDisplayDemoMode);
+        ipw.println("mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId);
+
+        final int logicalDisplayCount = mLogicalDisplays.size();
+        ipw.println();
+        ipw.println("Logical Displays: size=" + logicalDisplayCount);
+
+
+        for (int i = 0; i < logicalDisplayCount; i++) {
+            int displayId = mLogicalDisplays.keyAt(i);
+            LogicalDisplay display = mLogicalDisplays.valueAt(i);
+            ipw.println("Display " + displayId + ":");
+            ipw.increaseIndent();
+            display.dumpLocked(ipw);
+            ipw.decreaseIndent();
+            ipw.println();
+        }
+    }
+
+    void setDeviceFoldedLocked(boolean isFolded) {
         mIsFolded = isFolded;
         if (mIsFoldedOverride != null) {
             isFolded = mIsFoldedOverride.booleanValue();
@@ -237,30 +261,6 @@
         }
     }
 
-    public void dumpLocked(PrintWriter pw) {
-        pw.println("LogicalDisplayMapper:");
-        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
-        ipw.increaseIndent();
-
-        ipw.println("mSingleDisplayDemoMode=" + mSingleDisplayDemoMode);
-        ipw.println("mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId);
-
-        final int logicalDisplayCount = mLogicalDisplays.size();
-        ipw.println();
-        ipw.println("Logical Displays: size=" + logicalDisplayCount);
-
-
-        for (int i = 0; i < logicalDisplayCount; i++) {
-            int displayId = mLogicalDisplays.keyAt(i);
-            LogicalDisplay display = mLogicalDisplays.valueAt(i);
-            ipw.println("Display " + displayId + ":");
-            ipw.increaseIndent();
-            display.dumpLocked(ipw);
-            ipw.decreaseIndent();
-            ipw.println();
-        }
-    }
-
     void setFoldOverrideLocked(Boolean isFolded) {
         if (!Objects.equals(isFolded, mIsFoldedOverride)) {
             mIsFoldedOverride = isFolded;
diff --git a/services/core/java/com/android/server/policy/DisplayFoldController.java b/services/core/java/com/android/server/policy/DisplayFoldController.java
index 0ca6e59..f8e26fc 100644
--- a/services/core/java/com/android/server/policy/DisplayFoldController.java
+++ b/services/core/java/com/android/server/policy/DisplayFoldController.java
@@ -80,37 +80,42 @@
     }
 
     void setDeviceFolded(boolean folded) {
-        mDisplayManagerInternal.setDeviceFolded(folded);
-
         if (mFolded != null && mFolded == folded) {
             return;
         }
-        if (folded) {
-            Rect foldedArea;
-            if (!mOverrideFoldedArea.isEmpty()) {
-                foldedArea = mOverrideFoldedArea;
-            } else if (!mFoldedArea.isEmpty()) {
-                foldedArea = mFoldedArea;
-            } else {
-                return;
-            }
 
-            mDisplayManagerInternal.getNonOverrideDisplayInfo(mDisplayId, mNonOverrideDisplayInfo);
-            final int dx = (mNonOverrideDisplayInfo.logicalWidth - foldedArea.width()) / 2
-                    - foldedArea.left;
-            final int dy = (mNonOverrideDisplayInfo.logicalHeight - foldedArea.height()) / 2
-                    - foldedArea.top;
-
-            // Bypass scaling otherwise LogicalDisplay will scale contents by default.
-            mDisplayManagerInternal.setDisplayScalingDisabled(mDisplayId, true);
-            mWindowManagerInternal.setForcedDisplaySize(mDisplayId,
-                    foldedArea.width(), foldedArea.height());
-            mDisplayManagerInternal.setDisplayOffsets(mDisplayId, -dx, -dy);
+        final Rect foldedArea;
+        if (!mOverrideFoldedArea.isEmpty()) {
+            foldedArea = mOverrideFoldedArea;
+        } else if (!mFoldedArea.isEmpty()) {
+            foldedArea = mFoldedArea;
         } else {
-            mDisplayManagerInternal.setDisplayScalingDisabled(mDisplayId, false);
-            mWindowManagerInternal.clearForcedDisplaySize(mDisplayId);
-            mDisplayManagerInternal.setDisplayOffsets(mDisplayId, 0, 0);
+            foldedArea = null;
         }
+
+        // Only do display scaling/cropping if it has been configured to do so
+        if (foldedArea != null) {
+            if (folded) {
+
+                mDisplayManagerInternal.getNonOverrideDisplayInfo(
+                        mDisplayId, mNonOverrideDisplayInfo);
+                final int dx = (mNonOverrideDisplayInfo.logicalWidth - foldedArea.width()) / 2
+                        - foldedArea.left;
+                final int dy = (mNonOverrideDisplayInfo.logicalHeight - foldedArea.height()) / 2
+                        - foldedArea.top;
+
+                // Bypass scaling otherwise LogicalDisplay will scale contents by default.
+                mDisplayManagerInternal.setDisplayScalingDisabled(mDisplayId, true);
+                mWindowManagerInternal.setForcedDisplaySize(mDisplayId,
+                        foldedArea.width(), foldedArea.height());
+                mDisplayManagerInternal.setDisplayOffsets(mDisplayId, -dx, -dy);
+            } else {
+                mDisplayManagerInternal.setDisplayScalingDisabled(mDisplayId, false);
+                mWindowManagerInternal.clearForcedDisplaySize(mDisplayId);
+                mDisplayManagerInternal.setDisplayOffsets(mDisplayId, 0, 0);
+            }
+        }
+
         mDurationLogger.setDeviceFolded(folded);
         mDurationLogger.logFocusedAppWithFoldState(folded, mFocusedApp);
         mFolded = folded;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index b74de13..0983e10 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -471,7 +471,6 @@
     int mLidKeyboardAccessibility;
     int mLidNavigationAccessibility;
     private boolean mLidControlsDisplayFold;
-    private boolean mShouldSwapDisplaysOnLidSwitch;
     int mShortPressOnPowerBehavior;
     int mLongPressOnPowerBehavior;
     int mVeryLongPressOnPowerBehavior;
@@ -1849,8 +1848,6 @@
                 com.android.internal.R.integer.config_lidNavigationAccessibility);
         mLidControlsDisplayFold = mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_lidControlsDisplayFold);
-        mShouldSwapDisplaysOnLidSwitch = mContext.getResources().getStringArray(
-                com.android.internal.R.array.config_internalFoldedPhysicalDisplayIds).length == 2;
 
         mAllowTheaterModeWakeFromKey = mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_allowTheaterModeWakeFromKey);
@@ -5041,8 +5038,6 @@
         final int lidState = mDefaultDisplayPolicy.getLidState();
         if (mLidControlsDisplayFold && mDisplayFoldController != null) {
             mDisplayFoldController.requestDeviceFolded(lidState == LID_CLOSED);
-        } else if (mShouldSwapDisplaysOnLidSwitch) {
-            mDisplayManagerInternal.setDeviceFolded(lidState == LID_CLOSED);
         } else if (lidState == LID_CLOSED) {
             int lidBehavior = getLidBehavior();
             switch (lidBehavior) {