Merge "Support for faster brightness response to light changes." into lmp-mr1-modular-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
88a9a2a46e
@@ -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. -->
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user