summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Santos Cordon <santoscordon@google.com> 2021-07-15 19:06:49 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-07-15 19:06:49 +0000
commite3e3a319e65e89c7de0bad42d316426ac339d609 (patch)
tree3297773da28871ac8d7daf2f2329f609ffa3dad2
parent0d57ba415a12b294d998b0bae16af56f9c43348f (diff)
parentc24f35292d4431c9a0fa1c4909d1a586eab4055d (diff)
Merge "Tests for HighBrightnessModeController's HDR mode" into sc-dev
-rw-r--r--services/core/java/com/android/server/display/HighBrightnessModeController.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java104
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);