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 Injector mInjector;
|
||||||
private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged;
|
private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged;
|
||||||
|
|
||||||
private SurfaceControlHdrLayerInfoListener mHdrListener;
|
private HdrListener mHdrListener;
|
||||||
private HighBrightnessModeData mHbmData;
|
private HighBrightnessModeData mHbmData;
|
||||||
private IBinder mRegisteredDisplayToken;
|
private IBinder mRegisteredDisplayToken;
|
||||||
|
|
||||||
@@ -251,6 +251,11 @@ class HighBrightnessModeController {
|
|||||||
mHandler.runWithScissors(() -> dumpLocal(pw), 1000);
|
mHandler.runWithScissors(() -> dumpLocal(pw), 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
HdrListener getHdrListener() {
|
||||||
|
return mHdrListener;
|
||||||
|
}
|
||||||
|
|
||||||
private void dumpLocal(PrintWriter pw) {
|
private void dumpLocal(PrintWriter pw) {
|
||||||
pw.println("HighBrightnessModeController:");
|
pw.println("HighBrightnessModeController:");
|
||||||
pw.println(" mBrightness=" + mBrightness);
|
pw.println(" mBrightness=" + mBrightness);
|
||||||
@@ -487,7 +492,8 @@ class HighBrightnessModeController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
@VisibleForTesting
|
||||||
|
class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
||||||
@Override
|
@Override
|
||||||
public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
|
public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
|
||||||
int maxW, int maxH, int flags) {
|
int maxW, int maxH, int flags) {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.server.display;
|
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_OFF;
|
||||||
import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT;
|
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.os.test.TestLooper;
|
||||||
import android.platform.test.annotations.Presubmit;
|
import android.platform.test.annotations.Presubmit;
|
||||||
import android.test.mock.MockContentResolver;
|
import android.test.mock.MockContentResolver;
|
||||||
|
import android.util.MathUtils;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
@@ -90,11 +92,10 @@ public class HighBrightnessModeControllerTest {
|
|||||||
|
|
||||||
@Mock IThermalService mThermalServiceMock;
|
@Mock IThermalService mThermalServiceMock;
|
||||||
@Mock Injector mInjectorMock;
|
@Mock Injector mInjectorMock;
|
||||||
|
@Mock BrightnessSetting mBrightnessSetting;
|
||||||
|
|
||||||
@Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor;
|
@Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor;
|
||||||
|
|
||||||
@Mock private BrightnessSetting mBrightnessSetting;
|
|
||||||
|
|
||||||
private static final HighBrightnessModeData DEFAULT_HBM_DATA =
|
private static final HighBrightnessModeData DEFAULT_HBM_DATA =
|
||||||
new HighBrightnessModeData(MINIMUM_LUX, TRANSITION_POINT, TIME_WINDOW_MILLIS,
|
new HighBrightnessModeData(MINIMUM_LUX, TRANSITION_POINT, TIME_WINDOW_MILLIS,
|
||||||
TIME_ALLOWED_IN_WINDOW_MILLIS, TIME_MINIMUM_AVAILABLE_TO_ENABLE_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());
|
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,
|
private void assertState(HighBrightnessModeController hbmc,
|
||||||
float brightnessMin, float brightnessMax, int hbmMode) {
|
float brightnessMin, float brightnessMax, int hbmMode) {
|
||||||
assertEquals(brightnessMin, hbmc.getCurrentBrightnessMin(), EPSILON);
|
assertEquals(brightnessMin, hbmc.getCurrentBrightnessMin(), EPSILON);
|
||||||
|
|||||||
Reference in New Issue
Block a user