diff options
| author | 2021-07-15 19:06:49 +0000 | |
|---|---|---|
| committer | 2021-07-15 19:06:49 +0000 | |
| commit | e3e3a319e65e89c7de0bad42d316426ac339d609 (patch) | |
| tree | 3297773da28871ac8d7daf2f2329f609ffa3dad2 | |
| parent | 0d57ba415a12b294d998b0bae16af56f9c43348f (diff) | |
| parent | c24f35292d4431c9a0fa1c4909d1a586eab4055d (diff) | |
Merge "Tests for HighBrightnessModeController's HDR mode" into sc-dev
2 files changed, 110 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java index e0b4d47de0ee..645131c1eee8 100644 --- a/services/core/java/com/android/server/display/HighBrightnessModeController.java +++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java @@ -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) { diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java index 7243947db944..1ad8850a1921 100644 --- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java @@ -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); |