From 82b9aff0a9c9d5c9c4f986b7e2fac258b890cc79 Mon Sep 17 00:00:00 2001 From: Julius D'souza Date: Mon, 24 Oct 2016 19:26:45 -0700 Subject: [PATCH] DO NOT MERGE: Add initial ambient light sensor rate Bug: 32153559 Change-Id: Ic54bded46f88991290ed1e4d2574f865b6f598ec --- core/res/res/values/config.xml | 6 +++ core/res/res/values/symbols.xml | 1 + .../display/AutomaticBrightnessController.java | 45 ++++++++++++++++++---- .../server/display/DisplayPowerController.java | 4 +- 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index d33504de6542..f8c463ce9ba2 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1056,6 +1056,12 @@ 4000 8000 + + 0 + 250 diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e7d4b2b3fa88..ecce83368266 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1736,6 +1736,7 @@ + diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index a1e3d62c12bc..bdd041a317c9 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -86,8 +86,14 @@ class AutomaticBrightnessController { private final int mScreenBrightnessRangeMaximum; private final float mDozeScaleFactor; - // Light sensor event rate in milliseconds. - private final int mLightSensorRate; + // Initial light sensor event rate in milliseconds. + private final int mInitialLightSensorRate; + + // Steady-state light sensor event rate in milliseconds. + private final int mNormalLightSensorRate; + + // The current light sensor event rate in milliseconds. + private int mCurrentLightSensorRate; // 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 @@ -188,7 +194,7 @@ class AutomaticBrightnessController { public AutomaticBrightnessController(Callbacks callbacks, Looper looper, SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime, int brightnessMin, int brightnessMax, float dozeScaleFactor, - int lightSensorRate, long brighteningLightDebounceConfig, + int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig, int ambientLightHorizon, float autoBrightnessAdjustmentMaxGamma, LuxLevels luxLevels) { @@ -200,7 +206,9 @@ class AutomaticBrightnessController { mScreenBrightnessRangeMaximum = brightnessMax; mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime; mDozeScaleFactor = dozeScaleFactor; - mLightSensorRate = lightSensorRate; + mNormalLightSensorRate = lightSensorRate; + mInitialLightSensorRate = initialLightSensorRate; + mCurrentLightSensorRate = mNormalLightSensorRate; mBrighteningLightDebounceConfig = brighteningLightDebounceConfig; mDarkeningLightDebounceConfig = darkeningLightDebounceConfig; mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig; @@ -211,9 +219,9 @@ class AutomaticBrightnessController { mHandler = new AutomaticBrightnessHandler(looper); mAmbientLightRingBuffer = - new AmbientLightRingBuffer(mLightSensorRate, mAmbientLightHorizon); + new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizon); mInitialHorizonAmbientLightRingBuffer = - new AmbientLightRingBuffer(mLightSensorRate, mAmbientLightHorizon); + new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizon); if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) { mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); @@ -313,13 +321,16 @@ class AutomaticBrightnessController { mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig; mLightSensorEnableTime = SystemClock.uptimeMillis(); mSensorManager.registerListener(mLightSensorListener, mLightSensor, - mLightSensorRate * 1000, mHandler); + mCurrentLightSensorRate * 1000, mHandler); return true; } } else { if (mLightSensorEnabled) { mLightSensorEnabled = false; mRecentLightSamples = 0; + if (mInitialLightSensorRate > 0) { + mCurrentLightSensorRate = mInitialLightSensorRate; + } mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); mSensorManager.unregisterListener(mLightSensorListener); } @@ -330,6 +341,10 @@ class AutomaticBrightnessController { private void handleLightSensorEvent(long time, float lux) { mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); + if (mAmbientLightRingBuffer.size() == 0) { + // switch to using the steady-state sample rate after grabbing the initial light sample + adjustLightSensorRate(mNormalLightSensorRate); + } applyLightSensorMeasurement(time, lux); updateAmbientLux(time); if (mActiveDozeLightSensor) { @@ -354,6 +369,20 @@ class AutomaticBrightnessController { mLastObservedLuxTime = time; } + private void adjustLightSensorRate(int lightSensorRate) { + // if the light sensor rate changed, update the sensor listener + if (lightSensorRate != mCurrentLightSensorRate) { + if (DEBUG) { + Slog.d(TAG, "adjustLightSensorRate: previousRate=" + mCurrentLightSensorRate + + ", currentRate=" + lightSensorRate); + } + mCurrentLightSensorRate = lightSensorRate; + mSensorManager.unregisterListener(mLightSensorListener); + mSensorManager.registerListener(mLightSensorListener, mLightSensor, + lightSensorRate * 1000, mHandler); + } + } + private boolean setScreenAutoBrightnessAdjustment(float adjustment) { if (adjustment != mScreenAutoBrightnessAdjustment) { mScreenAutoBrightnessAdjustment = adjustment; @@ -489,7 +518,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 + mLightSensorRate; + nextTransitionTime > time ? nextTransitionTime : time + mNormalLightSensorRate; if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for " + nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime)); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index fa144575a4f2..3207a868afac 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -313,6 +313,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call int lightSensorRate = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessLightSensorRate); + int initialLightSensorRate = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); long brighteningLightDebounce = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); long darkeningLightDebounce = resources.getInteger( @@ -378,7 +380,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call handler.getLooper(), sensorManager, screenAutoBrightnessSpline, lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate, - brighteningLightDebounce, darkeningLightDebounce, + initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, autoBrightnessResetAmbientLuxAfterWarmUp, ambientLightHorizon, autoBrightnessAdjustmentMaxGamma, luxLevels); } -- 2.11.0