diff options
| author | 2022-10-25 23:50:05 +0000 | |
|---|---|---|
| committer | 2022-10-25 23:50:05 +0000 | |
| commit | 5317811966b93d032cbe7ad6656b94bcb40ee0fc (patch) | |
| tree | 171178bd7bf445a294243c3bdf1ad6d5b7cece02 | |
| parent | bee4c5d37e92bae2353b9a99dff6a3d8cd25b7db (diff) | |
| parent | 7524b5994ccf6ff53fed31df540f85edda90a356 (diff) | |
Merge "Ensure await lux calls are completed when there is no sensor activity." into tm-qpr-dev am: 7fc8c3b3e6 am: 7524b5994c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20259458
Change-Id: I4bf46efd9d150ff429acc6eeeaf97c6c78120972
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | services/core/java/com/android/server/biometrics/log/ALSProbe.java | 52 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/biometrics/log/ALSProbeTest.java | 17 |
2 files changed, 44 insertions, 25 deletions
diff --git a/services/core/java/com/android/server/biometrics/log/ALSProbe.java b/services/core/java/com/android/server/biometrics/log/ALSProbe.java index 1a5f31c8ac90..da4361843681 100644 --- a/services/core/java/com/android/server/biometrics/log/ALSProbe.java +++ b/services/core/java/com/android/server/biometrics/log/ALSProbe.java @@ -52,16 +52,13 @@ final class ALSProbe implements Probe { private boolean mDestroyed = false; private boolean mDestroyRequested = false; private boolean mDisableRequested = false; - private volatile NextConsumer mNextConsumer = null; + private NextConsumer mNextConsumer = null; private volatile float mLastAmbientLux = -1; private final SensorEventListener mLightSensorListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { - mLastAmbientLux = event.values[0]; - if (mNextConsumer != null) { - completeNextConsumer(mLastAmbientLux); - } + onNext(event.values[0]); } @Override @@ -133,11 +130,29 @@ final class ALSProbe implements Probe { // if a final consumer is set it will call destroy/disable on the next value if requested if (!mDestroyed && mNextConsumer == null) { - disable(); + disableLightSensorLoggingLocked(); mDestroyed = true; } } + private synchronized void onNext(float value) { + mLastAmbientLux = value; + + final NextConsumer consumer = mNextConsumer; + mNextConsumer = null; + if (consumer != null) { + Slog.v(TAG, "Finishing next consumer"); + + if (mDestroyRequested) { + destroy(); + } else if (mDisableRequested) { + disable(); + } + + consumer.consume(value); + } + } + /** The most recent lux reading. */ public float getMostRecentLux() { return mLastAmbientLux; @@ -160,7 +175,7 @@ final class ALSProbe implements Probe { @Nullable Handler handler) { final NextConsumer nextConsumer = new NextConsumer(consumer, handler); final float current = mLastAmbientLux; - if (current > 0) { + if (current > -1f) { nextConsumer.consume(current); } else if (mDestroyed) { nextConsumer.consume(-1f); @@ -172,23 +187,6 @@ final class ALSProbe implements Probe { } } - private synchronized void completeNextConsumer(float value) { - Slog.v(TAG, "Finishing next consumer"); - - final NextConsumer consumer = mNextConsumer; - mNextConsumer = null; - - if (mDestroyRequested) { - destroy(); - } else if (mDisableRequested) { - disable(); - } - - if (consumer != null) { - consumer.consume(value); - } - } - private void enableLightSensorLoggingLocked() { if (!mEnabled) { mEnabled = true; @@ -219,9 +217,13 @@ final class ALSProbe implements Probe { } } - private void onTimeout() { + private synchronized void onTimeout() { Slog.e(TAG, "Max time exceeded for ALS logger - disabling: " + mLightSensorListener.hashCode()); + + // if consumers are waiting but there was no sensor change, complete them with the latest + // value before disabling + onNext(mLastAmbientLux); disable(); } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/ALSProbeTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/ALSProbeTest.java index 68c9ce4a9f86..0cff4f14bf23 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/ALSProbeTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/ALSProbeTest.java @@ -178,6 +178,23 @@ public class ALSProbeTest { } @Test + public void testWatchDogCompletesAwait() { + mProbe.enable(); + + AtomicInteger lux = new AtomicInteger(-9); + mProbe.awaitNextLux((v) -> lux.set(Math.round(v)), null /* handler */); + + verify(mSensorManager).registerListener( + mSensorEventListenerCaptor.capture(), any(), anyInt()); + + moveTimeBy(TIMEOUT_MS); + + assertThat(lux.get()).isEqualTo(-1); + verify(mSensorManager).unregisterListener(any(SensorEventListener.class)); + verifyNoMoreInteractions(mSensorManager); + } + + @Test public void testNextLuxWhenAlreadyEnabledAndNotAvailable() { testNextLuxWhenAlreadyEnabled(false /* dataIsAvailable */); } |