Loading services/core/java/com/android/server/biometrics/log/ALSProbe.java +27 −25 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading @@ -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); Loading @@ -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; Loading Loading @@ -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(); } Loading services/tests/servicestests/src/com/android/server/biometrics/log/ALSProbeTest.java +17 −0 Original line number Diff line number Diff line Loading @@ -177,6 +177,23 @@ public class ALSProbeTest { assertThat(mProbe.getMostRecentLux()).isLessThan(0f); } @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 */); Loading Loading
services/core/java/com/android/server/biometrics/log/ALSProbe.java +27 −25 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading @@ -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); Loading @@ -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; Loading Loading @@ -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(); } Loading
services/tests/servicestests/src/com/android/server/biometrics/log/ALSProbeTest.java +17 −0 Original line number Diff line number Diff line Loading @@ -177,6 +177,23 @@ public class ALSProbeTest { assertThat(mProbe.getMostRecentLux()).isLessThan(0f); } @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 */); Loading