diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java index b27600800cc69..e845359a35c40 100644 --- a/core/java/android/hardware/display/DisplayManagerInternal.java +++ b/core/java/android/hardware/display/DisplayManagerInternal.java @@ -101,6 +101,16 @@ public abstract class DisplayManagerInternal { public abstract void setDisplayInfoOverrideFromWindowManager( int displayId, DisplayInfo info); + /** + * Get current display info without override from WindowManager. + * Current implementation of LogicalDisplay#getDisplayInfoLocked() always returns display info + * with overrides from WM if set. This method can be used for getting real display size without + * overrides to determine if real changes to display metrics happened. + * @param displayId Id of the target display. + * @param outInfo {@link DisplayInfo} to fill. + */ + public abstract void getNonOverrideDisplayInfo(int displayId, DisplayInfo outInfo); + /** * Called by the window manager to perform traversals while holding a * surface flinger transaction. diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 5494377ceebd1..6dedbde01995a 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -50,7 +50,7 @@ import java.util.Arrays; *
@@ -947,7 +947,7 @@ public final class Display { * The size is adjusted based on the current rotation of the display. *
* The real size may be smaller than the physical size of the screen when the - * window manager is emulating a smaller display (using adb shell am display-size). + * window manager is emulating a smaller display (using adb shell wm size). *
* * @param outSize Set to the real size of the display. diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index a1a74377cf620..ddd918fdcc5d4 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -339,6 +339,18 @@ public final class DisplayManagerService extends SystemService { } } + /** + * @see DisplayManagerInternal#getNonOverrideDisplayInfo(int, DisplayInfo) + */ + private void getNonOverrideDisplayInfoInternal(int displayId, DisplayInfo outInfo) { + synchronized (mSyncRoot) { + final LogicalDisplay display = mLogicalDisplays.get(displayId); + if (display != null) { + display.getNonOverrideDisplayInfoLocked(outInfo); + } + } + } + private void performTraversalInTransactionFromWindowManagerInternal() { synchronized (mSyncRoot) { if (!mPendingTraversal) { @@ -1662,6 +1674,11 @@ public final class DisplayManagerService extends SystemService { setDisplayInfoOverrideFromWindowManagerInternal(displayId, info); } + @Override + public void getNonOverrideDisplayInfo(int displayId, DisplayInfo outInfo) { + getNonOverrideDisplayInfoInternal(displayId, outInfo); + } + @Override public void performTraversalInTransactionFromWindowManager() { performTraversalInTransactionFromWindowManagerInternal(); diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index a947b41067941..addad0b413a38 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -17,6 +17,7 @@ package com.android.server.display; import android.graphics.Rect; +import android.hardware.display.DisplayManagerInternal; import android.view.Display; import android.view.DisplayInfo; import android.view.Surface; @@ -62,7 +63,18 @@ final class LogicalDisplay { private final int mDisplayId; private final int mLayerStack; - private DisplayInfo mOverrideDisplayInfo; // set by the window manager + /** + * Override information set by the window manager. Will be reported instead of {@link #mInfo} + * if not null. + * @see #setDisplayInfoOverrideFromWindowManagerLocked(DisplayInfo) + * @see #getDisplayInfoLocked() + */ + private DisplayInfo mOverrideDisplayInfo; + /** + * Current display info. Initialized with {@link #mBaseDisplayInfo}. Set to {@code null} if + * needs to be updated. + * @see #getDisplayInfoLocked() + */ private DisplayInfo mInfo; // The display device that this logical display is based on and which @@ -141,6 +153,13 @@ final class LogicalDisplay { return mInfo; } + /** + * @see DisplayManagerInternal#getNonOverrideDisplayInfo(int, DisplayInfo) + */ + void getNonOverrideDisplayInfoLocked(DisplayInfo outInfo) { + outInfo.copyFrom(mBaseDisplayInfo); + } + /** * Sets overridden logical display information from the window manager. * This method can be used to adjust application insets, rotation, and other diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 3c68e4ff4e7fd..da524c764ebaa 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -180,11 +180,23 @@ class DisplayContent extends WindowContainer