Loading core/res/res/values/config.xml +24 −0 Original line number Diff line number Diff line Loading @@ -861,10 +861,34 @@ <!-- Allow automatic adjusting of the screen brightness while dozing in low power state. --> <bool name="config_allowAutoBrightnessWhileDozing">false</bool> <!-- Stability requirements in milliseconds for accepting a new brightness level. This is used for debouncing the light sensor. Different constants are used to debounce the light sensor when adapting to brighter or darker environments. This parameter controls how quickly brightness changes occur in response to an observed change in light level that exceeds the hysteresis threshold. --> <integer name="config_autoBrightnessBrighteningLightDebounce">4000</integer> <integer name="config_autoBrightnessDarkeningLightDebounce">8000</integer> <!-- Light sensor event rate in milliseconds for automatic brightness control. --> <integer name="config_autoBrightnessLightSensorRate">250</integer> <!-- If we allow automatic adjustment of screen brightness while dozing, how many times we want to reduce it to preserve the battery. Value of 100% means no scaling. --> <fraction name="config_screenAutoBrightnessDozeScaleFactor">100%</fraction> <!-- When the screen is turned on, the previous estimate of the ambient light level at the time the screen was turned off is restored and is used to determine the initial screen brightness. If this flag is true, then the ambient light level estimate will be promptly recomputed after the warm-up interface and the screen brightness will be adjusted immediately. If this flag is false, then the ambient light level estimate will be adjusted more gradually in the same manner that normally happens when the screen is on according to the brightening or dimming debounce thresholds. As a result, it may take somewhat longer to adapt to the environment. This mode may be better suited for watches. --> <bool name="config_autoBrightnessResetAmbientLuxAfterWarmUp">true</bool> <!-- Screen brightness used to dim the screen when the user activity timeout expires. May be less than the minimum allowed brightness setting that can be set by the user. --> Loading core/res/res/values/symbols.xml +4 −0 Original line number Diff line number Diff line Loading @@ -1586,6 +1586,7 @@ <java-symbol type="bool" name="config_useAttentionLight" /> <java-symbol type="bool" name="config_animateScreenLights" /> <java-symbol type="bool" name="config_automatic_brightness_available" /> <java-symbol type="bool" name="config_autoBrightnessResetAmbientLuxAfterWarmUp" /> <java-symbol type="bool" name="config_dozeAfterScreenOff" /> <java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" /> <java-symbol type="bool" name="config_enableFusedLocationOverlay" /> Loading Loading @@ -1641,6 +1642,9 @@ <java-symbol type="id" name="replace_message" /> <java-symbol type="fraction" name="config_dimBehindFadeDuration" /> <java-symbol type="fraction" name="config_screenAutoBrightnessDozeScaleFactor" /> <java-symbol type="integer" name="config_autoBrightnessBrighteningLightDebounce"/> <java-symbol type="integer" name="config_autoBrightnessDarkeningLightDebounce"/> <java-symbol type="integer" name="config_autoBrightnessLightSensorRate"/> <java-symbol type="integer" name="config_carDockKeepsScreenOn" /> <java-symbol type="integer" name="config_criticalBatteryWarningLevel" /> <java-symbol type="integer" name="config_datause_notification_type" /> Loading services/core/java/com/android/server/display/AutomaticBrightnessController.java +34 −22 Original line number Diff line number Diff line Loading @@ -52,20 +52,9 @@ class AutomaticBrightnessController { // auto-brightness adjustment setting. private static final float SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT_MAX_GAMMA = 3.0f; // Light sensor event rate in milliseconds. private static final int LIGHT_SENSOR_RATE_MILLIS = 1000; // Period of time in which to consider light samples in milliseconds. private static final int AMBIENT_LIGHT_HORIZON = 10000; // Stability requirements in milliseconds for accepting a new brightness level. This is used // for debouncing the light sensor. Different constants are used to debounce the light sensor // when adapting to brighter or darker environments. This parameter controls how quickly // brightness changes occur in response to an observed change in light level that exceeds the // hysteresis threshold. private static final long BRIGHTENING_LIGHT_DEBOUNCE = 4000; private static final long DARKENING_LIGHT_DEBOUNCE = 8000; // Hysteresis constraints for brightening or darkening. // The recent lux must have changed by at least this fraction relative to the // current ambient lux before a change will be considered. Loading Loading @@ -121,6 +110,22 @@ class AutomaticBrightnessController { private final int mScreenBrightnessRangeMaximum; private final float mDozeScaleFactor; // Light sensor event rate in milliseconds. private final int mLightSensorRate; // Stability requirements in milliseconds for accepting a new brightness level. This is used // for debouncing the light sensor. Different constants are used to debounce the light sensor // when adapting to brighter or darker environments. This parameter controls how quickly // brightness changes occur in response to an observed change in light level that exceeds the // hysteresis threshold. private final long mBrighteningLightDebounceConfig; private final long mDarkeningLightDebounceConfig; // If true immediately after the screen is turned on the controller will try to adjust the // brightness based on the current sensor reads. If false, the controller will collect more data // and only then decide whether to change brightness. private final boolean mResetAmbientLuxAfterWarmUpConfig; // Amount of time to delay auto-brightness after screen on while waiting for // the light sensor to warm-up in milliseconds. // May be 0 if no warm-up is required. Loading Loading @@ -176,7 +181,9 @@ class AutomaticBrightnessController { public AutomaticBrightnessController(Callbacks callbacks, Looper looper, SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime, int brightnessMin, int brightnessMax, float dozeScaleFactor) { int brightnessMin, int brightnessMax, float dozeScaleFactor, int lightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig) { mCallbacks = callbacks; mTwilight = LocalServices.getService(TwilightManager.class); mSensorManager = sensorManager; Loading @@ -185,9 +192,13 @@ class AutomaticBrightnessController { mScreenBrightnessRangeMaximum = brightnessMax; mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime; mDozeScaleFactor = dozeScaleFactor; mLightSensorRate = lightSensorRate; mBrighteningLightDebounceConfig = brighteningLightDebounceConfig; mDarkeningLightDebounceConfig = darkeningLightDebounceConfig; mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig; mHandler = new AutomaticBrightnessHandler(looper); mAmbientLightRingBuffer = new AmbientLightRingBuffer(); mAmbientLightRingBuffer = new AmbientLightRingBuffer(mLightSensorRate); if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) { mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); Loading Loading @@ -226,6 +237,9 @@ class AutomaticBrightnessController { pw.println(" mScreenBrightnessRangeMinimum=" + mScreenBrightnessRangeMinimum); pw.println(" mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum); pw.println(" mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig); pw.println(" mBrighteningLightDebounceConfig=" + mBrighteningLightDebounceConfig); pw.println(" mDarkeningLightDebounceConfig=" + mDarkeningLightDebounceConfig); pw.println(" mResetAmbientLuxAfterWarmUpConfig=" + mResetAmbientLuxAfterWarmUpConfig); pw.println(); pw.println("Automatic Brightness Controller State:"); Loading @@ -252,13 +266,13 @@ class AutomaticBrightnessController { mLightSensorEnabled = true; mLightSensorEnableTime = SystemClock.uptimeMillis(); mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MILLIS * 1000, mHandler); mLightSensorRate * 1000, mHandler); return true; } } else { if (mLightSensorEnabled) { mLightSensorEnabled = false; mAmbientLuxValid = false; mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig; mRecentLightSamples = 0; mAmbientLightRingBuffer.clear(); mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); Loading Loading @@ -347,7 +361,7 @@ class AutomaticBrightnessController { } earliestValidTime = mAmbientLightRingBuffer.getTime(i); } return earliestValidTime + BRIGHTENING_LIGHT_DEBOUNCE; return earliestValidTime + mBrighteningLightDebounceConfig; } private long nextAmbientLightDarkeningTransition(long time) { Loading @@ -359,7 +373,7 @@ class AutomaticBrightnessController { } earliestValidTime = mAmbientLightRingBuffer.getTime(i); } return earliestValidTime + DARKENING_LIGHT_DEBOUNCE; return earliestValidTime + mDarkeningLightDebounceConfig; } private void updateAmbientLux() { Loading Loading @@ -420,7 +434,7 @@ class AutomaticBrightnessController { // should be enough time to decide whether we should actually transition to the new // weighted ambient lux or not. nextTransitionTime = nextTransitionTime > time ? nextTransitionTime : time + LIGHT_SENSOR_RATE_MILLIS; nextTransitionTime > time ? nextTransitionTime : time + mLightSensorRate; if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for " + nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime)); Loading Loading @@ -559,8 +573,6 @@ class AutomaticBrightnessController { // Proportional extra capacity of the buffer beyond the expected number of light samples // in the horizon private static final float BUFFER_SLACK = 1.5f; private static final int DEFAULT_CAPACITY = (int) Math.ceil(AMBIENT_LIGHT_HORIZON * BUFFER_SLACK / LIGHT_SENSOR_RATE_MILLIS); private float[] mRingLux; private long[] mRingTime; private int mCapacity; Loading @@ -571,8 +583,8 @@ class AutomaticBrightnessController { private int mEnd; private int mCount; public AmbientLightRingBuffer() { this(DEFAULT_CAPACITY); public AmbientLightRingBuffer(long lightSensorRate) { this((int) Math.ceil(AMBIENT_LIGHT_HORIZON * BUFFER_SLACK / lightSensorRate)); } public AmbientLightRingBuffer(int initialCapacity) { Loading services/core/java/com/android/server/display/DisplayPowerController.java +12 −1 Original line number Diff line number Diff line Loading @@ -302,6 +302,15 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean( com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing); int lightSensorRate = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessLightSensorRate); long brighteningLightDebounce = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); long darkeningLightDebounce = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce); boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); if (mUseSoftwareAutoBrightnessConfig) { int[] lux = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLevels); Loading Loading @@ -336,7 +345,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mAutomaticBrightnessController = new AutomaticBrightnessController(this, handler.getLooper(), sensorManager, screenAutoBrightnessSpline, lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum, dozeScaleFactor); mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate, brighteningLightDebounce, darkeningLightDebounce, autoBrightnessResetAmbientLuxAfterWarmUp); } } Loading Loading
core/res/res/values/config.xml +24 −0 Original line number Diff line number Diff line Loading @@ -861,10 +861,34 @@ <!-- Allow automatic adjusting of the screen brightness while dozing in low power state. --> <bool name="config_allowAutoBrightnessWhileDozing">false</bool> <!-- Stability requirements in milliseconds for accepting a new brightness level. This is used for debouncing the light sensor. Different constants are used to debounce the light sensor when adapting to brighter or darker environments. This parameter controls how quickly brightness changes occur in response to an observed change in light level that exceeds the hysteresis threshold. --> <integer name="config_autoBrightnessBrighteningLightDebounce">4000</integer> <integer name="config_autoBrightnessDarkeningLightDebounce">8000</integer> <!-- Light sensor event rate in milliseconds for automatic brightness control. --> <integer name="config_autoBrightnessLightSensorRate">250</integer> <!-- If we allow automatic adjustment of screen brightness while dozing, how many times we want to reduce it to preserve the battery. Value of 100% means no scaling. --> <fraction name="config_screenAutoBrightnessDozeScaleFactor">100%</fraction> <!-- When the screen is turned on, the previous estimate of the ambient light level at the time the screen was turned off is restored and is used to determine the initial screen brightness. If this flag is true, then the ambient light level estimate will be promptly recomputed after the warm-up interface and the screen brightness will be adjusted immediately. If this flag is false, then the ambient light level estimate will be adjusted more gradually in the same manner that normally happens when the screen is on according to the brightening or dimming debounce thresholds. As a result, it may take somewhat longer to adapt to the environment. This mode may be better suited for watches. --> <bool name="config_autoBrightnessResetAmbientLuxAfterWarmUp">true</bool> <!-- Screen brightness used to dim the screen when the user activity timeout expires. May be less than the minimum allowed brightness setting that can be set by the user. --> Loading
core/res/res/values/symbols.xml +4 −0 Original line number Diff line number Diff line Loading @@ -1586,6 +1586,7 @@ <java-symbol type="bool" name="config_useAttentionLight" /> <java-symbol type="bool" name="config_animateScreenLights" /> <java-symbol type="bool" name="config_automatic_brightness_available" /> <java-symbol type="bool" name="config_autoBrightnessResetAmbientLuxAfterWarmUp" /> <java-symbol type="bool" name="config_dozeAfterScreenOff" /> <java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" /> <java-symbol type="bool" name="config_enableFusedLocationOverlay" /> Loading Loading @@ -1641,6 +1642,9 @@ <java-symbol type="id" name="replace_message" /> <java-symbol type="fraction" name="config_dimBehindFadeDuration" /> <java-symbol type="fraction" name="config_screenAutoBrightnessDozeScaleFactor" /> <java-symbol type="integer" name="config_autoBrightnessBrighteningLightDebounce"/> <java-symbol type="integer" name="config_autoBrightnessDarkeningLightDebounce"/> <java-symbol type="integer" name="config_autoBrightnessLightSensorRate"/> <java-symbol type="integer" name="config_carDockKeepsScreenOn" /> <java-symbol type="integer" name="config_criticalBatteryWarningLevel" /> <java-symbol type="integer" name="config_datause_notification_type" /> Loading
services/core/java/com/android/server/display/AutomaticBrightnessController.java +34 −22 Original line number Diff line number Diff line Loading @@ -52,20 +52,9 @@ class AutomaticBrightnessController { // auto-brightness adjustment setting. private static final float SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT_MAX_GAMMA = 3.0f; // Light sensor event rate in milliseconds. private static final int LIGHT_SENSOR_RATE_MILLIS = 1000; // Period of time in which to consider light samples in milliseconds. private static final int AMBIENT_LIGHT_HORIZON = 10000; // Stability requirements in milliseconds for accepting a new brightness level. This is used // for debouncing the light sensor. Different constants are used to debounce the light sensor // when adapting to brighter or darker environments. This parameter controls how quickly // brightness changes occur in response to an observed change in light level that exceeds the // hysteresis threshold. private static final long BRIGHTENING_LIGHT_DEBOUNCE = 4000; private static final long DARKENING_LIGHT_DEBOUNCE = 8000; // Hysteresis constraints for brightening or darkening. // The recent lux must have changed by at least this fraction relative to the // current ambient lux before a change will be considered. Loading Loading @@ -121,6 +110,22 @@ class AutomaticBrightnessController { private final int mScreenBrightnessRangeMaximum; private final float mDozeScaleFactor; // Light sensor event rate in milliseconds. private final int mLightSensorRate; // Stability requirements in milliseconds for accepting a new brightness level. This is used // for debouncing the light sensor. Different constants are used to debounce the light sensor // when adapting to brighter or darker environments. This parameter controls how quickly // brightness changes occur in response to an observed change in light level that exceeds the // hysteresis threshold. private final long mBrighteningLightDebounceConfig; private final long mDarkeningLightDebounceConfig; // If true immediately after the screen is turned on the controller will try to adjust the // brightness based on the current sensor reads. If false, the controller will collect more data // and only then decide whether to change brightness. private final boolean mResetAmbientLuxAfterWarmUpConfig; // Amount of time to delay auto-brightness after screen on while waiting for // the light sensor to warm-up in milliseconds. // May be 0 if no warm-up is required. Loading Loading @@ -176,7 +181,9 @@ class AutomaticBrightnessController { public AutomaticBrightnessController(Callbacks callbacks, Looper looper, SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime, int brightnessMin, int brightnessMax, float dozeScaleFactor) { int brightnessMin, int brightnessMax, float dozeScaleFactor, int lightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig) { mCallbacks = callbacks; mTwilight = LocalServices.getService(TwilightManager.class); mSensorManager = sensorManager; Loading @@ -185,9 +192,13 @@ class AutomaticBrightnessController { mScreenBrightnessRangeMaximum = brightnessMax; mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime; mDozeScaleFactor = dozeScaleFactor; mLightSensorRate = lightSensorRate; mBrighteningLightDebounceConfig = brighteningLightDebounceConfig; mDarkeningLightDebounceConfig = darkeningLightDebounceConfig; mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig; mHandler = new AutomaticBrightnessHandler(looper); mAmbientLightRingBuffer = new AmbientLightRingBuffer(); mAmbientLightRingBuffer = new AmbientLightRingBuffer(mLightSensorRate); if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) { mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); Loading Loading @@ -226,6 +237,9 @@ class AutomaticBrightnessController { pw.println(" mScreenBrightnessRangeMinimum=" + mScreenBrightnessRangeMinimum); pw.println(" mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum); pw.println(" mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig); pw.println(" mBrighteningLightDebounceConfig=" + mBrighteningLightDebounceConfig); pw.println(" mDarkeningLightDebounceConfig=" + mDarkeningLightDebounceConfig); pw.println(" mResetAmbientLuxAfterWarmUpConfig=" + mResetAmbientLuxAfterWarmUpConfig); pw.println(); pw.println("Automatic Brightness Controller State:"); Loading @@ -252,13 +266,13 @@ class AutomaticBrightnessController { mLightSensorEnabled = true; mLightSensorEnableTime = SystemClock.uptimeMillis(); mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MILLIS * 1000, mHandler); mLightSensorRate * 1000, mHandler); return true; } } else { if (mLightSensorEnabled) { mLightSensorEnabled = false; mAmbientLuxValid = false; mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig; mRecentLightSamples = 0; mAmbientLightRingBuffer.clear(); mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); Loading Loading @@ -347,7 +361,7 @@ class AutomaticBrightnessController { } earliestValidTime = mAmbientLightRingBuffer.getTime(i); } return earliestValidTime + BRIGHTENING_LIGHT_DEBOUNCE; return earliestValidTime + mBrighteningLightDebounceConfig; } private long nextAmbientLightDarkeningTransition(long time) { Loading @@ -359,7 +373,7 @@ class AutomaticBrightnessController { } earliestValidTime = mAmbientLightRingBuffer.getTime(i); } return earliestValidTime + DARKENING_LIGHT_DEBOUNCE; return earliestValidTime + mDarkeningLightDebounceConfig; } private void updateAmbientLux() { Loading Loading @@ -420,7 +434,7 @@ class AutomaticBrightnessController { // should be enough time to decide whether we should actually transition to the new // weighted ambient lux or not. nextTransitionTime = nextTransitionTime > time ? nextTransitionTime : time + LIGHT_SENSOR_RATE_MILLIS; nextTransitionTime > time ? nextTransitionTime : time + mLightSensorRate; if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for " + nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime)); Loading Loading @@ -559,8 +573,6 @@ class AutomaticBrightnessController { // Proportional extra capacity of the buffer beyond the expected number of light samples // in the horizon private static final float BUFFER_SLACK = 1.5f; private static final int DEFAULT_CAPACITY = (int) Math.ceil(AMBIENT_LIGHT_HORIZON * BUFFER_SLACK / LIGHT_SENSOR_RATE_MILLIS); private float[] mRingLux; private long[] mRingTime; private int mCapacity; Loading @@ -571,8 +583,8 @@ class AutomaticBrightnessController { private int mEnd; private int mCount; public AmbientLightRingBuffer() { this(DEFAULT_CAPACITY); public AmbientLightRingBuffer(long lightSensorRate) { this((int) Math.ceil(AMBIENT_LIGHT_HORIZON * BUFFER_SLACK / lightSensorRate)); } public AmbientLightRingBuffer(int initialCapacity) { Loading
services/core/java/com/android/server/display/DisplayPowerController.java +12 −1 Original line number Diff line number Diff line Loading @@ -302,6 +302,15 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean( com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing); int lightSensorRate = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessLightSensorRate); long brighteningLightDebounce = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); long darkeningLightDebounce = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce); boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); if (mUseSoftwareAutoBrightnessConfig) { int[] lux = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLevels); Loading Loading @@ -336,7 +345,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mAutomaticBrightnessController = new AutomaticBrightnessController(this, handler.getLooper(), sensorManager, screenAutoBrightnessSpline, lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum, dozeScaleFactor); mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate, brighteningLightDebounce, darkeningLightDebounce, autoBrightnessResetAmbientLuxAfterWarmUp); } } Loading