Loading services/core/java/com/android/server/display/AutomaticBrightnessController.java +11 −6 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.os.BackgroundThread; import com.android.server.EventLogTags; import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.brightness.clamper.BrightnessClamperController; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading Loading @@ -252,6 +253,7 @@ public class AutomaticBrightnessController { // Controls Brightness range (including High Brightness Mode). private final BrightnessRangeController mBrightnessRangeController; private final BrightnessClamperController mBrightnessClamperController; // Throttles (caps) maximum allowed brightness private final BrightnessThrottler mBrightnessThrottler; Loading Loading @@ -287,7 +289,8 @@ public class AutomaticBrightnessController { HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits) { int ambientLightHorizonLong, float userLux, float userNits, BrightnessClamperController brightnessClamperController) { this(new Injector(), callbacks, looper, sensorManager, lightSensor, brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor, lightSensorRate, initialLightSensorRate, Loading @@ -297,7 +300,7 @@ public class AutomaticBrightnessController { screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, context, brightnessModeController, brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux, userNits userNits, brightnessClamperController ); } Loading @@ -313,9 +316,10 @@ public class AutomaticBrightnessController { HysteresisLevels screenBrightnessThresholds, HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, BrightnessRangeController brightnessRangeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits) { int ambientLightHorizonLong, float userLux, float userNits, BrightnessClamperController brightnessClamperController) { mInjector = injector; mClock = injector.createClock(); mContext = context; Loading Loading @@ -358,7 +362,8 @@ public class AutomaticBrightnessController { mPendingForegroundAppPackageName = null; mForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; mBrightnessRangeController = brightnessModeController; mBrightnessRangeController = brightnessRangeController; mBrightnessClamperController = brightnessClamperController; mBrightnessThrottler = brightnessThrottler; mBrightnessMappingStrategyMap = brightnessMappingStrategyMap; Loading Loading @@ -791,7 +796,7 @@ public class AutomaticBrightnessController { mAmbientBrightnessThresholds.getDarkeningThreshold(lux); } mBrightnessRangeController.onAmbientLuxChange(mAmbientLux); mBrightnessClamperController.onAmbientLuxChange(mAmbientLux); // If the short term model was invalidated and the change is drastic enough, reset it. mShortTermModel.maybeReset(mAmbientLux); Loading services/core/java/com/android/server/display/DisplayDeviceConfig.java +51 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.server.display.config.IdleScreenRefreshRateTimeout; import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint; import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholds; import com.android.server.display.config.IntegerArray; import com.android.server.display.config.LowBrightnessData; import com.android.server.display.config.LuxThrottling; import com.android.server.display.config.NitsMap; import com.android.server.display.config.NonNegativeFloatToFloatPoint; Loading Loading @@ -555,6 +556,24 @@ import javax.xml.datatype.DatatypeConfigurationException; * <majorVersion>2</majorVersion> * <minorVersion>0</minorVersion> * </usiVersion> * <lowBrightness enabled="true"> * <transitionPoint>0.1</transitionPoint> * * <nits>0.2</nits> * <nits>2.0</nits> * <nits>500.0</nits> * <nits>1000.0</nits> * * <backlight>0</backlight> * <backlight>0.0001</backlight> * <backlight>0.5</backlight> * <backlight>1.0</backlight> * * <brightness>0</brightness> * <brightness>0.1</brightness> * <brightness>0.5</brightness> * <brightness>1.0</brightness> * </lowBrightness> * <screenBrightnessCapForWearBedtimeMode>0.1</screenBrightnessCapForWearBedtimeMode> * <idleScreenRefreshRateTimeout> * <luxThresholds> Loading @@ -568,6 +587,8 @@ import javax.xml.datatype.DatatypeConfigurationException; * </point> * </luxThresholds> * </idleScreenRefreshRateTimeout> * * * </displayConfiguration> * } * </pre> Loading Loading @@ -732,6 +753,7 @@ public class DisplayDeviceConfig { private Spline mBacklightToBrightnessSpline; private Spline mBacklightToNitsSpline; private Spline mNitsToBacklightSpline; private List<String> mQuirks; private boolean mIsHighBrightnessModeEnabled = false; private HighBrightnessModeData mHbmData; Loading Loading @@ -872,6 +894,9 @@ public class DisplayDeviceConfig { @Nullable private HdrBrightnessData mHdrBrightnessData; @Nullable public LowBrightnessData mLowBrightnessData; /** * Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode. */ Loading Loading @@ -1813,6 +1838,15 @@ public class DisplayDeviceConfig { return mHostUsiVersion; } /** * * @return true if low brightness mode is enabled */ @VisibleForTesting public boolean getLbmEnabled() { return mLowBrightnessData != null; } /** * @return Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode. */ Loading Loading @@ -1952,6 +1986,8 @@ public class DisplayDeviceConfig { + "mUsiVersion= " + mHostUsiVersion + "\n" + "mHdrBrightnessData= " + mHdrBrightnessData + "\n" + "mBrightnessCapForWearBedtimeMode= " + mBrightnessCapForWearBedtimeMode + "\n" + (mLowBrightnessData != null ? mLowBrightnessData.toString() : "") + "}"; } Loading Loading @@ -2002,6 +2038,9 @@ public class DisplayDeviceConfig { loadDensityMapping(config); loadBrightnessDefaultFromDdcXml(config); loadBrightnessConstraintsFromConfigXml(); if (mFlags.isEvenDimmerEnabled()) { mLowBrightnessData = LowBrightnessData.loadConfig(config); } loadBrightnessMap(config); loadThermalThrottlingConfig(config); loadPowerThrottlingConfigData(config); Loading Loading @@ -2793,6 +2832,18 @@ public class DisplayDeviceConfig { // These splines are used to convert from the system brightness value to the HAL backlight // value private void createBacklightConversionSplines() { if (mLowBrightnessData != null) { mBrightnessToBacklightSpline = mLowBrightnessData.mBrightnessToBacklight; mBacklightToBrightnessSpline = mLowBrightnessData.mBacklightToBrightness; mBacklightToNitsSpline = mLowBrightnessData.mBacklightToNits; mNitsToBacklightSpline = mLowBrightnessData.mNitsToBacklight; mNits = mLowBrightnessData.mNits; mBrightness = mLowBrightnessData.mBrightness; mBacklight = mLowBrightnessData.mBacklight; return; } mBrightness = new float[mBacklight.length]; for (int i = 0; i < mBrightness.length; i++) { mBrightness[i] = MathUtils.map(mBacklight[0], Loading services/core/java/com/android/server/display/DisplayPowerController.java +7 −3 Original line number Diff line number Diff line Loading @@ -1165,7 +1165,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, mContext, mBrightnessRangeController, mBrightnessThrottler, mDisplayDeviceConfig.getAmbientHorizonShort(), mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits); mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits, mBrightnessClamperController); mDisplayBrightnessController.setAutomaticBrightnessController( mAutomaticBrightnessController); Loading Loading @@ -2479,6 +2480,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call public void setBrightnessToFollow(float leadDisplayBrightness, float nits, float ambientLux, boolean slowChange) { mBrightnessRangeController.onAmbientLuxChange(ambientLux); mBrightnessClamperController.onAmbientLuxChange(ambientLux); if (nits == BrightnessMappingStrategy.INVALID_NITS) { mDisplayBrightnessController.setBrightnessToFollow(leadDisplayBrightness, slowChange); } else { Loading Loading @@ -3176,7 +3178,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits) { int ambientLightHorizonLong, float userLux, float userNits, BrightnessClamperController brightnessClamperController) { return new AutomaticBrightnessController(callbacks, looper, sensorManager, lightSensor, brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor, lightSensorRate, initialLightSensorRate, Loading @@ -3186,7 +3190,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, context, brightnessModeController, brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux, userNits); userNits, brightnessClamperController); } BrightnessMappingStrategy getDefaultModeBrightnessMapper(Context context, Loading services/core/java/com/android/server/display/LocalDisplayAdapter.java +30 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import android.os.SystemProperties; import android.os.Trace; import android.util.DisplayUtils; import android.util.LongSparseArray; import android.util.MathUtils; import android.util.Slog; import android.util.SparseArray; import android.view.Display; Loading Loading @@ -78,6 +79,13 @@ final class LocalDisplayAdapter extends DisplayAdapter { private static final String UNIQUE_ID_PREFIX = "local:"; private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular"; // Min and max strengths for even dimmer feature. private static final float EVEN_DIMMER_MIN_STRENGTH = 0.0f; private static final float EVEN_DIMMER_MAX_STRENGTH = 70.0f; // not too dim yet. private static final float BRIGHTNESS_MIN = 0.0f; // The brightness at which we start using color matrices rather than backlight, // to dim the display private static final float BACKLIGHT_COLOR_TRANSITION_POINT = 0.1f; private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>(); Loading @@ -91,6 +99,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { private Context mOverlayContext; private int mEvenDimmerStrength = -1; // Called with SyncRoot lock held. LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, DisplayManagerFlags flags, Loading Loading @@ -928,6 +938,10 @@ final class LocalDisplayAdapter extends DisplayAdapter { final float nits = backlightToNits(backlight); final float sdrNits = backlightToNits(sdrBacklight); if (getFeatureFlags().isEvenDimmerEnabled()) { applyColorMatrixBasedDimming(brightnessState); } mBacklightAdapter.setBacklight(sdrBacklight, sdrNits, backlight, nits); Trace.traceCounter(Trace.TRACE_TAG_POWER, "ScreenBrightness", Loading Loading @@ -974,6 +988,22 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } } private void applyColorMatrixBasedDimming(float brightnessState) { int strength = (int) (MathUtils.constrainedMap( EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // to this range BRIGHTNESS_MIN, BACKLIGHT_COLOR_TRANSITION_POINT, // from this range brightnessState) + 0.5); // map this (+ rounded up) if (mEvenDimmerStrength < 0 // uninitialised || MathUtils.abs(mEvenDimmerStrength - strength) > 1 || strength <= 1) { mEvenDimmerStrength = strength; } // TODO: use `enabled` and `mRbcStrength` to set color matrices here // TODO: boolean enabled = mEvenDimmerStrength > 0.0f; } }; } return null; Loading services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java +7 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,13 @@ public class BrightnessClamperController { mModifiers.forEach(BrightnessStateModifier::stop); } /** * Notifies modifiers that ambient lux has changed. * @param ambientLux current lux, debounced */ public void onAmbientLuxChange(float ambientLux) { mModifiers.forEach(modifier -> modifier.onAmbientLuxChange(ambientLux)); } // Called in DisplayControllerHandler private void recalculateBrightnessCap() { Loading Loading
services/core/java/com/android/server/display/AutomaticBrightnessController.java +11 −6 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.os.BackgroundThread; import com.android.server.EventLogTags; import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.brightness.clamper.BrightnessClamperController; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading Loading @@ -252,6 +253,7 @@ public class AutomaticBrightnessController { // Controls Brightness range (including High Brightness Mode). private final BrightnessRangeController mBrightnessRangeController; private final BrightnessClamperController mBrightnessClamperController; // Throttles (caps) maximum allowed brightness private final BrightnessThrottler mBrightnessThrottler; Loading Loading @@ -287,7 +289,8 @@ public class AutomaticBrightnessController { HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits) { int ambientLightHorizonLong, float userLux, float userNits, BrightnessClamperController brightnessClamperController) { this(new Injector(), callbacks, looper, sensorManager, lightSensor, brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor, lightSensorRate, initialLightSensorRate, Loading @@ -297,7 +300,7 @@ public class AutomaticBrightnessController { screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, context, brightnessModeController, brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux, userNits userNits, brightnessClamperController ); } Loading @@ -313,9 +316,10 @@ public class AutomaticBrightnessController { HysteresisLevels screenBrightnessThresholds, HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, BrightnessRangeController brightnessRangeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits) { int ambientLightHorizonLong, float userLux, float userNits, BrightnessClamperController brightnessClamperController) { mInjector = injector; mClock = injector.createClock(); mContext = context; Loading Loading @@ -358,7 +362,8 @@ public class AutomaticBrightnessController { mPendingForegroundAppPackageName = null; mForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; mBrightnessRangeController = brightnessModeController; mBrightnessRangeController = brightnessRangeController; mBrightnessClamperController = brightnessClamperController; mBrightnessThrottler = brightnessThrottler; mBrightnessMappingStrategyMap = brightnessMappingStrategyMap; Loading Loading @@ -791,7 +796,7 @@ public class AutomaticBrightnessController { mAmbientBrightnessThresholds.getDarkeningThreshold(lux); } mBrightnessRangeController.onAmbientLuxChange(mAmbientLux); mBrightnessClamperController.onAmbientLuxChange(mAmbientLux); // If the short term model was invalidated and the change is drastic enough, reset it. mShortTermModel.maybeReset(mAmbientLux); Loading
services/core/java/com/android/server/display/DisplayDeviceConfig.java +51 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.server.display.config.IdleScreenRefreshRateTimeout; import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint; import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholds; import com.android.server.display.config.IntegerArray; import com.android.server.display.config.LowBrightnessData; import com.android.server.display.config.LuxThrottling; import com.android.server.display.config.NitsMap; import com.android.server.display.config.NonNegativeFloatToFloatPoint; Loading Loading @@ -555,6 +556,24 @@ import javax.xml.datatype.DatatypeConfigurationException; * <majorVersion>2</majorVersion> * <minorVersion>0</minorVersion> * </usiVersion> * <lowBrightness enabled="true"> * <transitionPoint>0.1</transitionPoint> * * <nits>0.2</nits> * <nits>2.0</nits> * <nits>500.0</nits> * <nits>1000.0</nits> * * <backlight>0</backlight> * <backlight>0.0001</backlight> * <backlight>0.5</backlight> * <backlight>1.0</backlight> * * <brightness>0</brightness> * <brightness>0.1</brightness> * <brightness>0.5</brightness> * <brightness>1.0</brightness> * </lowBrightness> * <screenBrightnessCapForWearBedtimeMode>0.1</screenBrightnessCapForWearBedtimeMode> * <idleScreenRefreshRateTimeout> * <luxThresholds> Loading @@ -568,6 +587,8 @@ import javax.xml.datatype.DatatypeConfigurationException; * </point> * </luxThresholds> * </idleScreenRefreshRateTimeout> * * * </displayConfiguration> * } * </pre> Loading Loading @@ -732,6 +753,7 @@ public class DisplayDeviceConfig { private Spline mBacklightToBrightnessSpline; private Spline mBacklightToNitsSpline; private Spline mNitsToBacklightSpline; private List<String> mQuirks; private boolean mIsHighBrightnessModeEnabled = false; private HighBrightnessModeData mHbmData; Loading Loading @@ -872,6 +894,9 @@ public class DisplayDeviceConfig { @Nullable private HdrBrightnessData mHdrBrightnessData; @Nullable public LowBrightnessData mLowBrightnessData; /** * Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode. */ Loading Loading @@ -1813,6 +1838,15 @@ public class DisplayDeviceConfig { return mHostUsiVersion; } /** * * @return true if low brightness mode is enabled */ @VisibleForTesting public boolean getLbmEnabled() { return mLowBrightnessData != null; } /** * @return Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode. */ Loading Loading @@ -1952,6 +1986,8 @@ public class DisplayDeviceConfig { + "mUsiVersion= " + mHostUsiVersion + "\n" + "mHdrBrightnessData= " + mHdrBrightnessData + "\n" + "mBrightnessCapForWearBedtimeMode= " + mBrightnessCapForWearBedtimeMode + "\n" + (mLowBrightnessData != null ? mLowBrightnessData.toString() : "") + "}"; } Loading Loading @@ -2002,6 +2038,9 @@ public class DisplayDeviceConfig { loadDensityMapping(config); loadBrightnessDefaultFromDdcXml(config); loadBrightnessConstraintsFromConfigXml(); if (mFlags.isEvenDimmerEnabled()) { mLowBrightnessData = LowBrightnessData.loadConfig(config); } loadBrightnessMap(config); loadThermalThrottlingConfig(config); loadPowerThrottlingConfigData(config); Loading Loading @@ -2793,6 +2832,18 @@ public class DisplayDeviceConfig { // These splines are used to convert from the system brightness value to the HAL backlight // value private void createBacklightConversionSplines() { if (mLowBrightnessData != null) { mBrightnessToBacklightSpline = mLowBrightnessData.mBrightnessToBacklight; mBacklightToBrightnessSpline = mLowBrightnessData.mBacklightToBrightness; mBacklightToNitsSpline = mLowBrightnessData.mBacklightToNits; mNitsToBacklightSpline = mLowBrightnessData.mNitsToBacklight; mNits = mLowBrightnessData.mNits; mBrightness = mLowBrightnessData.mBrightness; mBacklight = mLowBrightnessData.mBacklight; return; } mBrightness = new float[mBacklight.length]; for (int i = 0; i < mBrightness.length; i++) { mBrightness[i] = MathUtils.map(mBacklight[0], Loading
services/core/java/com/android/server/display/DisplayPowerController.java +7 −3 Original line number Diff line number Diff line Loading @@ -1165,7 +1165,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, mContext, mBrightnessRangeController, mBrightnessThrottler, mDisplayDeviceConfig.getAmbientHorizonShort(), mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits); mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits, mBrightnessClamperController); mDisplayBrightnessController.setAutomaticBrightnessController( mAutomaticBrightnessController); Loading Loading @@ -2479,6 +2480,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call public void setBrightnessToFollow(float leadDisplayBrightness, float nits, float ambientLux, boolean slowChange) { mBrightnessRangeController.onAmbientLuxChange(ambientLux); mBrightnessClamperController.onAmbientLuxChange(ambientLux); if (nits == BrightnessMappingStrategy.INVALID_NITS) { mDisplayBrightnessController.setBrightnessToFollow(leadDisplayBrightness, slowChange); } else { Loading Loading @@ -3176,7 +3178,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits) { int ambientLightHorizonLong, float userLux, float userNits, BrightnessClamperController brightnessClamperController) { return new AutomaticBrightnessController(callbacks, looper, sensorManager, lightSensor, brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor, lightSensorRate, initialLightSensorRate, Loading @@ -3186,7 +3190,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, context, brightnessModeController, brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux, userNits); userNits, brightnessClamperController); } BrightnessMappingStrategy getDefaultModeBrightnessMapper(Context context, Loading
services/core/java/com/android/server/display/LocalDisplayAdapter.java +30 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import android.os.SystemProperties; import android.os.Trace; import android.util.DisplayUtils; import android.util.LongSparseArray; import android.util.MathUtils; import android.util.Slog; import android.util.SparseArray; import android.view.Display; Loading Loading @@ -78,6 +79,13 @@ final class LocalDisplayAdapter extends DisplayAdapter { private static final String UNIQUE_ID_PREFIX = "local:"; private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular"; // Min and max strengths for even dimmer feature. private static final float EVEN_DIMMER_MIN_STRENGTH = 0.0f; private static final float EVEN_DIMMER_MAX_STRENGTH = 70.0f; // not too dim yet. private static final float BRIGHTNESS_MIN = 0.0f; // The brightness at which we start using color matrices rather than backlight, // to dim the display private static final float BACKLIGHT_COLOR_TRANSITION_POINT = 0.1f; private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>(); Loading @@ -91,6 +99,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { private Context mOverlayContext; private int mEvenDimmerStrength = -1; // Called with SyncRoot lock held. LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, DisplayManagerFlags flags, Loading Loading @@ -928,6 +938,10 @@ final class LocalDisplayAdapter extends DisplayAdapter { final float nits = backlightToNits(backlight); final float sdrNits = backlightToNits(sdrBacklight); if (getFeatureFlags().isEvenDimmerEnabled()) { applyColorMatrixBasedDimming(brightnessState); } mBacklightAdapter.setBacklight(sdrBacklight, sdrNits, backlight, nits); Trace.traceCounter(Trace.TRACE_TAG_POWER, "ScreenBrightness", Loading Loading @@ -974,6 +988,22 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } } private void applyColorMatrixBasedDimming(float brightnessState) { int strength = (int) (MathUtils.constrainedMap( EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // to this range BRIGHTNESS_MIN, BACKLIGHT_COLOR_TRANSITION_POINT, // from this range brightnessState) + 0.5); // map this (+ rounded up) if (mEvenDimmerStrength < 0 // uninitialised || MathUtils.abs(mEvenDimmerStrength - strength) > 1 || strength <= 1) { mEvenDimmerStrength = strength; } // TODO: use `enabled` and `mRbcStrength` to set color matrices here // TODO: boolean enabled = mEvenDimmerStrength > 0.0f; } }; } return null; Loading
services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java +7 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,13 @@ public class BrightnessClamperController { mModifiers.forEach(BrightnessStateModifier::stop); } /** * Notifies modifiers that ambient lux has changed. * @param ambientLux current lux, debounced */ public void onAmbientLuxChange(float ambientLux) { mModifiers.forEach(modifier -> modifier.onAmbientLuxChange(ambientLux)); } // Called in DisplayControllerHandler private void recalculateBrightnessCap() { Loading