Merge "Support for faster brightness response to light changes." into lmp-mr1-modular-dev

This commit is contained in:
Filip Gruszczynski
2015-02-14 02:21:40 +00:00
committed by Android (Google) Code Review
4 changed files with 74 additions and 23 deletions

View File

@@ -861,10 +861,34 @@
<!-- Allow automatic adjusting of the screen brightness while dozing in low power state. --> <!-- Allow automatic adjusting of the screen brightness while dozing in low power state. -->
<bool name="config_allowAutoBrightnessWhileDozing">false</bool> <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 <!-- 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. --> to reduce it to preserve the battery. Value of 100% means no scaling. -->
<fraction name="config_screenAutoBrightnessDozeScaleFactor">100%</fraction> <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 <!-- Screen brightness used to dim the screen when the user activity
timeout expires. May be less than the minimum allowed brightness setting timeout expires. May be less than the minimum allowed brightness setting
that can be set by the user. --> that can be set by the user. -->

View File

@@ -1586,6 +1586,7 @@
<java-symbol type="bool" name="config_useAttentionLight" /> <java-symbol type="bool" name="config_useAttentionLight" />
<java-symbol type="bool" name="config_animateScreenLights" /> <java-symbol type="bool" name="config_animateScreenLights" />
<java-symbol type="bool" name="config_automatic_brightness_available" /> <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_dozeAfterScreenOff" />
<java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" /> <java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" />
<java-symbol type="bool" name="config_enableFusedLocationOverlay" /> <java-symbol type="bool" name="config_enableFusedLocationOverlay" />
@@ -1641,6 +1642,9 @@
<java-symbol type="id" name="replace_message" /> <java-symbol type="id" name="replace_message" />
<java-symbol type="fraction" name="config_dimBehindFadeDuration" /> <java-symbol type="fraction" name="config_dimBehindFadeDuration" />
<java-symbol type="fraction" name="config_screenAutoBrightnessDozeScaleFactor" /> <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_carDockKeepsScreenOn" />
<java-symbol type="integer" name="config_criticalBatteryWarningLevel" /> <java-symbol type="integer" name="config_criticalBatteryWarningLevel" />
<java-symbol type="integer" name="config_datause_notification_type" /> <java-symbol type="integer" name="config_datause_notification_type" />

View File

@@ -52,20 +52,9 @@ class AutomaticBrightnessController {
// auto-brightness adjustment setting. // auto-brightness adjustment setting.
private static final float SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT_MAX_GAMMA = 3.0f; 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. // Period of time in which to consider light samples in milliseconds.
private static final int AMBIENT_LIGHT_HORIZON = 10000; 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. // Hysteresis constraints for brightening or darkening.
// The recent lux must have changed by at least this fraction relative to the // The recent lux must have changed by at least this fraction relative to the
// current ambient lux before a change will be considered. // current ambient lux before a change will be considered.
@@ -121,6 +110,22 @@ class AutomaticBrightnessController {
private final int mScreenBrightnessRangeMaximum; private final int mScreenBrightnessRangeMaximum;
private final float mDozeScaleFactor; 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 // Amount of time to delay auto-brightness after screen on while waiting for
// the light sensor to warm-up in milliseconds. // the light sensor to warm-up in milliseconds.
// May be 0 if no warm-up is required. // May be 0 if no warm-up is required.
@@ -176,7 +181,9 @@ class AutomaticBrightnessController {
public AutomaticBrightnessController(Callbacks callbacks, Looper looper, public AutomaticBrightnessController(Callbacks callbacks, Looper looper,
SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime, 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; mCallbacks = callbacks;
mTwilight = LocalServices.getService(TwilightManager.class); mTwilight = LocalServices.getService(TwilightManager.class);
mSensorManager = sensorManager; mSensorManager = sensorManager;
@@ -185,9 +192,13 @@ class AutomaticBrightnessController {
mScreenBrightnessRangeMaximum = brightnessMax; mScreenBrightnessRangeMaximum = brightnessMax;
mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime; mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime;
mDozeScaleFactor = dozeScaleFactor; mDozeScaleFactor = dozeScaleFactor;
mLightSensorRate = lightSensorRate;
mBrighteningLightDebounceConfig = brighteningLightDebounceConfig;
mDarkeningLightDebounceConfig = darkeningLightDebounceConfig;
mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig;
mHandler = new AutomaticBrightnessHandler(looper); mHandler = new AutomaticBrightnessHandler(looper);
mAmbientLightRingBuffer = new AmbientLightRingBuffer(); mAmbientLightRingBuffer = new AmbientLightRingBuffer(mLightSensorRate);
if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) { if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) {
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
@@ -226,6 +237,9 @@ class AutomaticBrightnessController {
pw.println(" mScreenBrightnessRangeMinimum=" + mScreenBrightnessRangeMinimum); pw.println(" mScreenBrightnessRangeMinimum=" + mScreenBrightnessRangeMinimum);
pw.println(" mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum); pw.println(" mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum);
pw.println(" mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig); pw.println(" mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig);
pw.println(" mBrighteningLightDebounceConfig=" + mBrighteningLightDebounceConfig);
pw.println(" mDarkeningLightDebounceConfig=" + mDarkeningLightDebounceConfig);
pw.println(" mResetAmbientLuxAfterWarmUpConfig=" + mResetAmbientLuxAfterWarmUpConfig);
pw.println(); pw.println();
pw.println("Automatic Brightness Controller State:"); pw.println("Automatic Brightness Controller State:");
@@ -252,13 +266,13 @@ class AutomaticBrightnessController {
mLightSensorEnabled = true; mLightSensorEnabled = true;
mLightSensorEnableTime = SystemClock.uptimeMillis(); mLightSensorEnableTime = SystemClock.uptimeMillis();
mSensorManager.registerListener(mLightSensorListener, mLightSensor, mSensorManager.registerListener(mLightSensorListener, mLightSensor,
LIGHT_SENSOR_RATE_MILLIS * 1000, mHandler); mLightSensorRate * 1000, mHandler);
return true; return true;
} }
} else { } else {
if (mLightSensorEnabled) { if (mLightSensorEnabled) {
mLightSensorEnabled = false; mLightSensorEnabled = false;
mAmbientLuxValid = false; mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig;
mRecentLightSamples = 0; mRecentLightSamples = 0;
mAmbientLightRingBuffer.clear(); mAmbientLightRingBuffer.clear();
mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX);
@@ -347,7 +361,7 @@ class AutomaticBrightnessController {
} }
earliestValidTime = mAmbientLightRingBuffer.getTime(i); earliestValidTime = mAmbientLightRingBuffer.getTime(i);
} }
return earliestValidTime + BRIGHTENING_LIGHT_DEBOUNCE; return earliestValidTime + mBrighteningLightDebounceConfig;
} }
private long nextAmbientLightDarkeningTransition(long time) { private long nextAmbientLightDarkeningTransition(long time) {
@@ -359,7 +373,7 @@ class AutomaticBrightnessController {
} }
earliestValidTime = mAmbientLightRingBuffer.getTime(i); earliestValidTime = mAmbientLightRingBuffer.getTime(i);
} }
return earliestValidTime + DARKENING_LIGHT_DEBOUNCE; return earliestValidTime + mDarkeningLightDebounceConfig;
} }
private void updateAmbientLux() { private void updateAmbientLux() {
@@ -420,7 +434,7 @@ class AutomaticBrightnessController {
// should be enough time to decide whether we should actually transition to the new // should be enough time to decide whether we should actually transition to the new
// weighted ambient lux or not. // weighted ambient lux or not.
nextTransitionTime = nextTransitionTime =
nextTransitionTime > time ? nextTransitionTime : time + LIGHT_SENSOR_RATE_MILLIS; nextTransitionTime > time ? nextTransitionTime : time + mLightSensorRate;
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for " Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for "
+ nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime)); + nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime));
@@ -559,8 +573,6 @@ class AutomaticBrightnessController {
// Proportional extra capacity of the buffer beyond the expected number of light samples // Proportional extra capacity of the buffer beyond the expected number of light samples
// in the horizon // in the horizon
private static final float BUFFER_SLACK = 1.5f; 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 float[] mRingLux;
private long[] mRingTime; private long[] mRingTime;
private int mCapacity; private int mCapacity;
@@ -571,8 +583,8 @@ class AutomaticBrightnessController {
private int mEnd; private int mEnd;
private int mCount; private int mCount;
public AmbientLightRingBuffer() { public AmbientLightRingBuffer(long lightSensorRate) {
this(DEFAULT_CAPACITY); this((int) Math.ceil(AMBIENT_LIGHT_HORIZON * BUFFER_SLACK / lightSensorRate));
} }
public AmbientLightRingBuffer(int initialCapacity) { public AmbientLightRingBuffer(int initialCapacity) {

View File

@@ -302,6 +302,15 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean( mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean(
com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing); 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) { if (mUseSoftwareAutoBrightnessConfig) {
int[] lux = resources.getIntArray( int[] lux = resources.getIntArray(
com.android.internal.R.array.config_autoBrightnessLevels); com.android.internal.R.array.config_autoBrightnessLevels);
@@ -336,7 +345,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mAutomaticBrightnessController = new AutomaticBrightnessController(this, mAutomaticBrightnessController = new AutomaticBrightnessController(this,
handler.getLooper(), sensorManager, screenAutoBrightnessSpline, handler.getLooper(), sensorManager, screenAutoBrightnessSpline,
lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum, lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum,
mScreenBrightnessRangeMaximum, dozeScaleFactor); mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
brighteningLightDebounce, darkeningLightDebounce,
autoBrightnessResetAmbientLuxAfterWarmUp);
} }
} }