diff options
| author | 2022-10-21 09:24:54 +0000 | |
|---|---|---|
| committer | 2022-12-12 16:22:51 +0000 | |
| commit | 241d3880fa9d86d0259ade58d86161430584b684 (patch) | |
| tree | d400875d1c00a98b47e0d2636629790e6f340dab | |
| parent | 8a871ae898f9b00da415d532182d7693078e2826 (diff) | |
Add support to read refresh rate thresholds and controls from the
DisplayDeviceConfig
Bug: 193892229
Test: atest DisplayDeviceConfigTest
Change-Id: I0295b0b8586d683ef3ad66f903de4874d4445f1c
8 files changed, 359 insertions, 26 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 9a585a194ed1..771722f41fcb 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4785,11 +4785,11 @@ <integer name="config_defaultPeakRefreshRate">0</integer> <!-- The display uses different gamma curves for different refresh rates. It's hard for panel - vendor to tune the curves to have exact same brightness for different refresh rate. So + vendors to tune the curves to have exact same brightness for different refresh rate. So flicker could be observed at switch time. The issue is worse at the gamma lower end. In addition, human eyes are more sensitive to the flicker at darker environment. To prevent flicker, we only support higher refresh rates if the display brightness is above - a threshold. And the darker environment could have higher threshold. + a threshold. For example, no higher refresh rate if display brightness <= disp0 && ambient brightness <= amb0 || display brightness <= disp1 && ambient brightness <= amb1 --> @@ -4811,13 +4811,12 @@ <integer name="config_defaultRefreshRateInZone">0</integer> <!-- The display uses different gamma curves for different refresh rates. It's hard for panel - vendor to tune the curves to have exact same brightness for different refresh rate. So + vendors to tune the curves to have exact same brightness for different refresh rate. So flicker could be observed at switch time. The issue can be observed on the screen with even full white content at the high brightness. To prevent flickering, we support fixed refresh rates if the display and ambient brightness are equal to or above the provided thresholds. You can define multiple threshold levels as higher brightness environments - may have lower display brightness requirements for the flickering is visible. And the - high brightness environment could have higher threshold. + may have lower display brightness requirements for the flickering is visible. For example, fixed refresh rate if display brightness >= disp0 && ambient brightness >= amb0 || display brightness >= disp1 && ambient brightness >= amb1 --> diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index c1e9526a9127..98a0af7f7c15 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -36,16 +36,19 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.server.display.config.AutoBrightness; +import com.android.server.display.config.BlockingZoneConfig; import com.android.server.display.config.BrightnessThresholds; import com.android.server.display.config.BrightnessThrottlingMap; import com.android.server.display.config.BrightnessThrottlingPoint; import com.android.server.display.config.Density; +import com.android.server.display.config.DisplayBrightnessPoint; import com.android.server.display.config.DisplayConfiguration; import com.android.server.display.config.DisplayQuirks; import com.android.server.display.config.HbmTiming; import com.android.server.display.config.HighBrightnessMode; import com.android.server.display.config.NitsMap; import com.android.server.display.config.Point; +import com.android.server.display.config.RefreshRateConfigs; import com.android.server.display.config.RefreshRateRange; import com.android.server.display.config.SdrHdrRatioMap; import com.android.server.display.config.SdrHdrRatioPoint; @@ -130,6 +133,35 @@ import javax.xml.datatype.DatatypeConfigurationException; * </brightnessThrottlingMap> * </thermalThrottling> * + * <refreshRate> + * <lowerBlockingZoneConfigs> + * <defaultRefreshRate>75</defaultRefreshRate> + * <blockingZoneThreshold> + * <displayBrightnessPoint> + * <lux>50</lux> + * <nits>45.3</nits> + * </displayBrightnessPoint> + * <displayBrightnessPoint> + * <lux>60</lux> + * <nits>55.2</nits> + * </displayBrightnessPoint> + * </blockingZoneThreshold> + * </lowerBlockingZoneConfigs> + * <higherBlockingZoneConfigs> + * <defaultRefreshRate>90</defaultRefreshRate> + * <blockingZoneThreshold> + * <displayBrightnessPoint> + * <lux>500</lux> + * <nits>245.3</nits> + * </displayBrightnessPoint> + * <displayBrightnessPoint> + * <lux>600</lux> + * <nits>232.3</nits> + * </displayBrightnessPoint> + * </blockingZoneThreshold> + * </higherBlockingZoneConfigs> + * </refreshRate> + * * <highBrightnessMode enabled="true"> * <transitionPoint>0.62</transitionPoint> * <minimumLux>10000</minimumLux> @@ -358,6 +390,9 @@ public class DisplayDeviceConfig { private static final String STABLE_ID_SUFFIX_FORMAT = "id_%d"; private static final String NO_SUFFIX_FORMAT = "%d"; private static final long STABLE_FLAG = 1L << 62; + private static final int DEFAULT_LOW_REFRESH_RATE = 60; + private static final int DEFAULT_HIGH_REFRESH_RATE = 0; + private static final int[] DEFAULT_BRIGHTNESS_THRESHOLDS = new int[]{}; private static final float[] DEFAULT_AMBIENT_THRESHOLD_LEVELS = new float[]{0f}; private static final float[] DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS = new float[]{100f}; @@ -512,6 +547,49 @@ public class DisplayDeviceConfig { // This stores the raw value loaded from the config file - true if not written. private boolean mDdcAutoBrightnessAvailable = true; + /** + * The default peak refresh rate for a given device. This value prevents the framework from + * using higher refresh rates, even if display modes with higher refresh rates are available + * from hardware composer. Only has an effect if the value is non-zero. + */ + private int mDefaultHighRefreshRate = DEFAULT_HIGH_REFRESH_RATE; + + /** + * The default refresh rate for a given device. This value sets the higher default + * refresh rate. If the hardware composer on the device supports display modes with + * a higher refresh rate than the default value specified here, the framework may use those + * higher refresh rate modes if an app chooses one by setting preferredDisplayModeId or calling + * setFrameRate(). We have historically allowed fallback to mDefaultHighRefreshRate if + * mDefaultLowRefreshRate is set to 0, but this is not supported anymore. + */ + private int mDefaultLowRefreshRate = DEFAULT_LOW_REFRESH_RATE; + + /** + * The display uses different gamma curves for different refresh rates. It's hard for panel + * vendors to tune the curves to have exact same brightness for different refresh rate. So + * brightness flickers could be observed at switch time. The issue is worse at the gamma lower + * end. In addition, human eyes are more sensitive to the flicker at darker environment. To + * prevent flicker, we only support higher refresh rates if the display brightness is above a + * threshold. For example, no higher refresh rate if display brightness <= disp0 && ambient + * brightness <= amb0 || display brightness <= disp1 && ambient brightness <= amb1 + */ + private int[] mLowDisplayBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; + private int[] mLowAmbientBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; + + /** + * The display uses different gamma curves for different refresh rates. It's hard for panel + * vendors to tune the curves to have exact same brightness for different refresh rate. So + * brightness flickers could be observed at switch time. The issue can be observed on the screen + * with even full white content at the high brightness. To prevent flickering, we support fixed + * refresh rates if the display and ambient brightness are equal to or above the provided + * thresholds. You can define multiple threshold levels as higher brightness environments may + * have lower display brightness requirements for the flickering is visible. For example, fixed + * refresh rate if display brightness >= disp0 && ambient brightness >= amb0 || display + * brightness >= disp1 && ambient brightness >= amb1 + */ + private int[] mHighDisplayBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; + private int[] mHighAmbientBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; + // Brightness Throttling data may be updated via the DeviceConfig. Here we store the original // data, which comes from the ddc, and the current one, which may be the DeviceConfig // overwritten value. @@ -1195,15 +1273,15 @@ public class DisplayDeviceConfig { /** * @return Default peak refresh rate of the associated display */ - public int getDefaultPeakRefreshRate() { - return mContext.getResources().getInteger(R.integer.config_defaultPeakRefreshRate); + public int getDefaultHighRefreshRate() { + return mDefaultHighRefreshRate; } /** * @return Default refresh rate of the associated display */ - public int getDefaultRefreshRate() { - return mContext.getResources().getInteger(R.integer.config_defaultRefreshRate); + public int getDefaultLowRefreshRate() { + return mDefaultLowRefreshRate; } /** @@ -1212,8 +1290,7 @@ public class DisplayDeviceConfig { * allowed */ public int[] getLowDisplayBrightnessThresholds() { - return mContext.getResources().getIntArray( - R.array.config_brightnessThresholdsOfPeakRefreshRate); + return mLowDisplayBrightnessThresholds; } /** @@ -1222,8 +1299,7 @@ public class DisplayDeviceConfig { * allowed */ public int[] getLowAmbientBrightnessThresholds() { - return mContext.getResources().getIntArray( - R.array.config_ambientThresholdsOfPeakRefreshRate); + return mLowAmbientBrightnessThresholds; } /** @@ -1232,8 +1308,7 @@ public class DisplayDeviceConfig { * allowed */ public int[] getHighDisplayBrightnessThresholds() { - return mContext.getResources().getIntArray( - R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate); + return mHighDisplayBrightnessThresholds; } /** @@ -1242,8 +1317,7 @@ public class DisplayDeviceConfig { * allowed */ public int[] getHighAmbientBrightnessThresholds() { - return mContext.getResources().getIntArray( - R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate); + return mHighAmbientBrightnessThresholds; } @Override @@ -1335,6 +1409,17 @@ public class DisplayDeviceConfig { + ", mBrightnessLevelsNits= " + Arrays.toString(mBrightnessLevelsNits) + ", mDdcAutoBrightnessAvailable= " + mDdcAutoBrightnessAvailable + ", mAutoBrightnessAvailable= " + mAutoBrightnessAvailable + + "\n" + + ", mDefaultRefreshRate= " + mDefaultLowRefreshRate + + ", mDefaultPeakRefreshRate= " + mDefaultHighRefreshRate + + ", mLowDisplayBrightnessThresholds= " + + Arrays.toString(mLowDisplayBrightnessThresholds) + + ", mLowAmbientBrightnessThresholds= " + + Arrays.toString(mLowAmbientBrightnessThresholds) + + ", mHighDisplayBrightnessThresholds= " + + Arrays.toString(mHighDisplayBrightnessThresholds) + + ", mHighAmbientBrightnessThresholds= " + + Arrays.toString(mHighAmbientBrightnessThresholds) + "}"; } @@ -1392,6 +1477,7 @@ public class DisplayDeviceConfig { loadAmbientHorizonFromDdc(config); loadBrightnessChangeThresholds(config); loadAutoBrightnessConfigValues(config); + loadRefreshRateSetting(config); } else { Slog.w(TAG, "DisplayDeviceConfig file is null"); } @@ -1414,6 +1500,7 @@ public class DisplayDeviceConfig { setProxSensorUnspecified(); loadAutoBrightnessConfigsFromConfigXml(); loadAutoBrightnessAvailableFromConfigXml(); + loadRefreshRateSetting(null); mLoadedFrom = "<config.xml>"; } @@ -1624,6 +1711,143 @@ public class DisplayDeviceConfig { } } + private void loadRefreshRateSetting(DisplayConfiguration config) { + final RefreshRateConfigs refreshRateConfigs = + (config == null) ? null : config.getRefreshRate(); + BlockingZoneConfig lowerBlockingZoneConfig = + (refreshRateConfigs == null) ? null + : refreshRateConfigs.getLowerBlockingZoneConfigs(); + BlockingZoneConfig higherBlockingZoneConfig = + (refreshRateConfigs == null) ? null + : refreshRateConfigs.getHigherBlockingZoneConfigs(); + loadLowerRefreshRateBlockingZones(lowerBlockingZoneConfig); + loadHigherRefreshRateBlockingZones(higherBlockingZoneConfig); + } + + + /** + * Loads the refresh rate configurations pertaining to the upper blocking zones. + */ + private void loadLowerRefreshRateBlockingZones(BlockingZoneConfig lowerBlockingZoneConfig) { + loadLowerBlockingZoneDefaultRefreshRate(lowerBlockingZoneConfig); + loadLowerBrightnessThresholds(lowerBlockingZoneConfig); + } + + /** + * Loads the refresh rate configurations pertaining to the upper blocking zones. + */ + private void loadHigherRefreshRateBlockingZones(BlockingZoneConfig upperBlockingZoneConfig) { + loadHigherBlockingZoneDefaultRefreshRate(upperBlockingZoneConfig); + loadHigherBrightnessThresholds(upperBlockingZoneConfig); + } + + /** + * Loads the default peak refresh rate. Internally, this takes care of loading + * the value from the display config, and if not present, falls back to config.xml. + */ + private void loadHigherBlockingZoneDefaultRefreshRate( + BlockingZoneConfig upperBlockingZoneConfig) { + if (upperBlockingZoneConfig == null) { + mDefaultHighRefreshRate = mContext.getResources().getInteger( + com.android.internal.R.integer.config_defaultPeakRefreshRate); + } else { + mDefaultHighRefreshRate = + upperBlockingZoneConfig.getDefaultRefreshRate().intValue(); + } + } + + /** + * Loads the default refresh rate. Internally, this takes care of loading + * the value from the display config, and if not present, falls back to config.xml. + */ + private void loadLowerBlockingZoneDefaultRefreshRate( + BlockingZoneConfig lowerBlockingZoneConfig) { + if (lowerBlockingZoneConfig == null) { + mDefaultLowRefreshRate = mContext.getResources().getInteger( + com.android.internal.R.integer.config_defaultRefreshRate); + } else { + mDefaultLowRefreshRate = + lowerBlockingZoneConfig.getDefaultRefreshRate().intValue(); + } + } + + /** + * Loads the lower brightness thresholds for refresh rate switching. Internally, this takes care + * of loading the value from the display config, and if not present, falls back to config.xml. + */ + private void loadLowerBrightnessThresholds(BlockingZoneConfig lowerBlockingZoneConfig) { + if (lowerBlockingZoneConfig == null) { + mLowDisplayBrightnessThresholds = mContext.getResources().getIntArray( + R.array.config_brightnessThresholdsOfPeakRefreshRate); + mLowAmbientBrightnessThresholds = mContext.getResources().getIntArray( + R.array.config_ambientThresholdsOfPeakRefreshRate); + if (mLowDisplayBrightnessThresholds == null || mLowAmbientBrightnessThresholds == null + || mLowDisplayBrightnessThresholds.length + != mLowAmbientBrightnessThresholds.length) { + throw new RuntimeException("display low brightness threshold array and ambient " + + "brightness threshold array have different length: " + + "mLowDisplayBrightnessThresholds=" + + Arrays.toString(mLowDisplayBrightnessThresholds) + + ", mLowAmbientBrightnessThresholds=" + + Arrays.toString(mLowAmbientBrightnessThresholds)); + } + } else { + List<DisplayBrightnessPoint> lowerThresholdDisplayBrightnessPoints = + lowerBlockingZoneConfig.getBlockingZoneThreshold().getDisplayBrightnessPoint(); + int size = lowerThresholdDisplayBrightnessPoints.size(); + mLowDisplayBrightnessThresholds = new int[size]; + mLowAmbientBrightnessThresholds = new int[size]; + for (int i = 0; i < size; i++) { + // We are explicitly casting this value to an integer to be able to reuse the + // existing DisplayBrightnessPoint type. It is fine to do this because the round off + // will have the negligible and unnoticeable impact on the loaded thresholds. + mLowDisplayBrightnessThresholds[i] = (int) lowerThresholdDisplayBrightnessPoints + .get(i).getNits().floatValue(); + mLowAmbientBrightnessThresholds[i] = lowerThresholdDisplayBrightnessPoints + .get(i).getLux().intValue(); + } + } + } + + /** + * Loads the higher brightness thresholds for refresh rate switching. Internally, this takes + * care of loading the value from the display config, and if not present, falls back to + * config.xml. + */ + private void loadHigherBrightnessThresholds(BlockingZoneConfig blockingZoneConfig) { + if (blockingZoneConfig == null) { + mHighDisplayBrightnessThresholds = mContext.getResources().getIntArray( + R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate); + mHighAmbientBrightnessThresholds = mContext.getResources().getIntArray( + R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate); + if (mHighAmbientBrightnessThresholds == null || mHighDisplayBrightnessThresholds == null + || mHighAmbientBrightnessThresholds.length + != mHighDisplayBrightnessThresholds.length) { + throw new RuntimeException("display high brightness threshold array and ambient " + + "brightness threshold array have different length: " + + "mHighDisplayBrightnessThresholds=" + + Arrays.toString(mHighDisplayBrightnessThresholds) + + ", mHighAmbientBrightnessThresholds=" + + Arrays.toString(mHighAmbientBrightnessThresholds)); + } + } else { + List<DisplayBrightnessPoint> higherThresholdDisplayBrightnessPoints = + blockingZoneConfig.getBlockingZoneThreshold().getDisplayBrightnessPoint(); + int size = higherThresholdDisplayBrightnessPoints.size(); + mHighDisplayBrightnessThresholds = new int[size]; + mHighAmbientBrightnessThresholds = new int[size]; + for (int i = 0; i < size; i++) { + // We are explicitly casting this value to an integer to be able to reuse the + // existing DisplayBrightnessPoint type. It is fine to do this because the round off + // will have the negligible and unnoticeable impact on the loaded thresholds. + mHighDisplayBrightnessThresholds[i] = (int) higherThresholdDisplayBrightnessPoints + .get(i).getNits().floatValue(); + mHighAmbientBrightnessThresholds[i] = higherThresholdDisplayBrightnessPoints + .get(i).getLux().intValue(); + } + } + } + private void loadAutoBrightnessConfigValues(DisplayConfiguration config) { final AutoBrightness autoBrightness = config.getAutoBrightness(); loadAutoBrightnessBrighteningLightDebounce(autoBrightness); diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 405a2b958dd1..5dba015b72be 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -1358,7 +1358,7 @@ public class DisplayModeDirector { mDefaultRefreshRate = (displayDeviceConfig == null) ? (float) mContext.getResources().getInteger( R.integer.config_defaultRefreshRate) - : (float) displayDeviceConfig.getDefaultRefreshRate(); + : (float) displayDeviceConfig.getDefaultLowRefreshRate(); } public void observe() { @@ -1445,7 +1445,7 @@ public class DisplayModeDirector { defaultPeakRefreshRate = (displayDeviceConfig == null) ? (float) mContext.getResources().getInteger( R.integer.config_defaultPeakRefreshRate) - : (float) displayDeviceConfig.getDefaultPeakRefreshRate(); + : (float) displayDeviceConfig.getDefaultHighRefreshRate(); } mDefaultPeakRefreshRate = defaultPeakRefreshRate; } 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 b9140513d85b..f96c929375c5 100644 --- a/services/core/xsd/display-device-config/display-device-config.xsd +++ b/services/core/xsd/display-device-config/display-device-config.xsd @@ -44,9 +44,11 @@ </xs:element> <xs:element type="highBrightnessMode" name="highBrightnessMode" minOccurs="0" maxOccurs="1"/> - <xs:element type="displayQuirks" name="quirks" minOccurs="0" maxOccurs="1" /> + <xs:element type="displayQuirks" name="quirks" minOccurs="0" maxOccurs="1"/> <xs:element type="autoBrightness" name="autoBrightness" minOccurs="0" - maxOccurs="1" /> + maxOccurs="1"/> + <xs:element type="refreshRateConfigs" name="refreshRate" minOccurs="0" + maxOccurs="1"/> <xs:element type="nonNegativeDecimal" name="screenBrightnessRampFastDecrease"> <xs:annotation name="final"/> </xs:element> @@ -324,7 +326,7 @@ <xs:annotation name="final"/> </xs:element> </xs:sequence> - </xs:complexType> + </xs:complexType> <!-- Thresholds for brightness changes. --> <xs:complexType name="thresholds"> @@ -452,4 +454,35 @@ </xs:element> </xs:sequence> </xs:complexType> + + <xs:complexType name="refreshRateConfigs"> + <xs:element name="lowerBlockingZoneConfigs" type="blockingZoneConfig" + minOccurs="0" maxOccurs="1"> + <xs:annotation name="final"/> + </xs:element> + <xs:element name="higherBlockingZoneConfigs" type="blockingZoneConfig" + minOccurs="0" maxOccurs="1"> + <xs:annotation name="final"/> + </xs:element> + </xs:complexType> + + <xs:complexType name="blockingZoneConfig"> + <xs:element name="defaultRefreshRate" type="xs:nonNegativeInteger" + minOccurs="1" maxOccurs="1"> + <xs:annotation name="final"/> + </xs:element> + <xs:element name="blockingZoneThreshold" type="blockingZoneThreshold" + minOccurs="1" maxOccurs="1"> + <xs:annotation name="final"/> + </xs:element> + </xs:complexType> + + <xs:complexType name="blockingZoneThreshold"> + <xs:sequence> + <xs:element name="displayBrightnessPoint" type="displayBrightnessPoint" + minOccurs="1" maxOccurs="unbounded"> + <xs:annotation name="final"/> + </xs:element> + </xs:sequence> + </xs:complexType> </xs:schema> diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt index d89bd7cc9aa2..6276edaf3ebc 100644 --- a/services/core/xsd/display-device-config/schema/current.txt +++ b/services/core/xsd/display-device-config/schema/current.txt @@ -13,6 +13,19 @@ package com.android.server.display.config { method public void setEnabled(boolean); } + public class BlockingZoneConfig { + ctor public BlockingZoneConfig(); + method public final com.android.server.display.config.BlockingZoneThreshold getBlockingZoneThreshold(); + method public final java.math.BigInteger getDefaultRefreshRate(); + method public final void setBlockingZoneThreshold(com.android.server.display.config.BlockingZoneThreshold); + method public final void setDefaultRefreshRate(java.math.BigInteger); + } + + public class BlockingZoneThreshold { + ctor public BlockingZoneThreshold(); + method public final java.util.List<com.android.server.display.config.DisplayBrightnessPoint> getDisplayBrightnessPoint(); + } + public class BrightnessThresholds { ctor public BrightnessThresholds(); method public final com.android.server.display.config.ThresholdPoints getBrightnessThresholdPoints(); @@ -76,6 +89,7 @@ package com.android.server.display.config { method public final com.android.server.display.config.SensorDetails getLightSensor(); method public final com.android.server.display.config.SensorDetails getProxSensor(); method public com.android.server.display.config.DisplayQuirks getQuirks(); + method public com.android.server.display.config.RefreshRateConfigs getRefreshRate(); method @NonNull public final java.math.BigDecimal getScreenBrightnessDefault(); method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap(); method public final java.math.BigInteger getScreenBrightnessRampDecreaseMaxMillis(); @@ -97,6 +111,7 @@ package com.android.server.display.config { method public final void setLightSensor(com.android.server.display.config.SensorDetails); method public final void setProxSensor(com.android.server.display.config.SensorDetails); method public void setQuirks(com.android.server.display.config.DisplayQuirks); + method public void setRefreshRate(com.android.server.display.config.RefreshRateConfigs); method public final void setScreenBrightnessDefault(@NonNull java.math.BigDecimal); method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap); method public final void setScreenBrightnessRampDecreaseMaxMillis(java.math.BigInteger); @@ -160,6 +175,14 @@ package com.android.server.display.config { method public final void setValue(@NonNull java.math.BigDecimal); } + public class RefreshRateConfigs { + ctor public RefreshRateConfigs(); + method public final com.android.server.display.config.BlockingZoneConfig getHigherBlockingZoneConfigs(); + method public final com.android.server.display.config.BlockingZoneConfig getLowerBlockingZoneConfigs(); + method public final void setHigherBlockingZoneConfigs(com.android.server.display.config.BlockingZoneConfig); + method public final void setLowerBlockingZoneConfigs(com.android.server.display.config.BlockingZoneConfig); + } + public class RefreshRateRange { ctor public RefreshRateRange(); method public final java.math.BigInteger getMaximum(); 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 395e6ac1017d..6b7c4d4c363d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -165,6 +165,18 @@ public class LocalDisplayAdapterTest { .thenReturn(mockArray); when(mMockedResources.obtainTypedArray(R.array.config_builtInDisplayIsRoundArray)) .thenReturn(mockArray); + when(mMockedResources.getIntArray( + com.android.internal.R.array.config_brightnessThresholdsOfPeakRefreshRate)) + .thenReturn(new int[]{}); + when(mMockedResources.getIntArray( + com.android.internal.R.array.config_ambientThresholdsOfPeakRefreshRate)) + .thenReturn(new int[]{}); + when(mMockedResources.getIntArray( + com.android.internal.R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate)) + .thenReturn(new int[]{}); + when(mMockedResources.getIntArray( + com.android.internal.R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate)) + .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 fdb78b83e493..c1eafd9e35a6 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java @@ -145,6 +145,16 @@ public final class DisplayDeviceConfigTest { assertArrayEquals(new float[]{23, 24, 25}, mDisplayDeviceConfig.getAmbientDarkeningPercentagesIdle(), ZERO_DELTA); + assertEquals(75, mDisplayDeviceConfig.getDefaultLowRefreshRate()); + assertEquals(90, mDisplayDeviceConfig.getDefaultHighRefreshRate()); + assertArrayEquals(new int[]{45, 55}, + mDisplayDeviceConfig.getLowDisplayBrightnessThresholds()); + assertArrayEquals(new int[]{50, 60}, + mDisplayDeviceConfig.getLowAmbientBrightnessThresholds()); + assertArrayEquals(new int[]{65, 75}, + mDisplayDeviceConfig.getHighDisplayBrightnessThresholds()); + assertArrayEquals(new int[]{70, 80}, + mDisplayDeviceConfig.getHighAmbientBrightnessThresholds()); // Todo(brup): Add asserts for BrightnessThrottlingData, DensityMapping, // HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor. @@ -207,8 +217,8 @@ public final class DisplayDeviceConfigTest { mDisplayDeviceConfig.getAmbientDarkeningLevelsIdle(), ZERO_DELTA); assertArrayEquals(new float[]{29, 30, 31}, mDisplayDeviceConfig.getAmbientDarkeningPercentagesIdle(), ZERO_DELTA); - assertEquals(mDisplayDeviceConfig.getDefaultRefreshRate(), DEFAULT_REFRESH_RATE); - assertEquals(mDisplayDeviceConfig.getDefaultPeakRefreshRate(), DEFAULT_PEAK_REFRESH_RATE); + assertEquals(mDisplayDeviceConfig.getDefaultLowRefreshRate(), DEFAULT_REFRESH_RATE); + assertEquals(mDisplayDeviceConfig.getDefaultHighRefreshRate(), DEFAULT_PEAK_REFRESH_RATE); assertArrayEquals(mDisplayDeviceConfig.getLowDisplayBrightnessThresholds(), LOW_BRIGHTNESS_THRESHOLD_OF_PEAK_REFRESH_RATE); assertArrayEquals(mDisplayDeviceConfig.getLowAmbientBrightnessThresholds(), @@ -416,6 +426,38 @@ public final class DisplayDeviceConfigTest { + "</brightnessThrottlingPoint>\n" + "</brightnessThrottlingMap>\n" + "</thermalThrottling>\n" + + "<refreshRate>\n" + + "<lowerBlockingZoneConfigs>\n" + + "<defaultRefreshRate>75</defaultRefreshRate>\n" + + "<blockingZoneThreshold>\n" + + "<displayBrightnessPoint>\n" + + "<lux>50</lux>\n" + // This number will be rounded to integer when read by the system + + "<nits>45.3</nits>\n" + + "</displayBrightnessPoint>\n" + + "<displayBrightnessPoint>\n" + + "<lux>60</lux>\n" + // This number will be rounded to integer when read by the system + + "<nits>55.2</nits>\n" + + "</displayBrightnessPoint>\n" + + "</blockingZoneThreshold>\n" + + "</lowerBlockingZoneConfigs>\n" + + "<higherBlockingZoneConfigs>\n" + + "<defaultRefreshRate>90</defaultRefreshRate>\n" + + "<blockingZoneThreshold>\n" + + "<displayBrightnessPoint>\n" + + "<lux>70</lux>\n" + // This number will be rounded to integer when read by the system + + "<nits>65.6</nits>\n" + + "</displayBrightnessPoint>\n" + + "<displayBrightnessPoint>\n" + + "<lux>80</lux>\n" + // This number will be rounded to integer when read by the system + + "<nits>75</nits>\n" + + "</displayBrightnessPoint>\n" + + "</blockingZoneThreshold>\n" + + "</higherBlockingZoneConfigs>\n" + + "</refreshRate>\n" + "</displayConfiguration>\n"; } diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index 865bc987cb2c..bd4058a86b56 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -2250,8 +2250,8 @@ public class DisplayModeDirectorTest { // Notify that the default display is updated, such that DisplayDeviceConfig has new values DisplayDeviceConfig displayDeviceConfig = mock(DisplayDeviceConfig.class); - when(displayDeviceConfig.getDefaultRefreshRate()).thenReturn(50); - when(displayDeviceConfig.getDefaultPeakRefreshRate()).thenReturn(55); + when(displayDeviceConfig.getDefaultLowRefreshRate()).thenReturn(50); + when(displayDeviceConfig.getDefaultHighRefreshRate()).thenReturn(55); when(displayDeviceConfig.getLowDisplayBrightnessThresholds()).thenReturn(new int[]{25}); when(displayDeviceConfig.getLowAmbientBrightnessThresholds()).thenReturn(new int[]{30}); when(displayDeviceConfig.getHighDisplayBrightnessThresholds()).thenReturn(new int[]{210}); |