Merge "Tests for HighBrightnessModeController's HDR mode" into sc-dev am: e3e3a319e6
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15235803 Change-Id: If7fb94bfe6266c2a59a49316a0fe05f6b7805bc9
This commit is contained in:
@@ -72,7 +72,7 @@ class HighBrightnessModeController {
|
||||
private final Injector mInjector;
|
||||
private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged;
|
||||
|
||||
private SurfaceControlHdrLayerInfoListener mHdrListener;
|
||||
private HdrListener mHdrListener;
|
||||
private HighBrightnessModeData mHbmData;
|
||||
private IBinder mRegisteredDisplayToken;
|
||||
|
||||
@@ -251,6 +251,11 @@ class HighBrightnessModeController {
|
||||
mHandler.runWithScissors(() -> dumpLocal(pw), 1000);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
HdrListener getHdrListener() {
|
||||
return mHdrListener;
|
||||
}
|
||||
|
||||
private void dumpLocal(PrintWriter pw) {
|
||||
pw.println("HighBrightnessModeController:");
|
||||
pw.println(" mBrightness=" + mBrightness);
|
||||
@@ -487,7 +492,8 @@ class HighBrightnessModeController {
|
||||
}
|
||||
}
|
||||
|
||||
private class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
||||
@VisibleForTesting
|
||||
class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
||||
@Override
|
||||
public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
|
||||
int maxW, int maxH, int flags) {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.server.display;
|
||||
|
||||
import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR;
|
||||
import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
|
||||
import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT;
|
||||
|
||||
@@ -38,6 +39,7 @@ import android.os.Temperature.ThrottlingStatus;
|
||||
import android.os.test.TestLooper;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.test.mock.MockContentResolver;
|
||||
import android.util.MathUtils;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.filters.SmallTest;
|
||||
@@ -90,11 +92,10 @@ public class HighBrightnessModeControllerTest {
|
||||
|
||||
@Mock IThermalService mThermalServiceMock;
|
||||
@Mock Injector mInjectorMock;
|
||||
@Mock BrightnessSetting mBrightnessSetting;
|
||||
|
||||
@Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor;
|
||||
|
||||
@Mock private BrightnessSetting mBrightnessSetting;
|
||||
|
||||
private static final HighBrightnessModeData DEFAULT_HBM_DATA =
|
||||
new HighBrightnessModeData(MINIMUM_LUX, TRANSITION_POINT, TIME_WINDOW_MILLIS,
|
||||
TIME_ALLOWED_IN_WINDOW_MILLIS, TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS,
|
||||
@@ -348,6 +349,105 @@ public class HighBrightnessModeControllerTest {
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_SUNLIGHT, hbmc.getHighBrightnessMode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHdrRequires50PercentOfScreen() {
|
||||
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
||||
|
||||
final int layerWidth = DISPLAY_WIDTH;
|
||||
final int smallLayerHeight = DISPLAY_HEIGHT / 2 - 1; // height to use for <50%
|
||||
final int largeLayerHeight = DISPLAY_HEIGHT / 2 + 1; // height to use for >50%
|
||||
|
||||
// ensure hdr doesn't turn on if layer is too small
|
||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||
layerWidth, smallLayerHeight, 0 /*flags*/);
|
||||
advanceTime(0);
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
|
||||
|
||||
// Now check with layer larger than 50%
|
||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||
layerWidth, largeLayerHeight, 0 /*flags*/);
|
||||
advanceTime(0);
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHdrTrumpsSunlight() {
|
||||
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
||||
|
||||
// Turn on sunlight
|
||||
hbmc.setAutoBrightnessEnabled(true);
|
||||
hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
|
||||
advanceTime(0);
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_SUNLIGHT, hbmc.getHighBrightnessMode());
|
||||
assertEquals(DEFAULT_MAX, hbmc.getCurrentBrightnessMax(), EPSILON);
|
||||
|
||||
// turn on hdr
|
||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
||||
advanceTime(0);
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHdrBrightnessLimitSameAsNormalLimit() {
|
||||
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
||||
|
||||
// Check limit when HBM is off
|
||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
||||
advanceTime(0);
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
||||
|
||||
// Check limit with HBM is set to HDR
|
||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/,
|
||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
||||
advanceTime(0);
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
|
||||
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHdrBrightnessScaledNormalBrightness() {
|
||||
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
||||
|
||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
||||
advanceTime(0);
|
||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||
|
||||
// verify things are scaled for 0.5f
|
||||
float brightness = 0.5f;
|
||||
float expectedHdrBrightness = MathUtils.map(DEFAULT_MIN, TRANSITION_POINT,
|
||||
DEFAULT_MIN, DEFAULT_MAX, brightness); // map value from normal range to hdr range
|
||||
hbmc.onBrightnessChanged(brightness);
|
||||
advanceTime(0);
|
||||
assertEquals(expectedHdrBrightness, hbmc.getHdrBrightnessValue(), EPSILON);
|
||||
|
||||
// Try another value
|
||||
brightness = 0.33f;
|
||||
expectedHdrBrightness = MathUtils.map(DEFAULT_MIN, TRANSITION_POINT,
|
||||
DEFAULT_MIN, DEFAULT_MAX, brightness); // map value from normal range to hdr range
|
||||
hbmc.onBrightnessChanged(brightness);
|
||||
advanceTime(0);
|
||||
assertEquals(expectedHdrBrightness, hbmc.getHdrBrightnessValue(), EPSILON);
|
||||
|
||||
// Try the min value
|
||||
brightness = DEFAULT_MIN;
|
||||
expectedHdrBrightness = DEFAULT_MIN;
|
||||
hbmc.onBrightnessChanged(brightness);
|
||||
advanceTime(0);
|
||||
assertEquals(expectedHdrBrightness, hbmc.getHdrBrightnessValue(), EPSILON);
|
||||
|
||||
// Try the max value
|
||||
brightness = TRANSITION_POINT;
|
||||
expectedHdrBrightness = DEFAULT_MAX;
|
||||
hbmc.onBrightnessChanged(brightness);
|
||||
advanceTime(0);
|
||||
assertEquals(expectedHdrBrightness, hbmc.getHdrBrightnessValue(), EPSILON);
|
||||
}
|
||||
|
||||
private void assertState(HighBrightnessModeController hbmc,
|
||||
float brightnessMin, float brightnessMax, int hbmMode) {
|
||||
assertEquals(brightnessMin, hbmc.getCurrentBrightnessMin(), EPSILON);
|
||||
|
||||
Reference in New Issue
Block a user