Merge "Add support to make the refresh rate used when the device has HDR enabled configurable for each display." into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
6fc081bd60
@@ -1321,6 +1321,23 @@ public class DisplayDeviceConfig {
|
||||
return mDefaultRefreshRate;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
*/
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user