Merge "Update xdpi/ydio according to config_maxUIWidth" into tm-dev

This commit is contained in:
Kriti Dang
2022-03-31 08:22:18 +00:00
committed by Android (Google) Code Review
5 changed files with 85 additions and 21 deletions

View File

@@ -227,6 +227,8 @@ final class LogicalDisplay {
info.largestNominalAppHeight = mOverrideDisplayInfo.largestNominalAppHeight; info.largestNominalAppHeight = mOverrideDisplayInfo.largestNominalAppHeight;
info.logicalWidth = mOverrideDisplayInfo.logicalWidth; info.logicalWidth = mOverrideDisplayInfo.logicalWidth;
info.logicalHeight = mOverrideDisplayInfo.logicalHeight; info.logicalHeight = mOverrideDisplayInfo.logicalHeight;
info.physicalXDpi = mOverrideDisplayInfo.physicalXDpi;
info.physicalYDpi = mOverrideDisplayInfo.physicalYDpi;
info.rotation = mOverrideDisplayInfo.rotation; info.rotation = mOverrideDisplayInfo.rotation;
info.displayCutout = mOverrideDisplayInfo.displayCutout; info.displayCutout = mOverrideDisplayInfo.displayCutout;
info.logicalDensityDpi = mOverrideDisplayInfo.logicalDensityDpi; info.logicalDensityDpi = mOverrideDisplayInfo.logicalDensityDpi;

View File

@@ -355,6 +355,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
int mInitialDisplayWidth = 0; int mInitialDisplayWidth = 0;
int mInitialDisplayHeight = 0; int mInitialDisplayHeight = 0;
int mInitialDisplayDensity = 0; int mInitialDisplayDensity = 0;
float mInitialPhysicalXDpi = 0.0f;
float mInitialPhysicalYDpi = 0.0f;
DisplayCutout mInitialDisplayCutout; DisplayCutout mInitialDisplayCutout;
private final RotationCache<DisplayCutout, WmDisplayCutout> mDisplayCutoutCache private final RotationCache<DisplayCutout, WmDisplayCutout> mDisplayCutoutCache
@@ -394,6 +396,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
int mBaseDisplayDensity = 0; int mBaseDisplayDensity = 0;
boolean mIsDensityForced = false; 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". * Whether to disable display scaling. This can be set via shell command "adb shell wm scaling".
* @see WindowManagerService#setForcedDisplayScalingMode(int, int) * @see WindowManagerService#setForcedDisplayScalingMode(int, int)
@@ -427,7 +435,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
/** /**
* Compat metrics computed based on {@link #mDisplayMetrics}. * Compat metrics computed based on {@link #mDisplayMetrics}.
* @see #updateDisplayAndOrientation(int) * @see #updateDisplayAndOrientation(int, Configuration)
*/ */
private final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics(); private final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics();
@@ -2035,6 +2043,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mDisplayInfo.logicalWidth = dw; mDisplayInfo.logicalWidth = dw;
mDisplayInfo.logicalHeight = dh; mDisplayInfo.logicalHeight = dh;
mDisplayInfo.logicalDensityDpi = mBaseDisplayDensity; mDisplayInfo.logicalDensityDpi = mBaseDisplayDensity;
mDisplayInfo.physicalXDpi = mBaseDisplayPhysicalXDpi;
mDisplayInfo.physicalYDpi = mBaseDisplayPhysicalYDpi;
mDisplayInfo.appWidth = appWidth; mDisplayInfo.appWidth = appWidth;
mDisplayInfo.appHeight = appHeight; mDisplayInfo.appHeight = appHeight;
if (isDefaultDisplay) { if (isDefaultDisplay) {
@@ -2697,10 +2707,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
} }
updateBaseDisplayMetrics(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight, updateBaseDisplayMetrics(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight,
mDisplayInfo.logicalDensityDpi); mDisplayInfo.logicalDensityDpi, mDisplayInfo.physicalXDpi,
mDisplayInfo.physicalYDpi);
mInitialDisplayWidth = mDisplayInfo.logicalWidth; mInitialDisplayWidth = mDisplayInfo.logicalWidth;
mInitialDisplayHeight = mDisplayInfo.logicalHeight; mInitialDisplayHeight = mDisplayInfo.logicalHeight;
mInitialDisplayDensity = mDisplayInfo.logicalDensityDpi; mInitialDisplayDensity = mDisplayInfo.logicalDensityDpi;
mInitialPhysicalXDpi = mDisplayInfo.physicalXDpi;
mInitialPhysicalYDpi = mDisplayInfo.physicalYDpi;
mInitialDisplayCutout = mDisplayInfo.displayCutout; mInitialDisplayCutout = mDisplayInfo.displayCutout;
mInitialRoundedCorners = mDisplayInfo.roundedCorners; mInitialRoundedCorners = mDisplayInfo.roundedCorners;
mCurrentPrivacyIndicatorBounds = new PrivacyIndicatorBounds(new Rect[4], 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 newWidth = rotated ? mDisplayInfo.logicalHeight : mDisplayInfo.logicalWidth;
final int newHeight = rotated ? mDisplayInfo.logicalWidth : mDisplayInfo.logicalHeight; final int newHeight = rotated ? mDisplayInfo.logicalWidth : mDisplayInfo.logicalHeight;
final int newDensity = mDisplayInfo.logicalDensityDpi; final int newDensity = mDisplayInfo.logicalDensityDpi;
final float newXDpi = mDisplayInfo.physicalXDpi;
final float newYDpi = mDisplayInfo.physicalYDpi;
final DisplayCutout newCutout = mIgnoreDisplayCutout final DisplayCutout newCutout = mIgnoreDisplayCutout
? DisplayCutout.NO_CUTOUT : mDisplayInfo.displayCutout; ? DisplayCutout.NO_CUTOUT : mDisplayInfo.displayCutout;
final String newUniqueId = mDisplayInfo.uniqueId; final String newUniqueId = mDisplayInfo.uniqueId;
@@ -2726,7 +2741,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
final boolean displayMetricsChanged = mInitialDisplayWidth != newWidth final boolean displayMetricsChanged = mInitialDisplayWidth != newWidth
|| mInitialDisplayHeight != newHeight || mInitialDisplayHeight != newHeight
|| mInitialDisplayDensity != mDisplayInfo.logicalDensityDpi || mInitialDisplayDensity != newDensity
|| mInitialPhysicalXDpi != newXDpi
|| mInitialPhysicalYDpi != newYDpi
|| !Objects.equals(mInitialDisplayCutout, newCutout) || !Objects.equals(mInitialDisplayCutout, newCutout)
|| !Objects.equals(mInitialRoundedCorners, newRoundedCorners); || !Objects.equals(mInitialRoundedCorners, newRoundedCorners);
final boolean physicalDisplayChanged = !newUniqueId.equals(mCurrentUniqueDisplayId); 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. // If there is an override set for base values - use it, otherwise use new values.
updateBaseDisplayMetrics(mIsSizeForced ? mBaseDisplayWidth : newWidth, updateBaseDisplayMetrics(mIsSizeForced ? mBaseDisplayWidth : newWidth,
mIsSizeForced ? mBaseDisplayHeight : newHeight, mIsSizeForced ? mBaseDisplayHeight : newHeight,
mIsDensityForced ? mBaseDisplayDensity : newDensity); mIsDensityForced ? mBaseDisplayDensity : newDensity,
mIsSizeForced ? mBaseDisplayPhysicalXDpi : newXDpi,
mIsSizeForced ? mBaseDisplayPhysicalYDpi : newYDpi);
configureDisplayPolicy(); configureDisplayPolicy();
@@ -2758,6 +2777,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mInitialDisplayWidth = newWidth; mInitialDisplayWidth = newWidth;
mInitialDisplayHeight = newHeight; mInitialDisplayHeight = newHeight;
mInitialDisplayDensity = newDensity; mInitialDisplayDensity = newDensity;
mInitialPhysicalXDpi = newXDpi;
mInitialPhysicalYDpi = newYDpi;
mInitialDisplayCutout = newCutout; mInitialDisplayCutout = newCutout;
mInitialRoundedCorners = newRoundedCorners; mInitialRoundedCorners = newRoundedCorners;
mCurrentUniqueDisplayId = newUniqueId; mCurrentUniqueDisplayId = newUniqueId;
@@ -2774,19 +2795,25 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mMaxUiWidth = width; mMaxUiWidth = width;
// Update existing metrics. // Update existing metrics.
updateBaseDisplayMetrics(mBaseDisplayWidth, mBaseDisplayHeight, mBaseDisplayDensity); updateBaseDisplayMetrics(mBaseDisplayWidth, mBaseDisplayHeight, mBaseDisplayDensity,
mBaseDisplayPhysicalXDpi, mBaseDisplayPhysicalYDpi);
} }
/** Update base (override) display metrics. */ /** 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; mBaseDisplayWidth = baseWidth;
mBaseDisplayHeight = baseHeight; mBaseDisplayHeight = baseHeight;
mBaseDisplayDensity = baseDensity; mBaseDisplayDensity = baseDensity;
mBaseDisplayPhysicalXDpi = baseXDpi;
mBaseDisplayPhysicalYDpi = baseYDpi;
if (mMaxUiWidth > 0 && mBaseDisplayWidth > mMaxUiWidth) { if (mMaxUiWidth > 0 && mBaseDisplayWidth > mMaxUiWidth) {
final float ratio = mMaxUiWidth / (float) mBaseDisplayWidth; final float ratio = mMaxUiWidth / (float) mBaseDisplayWidth;
mBaseDisplayHeight = (int) (mBaseDisplayHeight * ratio); mBaseDisplayHeight = (int) (mBaseDisplayHeight * ratio);
mBaseDisplayWidth = mMaxUiWidth; mBaseDisplayWidth = mMaxUiWidth;
mBaseDisplayPhysicalXDpi = mBaseDisplayPhysicalXDpi * ratio;
mBaseDisplayPhysicalYDpi = mBaseDisplayPhysicalYDpi * ratio;
if (!mIsDensityForced) { if (!mIsDensityForced) {
// Update the density proportionally so the size of the UI elements won't change // Update the density proportionally so the size of the UI elements won't change
// from the user's perspective. // 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); Slog.i(TAG_WM, "Using new display size: " + width + "x" + height);
updateBaseDisplayMetrics(width, height, mBaseDisplayDensity); updateBaseDisplayMetrics(width, height, mBaseDisplayDensity, mBaseDisplayPhysicalXDpi,
mBaseDisplayPhysicalYDpi);
reconfigureDisplayLocked(); reconfigureDisplayLocked();
if (!mIsSizeForced) { if (!mIsSizeForced) {

View File

@@ -277,7 +277,8 @@ class DisplayWindowSettings {
final int height = hasSizeOverride ? settings.mForcedHeight : dc.mInitialDisplayHeight; final int height = hasSizeOverride ? settings.mForcedHeight : dc.mInitialDisplayHeight;
final int density = hasDensityOverride ? settings.mForcedDensity final int density = hasDensityOverride ? settings.mForcedDensity
: dc.mInitialDisplayDensity; : dc.mInitialDisplayDensity;
dc.updateBaseDisplayMetrics(width, height, density); dc.updateBaseDisplayMetrics(width, height, density, dc.mBaseDisplayPhysicalXDpi,
dc.mBaseDisplayPhysicalYDpi);
final int forcedScalingMode = settings.mForcedScalingMode != null final int forcedScalingMode = settings.mForcedScalingMode != null
? settings.mForcedScalingMode : FORCE_SCALING_MODE_AUTO; ? settings.mForcedScalingMode : FORCE_SCALING_MODE_AUTO;

View File

@@ -5691,7 +5691,9 @@ public class WindowManagerService extends IWindowManager.Stub
|| displayContent.mBaseDisplayHeight != height) { || displayContent.mBaseDisplayHeight != height) {
ProtoLog.i(WM_ERROR, "FORCED DISPLAY SIZE: %dx%d", width, height); ProtoLog.i(WM_ERROR, "FORCED DISPLAY SIZE: %dx%d", width, height);
displayContent.updateBaseDisplayMetrics(width, height, displayContent.updateBaseDisplayMetrics(width, height,
displayContent.mBaseDisplayDensity); displayContent.mBaseDisplayDensity,
displayContent.mBaseDisplayPhysicalXDpi,
displayContent.mBaseDisplayPhysicalYDpi);
changed = true; changed = true;
} }
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {

View File

@@ -682,31 +682,43 @@ public class DisplayContentTests extends WindowTestsBase {
final int baseWidth = 1440; final int baseWidth = 1440;
final int baseHeight = 2560; final int baseHeight = 2560;
final int baseDensity = 300; 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 maxWidth = 300;
final int resultingHeight = (maxWidth * baseHeight) / baseWidth; final float ratioChange = maxWidth / (float) baseWidth;
final int resultingDensity = (baseDensity * maxWidth) / 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); displayContent.setMaxUiWidth(maxWidth);
verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity); verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity, resultingXDpi,
resultingYDpi);
// Assert setting values again does not change; // Assert setting values again does not change;
displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi,
verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity); baseYDpi);
verifySizes(displayContent, maxWidth, resultingHeight, resultingDensity, resultingXDpi,
resultingYDpi);
final int smallerWidth = 200; final int smallerWidth = 200;
final int smallerHeight = 400; final int smallerHeight = 400;
final int smallerDensity = 100; final int smallerDensity = 100;
// Specify smaller dimension, verify that it is honored // Specify smaller dimension, verify that it is honored
displayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity); displayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity,
verifySizes(displayContent, 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 // Verify that setting the max width to a greater value than the base width has no effect
displayContent.setMaxUiWidth(maxWidth); displayContent.setMaxUiWidth(maxWidth);
verifySizes(displayContent, smallerWidth, smallerHeight, smallerDensity); verifySizes(displayContent, smallerWidth, smallerHeight, smallerDensity, baseXDpi,
baseYDpi);
} }
@Test @Test
@@ -716,11 +728,14 @@ public class DisplayContentTests extends WindowTestsBase {
final int baseWidth = 1280; final int baseWidth = 1280;
final int baseHeight = 720; final int baseHeight = 720;
final int baseDensity = 320; final int baseDensity = 320;
final float baseXDpi = 60;
final float baseYDpi = 60;
displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayWidth = baseWidth;
displayContent.mInitialDisplayHeight = baseHeight; displayContent.mInitialDisplayHeight = baseHeight;
displayContent.mInitialDisplayDensity = baseDensity; displayContent.mInitialDisplayDensity = baseDensity;
displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi,
baseYDpi);
final int forcedWidth = 1920; final int forcedWidth = 1920;
final int forcedHeight = 1080; final int forcedHeight = 1080;
@@ -741,11 +756,14 @@ public class DisplayContentTests extends WindowTestsBase {
final int baseWidth = 1280; final int baseWidth = 1280;
final int baseHeight = 720; final int baseHeight = 720;
final int baseDensity = 320; final int baseDensity = 320;
final float baseXDpi = 60;
final float baseYDpi = 60;
displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayWidth = baseWidth;
displayContent.mInitialDisplayHeight = baseHeight; displayContent.mInitialDisplayHeight = baseHeight;
displayContent.mInitialDisplayDensity = baseDensity; displayContent.mInitialDisplayDensity = baseDensity;
displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi,
baseYDpi);
displayContent.setMaxUiWidth(baseWidth); displayContent.setMaxUiWidth(baseWidth);
@@ -767,11 +785,14 @@ public class DisplayContentTests extends WindowTestsBase {
final int baseWidth = 1280; final int baseWidth = 1280;
final int baseHeight = 720; final int baseHeight = 720;
final int baseDensity = 320; final int baseDensity = 320;
final float baseXDpi = 60;
final float baseYDpi = 60;
displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayWidth = baseWidth;
displayContent.mInitialDisplayHeight = baseHeight; displayContent.mInitialDisplayHeight = baseHeight;
displayContent.mInitialDisplayDensity = baseDensity; displayContent.mInitialDisplayDensity = baseDensity;
displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); displayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity, baseXDpi,
baseYDpi);
final int forcedDensity = 600; final int forcedDensity = 600;
@@ -2513,6 +2534,16 @@ public class DisplayContentTests extends WindowTestsBase {
assertEquals(expectedBaseDensity, displayContent.mBaseDisplayDensity); 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() { private void updateFocusedWindow() {
mWm.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, false /* updateInputWindows */); mWm.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, false /* updateInputWindows */);
} }