diff options
| author | 2019-08-02 22:00:21 +0000 | |
|---|---|---|
| committer | 2019-08-02 22:00:21 +0000 | |
| commit | 6348d1e923e924b7facb79a3dfd145ae528a19ca (patch) | |
| tree | 0411b978d9b5b9001378060e01c8072db05baad9 | |
| parent | cd4208e0801cd5d99d7e8a1e30634889db8b8738 (diff) | |
| parent | c1ee042443e1f7938e0e2df2cce48a4dc264af84 (diff) | |
Merge "Responsiveness improvement for BrightnessObserver" into qt-r1-dev
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayModeDirector.java | 73 |
1 files changed, 68 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 78a48dac6fb5..c45a314e39cc 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -728,6 +728,7 @@ public class DisplayModeDirector { private SensorManager mSensorManager; private Sensor mLightSensor; + private LightSensorEventListener mLightSensorListener = new LightSensorEventListener(); // Take it as low brightness before valid sensor data comes private float mAmbientLux = -1.0f; private AmbientFilter mAmbientFilter; @@ -907,19 +908,40 @@ public class DisplayModeDirector { mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); } else { + mLightSensorListener.removeCallbacks(); mSensorManager.unregisterListener(mLightSensorListener); } } - private final SensorEventListener mLightSensorListener = new SensorEventListener() { + private final class LightSensorEventListener implements SensorEventListener { + final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; + private float mLastSensorData; + @Override public void onSensorChanged(SensorEvent event) { + mLastSensorData = event.values[0]; + if (DEBUG) { + Slog.d(TAG, "On sensor changed: " + mLastSensorData); + } + + boolean zoneChanged = isDifferentZone(mLastSensorData, mAmbientLux); + if (zoneChanged && mLastSensorData < mAmbientLux) { + // Easier to see flicker at lower brightness environment. Forget the history to + // get immediate response. + mAmbientFilter.clear(); + } + long now = SystemClock.uptimeMillis(); - mAmbientFilter.addValue(now, event.values[0]); - mAmbientLux = mAmbientFilter.getEstimate(now); + mAmbientFilter.addValue(now, mLastSensorData); - synchronized (mLock) { - onBrightnessChangedLocked(); + mHandler.removeCallbacks(mInjectSensorEventRunnable); + processSensorData(now); + + if (zoneChanged && mLastSensorData > mAmbientLux) { + // Sensor may not report new event if there is no brightness change. + // Need to keep querying the temporal filter for the latest estimation, + // until enter in higher lux zone or is interrupted by a new sensor event. + mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); } } @@ -927,6 +949,47 @@ public class DisplayModeDirector { public void onAccuracyChanged(Sensor sensor, int accuracy) { // Not used. } + + public void removeCallbacks() { + mHandler.removeCallbacks(mInjectSensorEventRunnable); + } + + private void processSensorData(long now) { + mAmbientLux = mAmbientFilter.getEstimate(now); + + synchronized (mLock) { + onBrightnessChangedLocked(); + } + } + + private boolean isDifferentZone(float lux1, float lux2) { + for (int z = 0; z < mAmbientBrightnessThresholds.length; z++) { + final float boundary = mAmbientBrightnessThresholds[z]; + + // Test each boundary. See if the current value and the new value are at + // different sides. + if ((lux1 <= boundary && lux2 > boundary) + || (lux1 > boundary && lux2 <= boundary)) { + return true; + } + } + + return false; + } + + private Runnable mInjectSensorEventRunnable = new Runnable() { + @Override + public void run() { + long now = SystemClock.uptimeMillis(); + // No need to really inject the last event into a temporal filter. + processSensorData(now); + + // Inject next event if there is a possible zone change. + if (isDifferentZone(mLastSensorData, mAmbientLux)) { + mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); + } + } + }; }; private final class ScreenStateReceiver extends BroadcastReceiver { |