Merge "Fix HDR for app-override brightness." into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
9ed99bd9d1
@@ -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() {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user