Update xdpi/ydio according to config_maxUIWidth

Bug: 211523188
Test: Tested manually via shell command
Test: atest com.android.server.wm.DisplayContentTests#testMaxUiWidth

Change-Id: I5799450c24d0a88decbbeaf4432dee0f319db786
This commit is contained in:
Kriti Dang
2022-03-22 14:06:14 +01:00
parent fdf328c2b5
commit a3e43700b5
5 changed files with 85 additions and 21 deletions

View File

@@ -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;

View File

@@ -354,6 +354,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<DisplayCutout, WmDisplayCutout> mDisplayCutoutCache
@@ -393,6 +395,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)
@@ -426,7 +434,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();
@@ -2034,6 +2042,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) {
@@ -2698,10 +2708,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],
@@ -2720,6 +2733,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;
@@ -2727,7 +2742,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);
@@ -2744,7 +2761,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();
@@ -2759,6 +2778,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mInitialDisplayWidth = newWidth;
mInitialDisplayHeight = newHeight;
mInitialDisplayDensity = newDensity;
mInitialPhysicalXDpi = newXDpi;
mInitialPhysicalYDpi = newYDpi;
mInitialDisplayCutout = newCutout;
mInitialRoundedCorners = newRoundedCorners;
mCurrentUniqueDisplayId = newUniqueId;
@@ -2775,19 +2796,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.
@@ -2861,7 +2888,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) {

View File

@@ -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;

View File

@@ -5655,7 +5655,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) {

View File

@@ -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;
@@ -2487,6 +2508,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 */);
}