summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/display/DisplayDeviceConfig.java17
-rw-r--r--services/core/java/com/android/server/display/DisplayModeDirector.java96
-rw-r--r--services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java29
4 files changed, 122 insertions, 32 deletions
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 2b7fbfb71901..0ee25e2e03e7 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -1322,6 +1322,23 @@ public class DisplayDeviceConfig {
}
/**
+ * @return Default refresh rate while the device has high brightness mode enabled for HDR.
+ */
+ public int getDefaultRefreshRateInHbmHdr() {
+ return mContext.getResources().getInteger(
+ R.integer.config_defaultRefreshRateInHbmHdr);
+ }
+
+ /**
+ * @return Default refresh rate while the device has high brightness mode enabled because of
+ * high lux.
+ */
+ public int getDefaultRefreshRateInHbmSunlight() {
+ return mContext.getResources().getInteger(
+ R.integer.config_defaultRefreshRateInHbmSunlight);
+ }
+
+ /**
* @return Default refresh rate in the higher blocking zone of the associated display
*/
public int getDefaultHighBlockingZoneRefreshRate() {
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
index 7c6b667f585f..1bbdc20c81e5 100644
--- a/services/core/java/com/android/server/display/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/DisplayModeDirector.java
@@ -121,6 +121,10 @@ public class DisplayModeDirector {
private final DeviceConfigInterface mDeviceConfig;
private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings;
+ @GuardedBy("mLock")
+ @Nullable
+ private DisplayDeviceConfig mDefaultDisplayDeviceConfig;
+
// A map from the display ID to the collection of votes and their priority. The latter takes
// the form of another map from the priority to the vote itself so that each priority is
// guaranteed to have exactly one vote, which is also easily and efficiently replaceable.
@@ -160,6 +164,7 @@ public class DisplayModeDirector {
mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings();
mSettingsObserver = new SettingsObserver(context, handler);
mBrightnessObserver = new BrightnessObserver(context, handler, injector);
+ mDefaultDisplayDeviceConfig = null;
mUdfpsObserver = new UdfpsObserver();
final BallotBox ballotBox = (displayId, priority, vote) -> {
synchronized (mLock) {
@@ -529,11 +534,15 @@ public class DisplayModeDirector {
* @param displayDeviceConfig configurations relating to the underlying display device.
*/
public void defaultDisplayDeviceUpdated(DisplayDeviceConfig displayDeviceConfig) {
- mSettingsObserver.setRefreshRates(displayDeviceConfig,
- /* attemptLoadingFromDeviceConfig= */ true);
- mBrightnessObserver.updateBlockingZoneThresholds(displayDeviceConfig,
- /* attemptLoadingFromDeviceConfig= */ true);
- mBrightnessObserver.reloadLightSensor(displayDeviceConfig);
+ synchronized (mLock) {
+ mDefaultDisplayDeviceConfig = displayDeviceConfig;
+ mSettingsObserver.setRefreshRates(displayDeviceConfig,
+ /* attemptLoadingFromDeviceConfig= */ true);
+ mBrightnessObserver.updateBlockingZoneThresholds(displayDeviceConfig,
+ /* attemptLoadingFromDeviceConfig= */ true);
+ mBrightnessObserver.reloadLightSensor(displayDeviceConfig);
+ mHbmObserver.setupHdrRefreshRates(displayDeviceConfig);
+ }
}
/**
@@ -2534,7 +2543,7 @@ public class DisplayModeDirector {
* HBM that are associated with that display. Restrictions are retrieved from
* DisplayManagerInternal but originate in the display-device-config file.
*/
- public static class HbmObserver implements DisplayManager.DisplayListener {
+ public class HbmObserver implements DisplayManager.DisplayListener {
private final BallotBox mBallotBox;
private final Handler mHandler;
private final SparseIntArray mHbmMode = new SparseIntArray();
@@ -2554,10 +2563,24 @@ public class DisplayModeDirector {
mDeviceConfigDisplaySettings = displaySettings;
}
- public void observe() {
- mRefreshRateInHbmSunlight = mDeviceConfigDisplaySettings.getRefreshRateInHbmSunlight();
- mRefreshRateInHbmHdr = mDeviceConfigDisplaySettings.getRefreshRateInHbmHdr();
+ /**
+ * Sets up the refresh rate to be used when HDR is enabled
+ */
+ public void setupHdrRefreshRates(DisplayDeviceConfig displayDeviceConfig) {
+ mRefreshRateInHbmHdr = mDeviceConfigDisplaySettings
+ .getRefreshRateInHbmHdr(displayDeviceConfig);
+ mRefreshRateInHbmSunlight = mDeviceConfigDisplaySettings
+ .getRefreshRateInHbmSunlight(displayDeviceConfig);
+ }
+ /**
+ * Sets up the HDR refresh rates, and starts observing for the changes in the display that
+ * might impact it
+ */
+ public void observe() {
+ synchronized (mLock) {
+ setupHdrRefreshRates(mDefaultDisplayDeviceConfig);
+ }
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
mInjector.registerDisplayListener(this, mHandler,
DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS
@@ -2789,26 +2812,33 @@ public class DisplayModeDirector {
-1);
}
- public int getRefreshRateInHbmSunlight() {
- final int defaultRefreshRateInHbmSunlight =
- mContext.getResources().getInteger(
- R.integer.config_defaultRefreshRateInHbmSunlight);
-
- final int refreshRate = mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
- DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_SUNLIGHT,
- defaultRefreshRateInHbmSunlight);
-
+ public int getRefreshRateInHbmHdr(DisplayDeviceConfig displayDeviceConfig) {
+ int refreshRate =
+ (displayDeviceConfig == null) ? mContext.getResources().getInteger(
+ R.integer.config_defaultRefreshRateInHbmHdr)
+ : displayDeviceConfig.getDefaultRefreshRateInHbmHdr();
+ try {
+ refreshRate = mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_HDR,
+ refreshRate);
+ } catch (NullPointerException e) {
+ // Do Nothing
+ }
return refreshRate;
}
- public int getRefreshRateInHbmHdr() {
- final int defaultRefreshRateInHbmHdr =
- mContext.getResources().getInteger(R.integer.config_defaultRefreshRateInHbmHdr);
-
- final int refreshRate = mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
- DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_HDR,
- defaultRefreshRateInHbmHdr);
-
+ public int getRefreshRateInHbmSunlight(DisplayDeviceConfig displayDeviceConfig) {
+ int refreshRate =
+ (displayDeviceConfig == null) ? mContext.getResources()
+ .getInteger(R.integer.config_defaultRefreshRateInHbmSunlight)
+ : displayDeviceConfig.getDefaultRefreshRateInHbmSunlight();
+ try {
+ refreshRate = mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_SUNLIGHT,
+ refreshRate);
+ } catch (NullPointerException e) {
+ // Do Nothing
+ }
return refreshRate;
}
@@ -2858,14 +2888,18 @@ public class DisplayModeDirector {
0).sendToTarget();
}
- final int refreshRateInHbmSunlight = getRefreshRateInHbmSunlight();
- mHandler.obtainMessage(MSG_REFRESH_RATE_IN_HBM_SUNLIGHT_CHANGED,
- refreshRateInHbmSunlight, 0)
+ synchronized (mLock) {
+ final int refreshRateInHbmSunlight =
+ getRefreshRateInHbmSunlight(mDefaultDisplayDeviceConfig);
+ mHandler.obtainMessage(MSG_REFRESH_RATE_IN_HBM_SUNLIGHT_CHANGED,
+ refreshRateInHbmSunlight, 0)
.sendToTarget();
- final int refreshRateInHbmHdr = getRefreshRateInHbmHdr();
- mHandler.obtainMessage(MSG_REFRESH_RATE_IN_HBM_HDR_CHANGED, refreshRateInHbmHdr, 0)
+ final int refreshRateInHbmHdr =
+ getRefreshRateInHbmHdr(mDefaultDisplayDeviceConfig);
+ mHandler.obtainMessage(MSG_REFRESH_RATE_IN_HBM_HDR_CHANGED, refreshRateInHbmHdr, 0)
.sendToTarget();
+ }
}
private int[] getIntArrayProperty(String prop) {
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 77e5d1d60cb5..d1fbc1e50e83 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java
@@ -53,6 +53,8 @@ public final class DisplayDeviceConfigTest {
private static final int DEFAULT_REFRESH_RATE = 120;
private static final int DEFAULT_HIGH_BLOCKING_ZONE_REFRESH_RATE = 55;
private static final int DEFAULT_LOW_BLOCKING_ZONE_REFRESH_RATE = 95;
+ private static final int DEFAULT_REFRESH_RATE_IN_HBM_HDR = 90;
+ private static final int DEFAULT_REFRESH_RATE_IN_HBM_SUNLIGHT = 100;
private static final int[] LOW_BRIGHTNESS_THRESHOLD_OF_PEAK_REFRESH_RATE = new int[]{10, 30};
private static final int[] LOW_AMBIENT_THRESHOLD_OF_PEAK_REFRESH_RATE = new int[]{1, 21};
private static final int[] HIGH_BRIGHTNESS_THRESHOLD_OF_PEAK_REFRESH_RATE = new int[]{160};
@@ -240,6 +242,10 @@ public final class DisplayDeviceConfigTest {
DEFAULT_HIGH_BLOCKING_ZONE_REFRESH_RATE);
assertEquals(mDisplayDeviceConfig.getDefaultPeakRefreshRate(), DEFAULT_PEAK_REFRESH_RATE);
assertEquals(mDisplayDeviceConfig.getDefaultRefreshRate(), DEFAULT_REFRESH_RATE);
+ assertEquals(mDisplayDeviceConfig.getDefaultRefreshRateInHbmSunlight(),
+ DEFAULT_REFRESH_RATE_IN_HBM_SUNLIGHT);
+ assertEquals(mDisplayDeviceConfig.getDefaultRefreshRateInHbmHdr(),
+ DEFAULT_REFRESH_RATE_IN_HBM_HDR);
assertArrayEquals(mDisplayDeviceConfig.getLowDisplayBrightnessThresholds(),
LOW_BRIGHTNESS_THRESHOLD_OF_PEAK_REFRESH_RATE);
assertArrayEquals(mDisplayDeviceConfig.getLowAmbientBrightnessThresholds(),
@@ -578,6 +584,12 @@ public final class DisplayDeviceConfigTest {
when(mResources.getIntArray(
R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate))
.thenReturn(HIGH_AMBIENT_THRESHOLD_OF_PEAK_REFRESH_RATE);
+ when(mResources.getInteger(
+ R.integer.config_defaultRefreshRateInHbmHdr))
+ .thenReturn(DEFAULT_REFRESH_RATE_IN_HBM_HDR);
+ when(mResources.getInteger(
+ R.integer.config_defaultRefreshRateInHbmSunlight))
+ .thenReturn(DEFAULT_REFRESH_RATE_IN_HBM_SUNLIGHT);
mDisplayDeviceConfig = DisplayDeviceConfig.create(mContext, true);
}
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 2cc6bd557aea..ff37564f46a4 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
@@ -1873,6 +1873,10 @@ public class DisplayModeDirectorTest {
.thenReturn(65);
when(resources.getInteger(R.integer.config_defaultRefreshRateInZone))
.thenReturn(85);
+ when(resources.getInteger(R.integer.config_defaultRefreshRateInHbmHdr))
+ .thenReturn(95);
+ when(resources.getInteger(R.integer.config_defaultRefreshRateInHbmSunlight))
+ .thenReturn(100);
when(resources.getIntArray(R.array.config_brightnessThresholdsOfPeakRefreshRate))
.thenReturn(new int[]{5});
when(resources.getIntArray(R.array.config_ambientThresholdsOfPeakRefreshRate))
@@ -1883,8 +1887,21 @@ public class DisplayModeDirectorTest {
when(
resources.getIntArray(R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate))
.thenReturn(new int[]{7000});
+ when(resources.getInteger(
+ com.android.internal.R.integer.config_displayWhiteBalanceBrightnessFilterHorizon))
+ .thenReturn(3);
+ ArgumentCaptor<TypedValue> valueArgumentCaptor = ArgumentCaptor.forClass(TypedValue.class);
+ doAnswer((Answer<Void>) invocation -> {
+ valueArgumentCaptor.getValue().type = 4;
+ valueArgumentCaptor.getValue().data = 13;
+ return null;
+ }).when(resources).getValue(eq(com.android.internal.R.dimen
+ .config_displayWhiteBalanceBrightnessFilterIntercept),
+ valueArgumentCaptor.capture(), eq(true));
DisplayModeDirector director =
createDirectorFromRefreshRateArray(new float[]{60.0f, 90.0f}, 0);
+ SensorManager sensorManager = createMockSensorManager(createLightSensor());
+ director.start(sensorManager);
// We don't expect any interaction with DeviceConfig when the director is initialized
// because we explicitly avoid doing this as this can lead to a latency spike in the
// startup of DisplayManagerService
@@ -1894,6 +1911,8 @@ public class DisplayModeDirectorTest {
0.0);
assertEquals(director.getBrightnessObserver().getRefreshRateInHighZone(), 65);
assertEquals(director.getBrightnessObserver().getRefreshRateInLowZone(), 85);
+ assertEquals(director.getHbmObserver().getRefreshRateInHbmHdr(), 95);
+ assertEquals(director.getHbmObserver().getRefreshRateInHbmSunlight(), 100);
assertArrayEquals(director.getBrightnessObserver().getHighDisplayBrightnessThreshold(),
new int[]{250});
assertArrayEquals(director.getBrightnessObserver().getHighAmbientBrightnessThreshold(),
@@ -1903,6 +1922,7 @@ public class DisplayModeDirectorTest {
assertArrayEquals(director.getBrightnessObserver().getLowAmbientBrightnessThreshold(),
new int[]{10});
+
// Notify that the default display is updated, such that DisplayDeviceConfig has new values
DisplayDeviceConfig displayDeviceConfig = mock(DisplayDeviceConfig.class);
when(displayDeviceConfig.getDefaultLowBlockingZoneRefreshRate()).thenReturn(50);
@@ -1913,6 +1933,8 @@ public class DisplayModeDirectorTest {
when(displayDeviceConfig.getLowAmbientBrightnessThresholds()).thenReturn(new int[]{30});
when(displayDeviceConfig.getHighDisplayBrightnessThresholds()).thenReturn(new int[]{210});
when(displayDeviceConfig.getHighAmbientBrightnessThresholds()).thenReturn(new int[]{2100});
+ when(displayDeviceConfig.getDefaultRefreshRateInHbmHdr()).thenReturn(65);
+ when(displayDeviceConfig.getDefaultRefreshRateInHbmSunlight()).thenReturn(75);
director.defaultDisplayDeviceUpdated(displayDeviceConfig);
assertEquals(director.getSettingsObserver().getDefaultRefreshRate(), 60, 0.0);
@@ -1928,6 +1950,8 @@ public class DisplayModeDirectorTest {
new int[]{25});
assertArrayEquals(director.getBrightnessObserver().getLowAmbientBrightnessThreshold(),
new int[]{30});
+ assertEquals(director.getHbmObserver().getRefreshRateInHbmHdr(), 65);
+ assertEquals(director.getHbmObserver().getRefreshRateInHbmSunlight(), 75);
// Notify that the default display is updated, such that DeviceConfig has new values
FakeDeviceConfig config = mInjector.getDeviceConfig();
@@ -1938,7 +1962,8 @@ public class DisplayModeDirectorTest {
config.setLowDisplayBrightnessThresholds(new int[]{10});
config.setHighDisplayBrightnessThresholds(new int[]{255});
config.setHighAmbientBrightnessThresholds(new int[]{8000});
-
+ config.setRefreshRateInHbmHdr(70);
+ config.setRefreshRateInHbmSunlight(80);
director.defaultDisplayDeviceUpdated(displayDeviceConfig);
assertEquals(director.getSettingsObserver().getDefaultRefreshRate(), 60, 0.0);
@@ -1954,6 +1979,8 @@ public class DisplayModeDirectorTest {
new int[]{10});
assertArrayEquals(director.getBrightnessObserver().getLowAmbientBrightnessThreshold(),
new int[]{20});
+ assertEquals(director.getHbmObserver().getRefreshRateInHbmHdr(), 70);
+ assertEquals(director.getHbmObserver().getRefreshRateInHbmSunlight(), 80);
}
@Test