diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 483efd86c1909..d5f40e0eb259b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1567,8 +1567,7 @@ false - - - - - - - - - - - - - - \ No newline at end of file diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd index bea5e2c2de748..6b05d8f74a5e6 100644 --- a/services/core/xsd/display-device-config/display-device-config.xsd +++ b/services/core/xsd/display-device-config/display-device-config.xsd @@ -23,7 +23,6 @@ - @@ -343,4 +342,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt index e9a9269467641..fb7a920f7d826 100644 --- a/services/core/xsd/display-device-config/schema/current.txt +++ b/services/core/xsd/display-device-config/schema/current.txt @@ -5,8 +5,10 @@ package com.android.server.display.config { ctor public AutoBrightness(); method public final java.math.BigInteger getBrighteningLightDebounceMillis(); method public final java.math.BigInteger getDarkeningLightDebounceMillis(); + method public final com.android.server.display.config.DisplayBrightnessMapping getDisplayBrightnessMapping(); method public final void setBrighteningLightDebounceMillis(java.math.BigInteger); method public final void setDarkeningLightDebounceMillis(java.math.BigInteger); + method public final void setDisplayBrightnessMapping(com.android.server.display.config.DisplayBrightnessMapping); } public class BrightnessThresholds { @@ -43,6 +45,19 @@ package com.android.server.display.config { method public java.util.List getDensity(); } + public class DisplayBrightnessMapping { + ctor public DisplayBrightnessMapping(); + method public final java.util.List getDisplayBrightnessPoint(); + } + + public class DisplayBrightnessPoint { + ctor public DisplayBrightnessPoint(); + method public final java.math.BigInteger getLux(); + method public final java.math.BigDecimal getNits(); + method public final void setLux(java.math.BigInteger); + method public final void setNits(java.math.BigDecimal); + } + public class DisplayConfiguration { ctor public DisplayConfiguration(); method @NonNull public final com.android.server.display.config.Thresholds getAmbientBrightnessChangeThresholds(); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index 617321beadd2b..9c615d140e851 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -149,6 +149,12 @@ public class LocalDisplayAdapterTest { .thenReturn(mockArray); when(mMockedResources.obtainTypedArray(R.array.config_roundedCornerBottomRadiusArray)) .thenReturn(mockArray); + when(mMockedResources.obtainTypedArray( + com.android.internal.R.array.config_autoBrightnessDisplayValuesNits)) + .thenReturn(mockArray); + when(mMockedResources.getIntArray( + com.android.internal.R.array.config_autoBrightnessLevels)) + .thenReturn(new int[]{}); } @After diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java index 03ea6137074d0..66420ad4572e8 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java @@ -19,16 +19,19 @@ package com.android.server.display; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; +import android.content.res.TypedArray; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -52,22 +55,16 @@ public final class DisplayDeviceConfigTest { private Resources mResources; @Before - public void setUp() throws IOException { + public void setUp() { MockitoAnnotations.initMocks(this); when(mContext.getResources()).thenReturn(mResources); mockDeviceConfigs(); - try { - Path tempFile = Files.createTempFile("display_config", ".tmp"); - Files.write(tempFile, getContent().getBytes(StandardCharsets.UTF_8)); - mDisplayDeviceConfig = new DisplayDeviceConfig(mContext); - mDisplayDeviceConfig.initFromFile(tempFile.toFile()); - } catch (IOException e) { - throw new IOException("Failed to setup the display device config.", e); - } } @Test - public void testConfigValues() { + public void testConfigValuesFromDisplayConfig() throws IOException { + setupDisplayDeviceConfigFromDisplayConfigFile(); + assertEquals(mDisplayDeviceConfig.getAmbientHorizonLong(), 5000); assertEquals(mDisplayDeviceConfig.getAmbientHorizonShort(), 50); assertEquals(mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis(), 3000); @@ -88,10 +85,23 @@ public final class DisplayDeviceConfigTest { assertEquals(mDisplayDeviceConfig.getScreenDarkeningMinThreshold(), 0.002, 0.000001f); assertEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLightDebounce(), 2000); assertEquals(mDisplayDeviceConfig.getAutoBrightnessDarkeningLightDebounce(), 1000); - + assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(), new + float[]{0.0f, 50.0f, 80.0f}, 0.0f); + assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(), new + float[]{45.32f, 75.43f}, 0.0f); + // Todo(brup): Add asserts for BrightnessThrottlingData, DensityMapping, + // HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor. + } + + @Test + public void testConfigValuesFromConfigResource() { + setupDisplayDeviceConfigFromConfigResourceFile(); + assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(), new + float[]{2.0f, 200.0f, 600.0f}, 0.0f); + assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(), new + float[]{0.0f, 0.0f, 110.0f, 500.0f}, 0.0f); // Todo(brup): Add asserts for BrightnessThrottlingData, DensityMapping, // HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor. - // Also add test for the case where optional display configs are null } private String getContent() { @@ -114,6 +124,16 @@ public final class DisplayDeviceConfigTest { + "\n" + "2000\n" + "1000\n" + + "\n" + + "\n" + + "50\n" + + "45.32\n" + + "\n" + + "\n" + + "80\n" + + "75.43\n" + + "\n" + + "\n" + "\n" + "\n" + "0.62\n" @@ -185,4 +205,63 @@ public final class DisplayDeviceConfigTest { when(mResources.getFloat(com.android.internal.R.dimen .config_screenBrightnessSettingMaximumFloat)).thenReturn(1.0f); } + + private void setupDisplayDeviceConfigFromDisplayConfigFile() throws IOException { + Path tempFile = Files.createTempFile("display_config", ".tmp"); + Files.write(tempFile, getContent().getBytes(StandardCharsets.UTF_8)); + mDisplayDeviceConfig = new DisplayDeviceConfig(mContext); + mDisplayDeviceConfig.initFromFile(tempFile.toFile()); + } + + private void setupDisplayDeviceConfigFromConfigResourceFile() { + TypedArray screenBrightnessNits = createFloatTypedArray(new float[]{2.0f, 250.0f, 650.0f}); + when(mResources.obtainTypedArray( + com.android.internal.R.array.config_screenBrightnessNits)) + .thenReturn(screenBrightnessNits); + TypedArray screenBrightnessBacklight = createFloatTypedArray(new + float[]{0.0f, 120.0f, 255.0f}); + when(mResources.obtainTypedArray( + com.android.internal.R.array.config_screenBrightnessBacklight)) + .thenReturn(screenBrightnessBacklight); + when(mResources.getIntArray(com.android.internal.R.array + .config_screenBrightnessBacklight)).thenReturn(new int[]{0, 120, 255}); + + when(mResources.getIntArray(com.android.internal.R.array + .config_autoBrightnessLevels)).thenReturn(new int[]{30, 80}); + when(mResources.getIntArray(com.android.internal.R.array + .config_autoBrightnessDisplayValuesNits)).thenReturn(new int[]{25, 55}); + + TypedArray screenBrightnessLevelNits = createFloatTypedArray(new + float[]{2.0f, 200.0f, 600.0f}); + when(mResources.obtainTypedArray( + com.android.internal.R.array.config_autoBrightnessDisplayValuesNits)) + .thenReturn(screenBrightnessLevelNits); + int[] screenBrightnessLevelLux = new int[]{0, 110, 500}; + when(mResources.getIntArray( + com.android.internal.R.array.config_autoBrightnessLevels)) + .thenReturn(screenBrightnessLevelLux); + + mDisplayDeviceConfig = DisplayDeviceConfig.create(mContext, true); + + } + + private TypedArray createFloatTypedArray(float[] vals) { + TypedArray mockArray = mock(TypedArray.class); + when(mockArray.length()).thenAnswer(invocation -> { + return vals.length; + }); + when(mockArray.getFloat(anyInt(), anyFloat())).thenAnswer(invocation -> { + final float def = (float) invocation.getArguments()[1]; + if (vals == null) { + return def; + } + int idx = (int) invocation.getArguments()[0]; + if (idx >= 0 && idx < vals.length) { + return vals[idx]; + } else { + return def; + } + }); + return mockArray; + } }