Merge "Ensure await lux calls are completed when there is no sensor activity." into tm-qpr-dev

This commit is contained in:
Joe Bolinger
2022-10-25 22:38:19 +00:00
committed by Android (Google) Code Review
2 changed files with 44 additions and 25 deletions

View File

@@ -52,16 +52,13 @@ final class ALSProbe implements Probe {
private boolean mDestroyed = false; private boolean mDestroyed = false;
private boolean mDestroyRequested = false; private boolean mDestroyRequested = false;
private boolean mDisableRequested = false; private boolean mDisableRequested = false;
private volatile NextConsumer mNextConsumer = null; private NextConsumer mNextConsumer = null;
private volatile float mLastAmbientLux = -1; private volatile float mLastAmbientLux = -1;
private final SensorEventListener mLightSensorListener = new SensorEventListener() { private final SensorEventListener mLightSensorListener = new SensorEventListener() {
@Override @Override
public void onSensorChanged(SensorEvent event) { public void onSensorChanged(SensorEvent event) {
mLastAmbientLux = event.values[0]; onNext(event.values[0]);
if (mNextConsumer != null) {
completeNextConsumer(mLastAmbientLux);
}
} }
@Override @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 a final consumer is set it will call destroy/disable on the next value if requested
if (!mDestroyed && mNextConsumer == null) { if (!mDestroyed && mNextConsumer == null) {
disable(); disableLightSensorLoggingLocked();
mDestroyed = true; 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. */ /** The most recent lux reading. */
public float getMostRecentLux() { public float getMostRecentLux() {
return mLastAmbientLux; return mLastAmbientLux;
@@ -160,7 +175,7 @@ final class ALSProbe implements Probe {
@Nullable Handler handler) { @Nullable Handler handler) {
final NextConsumer nextConsumer = new NextConsumer(consumer, handler); final NextConsumer nextConsumer = new NextConsumer(consumer, handler);
final float current = mLastAmbientLux; final float current = mLastAmbientLux;
if (current > 0) { if (current > -1f) {
nextConsumer.consume(current); nextConsumer.consume(current);
} else if (mDestroyed) { } else if (mDestroyed) {
nextConsumer.consume(-1f); 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() { private void enableLightSensorLoggingLocked() {
if (!mEnabled) { if (!mEnabled) {
mEnabled = true; 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: " Slog.e(TAG, "Max time exceeded for ALS logger - disabling: "
+ mLightSensorListener.hashCode()); + mLightSensorListener.hashCode());
// if consumers are waiting but there was no sensor change, complete them with the latest
// value before disabling
onNext(mLastAmbientLux);
disable(); disable();
} }

View File

@@ -177,6 +177,23 @@ public class ALSProbeTest {
assertThat(mProbe.getMostRecentLux()).isLessThan(0f); 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 @Test
public void testNextLuxWhenAlreadyEnabledAndNotAvailable() { public void testNextLuxWhenAlreadyEnabledAndNotAvailable() {
testNextLuxWhenAlreadyEnabled(false /* dataIsAvailable */); testNextLuxWhenAlreadyEnabled(false /* dataIsAvailable */);