Merge "Fix HDR for app-override brightness." into sc-dev

This commit is contained in:
TreeHugger Robot
2021-07-22 20:29:38 +00:00
committed by Android (Google) Code Review
3 changed files with 33 additions and 40 deletions

View File

@@ -778,7 +778,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
setUpAutoBrightness(mContext.getResources(), mHandler); setUpAutoBrightness(mContext.getResources(), mHandler);
reloadReduceBrightColours(); reloadReduceBrightColours();
mHbmController.resetHbmData(info.width, info.height, token, mHbmController.resetHbmData(info.width, info.height, token,
mDisplayDeviceConfig.getHighBrightnessModeData(), mBrightnessSetting); mDisplayDeviceConfig.getHighBrightnessModeData());
} }
private void sendUpdatePowerState() { private void sendUpdatePowerState() {
@@ -968,7 +968,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
final boolean mustNotify; final boolean mustNotify;
final int previousPolicy; final int previousPolicy;
boolean mustInitialize = false; boolean mustInitialize = false;
boolean shouldSaveBrightnessInfo = true;
int brightnessAdjustmentFlags = 0; int brightnessAdjustmentFlags = 0;
mBrightnessReasonTemp.set(null); mBrightnessReasonTemp.set(null);
synchronized (mLock) { synchronized (mLock) {
@@ -1099,7 +1098,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (state == Display.STATE_OFF) { if (state == Display.STATE_OFF) {
brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT; brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT;
mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF);
shouldSaveBrightnessInfo = false;
} }
// Always use the VR brightness when in the VR state. // Always use the VR brightness when in the VR state.
@@ -1217,6 +1215,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
brightnessAdjustmentFlags = 0; brightnessAdjustmentFlags = 0;
} }
} else { } else {
// Any non-auto-brightness values such as override or temporary should still be subject
// to clamping so that they don't go beyond the current max as specified by HBM
// Controller.
brightnessState = clampScreenBrightness(brightnessState);
mAppliedAutoBrightness = false; mAppliedAutoBrightness = false;
brightnessAdjustmentFlags = 0; brightnessAdjustmentFlags = 0;
} }
@@ -1224,9 +1226,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Use default brightness when dozing unless overridden. // Use default brightness when dozing unless overridden.
if ((Float.isNaN(brightnessState)) if ((Float.isNaN(brightnessState))
&& Display.isDozeState(state)) { && Display.isDozeState(state)) {
brightnessState = mScreenBrightnessDozeConfig; brightnessState = clampScreenBrightness(mScreenBrightnessDozeConfig);
mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT);
shouldSaveBrightnessInfo = false;
} }
// Apply manual brightness. // Apply manual brightness.
@@ -1241,12 +1242,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mBrightnessReasonTemp.setReason(BrightnessReason.REASON_MANUAL); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_MANUAL);
} }
// Save out the brightness info now that the brightness state for this iteration has been // The current brightness to use has been calculated at this point (minus the adjustments
// finalized and before we send out notifications about the brightness changing. // like low-power and dim), and HbmController should be notified so that it can accurately
if (shouldSaveBrightnessInfo) { // calculate HDR or HBM levels. We specifically do it here instead of having HbmController
saveBrightnessInfo(brightnessState); // listen to the brightness setting because certain brightness sources (just as an app
// override) are not saved to the setting, but should be reflected in HBM
} // calculations.
mHbmController.onBrightnessChanged(brightnessState);
if (updateScreenBrightnessSetting) { if (updateScreenBrightnessSetting) {
// Tell the rest of the system about the new brightness in case we had to change it // Tell the rest of the system about the new brightness in case we had to change it
@@ -1257,6 +1259,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
putScreenBrightnessSetting(brightnessState, /* updateCurrent */ true); putScreenBrightnessSetting(brightnessState, /* updateCurrent */ true);
} }
// We save the brightness info *after* the brightness setting has been changed so that
// the brightness info reflects the latest value.
saveBrightnessInfo(getScreenBrightnessSetting());
// Apply dimming by at least some minimum amount when user activity // Apply dimming by at least some minimum amount when user activity
// timeout is about to expire. // timeout is about to expire.
if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) { if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
@@ -1533,7 +1539,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mHandler.post(mOnBrightnessChangeRunnable); mHandler.post(mOnBrightnessChangeRunnable);
// TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern. // TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern.
mAutomaticBrightnessController.update(); mAutomaticBrightnessController.update();
}, mContext, mBrightnessSetting); }, mContext);
} }
private void blockScreenOn() { private void blockScreenOn() {

View File

@@ -37,7 +37,6 @@ import android.util.TimeUtils;
import android.view.SurfaceControlHdrLayerInfoListener; import android.view.SurfaceControlHdrLayerInfoListener;
import com.android.internal.annotations.VisibleForTesting; 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.DisplayDeviceConfig.HighBrightnessModeData;
import com.android.server.display.DisplayManagerService.Clock; import com.android.server.display.DisplayManagerService.Clock;
@@ -70,7 +69,6 @@ class HighBrightnessModeController {
private final Context mContext; private final Context mContext;
private final SettingsObserver mSettingsObserver; private final SettingsObserver mSettingsObserver;
private final Injector mInjector; private final Injector mInjector;
private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged;
private HdrListener mHdrListener; private HdrListener mHdrListener;
private HighBrightnessModeData mHbmData; private HighBrightnessModeData mHbmData;
@@ -86,7 +84,6 @@ class HighBrightnessModeController {
private boolean mIsBlockedByLowPowerMode = false; private boolean mIsBlockedByLowPowerMode = false;
private int mWidth; private int mWidth;
private int mHeight; private int mHeight;
private BrightnessSetting mBrightnessSetting;
private float mAmbientLux; private float mAmbientLux;
/** /**
@@ -103,30 +100,30 @@ class HighBrightnessModeController {
HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken,
float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData,
Runnable hbmChangeCallback, Context context, BrightnessSetting brightnessSetting) { Runnable hbmChangeCallback, Context context) {
this(new Injector(), handler, width, height, displayToken, brightnessMin, brightnessMax, this(new Injector(), handler, width, height, displayToken, brightnessMin, brightnessMax,
hbmData, hbmChangeCallback, context, brightnessSetting); hbmData, hbmChangeCallback, context);
} }
@VisibleForTesting @VisibleForTesting
HighBrightnessModeController(Injector injector, Handler handler, int width, int height, HighBrightnessModeController(Injector injector, Handler handler, int width, int height,
IBinder displayToken, float brightnessMin, float brightnessMax, IBinder displayToken, float brightnessMin, float brightnessMax,
HighBrightnessModeData hbmData, Runnable hbmChangeCallback, HighBrightnessModeData hbmData, Runnable hbmChangeCallback,
Context context, BrightnessSetting brightnessSetting) { Context context) {
mInjector = injector; mInjector = injector;
mContext = context; mContext = context;
mClock = injector.getClock(); mClock = injector.getClock();
mHandler = handler; mHandler = handler;
mBrightness = brightnessMin;
mBrightnessMin = brightnessMin; mBrightnessMin = brightnessMin;
mBrightnessMax = brightnessMax; mBrightnessMax = brightnessMax;
mBrightness = brightnessSetting.getBrightness();
mHbmChangeCallback = hbmChangeCallback; mHbmChangeCallback = hbmChangeCallback;
mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler); mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler);
mSettingsObserver = new SettingsObserver(mHandler); mSettingsObserver = new SettingsObserver(mHandler);
mRecalcRunnable = this::recalculateTimeAllowance; mRecalcRunnable = this::recalculateTimeAllowance;
mHdrListener = new HdrListener(); mHdrListener = new HdrListener();
resetHbmData(width, height, displayToken, hbmData, brightnessSetting); resetHbmData(width, height, displayToken, hbmData);
} }
void setAutoBrightnessEnabled(boolean isEnabled) { void setAutoBrightnessEnabled(boolean isEnabled) {
@@ -185,7 +182,6 @@ class HighBrightnessModeController {
} }
} }
@VisibleForTesting
void onBrightnessChanged(float brightness) { void onBrightnessChanged(float brightness) {
if (!deviceSupportsHbm()) { if (!deviceSupportsHbm()) {
return; return;
@@ -224,12 +220,11 @@ class HighBrightnessModeController {
mSettingsObserver.stopObserving(); mSettingsObserver.stopObserving();
} }
void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData, void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData) {
BrightnessSetting brightnessSetting) {
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
mHbmData = hbmData; mHbmData = hbmData;
resetBrightnessSetting(brightnessSetting);
unregisterHdrListener(); unregisterHdrListener();
mSkinThermalStatusObserver.stopObserving(); mSkinThermalStatusObserver.stopObserving();
mSettingsObserver.stopObserving(); mSettingsObserver.stopObserving();
@@ -261,9 +256,12 @@ class HighBrightnessModeController {
pw.println(" mBrightness=" + mBrightness); pw.println(" mBrightness=" + mBrightness);
pw.println(" mCurrentMin=" + getCurrentBrightnessMin()); pw.println(" mCurrentMin=" + getCurrentBrightnessMin());
pw.println(" mCurrentMax=" + getCurrentBrightnessMax()); pw.println(" mCurrentMax=" + getCurrentBrightnessMax());
pw.println(" mHbmMode=" + BrightnessInfo.hbmToString(mHbmMode)); pw.println(" mHbmMode=" + BrightnessInfo.hbmToString(mHbmMode)
+ (mHbmMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR
? "(" + getHdrBrightnessValue() + ")" : ""));
pw.println(" mHbmData=" + mHbmData); pw.println(" mHbmData=" + mHbmData);
pw.println(" mAmbientLux=" + mAmbientLux); pw.println(" mAmbientLux=" + mAmbientLux
+ (mIsAutoBrightnessEnabled ? "" : " (old/invalid)"));
pw.println(" mIsInAllowedAmbientRange=" + mIsInAllowedAmbientRange); pw.println(" mIsInAllowedAmbientRange=" + mIsInAllowedAmbientRange);
pw.println(" mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled); pw.println(" mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled);
pw.println(" mIsHdrLayerPresent=" + mIsHdrLayerPresent); pw.println(" mIsHdrLayerPresent=" + mIsHdrLayerPresent);
@@ -301,16 +299,6 @@ class HighBrightnessModeController {
return event.startTimeMillis; 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() { private boolean isCurrentlyAllowed() {
// Returns true if HBM is allowed (above the ambient lux threshold) and there's still // 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 // time within the current window for additional HBM usage. We return false if there is an

View File

@@ -92,7 +92,6 @@ 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;
@@ -123,7 +122,7 @@ public class HighBrightnessModeControllerTest {
initHandler(null); initHandler(null);
final HighBrightnessModeController hbmc = new HighBrightnessModeController( final HighBrightnessModeController hbmc = new HighBrightnessModeController(
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN,
DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting); DEFAULT_MAX, null, () -> {}, mContextSpy);
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
} }
@@ -132,7 +131,7 @@ public class HighBrightnessModeControllerTest {
initHandler(null); initHandler(null);
final HighBrightnessModeController hbmc = new HighBrightnessModeController( final HighBrightnessModeController hbmc = new HighBrightnessModeController(
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN,
DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting); DEFAULT_MAX, null, () -> {}, mContextSpy);
hbmc.setAutoBrightnessEnabled(true); hbmc.setAutoBrightnessEnabled(true);
hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
@@ -464,7 +463,7 @@ public class HighBrightnessModeControllerTest {
initHandler(clock); initHandler(clock);
return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH, return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH,
DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {}, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {},
mContextSpy, mBrightnessSetting); mContextSpy);
} }
private void initHandler(OffsettableClock clock) { private void initHandler(OffsettableClock clock) {