Merge "Add limitations to HDR." into sc-dev am: 5b31467f3b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15221893

Change-Id: I757a081ade4c44d304f4c84162677b258ba817de
This commit is contained in:
TreeHugger Robot
2021-07-09 14:10:41 +00:00
committed by Automerger Merge Worker
5 changed files with 121 additions and 64 deletions

View File

@@ -778,7 +778,6 @@ class AutomaticBrightnessController {
mScreenBrightnessThresholds.getBrighteningThreshold(newScreenAutoBrightness));
mScreenDarkeningThreshold = clampScreenBrightness(
mScreenBrightnessThresholds.getDarkeningThreshold(newScreenAutoBrightness));
mHbmController.onAutoBrightnessChanged(mScreenAutoBrightness);
if (sendUpdate) {
mCallbacks.updateBrightness();

View File

@@ -1281,6 +1281,11 @@ public final class DisplayManagerService extends SystemService {
sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED);
scheduleTraversalLocked(false);
mPersistentDataStore.saveIfNeeded();
DisplayPowerController dpc = mDisplayPowerControllers.get(displayId);
if (dpc != null) {
dpc.onDisplayChanged();
}
}
private void handleLogicalDisplayFrameRateOverridesChangedLocked(
@@ -1312,11 +1317,6 @@ public final class DisplayManagerService extends SystemService {
if (work != null) {
mHandler.post(work);
}
final int displayId = display.getDisplayIdLocked();
DisplayPowerController dpc = mDisplayPowerControllers.get(displayId);
if (dpc != null) {
dpc.onDisplayChanged();
}
handleLogicalDisplayChangedLocked(display);
}

View File

@@ -511,7 +511,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mSkipScreenOnBrightnessRamp = resources.getBoolean(
com.android.internal.R.bool.config_skipScreenOnBrightnessRamp);
mHbmController = createHbmController();
mHbmController = createHbmControllerLocked();
// Seed the cached brightness
saveBrightnessInfo(getScreenBrightnessSetting());
@@ -717,6 +717,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
final String uniqueId = device.getUniqueId();
final DisplayDeviceConfig config = device.getDisplayDeviceConfig();
final IBinder token = device.getDisplayTokenLocked();
final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
mHandler.post(() -> {
if (mDisplayDevice == device) {
return;
@@ -724,7 +725,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mDisplayDevice = device;
mUniqueDisplayId = uniqueId;
mDisplayDeviceConfig = config;
loadFromDisplayDeviceConfig(token);
loadFromDisplayDeviceConfig(token, info);
});
}
@@ -765,7 +766,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
}
private void loadFromDisplayDeviceConfig(IBinder token) {
private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
// All properties that depend on the associated DisplayDevice and the DDC must be
// updated here.
loadAmbientLightSensor();
@@ -774,7 +775,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
loadNitsRange(mContext.getResources());
setUpAutoBrightness(mContext.getResources(), mHandler);
reloadReduceBrightColours();
mHbmController.resetHbmData(token, mDisplayDeviceConfig.getHighBrightnessModeData());
mHbmController.resetHbmData(info.width, info.height, token,
mDisplayDeviceConfig.getHighBrightnessModeData(), mBrightnessSetting);
}
private void sendUpdatePowerState() {
@@ -1343,6 +1345,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (mHbmController.getHighBrightnessMode() == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR
&& ((mBrightnessReason.modifier & BrightnessReason.MODIFIER_DIMMED) == 0
|| (mBrightnessReason.modifier & BrightnessReason.MODIFIER_LOW_POWER) == 0)) {
// We want to scale HDR brightness level with the SDR level
animateValue = mHbmController.getHdrBrightnessValue();
}
@@ -1514,21 +1517,22 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
}
private HighBrightnessModeController createHbmController() {
final DisplayDeviceConfig ddConfig =
mLogicalDisplay.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig();
private HighBrightnessModeController createHbmControllerLocked() {
final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig();
final IBinder displayToken =
mLogicalDisplay.getPrimaryDisplayDeviceLocked().getDisplayTokenLocked();
final DisplayDeviceConfig.HighBrightnessModeData hbmData =
ddConfig != null ? ddConfig.getHighBrightnessModeData() : null;
return new HighBrightnessModeController(mHandler, displayToken, PowerManager.BRIGHTNESS_MIN,
PowerManager.BRIGHTNESS_MAX, hbmData,
final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
return new HighBrightnessModeController(mHandler, info.width, info.height, displayToken,
PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData,
() -> {
sendUpdatePowerStateLocked();
mHandler.post(mOnBrightnessChangeRunnable);
// TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern.
mAutomaticBrightnessController.update();
}, mContext);
}, mContext, mBrightnessSetting);
}
private void blockScreenOn() {

View File

@@ -31,11 +31,13 @@ import android.os.SystemClock;
import android.os.Temperature;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.MathUtils;
import android.util.Slog;
import android.util.TimeUtils;
import android.view.SurfaceControlHdrLayerInfoListener;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.BrightnessSetting.BrightnessSettingListener;
import com.android.server.display.DisplayDeviceConfig.HighBrightnessModeData;
import com.android.server.display.DisplayManagerService.Clock;
@@ -56,6 +58,8 @@ class HighBrightnessModeController {
private static final boolean DEBUG = false;
private static final float HDR_PERCENT_OF_SCREEN_REQUIRED = 0.50f;
private final float mBrightnessMin;
private final float mBrightnessMax;
private final Handler mHandler;
@@ -66,6 +70,7 @@ class HighBrightnessModeController {
private final Context mContext;
private final SettingsObserver mSettingsObserver;
private final Injector mInjector;
private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged;
private SurfaceControlHdrLayerInfoListener mHdrListener;
private HighBrightnessModeData mHbmData;
@@ -74,11 +79,15 @@ class HighBrightnessModeController {
private boolean mIsInAllowedAmbientRange = false;
private boolean mIsTimeAvailable = false;
private boolean mIsAutoBrightnessEnabled = false;
private float mAutoBrightness;
private float mBrightness;
private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
private boolean mIsHdrLayerPresent = false;
private boolean mIsThermalStatusWithinLimit = true;
private boolean mIsBlockedByLowPowerMode = false;
private int mWidth;
private int mHeight;
private BrightnessSetting mBrightnessSetting;
private float mAmbientLux;
/**
* If HBM is currently running, this is the start time for the current HBM session.
@@ -92,30 +101,32 @@ class HighBrightnessModeController {
*/
private LinkedList<HbmEvent> mEvents = new LinkedList<>();
HighBrightnessModeController(Handler handler, IBinder displayToken, float brightnessMin,
float brightnessMax, HighBrightnessModeData hbmData, Runnable hbmChangeCallback,
Context context) {
this(new Injector(), handler, displayToken, brightnessMin, brightnessMax,
hbmData, hbmChangeCallback, context);
HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken,
float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData,
Runnable hbmChangeCallback, Context context, BrightnessSetting brightnessSetting) {
this(new Injector(), handler, width, height, displayToken, brightnessMin, brightnessMax,
hbmData, hbmChangeCallback, context, brightnessSetting);
}
@VisibleForTesting
HighBrightnessModeController(Injector injector, Handler handler, IBinder displayToken,
float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData,
Runnable hbmChangeCallback, Context context) {
HighBrightnessModeController(Injector injector, Handler handler, int width, int height,
IBinder displayToken, float brightnessMin, float brightnessMax,
HighBrightnessModeData hbmData, Runnable hbmChangeCallback,
Context context, BrightnessSetting brightnessSetting) {
mInjector = injector;
mContext = context;
mClock = injector.getClock();
mHandler = handler;
mBrightnessMin = brightnessMin;
mBrightnessMax = brightnessMax;
mBrightness = brightnessSetting.getBrightness();
mHbmChangeCallback = hbmChangeCallback;
mContext = context;
mAutoBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
mRecalcRunnable = this::recalculateTimeAllowance;
mHdrListener = new HdrListener();
mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler);
mSettingsObserver = new SettingsObserver(mHandler);
resetHbmData(displayToken, hbmData);
mRecalcRunnable = this::recalculateTimeAllowance;
mHdrListener = new HdrListener();
resetHbmData(width, height, displayToken, hbmData, brightnessSetting);
}
void setAutoBrightnessEnabled(boolean isEnabled) {
@@ -123,7 +134,7 @@ class HighBrightnessModeController {
return;
}
if (DEBUG) {
Slog.d(TAG, "setAutoBrightness( " + isEnabled + " )");
Slog.d(TAG, "setAutoBrightnessEnabled( " + isEnabled + " )");
}
mIsAutoBrightnessEnabled = isEnabled;
mIsInAllowedAmbientRange = false; // reset when auto-brightness switches
@@ -147,11 +158,22 @@ class HighBrightnessModeController {
}
}
float getNormalBrightnessMax() {
return deviceSupportsHbm() ? mHbmData.transitionPoint : mBrightnessMax;
}
float getHdrBrightnessValue() {
return mBrightnessMax;
// For HDR brightness, we take the current brightness and scale it to the max. The reason
// we do this is because we want brightness to go to HBM max when it would normally go
// to normal max, meaning it should not wait to go to 10000 lux (or whatever the transition
// point happens to be) in order to go full HDR. Likewise, HDR on manual brightness should
// automatically scale the brightness without forcing the user to adjust to higher values.
return MathUtils.map(getCurrentBrightnessMin(), getCurrentBrightnessMax(),
mBrightnessMin, mBrightnessMax, mBrightness);
}
void onAmbientLuxChange(float ambientLux) {
mAmbientLux = ambientLux;
if (!deviceSupportsHbm() || !mIsAutoBrightnessEnabled) {
return;
}
@@ -163,17 +185,17 @@ class HighBrightnessModeController {
}
}
void onAutoBrightnessChanged(float autoBrightness) {
@VisibleForTesting
void onBrightnessChanged(float brightness) {
if (!deviceSupportsHbm()) {
return;
}
final float oldAutoBrightness = mAutoBrightness;
mAutoBrightness = autoBrightness;
mBrightness = brightness;
// If we are starting or ending a high brightness mode session, store the current
// session in mRunningStartTimeMillis, or the old one in mEvents.
final boolean wasHbmDrainingAvailableTime = mRunningStartTimeMillis != -1;
final boolean shouldHbmDrainAvailableTime = mAutoBrightness > mHbmData.transitionPoint
final boolean shouldHbmDrainAvailableTime = mBrightness > mHbmData.transitionPoint
&& !mIsHdrLayerPresent;
if (wasHbmDrainingAvailableTime != shouldHbmDrainAvailableTime) {
final long currentTime = mClock.uptimeMillis();
@@ -202,8 +224,12 @@ class HighBrightnessModeController {
mSettingsObserver.stopObserving();
}
void resetHbmData(IBinder displayToken, HighBrightnessModeData hbmData) {
void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData,
BrightnessSetting brightnessSetting) {
mWidth = width;
mHeight = height;
mHbmData = hbmData;
resetBrightnessSetting(brightnessSetting);
unregisterHdrListener();
mSkinThermalStatusObserver.stopObserving();
mSettingsObserver.stopObserving();
@@ -227,21 +253,23 @@ class HighBrightnessModeController {
private void dumpLocal(PrintWriter pw) {
pw.println("HighBrightnessModeController:");
pw.println(" mBrightness=" + mBrightness);
pw.println(" mCurrentMin=" + getCurrentBrightnessMin());
pw.println(" mCurrentMax=" + getCurrentBrightnessMax());
pw.println(" mHbmMode=" + BrightnessInfo.hbmToString(mHbmMode));
pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis()));
pw.println(" mHbmData=" + mHbmData);
pw.println(" mAmbientLux=" + mAmbientLux);
pw.println(" mIsInAllowedAmbientRange=" + mIsInAllowedAmbientRange);
pw.println(" mIsTimeAvailable= " + mIsTimeAvailable);
pw.println(" mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled);
pw.println(" mAutoBrightness=" + mAutoBrightness);
pw.println(" mIsHdrLayerPresent=" + mIsHdrLayerPresent);
pw.println(" mBrightnessMin=" + mBrightnessMin);
pw.println(" mBrightnessMax=" + mBrightnessMax);
pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis()));
pw.println(" mIsTimeAvailable= " + mIsTimeAvailable);
pw.println(" mRunningStartTimeMillis=" + TimeUtils.formatUptime(mRunningStartTimeMillis));
pw.println(" mIsThermalStatusWithinLimit=" + mIsThermalStatusWithinLimit);
pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode);
pw.println(" width*height=" + mWidth + "*" + mHeight);
pw.println(" mEvents=");
final long currentTime = mClock.uptimeMillis();
long lastStartTime = currentTime;
@@ -268,9 +296,26 @@ class HighBrightnessModeController {
return event.startTimeMillis;
}
private void resetBrightnessSetting(BrightnessSetting brightnessSetting) {
if (mBrightnessSetting != null) {
mBrightnessSetting.unregisterListener(mBrightnessSettingListener);
}
mBrightnessSetting = brightnessSetting;
if (mBrightnessSetting != null) {
mBrightnessSetting.registerListener(mBrightnessSettingListener);
}
}
private boolean isCurrentlyAllowed() {
return mIsHdrLayerPresent
|| (mIsAutoBrightnessEnabled && mIsTimeAvailable && mIsInAllowedAmbientRange
// Returns true if HBM is allowed (above the ambient lux threshold) and there's still
// time within the current window for additional HBM usage. We return false if there is an
// HDR layer because we don't want the brightness MAX to change for HDR, which has its
// brightness scaled in a different way than sunlight HBM that doesn't require changing
// the MAX. HDR also needs to work under manual brightness which never adjusts the
// brightness maximum; so we implement HDR-HBM in a way that doesn't adjust the max.
// See {@link #getHdrBrightnessValue}.
return !mIsHdrLayerPresent
&& (mIsAutoBrightnessEnabled && mIsTimeAvailable && mIsInAllowedAmbientRange
&& mIsThermalStatusWithinLimit && !mIsBlockedByLowPowerMode);
}
@@ -334,13 +379,13 @@ class HighBrightnessModeController {
// or if brightness is already in the high range, if there is any time left at all.
final boolean isAllowedWithoutRestrictions = remainingTime >= mHbmData.timeMinMillis;
final boolean isOnlyAllowedToStayOn = !isAllowedWithoutRestrictions
&& remainingTime > 0 && mAutoBrightness > mHbmData.transitionPoint;
&& remainingTime > 0 && mBrightness > mHbmData.transitionPoint;
mIsTimeAvailable = isAllowedWithoutRestrictions || isOnlyAllowedToStayOn;
// Calculate the time at which we want to recalculate mIsTimeAvailable in case a lux or
// brightness change doesn't happen before then.
long nextTimeout = -1;
if (mAutoBrightness > mHbmData.transitionPoint) {
if (mBrightness > mHbmData.transitionPoint) {
// if we're in high-lux now, timeout when we run out of allowed time.
nextTimeout = currentTime + remainingTime;
} else if (!mIsTimeAvailable && mEvents.size() > 0) {
@@ -370,7 +415,7 @@ class HighBrightnessModeController {
+ ", mIsInAllowedAmbientRange: " + mIsInAllowedAmbientRange
+ ", mIsThermalStatusWithinLimit: " + mIsThermalStatusWithinLimit
+ ", mIsBlockedByLowPowerMode: " + mIsBlockedByLowPowerMode
+ ", brightness: " + mAutoBrightness
+ ", mBrightness: " + mBrightness
+ ", RunningStartTimeMillis: " + mRunningStartTimeMillis
+ ", nextTimeout: " + (nextTimeout != -1 ? (nextTimeout - currentTime) : -1)
+ ", events: " + mEvents);
@@ -447,11 +492,12 @@ class HighBrightnessModeController {
public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
int maxW, int maxH, int flags) {
mHandler.post(() -> {
mIsHdrLayerPresent = numberOfHdrLayers > 0;
// Calling the auto-brightness update so that we can recalculate
// auto-brightness with HDR in mind. When HDR layers are present,
// we don't limit auto-brightness' HBM time limits.
onAutoBrightnessChanged(mAutoBrightness);
mIsHdrLayerPresent = numberOfHdrLayers > 0
&& (float) (maxW * maxH)
>= ((float) (mWidth * mHeight) * HDR_PERCENT_OF_SCREEN_REQUIRED);
// Calling the brightness update so that we can recalculate
// brightness with HDR in mind.
onBrightnessChanged(mBrightness);
});
}
}

View File

@@ -74,6 +74,9 @@ public class HighBrightnessModeControllerTest {
private static final float DEFAULT_MIN = 0.01f;
private static final float DEFAULT_MAX = 0.80f;
private static final int DISPLAY_WIDTH = 900;
private static final int DISPLAY_HEIGHT = 1600;
private static final float EPSILON = 0.000001f;
private OffsettableClock mClock;
@@ -90,6 +93,8 @@ public class HighBrightnessModeControllerTest {
@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,
@@ -98,6 +103,8 @@ public class HighBrightnessModeControllerTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mClock = new OffsettableClock.Stopped();
mTestLooper = new TestLooper(mClock::now);
mDisplayToken = null;
mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
@@ -114,8 +121,8 @@ public class HighBrightnessModeControllerTest {
public void testNoHbmData() {
initHandler(null);
final HighBrightnessModeController hbmc = new HighBrightnessModeController(
mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null,
() -> {}, mContextSpy);
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN,
DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting);
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
}
@@ -123,8 +130,8 @@ public class HighBrightnessModeControllerTest {
public void testNoHbmData_Enabled() {
initHandler(null);
final HighBrightnessModeController hbmc = new HighBrightnessModeController(
mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null,
() -> {}, mContextSpy);
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN,
DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting);
hbmc.setAutoBrightnessEnabled(true);
hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
@@ -180,7 +187,7 @@ public class HighBrightnessModeControllerTest {
hbmc.setAutoBrightnessEnabled(true);
hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f);
// Verify we are in HBM
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
@@ -212,7 +219,7 @@ public class HighBrightnessModeControllerTest {
hbmc.setAutoBrightnessEnabled(true);
hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f);
// Verify we are in HBM
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
@@ -237,18 +244,18 @@ public class HighBrightnessModeControllerTest {
hbmc.setAutoBrightnessEnabled(true);
hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f);
advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2);
// Verify we are in HBM
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
hbmc.onAutoBrightnessChanged(TRANSITION_POINT - 0.01f);
hbmc.onBrightnessChanged(TRANSITION_POINT - 0.01f);
advanceTime(1);
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f);
advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2);
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
@@ -267,13 +274,13 @@ public class HighBrightnessModeControllerTest {
hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
// Go into HBM for half the allowed window
hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f);
advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2);
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
// Move lux below threshold (ending first event);
hbmc.onAmbientLuxChange(MINIMUM_LUX - 1);
hbmc.onAutoBrightnessChanged(TRANSITION_POINT);
hbmc.onBrightnessChanged(TRANSITION_POINT);
assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
// Move up some amount of time so that there's still time in the window even after a
@@ -283,7 +290,7 @@ public class HighBrightnessModeControllerTest {
// Go into HBM for just under the second half of allowed window
hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 1);
hbmc.onBrightnessChanged(TRANSITION_POINT + 1);
advanceTime((TIME_ALLOWED_IN_WINDOW_MILLIS / 2) - 1);
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
@@ -355,8 +362,9 @@ public class HighBrightnessModeControllerTest {
// Creates instance with standard initialization values.
private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) {
initHandler(clock);
return new HighBrightnessModeController(mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN,
DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {}, mContextSpy);
return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH,
DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {},
mContextSpy, mBrightnessSetting);
}
private void initHandler(OffsettableClock clock) {