Loading services/core/java/com/android/server/display/HighBrightnessModeController.java +8 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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) { Loading services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +102 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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); Loading Loading
services/core/java/com/android/server/display/HighBrightnessModeController.java +8 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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) { Loading
services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +102 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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); Loading