Merge "Ensure ProxCheck doesn't unregister ProxSensor" into rvc-d1-dev

This commit is contained in:
Dave Mankoff
2020-05-22 00:22:45 +00:00
committed by Android (Google) Code Review
2 changed files with 47 additions and 13 deletions

View File

@@ -297,22 +297,15 @@ public class ProximitySensor implements ThresholdSensor {
private final ProximitySensor mSensor;
private final DelayableExecutor mDelayableExecutor;
private List<Consumer<Boolean>> mCallbacks = new ArrayList<>();
private final ThresholdSensor.Listener mListener;
private final AtomicBoolean mRegistered = new AtomicBoolean();
@Inject
public ProximityCheck(ProximitySensor sensor, DelayableExecutor delayableExecutor) {
mSensor = sensor;
mSensor.setTag("prox_check");
mDelayableExecutor = delayableExecutor;
mSensor.pause();
ThresholdSensor.Listener listener = proximityEvent -> {
mCallbacks.forEach(
booleanConsumer ->
booleanConsumer.accept(
proximityEvent == null ? null : proximityEvent.getBelow()));
mCallbacks.clear();
mSensor.pause();
};
mSensor.register(listener);
mListener = this::onProximityEvent;
}
/** Set a descriptive tag for the sensors registration. */
@@ -322,7 +315,7 @@ public class ProximitySensor implements ThresholdSensor {
@Override
public void run() {
mSensor.pause();
unregister();
mSensor.alertListeners();
}
@@ -334,11 +327,26 @@ public class ProximitySensor implements ThresholdSensor {
callback.accept(null);
}
mCallbacks.add(callback);
if (!mSensor.isRegistered()) {
mSensor.resume();
if (!mRegistered.getAndSet(true)) {
mSensor.register(mListener);
mDelayableExecutor.executeDelayed(this, timeoutMs);
}
}
private void unregister() {
mSensor.unregister(mListener);
mRegistered.set(false);
}
private void onProximityEvent(ThresholdSensorEvent proximityEvent) {
mCallbacks.forEach(
booleanConsumer ->
booleanConsumer.accept(
proximityEvent == null ? null : proximityEvent.getBelow()));
mCallbacks.clear();
unregister();
mRegistered.set(false);
}
}
private void logDebug(String msg) {

View File

@@ -82,6 +82,32 @@ public class ProximityCheckTest extends SysuiTestCase {
assertFalse(mFakeProximitySensor.isRegistered());
}
@Test
public void testProxDoesntCancelOthers() {
assertFalse(mFakeProximitySensor.isRegistered());
// We don't need our "other" listener to do anything. Just ensure our sensor is registered.
ThresholdSensor.Listener emptyListener = event -> { };
mFakeProximitySensor.register(emptyListener);
assertTrue(mFakeProximitySensor.isRegistered());
// Now run a basic check. This is just like testCheck()
mProximityCheck.check(100, mTestableCallback);
assertNull(mTestableCallback.mLastResult);
mFakeProximitySensor.setLastEvent(new ProximitySensor.ThresholdSensorEvent(true, 0));
mFakeProximitySensor.alertListeners();
assertTrue(mTestableCallback.mLastResult);
// We should still be registered, since we have another listener.
assertTrue(mFakeProximitySensor.isRegistered());
mFakeProximitySensor.unregister(emptyListener);
assertFalse(mFakeProximitySensor.isRegistered());
}
private static class TestableCallback implements Consumer<Boolean> {
Boolean mLastResult;
@Override