Merge "Ensure await lux calls are completed when there is no sensor activity." into tm-qpr-dev
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 */);
|
||||||
|
|||||||
Reference in New Issue
Block a user