diff options
| author | 2019-08-02 15:21:02 -0700 | |
|---|---|---|
| committer | 2019-08-02 15:21:02 -0700 | |
| commit | c04f49e0056e66a9b7231ade5a93c68c8a98a6db (patch) | |
| tree | 0a307d79a907e2ddda803b8c310b97f3eb0b9d2a | |
| parent | 1b1f14ebffa38d889573c40283c99deb5e94082d (diff) | |
| parent | 6348d1e923e924b7facb79a3dfd145ae528a19ca (diff) | |
Merge "Responsiveness improvement for BrightnessObserver" into qt-r1-dev
am: 6348d1e923
Change-Id: Ie98eaea5afe1bfc4ecc16506bb6cfea0c2eecbde
| -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 { |