Merge "Continue synthesizing data even after brightness adjustment" into klp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
6a29778eeb
@@ -298,6 +298,10 @@ final class DisplayPowerController {
|
||||
// True if mAmbientLux holds a valid value.
|
||||
private boolean mAmbientLuxValid;
|
||||
|
||||
// The ambient light level threshold at which to brighten or darken the screen.
|
||||
private float mBrighteningLuxThreshold;
|
||||
private float mDarkeningLuxThreshold;
|
||||
|
||||
// The most recent light sample.
|
||||
private float mLastObservedLux;
|
||||
|
||||
@@ -945,12 +949,24 @@ final class DisplayPowerController {
|
||||
mLastObservedLuxTime = time;
|
||||
}
|
||||
|
||||
private void setAmbientLux(float lux) {
|
||||
mAmbientLux = lux;
|
||||
mBrighteningLuxThreshold = mAmbientLux * (1.0f + BRIGHTENING_LIGHT_HYSTERESIS);
|
||||
mDarkeningLuxThreshold = mAmbientLux * (1.0f - DARKENING_LIGHT_HYSTERESIS);
|
||||
}
|
||||
|
||||
private void updateAmbientLux(long time) {
|
||||
// If the light sensor was just turned on then immediately update our initial
|
||||
// estimate of the current ambient light level.
|
||||
if (!mAmbientLuxValid
|
||||
|| (time - mLightSensorEnableTime) < mLightSensorWarmUpTimeConfig) {
|
||||
mAmbientLux = mRecentShortTermAverageLux;
|
||||
if (!mAmbientLuxValid) {
|
||||
final long timeWhenSensorWarmedUp =
|
||||
mLightSensorWarmUpTimeConfig + mLightSensorEnableTime;
|
||||
if (time < timeWhenSensorWarmedUp) {
|
||||
mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED,
|
||||
timeWhenSensorWarmedUp);
|
||||
return;
|
||||
}
|
||||
setAmbientLux(mRecentShortTermAverageLux);
|
||||
mAmbientLuxValid = true;
|
||||
mDebounceLuxDirection = 0;
|
||||
mDebounceLuxTime = time;
|
||||
@@ -961,98 +977,90 @@ final class DisplayPowerController {
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
updateAutoBrightness(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine whether the ambient environment appears to be brightening.
|
||||
float brighteningLuxThreshold = mAmbientLux * (1.0f + BRIGHTENING_LIGHT_HYSTERESIS);
|
||||
if (mRecentShortTermAverageLux > brighteningLuxThreshold
|
||||
&& mRecentLongTermAverageLux > brighteningLuxThreshold) {
|
||||
} else if (mRecentShortTermAverageLux > mBrighteningLuxThreshold
|
||||
&& mRecentLongTermAverageLux > mBrighteningLuxThreshold) {
|
||||
// The ambient environment appears to be brightening.
|
||||
if (mDebounceLuxDirection <= 0) {
|
||||
mDebounceLuxDirection = 1;
|
||||
mDebounceLuxTime = time;
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "updateAmbientLux: Possibly brightened, waiting for "
|
||||
+ BRIGHTENING_LIGHT_DEBOUNCE + " ms: "
|
||||
+ "brighteningLuxThreshold=" + brighteningLuxThreshold
|
||||
+ "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold
|
||||
+ ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux
|
||||
+ ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
}
|
||||
long debounceTime = mDebounceLuxTime + BRIGHTENING_LIGHT_DEBOUNCE;
|
||||
if (time >= debounceTime) {
|
||||
mAmbientLux = mRecentShortTermAverageLux;
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "updateAmbientLux: Brightened: "
|
||||
+ "brighteningLuxThreshold=" + brighteningLuxThreshold
|
||||
+ ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux
|
||||
+ ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
updateAutoBrightness(true);
|
||||
} else {
|
||||
if (time < debounceTime) {
|
||||
mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine whether the ambient environment appears to be darkening.
|
||||
float darkeningLuxThreshold = mAmbientLux * (1.0f - DARKENING_LIGHT_HYSTERESIS);
|
||||
if (mRecentShortTermAverageLux < darkeningLuxThreshold
|
||||
&& mRecentLongTermAverageLux < darkeningLuxThreshold) {
|
||||
setAmbientLux(mRecentShortTermAverageLux);
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "updateAmbientLux: Brightened: "
|
||||
+ "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold
|
||||
+ ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux
|
||||
+ ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
updateAutoBrightness(true);
|
||||
} else if (mRecentShortTermAverageLux < mDarkeningLuxThreshold
|
||||
&& mRecentLongTermAverageLux < mDarkeningLuxThreshold) {
|
||||
// The ambient environment appears to be darkening.
|
||||
if (mDebounceLuxDirection >= 0) {
|
||||
mDebounceLuxDirection = -1;
|
||||
mDebounceLuxTime = time;
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "updateAmbientLux: Possibly darkened, waiting for "
|
||||
+ DARKENING_LIGHT_DEBOUNCE + " ms: "
|
||||
+ "darkeningLuxThreshold=" + darkeningLuxThreshold
|
||||
+ "mDarkeningLuxThreshold=" + mDarkeningLuxThreshold
|
||||
+ ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux
|
||||
+ ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
}
|
||||
long debounceTime = mDebounceLuxTime + DARKENING_LIGHT_DEBOUNCE;
|
||||
if (time >= debounceTime) {
|
||||
// Be conservative about reducing the brightness, only reduce it a little bit
|
||||
// at a time to avoid having to bump it up again soon.
|
||||
mAmbientLux = Math.max(mRecentShortTermAverageLux, mRecentLongTermAverageLux);
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "updateAmbientLux: Darkened: "
|
||||
+ "darkeningLuxThreshold=" + darkeningLuxThreshold
|
||||
+ ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux
|
||||
+ ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
updateAutoBrightness(true);
|
||||
} else {
|
||||
if (time < debounceTime) {
|
||||
mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// No change or change is within the hysteresis thresholds.
|
||||
if (mDebounceLuxDirection != 0) {
|
||||
// Be conservative about reducing the brightness, only reduce it a little bit
|
||||
// at a time to avoid having to bump it up again soon.
|
||||
setAmbientLux(Math.max(mRecentShortTermAverageLux, mRecentLongTermAverageLux));
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "updateAmbientLux: Darkened: "
|
||||
+ "mDarkeningLuxThreshold=" + mDarkeningLuxThreshold
|
||||
+ ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux
|
||||
+ ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
updateAutoBrightness(true);
|
||||
} else if (mDebounceLuxDirection != 0) {
|
||||
// No change or change is within the hysteresis thresholds.
|
||||
mDebounceLuxDirection = 0;
|
||||
mDebounceLuxTime = time;
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "updateAmbientLux: Canceled debounce: "
|
||||
+ "brighteningLuxThreshold=" + brighteningLuxThreshold
|
||||
+ ", darkeningLuxThreshold=" + darkeningLuxThreshold
|
||||
+ "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold
|
||||
+ ", mDarkeningLuxThreshold=" + mDarkeningLuxThreshold
|
||||
+ ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux
|
||||
+ ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux
|
||||
+ ", mAmbientLux=" + mAmbientLux);
|
||||
}
|
||||
}
|
||||
|
||||
// If the light level does not change, then the sensor may not report
|
||||
// a new value. This can cause problems for the auto-brightness algorithm
|
||||
// because the filters might not be updated. To work around it, we want to
|
||||
// make sure to update the filters whenever the observed light level could
|
||||
// possibly exceed one of the hysteresis thresholds.
|
||||
if (mLastObservedLux > brighteningLuxThreshold
|
||||
|| mLastObservedLux < darkeningLuxThreshold) {
|
||||
// Now that we've done all of that, we haven't yet posted a debounce
|
||||
// message. So consider the case where current lux is beyond the
|
||||
// threshold. It's possible that the light sensor may not report values
|
||||
// if the light level does not change, so we need to occasionally
|
||||
// synthesize sensor readings in order to make sure the brightness is
|
||||
// adjusted accordingly. Note these thresholds may have changed since
|
||||
// we entered the function because we called setAmbientLux and
|
||||
// updateAutoBrightness along the way.
|
||||
if (mLastObservedLux > mBrighteningLuxThreshold
|
||||
|| mLastObservedLux < mDarkeningLuxThreshold) {
|
||||
mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED,
|
||||
time + SYNTHETIC_LIGHT_SENSOR_RATE_MILLIS);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user