Loading services/core/java/com/android/server/display/DisplayPowerController.java +18 −12 Original line number Diff line number Diff line Loading @@ -778,7 +778,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call setUpAutoBrightness(mContext.getResources(), mHandler); reloadReduceBrightColours(); mHbmController.resetHbmData(info.width, info.height, token, mDisplayDeviceConfig.getHighBrightnessModeData(), mBrightnessSetting); mDisplayDeviceConfig.getHighBrightnessModeData()); } private void sendUpdatePowerState() { Loading Loading @@ -968,7 +968,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final boolean mustNotify; final int previousPolicy; boolean mustInitialize = false; boolean shouldSaveBrightnessInfo = true; int brightnessAdjustmentFlags = 0; mBrightnessReasonTemp.set(null); synchronized (mLock) { Loading Loading @@ -1099,7 +1098,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (state == Display.STATE_OFF) { brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT; mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF); shouldSaveBrightnessInfo = false; } // Always use the VR brightness when in the VR state. Loading Loading @@ -1217,6 +1215,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call brightnessAdjustmentFlags = 0; } } 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; brightnessAdjustmentFlags = 0; } Loading @@ -1224,9 +1226,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Use default brightness when dozing unless overridden. if ((Float.isNaN(brightnessState)) && Display.isDozeState(state)) { brightnessState = mScreenBrightnessDozeConfig; brightnessState = clampScreenBrightness(mScreenBrightnessDozeConfig); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT); shouldSaveBrightnessInfo = false; } // Apply manual brightness. Loading @@ -1241,12 +1242,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessReasonTemp.setReason(BrightnessReason.REASON_MANUAL); } // Save out the brightness info now that the brightness state for this iteration has been // finalized and before we send out notifications about the brightness changing. if (shouldSaveBrightnessInfo) { saveBrightnessInfo(brightnessState); } // The current brightness to use has been calculated at this point (minus the adjustments // like low-power and dim), and HbmController should be notified so that it can accurately // calculate HDR or HBM levels. We specifically do it here instead of having HbmController // 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) { // Tell the rest of the system about the new brightness in case we had to change it Loading @@ -1257,6 +1259,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 // timeout is about to expire. if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) { Loading Loading @@ -1533,7 +1539,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mHandler.post(mOnBrightnessChangeRunnable); // TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern. mAutomaticBrightnessController.update(); }, mContext, mBrightnessSetting); }, mContext); } private void blockScreenOn() { Loading services/core/java/com/android/server/display/HighBrightnessModeController.java +12 −24 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ 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; Loading Loading @@ -70,7 +69,6 @@ class HighBrightnessModeController { private final Context mContext; private final SettingsObserver mSettingsObserver; private final Injector mInjector; private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged; private HdrListener mHdrListener; private HighBrightnessModeData mHbmData; Loading @@ -86,7 +84,6 @@ class HighBrightnessModeController { private boolean mIsBlockedByLowPowerMode = false; private int mWidth; private int mHeight; private BrightnessSetting mBrightnessSetting; private float mAmbientLux; /** Loading @@ -103,30 +100,30 @@ class HighBrightnessModeController { HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, 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, hbmData, hbmChangeCallback, context, brightnessSetting); hbmData, hbmChangeCallback, context); } @VisibleForTesting HighBrightnessModeController(Injector injector, Handler handler, int width, int height, IBinder displayToken, float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, Runnable hbmChangeCallback, Context context, BrightnessSetting brightnessSetting) { Context context) { mInjector = injector; mContext = context; mClock = injector.getClock(); mHandler = handler; mBrightness = brightnessMin; mBrightnessMin = brightnessMin; mBrightnessMax = brightnessMax; mBrightness = brightnessSetting.getBrightness(); mHbmChangeCallback = hbmChangeCallback; mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler); mSettingsObserver = new SettingsObserver(mHandler); mRecalcRunnable = this::recalculateTimeAllowance; mHdrListener = new HdrListener(); resetHbmData(width, height, displayToken, hbmData, brightnessSetting); resetHbmData(width, height, displayToken, hbmData); } void setAutoBrightnessEnabled(boolean isEnabled) { Loading Loading @@ -185,7 +182,6 @@ class HighBrightnessModeController { } } @VisibleForTesting void onBrightnessChanged(float brightness) { if (!deviceSupportsHbm()) { return; Loading Loading @@ -224,12 +220,11 @@ class HighBrightnessModeController { mSettingsObserver.stopObserving(); } void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData, BrightnessSetting brightnessSetting) { void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData) { mWidth = width; mHeight = height; mHbmData = hbmData; resetBrightnessSetting(brightnessSetting); unregisterHdrListener(); mSkinThermalStatusObserver.stopObserving(); mSettingsObserver.stopObserving(); Loading Loading @@ -261,9 +256,12 @@ class HighBrightnessModeController { pw.println(" mBrightness=" + mBrightness); pw.println(" mCurrentMin=" + getCurrentBrightnessMin()); 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(" mAmbientLux=" + mAmbientLux); pw.println(" mAmbientLux=" + mAmbientLux + (mIsAutoBrightnessEnabled ? "" : " (old/invalid)")); pw.println(" mIsInAllowedAmbientRange=" + mIsInAllowedAmbientRange); pw.println(" mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled); pw.println(" mIsHdrLayerPresent=" + mIsHdrLayerPresent); Loading Loading @@ -301,16 +299,6 @@ 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() { // 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 Loading services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +3 −4 Original line number Diff line number Diff line Loading @@ -92,7 +92,6 @@ public class HighBrightnessModeControllerTest { @Mock IThermalService mThermalServiceMock; @Mock Injector mInjectorMock; @Mock BrightnessSetting mBrightnessSetting; @Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor; Loading Loading @@ -123,7 +122,7 @@ public class HighBrightnessModeControllerTest { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( 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); } Loading @@ -132,7 +131,7 @@ public class HighBrightnessModeControllerTest { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting); DEFAULT_MAX, null, () -> {}, mContextSpy); hbmc.setAutoBrightnessEnabled(true); hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); Loading Loading @@ -464,7 +463,7 @@ public class HighBrightnessModeControllerTest { initHandler(clock); return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {}, mContextSpy, mBrightnessSetting); mContextSpy); } private void initHandler(OffsettableClock clock) { Loading Loading
services/core/java/com/android/server/display/DisplayPowerController.java +18 −12 Original line number Diff line number Diff line Loading @@ -778,7 +778,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call setUpAutoBrightness(mContext.getResources(), mHandler); reloadReduceBrightColours(); mHbmController.resetHbmData(info.width, info.height, token, mDisplayDeviceConfig.getHighBrightnessModeData(), mBrightnessSetting); mDisplayDeviceConfig.getHighBrightnessModeData()); } private void sendUpdatePowerState() { Loading Loading @@ -968,7 +968,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final boolean mustNotify; final int previousPolicy; boolean mustInitialize = false; boolean shouldSaveBrightnessInfo = true; int brightnessAdjustmentFlags = 0; mBrightnessReasonTemp.set(null); synchronized (mLock) { Loading Loading @@ -1099,7 +1098,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (state == Display.STATE_OFF) { brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT; mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF); shouldSaveBrightnessInfo = false; } // Always use the VR brightness when in the VR state. Loading Loading @@ -1217,6 +1215,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call brightnessAdjustmentFlags = 0; } } 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; brightnessAdjustmentFlags = 0; } Loading @@ -1224,9 +1226,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Use default brightness when dozing unless overridden. if ((Float.isNaN(brightnessState)) && Display.isDozeState(state)) { brightnessState = mScreenBrightnessDozeConfig; brightnessState = clampScreenBrightness(mScreenBrightnessDozeConfig); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT); shouldSaveBrightnessInfo = false; } // Apply manual brightness. Loading @@ -1241,12 +1242,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessReasonTemp.setReason(BrightnessReason.REASON_MANUAL); } // Save out the brightness info now that the brightness state for this iteration has been // finalized and before we send out notifications about the brightness changing. if (shouldSaveBrightnessInfo) { saveBrightnessInfo(brightnessState); } // The current brightness to use has been calculated at this point (minus the adjustments // like low-power and dim), and HbmController should be notified so that it can accurately // calculate HDR or HBM levels. We specifically do it here instead of having HbmController // 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) { // Tell the rest of the system about the new brightness in case we had to change it Loading @@ -1257,6 +1259,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 // timeout is about to expire. if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) { Loading Loading @@ -1533,7 +1539,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mHandler.post(mOnBrightnessChangeRunnable); // TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern. mAutomaticBrightnessController.update(); }, mContext, mBrightnessSetting); }, mContext); } private void blockScreenOn() { Loading
services/core/java/com/android/server/display/HighBrightnessModeController.java +12 −24 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ 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; Loading Loading @@ -70,7 +69,6 @@ class HighBrightnessModeController { private final Context mContext; private final SettingsObserver mSettingsObserver; private final Injector mInjector; private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged; private HdrListener mHdrListener; private HighBrightnessModeData mHbmData; Loading @@ -86,7 +84,6 @@ class HighBrightnessModeController { private boolean mIsBlockedByLowPowerMode = false; private int mWidth; private int mHeight; private BrightnessSetting mBrightnessSetting; private float mAmbientLux; /** Loading @@ -103,30 +100,30 @@ class HighBrightnessModeController { HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, 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, hbmData, hbmChangeCallback, context, brightnessSetting); hbmData, hbmChangeCallback, context); } @VisibleForTesting HighBrightnessModeController(Injector injector, Handler handler, int width, int height, IBinder displayToken, float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, Runnable hbmChangeCallback, Context context, BrightnessSetting brightnessSetting) { Context context) { mInjector = injector; mContext = context; mClock = injector.getClock(); mHandler = handler; mBrightness = brightnessMin; mBrightnessMin = brightnessMin; mBrightnessMax = brightnessMax; mBrightness = brightnessSetting.getBrightness(); mHbmChangeCallback = hbmChangeCallback; mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler); mSettingsObserver = new SettingsObserver(mHandler); mRecalcRunnable = this::recalculateTimeAllowance; mHdrListener = new HdrListener(); resetHbmData(width, height, displayToken, hbmData, brightnessSetting); resetHbmData(width, height, displayToken, hbmData); } void setAutoBrightnessEnabled(boolean isEnabled) { Loading Loading @@ -185,7 +182,6 @@ class HighBrightnessModeController { } } @VisibleForTesting void onBrightnessChanged(float brightness) { if (!deviceSupportsHbm()) { return; Loading Loading @@ -224,12 +220,11 @@ class HighBrightnessModeController { mSettingsObserver.stopObserving(); } void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData, BrightnessSetting brightnessSetting) { void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData) { mWidth = width; mHeight = height; mHbmData = hbmData; resetBrightnessSetting(brightnessSetting); unregisterHdrListener(); mSkinThermalStatusObserver.stopObserving(); mSettingsObserver.stopObserving(); Loading Loading @@ -261,9 +256,12 @@ class HighBrightnessModeController { pw.println(" mBrightness=" + mBrightness); pw.println(" mCurrentMin=" + getCurrentBrightnessMin()); 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(" mAmbientLux=" + mAmbientLux); pw.println(" mAmbientLux=" + mAmbientLux + (mIsAutoBrightnessEnabled ? "" : " (old/invalid)")); pw.println(" mIsInAllowedAmbientRange=" + mIsInAllowedAmbientRange); pw.println(" mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled); pw.println(" mIsHdrLayerPresent=" + mIsHdrLayerPresent); Loading Loading @@ -301,16 +299,6 @@ 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() { // 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 Loading
services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +3 −4 Original line number Diff line number Diff line Loading @@ -92,7 +92,6 @@ public class HighBrightnessModeControllerTest { @Mock IThermalService mThermalServiceMock; @Mock Injector mInjectorMock; @Mock BrightnessSetting mBrightnessSetting; @Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor; Loading Loading @@ -123,7 +122,7 @@ public class HighBrightnessModeControllerTest { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( 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); } Loading @@ -132,7 +131,7 @@ public class HighBrightnessModeControllerTest { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting); DEFAULT_MAX, null, () -> {}, mContextSpy); hbmc.setAutoBrightnessEnabled(true); hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); Loading Loading @@ -464,7 +463,7 @@ public class HighBrightnessModeControllerTest { initHandler(clock); return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {}, mContextSpy, mBrightnessSetting); mContextSpy); } private void initHandler(OffsettableClock clock) { Loading