summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ebru Kurnaz <ebrukurnaz@google.com> 2025-01-15 08:52:53 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-15 08:52:53 -0800
commit71f33d38a0067fe7c87f007ba3631ec8bada29f4 (patch)
tree39b81037e4b9c0e333556fd71436bf876edb9dd9
parent8b0adc5f948a2f1f4e71b082780e813b7113d880 (diff)
parent5b20bbe462640c7f421dbdb53be28494588a9eb6 (diff)
Merge "Update getLogicalDensity to return physical pixel density for external displays." into main
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java17
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java22
2 files changed, 38 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index d37dd3018fde..b49c01b3e2a8 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -83,6 +83,8 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular";
+ private static final double DEFAULT_DISPLAY_SIZE = 24.0;
+
private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>();
private final Injector mInjector;
@@ -526,6 +528,21 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private int getLogicalDensity() {
DensityMapping densityMapping = getDisplayDeviceConfig().getDensityMapping();
if (densityMapping == null) {
+ if (getFeatureFlags().isBaseDensityForExternalDisplaysEnabled()
+ && !mStaticDisplayInfo.isInternal) {
+ double dpi;
+
+ if (mActiveSfDisplayMode.xDpi > 0 && mActiveSfDisplayMode.yDpi > 0) {
+ dpi = Math.sqrt((Math.pow(mActiveSfDisplayMode.xDpi, 2)
+ + Math.pow(mActiveSfDisplayMode.yDpi, 2)) / 2);
+ } else {
+ // xDPI and yDPI is missing, calculate DPI from display resolution and
+ // default display size
+ dpi = Math.sqrt(Math.pow(mInfo.width, 2) + Math.pow(mInfo.height, 2))
+ / DEFAULT_DISPLAY_SIZE;
+ }
+ return (int) (dpi + 0.5);
+ }
return (int) (mStaticDisplayInfo.density * 160 + 0.5);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
index f5bed999d5a0..5393e20889c0 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
@@ -455,8 +455,9 @@ public class LocalDisplayAdapterTest {
* Confirm that external display uses physical density.
*/
@Test
- public void testDpiValues() throws Exception {
+ public void testDpiValues_baseDensityForExternalDisplaysDisabled() throws Exception {
// needs default one always
+ doReturn(false).when(mFlags).isBaseDensityForExternalDisplaysEnabled();
setUpDisplay(new FakeDisplay(PORT_A));
setUpDisplay(new FakeDisplay(PORT_B));
updateAvailableDisplays();
@@ -472,6 +473,25 @@ public class LocalDisplayAdapterTest {
16000);
}
+ @Test
+ public void testDpiValues_baseDensityForExternalDisplaysEnabled() throws Exception {
+ // needs default one always
+ doReturn(true).when(mFlags).isBaseDensityForExternalDisplaysEnabled();
+ setUpDisplay(new FakeDisplay(PORT_A));
+ setUpDisplay(new FakeDisplay(PORT_B));
+ updateAvailableDisplays();
+ mAdapter.registerLocked();
+
+ waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+
+ assertDisplayDpi(
+ mListener.addedDisplays.get(0).getDisplayDeviceInfoLocked(), PORT_A, 100, 100,
+ 100);
+ assertDisplayDpi(
+ mListener.addedDisplays.get(1).getDisplayDeviceInfoLocked(), PORT_B, 100, 100,
+ 100);
+ }
+
private static class DisplayModeWrapper {
public SurfaceControl.DisplayMode mode;
public float[] expectedAlternativeRefreshRates;