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:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 */);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user