diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index e3ecf498fbb05..b7ad4ed4f98db 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -227,6 +227,8 @@ final class LogicalDisplay { info.largestNominalAppHeight = mOverrideDisplayInfo.largestNominalAppHeight; info.logicalWidth = mOverrideDisplayInfo.logicalWidth; info.logicalHeight = mOverrideDisplayInfo.logicalHeight; + info.physicalXDpi = mOverrideDisplayInfo.physicalXDpi; + info.physicalYDpi = mOverrideDisplayInfo.physicalYDpi; info.rotation = mOverrideDisplayInfo.rotation; info.displayCutout = mOverrideDisplayInfo.displayCutout; info.logicalDensityDpi = mOverrideDisplayInfo.logicalDensityDpi; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 798719b9c51f9..a982078a25b63 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -355,6 +355,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp int mInitialDisplayWidth = 0; int mInitialDisplayHeight = 0; int mInitialDisplayDensity = 0; + float mInitialPhysicalXDpi = 0.0f; + float mInitialPhysicalYDpi = 0.0f; DisplayCutout mInitialDisplayCutout; private final RotationCache mDisplayCutoutCache @@ -394,6 +396,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp int mBaseDisplayDensity = 0; boolean mIsDensityForced = false; + /** + * Overridden display physical dpi. + */ + float mBaseDisplayPhysicalXDpi = 0.0f; + float mBaseDisplayPhysicalYDpi = 0.0f; + /** * Whether to disable display scaling. This can be set via shell command "adb shell wm scaling". * @see WindowManagerService#setForcedDisplayScalingMode(int, int) @@ -427,7 +435,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp /** * Compat metrics computed based on {@link #mDisplayMetrics}. - * @see #updateDisplayAndOrientation(int) + * @see #updateDisplayAndOrientation(int, Configuration) */ private final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics(); @@ -2035,6 +2043,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mDisplayInfo.logicalWidth = dw; mDisplayInfo.logicalHeight = dh; mDisplayInfo.logicalDensityDpi = mBaseDisplayDensity; + mDisplayInfo.physicalXDpi = mBaseDisplayPhysicalXDpi; + mDisplayInfo.physicalYDpi = mBaseDisplayPhysicalYDpi; mDisplayInfo.appWidth = appWidth; mDisplayInfo.appHeight = appHeight; if (isDefaultDisplay) { @@ -2697,10 +2707,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } updateBaseDisplayMetrics(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight, - mDisplayInfo.logicalDensityDpi); + mDisplayInfo.logicalDensityDpi, mDisplayInfo.physicalXDpi, + mDisplayInfo.physicalYDpi); mInitialDisplayWidth = mDisplayInfo.logicalWidth; mInitialDisplayHeight = mDisplayInfo.logicalHeight; mInitialDisplayDensity = mDisplayInfo.logicalDensityDpi; + mInitialPhysicalXDpi = mDisplayInfo.physicalXDpi; + mInitialPhysicalYDpi = mDisplayInfo.physicalYDpi; mInitialDisplayCutout = mDisplayInfo.displayCutout; mInitialRoundedCorners = mDisplayInfo.roundedCorners; mCurrentPrivacyIndicatorBounds = new PrivacyIndicatorBounds(new Rect[4], @@ -2719,6 +2732,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final int newWidth = rotated ? mDisplayInfo.logicalHeight : mDisplayInfo.logicalWidth; final int newHeight = rotated ? mDisplayInfo.logicalWidth : mDisplayInfo.logicalHeight; final int newDensity = mDisplayInfo.logicalDensityDpi; + final float newXDpi = mDisplayInfo.physicalXDpi; + final float newYDpi = mDisplayInfo.physicalYDpi; final DisplayCutout newCutout = mIgnoreDisplayCutout ? DisplayCutout.NO_CUTOUT : mDisplayInfo.displayCutout; final String newUniqueId = mDisplayInfo.uniqueId; @@ -2726,7 +2741,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final boolean displayMetricsChanged = mInitialDisplayWidth != newWidth || mInitialDisplayHeight != newHeight - || mInitialDisplayDensity != mDisplayInfo.logicalDensityDpi + || mInitialDisplayDensity != newDensity + || mInitialPhysicalXDpi != newXDpi + || mInitialPhysicalYDpi != newYDpi || !Objects.equals(mInitialDisplayCutout, newCutout) || !Objects.equals(mInitialRoundedCorners, newRoundedCorners); final boolean physicalDisplayChanged = !newUniqueId.equals(mCurrentUniqueDisplayId); @@ -2743,7 +2760,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // If there is an override set for base values - use it, otherwise use new values. updateBaseDisplayMetrics(mIsSizeForced ? mBaseDisplayWidth : newWidth, mIsSizeForced ? mBaseDisplayHeight : newHeight, - mIsDensityForced ? mBaseDisplayDensity : newDensity); + mIsDensityForced ? mBaseDisplayDensity : newDensity, + mIsSizeForced ? mBaseDisplayPhysicalXDpi : newXDpi, + mIsSizeForced ? mBaseDisplayPhysicalYDpi : newYDpi); configureDisplayPolicy(); @@ -2758,6 +2777,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mInitialDisplayWidth = newWidth; mInitialDisplayHeight = newHeight; mInitialDisplayDensity = newDensity; + mInitialPhysicalXDpi = newXDpi; + mInitialPhysicalYDpi = newYDpi; mInitialDisplayCutout = newCutout; mInitialRoundedCorners = newRoundedCorners; mCurrentUniqueDisplayId = newUniqueId; @@ -2774,19 +2795,25 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mMaxUiWidth = width; // Update existing metrics. - updateBaseDisplayMetrics(mBaseDisplayWidth, mBaseDisplayHeight, mBaseDisplayDensity); + updateBaseDisplayMetrics(mBaseDisplayWidth, mBaseDisplayHeight, mBaseDisplayDensity, + mBaseDisplayPhysicalXDpi, mBaseDisplayPhysicalYDpi); } /** Update base (override) display metrics. */ - void updateBaseDisplayMetrics(int baseWidth, int baseHeight, int baseDensity) { + void updateBaseDisplayMetrics(int baseWidth, int baseHeight, int baseDensity, float baseXDpi, + float baseYDpi) { mBaseDisplayWidth = baseWidth; mBaseDisplayHeight = baseHeight; mBaseDisplayDensity = baseDensity; + mBaseDisplayPhysicalXDpi = baseXDpi; + mBaseDisplayPhysicalYDpi = baseYDpi; if (mMaxUiWidth > 0 && mBaseDisplayWidth > mMaxUiWidth) { final float ratio = mMaxUiWidth / (float) mBaseDisplayWidth; mBaseDisplayHeight = (int) (mBaseDisplayHeight * ratio); mBaseDisplayWidth = mMaxUiWidth; + mBaseDisplayPhysicalXDpi = mBaseDisplayPhysicalXDpi * ratio; + mBaseDisplayPhysicalYDpi = mBaseDisplayPhysicalYDpi * ratio; if (!mIsDensityForced) { // Update the density proportionally so the size of the UI elements won't change // from the user's perspective. @@ -2860,7 +2887,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } Slog.i(TAG_WM, "Using new display size: " + width + "x" + height); - updateBaseDisplayMetrics(width, height, mBaseDisplayDensity); + updateBaseDisplayMetrics(width, height, mBaseDisplayDensity, mBaseDisplayPhysicalXDpi, + mBaseDisplayPhysicalYDpi); reconfigureDisplayLocked(); if (!mIsSizeForced) { diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index 70c769d608449..11bcd8ca36818 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -277,7 +277,8 @@ class DisplayWindowSettings { final int height = hasSizeOverride ? settings.mForcedHeight : dc.mInitialDisplayHeight; final int density = hasDensityOverride ? settings.mForcedDensity : dc.mInitialDisplayDensity; - dc.updateBaseDisplayMetrics(width, height, density); + dc.updateBaseDisplayMetrics(width, height, density, dc.mBaseDisplayPhysicalXDpi, + dc.mBaseDisplayPhysicalYDpi); final int forcedScalingMode = settings.mForcedScalingMode != null ? settings.mForcedScalingMode : FORCE_SCALING_MODE_AUTO; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index c86baac59a1b1..99e7817d22ce7 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5691,7 +5691,9 @@ public class WindowManagerService extends IWindowManager.Stub || displayContent.mBaseDisplayHeight != height) { ProtoLog.i(WM_ERROR, "FORCED DISPLAY SIZE: %dx%d", width, height); displayContent.updateBaseDisplayMetrics(width, height, - displayContent.mBaseDisplayDensity); + displayContent.mBaseDisplayDensity, + displayContent.mBaseDisplayPhysicalXDpi, + displayContent.mBaseDisplayPhysicalYDpi); changed = true; } } catch (NumberFormatException ex) { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index eb85d0098d176..605726c0e8049 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -682,31 +682,43 @@ public class DisplayContentTests extends WindowTestsBase { final int baseWidth = 1440; final int baseHeight = 2560; final int baseDensity = 300; + final float baseXDpi = 60; + final float baseYDpi = 60; - displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); + displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseYDpi, + baseYDpi); final int maxWidth = 300; - final int resultingHeight = (maxWidth * baseHeight) / baseWidth; - final int resultingDensity = (baseDensity * maxWidth) / baseWidth; + final float ratioChange = maxWidth / (float) baseWidth; + final int resultingHeight = (int) (baseHeight * ratioChange); + final int resultingDensity = (int) (baseDensity * ratioChange); + final float resultingXDpi = baseXDpi * ratioChange; + final float resultingYDpi = baseYDpi * ratioChange; displayContent.setMaxUiWidth(maxWidth); - verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity); + verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity, resultingXDpi, + resultingYDpi); // Assert setting values again does not change; - displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); - verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity); + displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi, + baseYDpi); + verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity, resultingXDpi, + resultingYDpi); final int smallerWidth = 200; final int smallerHeight = 400; final int smallerDensity = 100; // Specify smaller dimension, verify that it is honored - displayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity); - verifySizes(displayContent, smallerWidth, smallerHeight, smallerDensity); + displayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity, + baseXDpi, baseYDpi); + verifySizes(displayContent, smallerWidth, smallerHeight, smallerDensity, baseXDpi, + baseYDpi); // Verify that setting the max width to a greater value than the base width has no effect displayContent.setMaxUiWidth(maxWidth); - verifySizes(displayContent, smallerWidth, smallerHeight, smallerDensity); + verifySizes(displayContent, smallerWidth, smallerHeight, smallerDensity, baseXDpi, + baseYDpi); } @Test @@ -716,11 +728,14 @@ public class DisplayContentTests extends WindowTestsBase { final int baseWidth = 1280; final int baseHeight = 720; final int baseDensity = 320; + final float baseXDpi = 60; + final float baseYDpi = 60; displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayHeight = baseHeight; displayContent.mInitialDisplayDensity = baseDensity; - displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); + displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi, + baseYDpi); final int forcedWidth = 1920; final int forcedHeight = 1080; @@ -741,11 +756,14 @@ public class DisplayContentTests extends WindowTestsBase { final int baseWidth = 1280; final int baseHeight = 720; final int baseDensity = 320; + final float baseXDpi = 60; + final float baseYDpi = 60; displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayHeight = baseHeight; displayContent.mInitialDisplayDensity = baseDensity; - displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); + displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi, + baseYDpi); displayContent.setMaxUiWidth(baseWidth); @@ -767,11 +785,14 @@ public class DisplayContentTests extends WindowTestsBase { final int baseWidth = 1280; final int baseHeight = 720; final int baseDensity = 320; + final float baseXDpi = 60; + final float baseYDpi = 60; displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayHeight = baseHeight; displayContent.mInitialDisplayDensity = baseDensity; - displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); + displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi, + baseYDpi); final int forcedDensity = 600; @@ -2513,6 +2534,16 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(expectedBaseDensity, displayContent.mBaseDisplayDensity); } + private static void verifySizes(DisplayContent displayContent, int expectedBaseWidth, + int expectedBaseHeight, int expectedBaseDensity, float expectedBaseXDpi, + float expectedBaseYDpi) { + assertEquals(expectedBaseWidth, displayContent.mBaseDisplayWidth); + assertEquals(expectedBaseHeight, displayContent.mBaseDisplayHeight); + assertEquals(expectedBaseDensity, displayContent.mBaseDisplayDensity); + assertEquals(expectedBaseXDpi, displayContent.mBaseDisplayPhysicalXDpi, 1.0f /* delta */); + assertEquals(expectedBaseYDpi, displayContent.mBaseDisplayPhysicalYDpi, 1.0f /* delta */); + } + private void updateFocusedWindow() { mWm.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, false /* updateInputWindows */); }