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) {