Loading services/java/com/android/server/power/DisplayPowerController.java +65 −57 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 (time < debounceTime) { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); return; } setAmbientLux(mRecentShortTermAverageLux); if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Brightened: " + "brighteningLuxThreshold=" + brighteningLuxThreshold + "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold + ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux + ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux + ", mAmbientLux=" + mAmbientLux); } updateAutoBrightness(true); } else { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); } return; } // Determine whether the ambient environment appears to be darkening. float darkeningLuxThreshold = mAmbientLux * (1.0f - DARKENING_LIGHT_HYSTERESIS); if (mRecentShortTermAverageLux < darkeningLuxThreshold && mRecentLongTermAverageLux < darkeningLuxThreshold) { } 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) { if (time < debounceTime) { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); return; } // 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); setAmbientLux(Math.max(mRecentShortTermAverageLux, mRecentLongTermAverageLux)); if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Darkened: " + "darkeningLuxThreshold=" + darkeningLuxThreshold + "mDarkeningLuxThreshold=" + mDarkeningLuxThreshold + ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux + ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux + ", mAmbientLux=" + mAmbientLux); } updateAutoBrightness(true); } else { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); } return; } } else if (mDebounceLuxDirection != 0) { // No change or change is within the hysteresis thresholds. if (mDebounceLuxDirection != 0) { 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); } Loading Loading
services/java/com/android/server/power/DisplayPowerController.java +65 −57 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 (time < debounceTime) { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); return; } setAmbientLux(mRecentShortTermAverageLux); if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Brightened: " + "brighteningLuxThreshold=" + brighteningLuxThreshold + "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold + ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux + ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux + ", mAmbientLux=" + mAmbientLux); } updateAutoBrightness(true); } else { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); } return; } // Determine whether the ambient environment appears to be darkening. float darkeningLuxThreshold = mAmbientLux * (1.0f - DARKENING_LIGHT_HYSTERESIS); if (mRecentShortTermAverageLux < darkeningLuxThreshold && mRecentLongTermAverageLux < darkeningLuxThreshold) { } 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) { if (time < debounceTime) { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); return; } // 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); setAmbientLux(Math.max(mRecentShortTermAverageLux, mRecentLongTermAverageLux)); if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Darkened: " + "darkeningLuxThreshold=" + darkeningLuxThreshold + "mDarkeningLuxThreshold=" + mDarkeningLuxThreshold + ", mRecentShortTermAverageLux=" + mRecentShortTermAverageLux + ", mRecentLongTermAverageLux=" + mRecentLongTermAverageLux + ", mAmbientLux=" + mAmbientLux); } updateAutoBrightness(true); } else { mHandler.sendEmptyMessageAtTime(MSG_LIGHT_SENSOR_DEBOUNCED, debounceTime); } return; } } else if (mDebounceLuxDirection != 0) { // No change or change is within the hysteresis thresholds. if (mDebounceLuxDirection != 0) { 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); } Loading