Loading packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +24 −14 Original line number Diff line number Diff line Loading @@ -222,7 +222,9 @@ public class ProximitySensor { if (mAlerting.getAndSet(true)) { return; } mListeners.forEach(proximitySensorListener -> List<ProximitySensorListener> listeners = new ArrayList<>(mListeners); listeners.forEach(proximitySensorListener -> proximitySensorListener.onSensorEvent(mLastEvent)); mAlerting.set(false); } Loading @@ -247,22 +249,15 @@ public class ProximitySensor { private final ProximitySensor mSensor; private final DelayableExecutor mDelayableExecutor; private List<Consumer<Boolean>> mCallbacks = new ArrayList<>(); private final ProximitySensor.ProximitySensorListener mListener; private final AtomicBoolean mRegistered = new AtomicBoolean(); @Inject public ProximityCheck(ProximitySensor sensor, DelayableExecutor delayableExecutor) { mSensor = sensor; mSensor.setTag("prox_check"); mDelayableExecutor = delayableExecutor; mSensor.pause(); ProximitySensorListener listener = proximityEvent -> { mCallbacks.forEach( booleanConsumer -> booleanConsumer.accept( proximityEvent == null ? null : proximityEvent.getNear())); mCallbacks.clear(); mSensor.pause(); }; mSensor.register(listener); mListener = this::onProximityEvent; } /** Set a descriptive tag for the sensors registration. */ Loading @@ -272,7 +267,7 @@ public class ProximitySensor { @Override public void run() { mSensor.pause(); unregister(); mSensor.alertListeners(); } Loading @@ -284,11 +279,26 @@ public class ProximitySensor { 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(ProximityEvent proximityEvent) { mCallbacks.forEach( booleanConsumer -> booleanConsumer.accept( proximityEvent == null ? null : proximityEvent.getNear())); mCallbacks.clear(); unregister(); mRegistered.set(false); } } /** Implement to be notified of ProximityEvents. */ Loading packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,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. ProximitySensor.ProximitySensorListener 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.ProximityEvent(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 Loading Loading
packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +24 −14 Original line number Diff line number Diff line Loading @@ -222,7 +222,9 @@ public class ProximitySensor { if (mAlerting.getAndSet(true)) { return; } mListeners.forEach(proximitySensorListener -> List<ProximitySensorListener> listeners = new ArrayList<>(mListeners); listeners.forEach(proximitySensorListener -> proximitySensorListener.onSensorEvent(mLastEvent)); mAlerting.set(false); } Loading @@ -247,22 +249,15 @@ public class ProximitySensor { private final ProximitySensor mSensor; private final DelayableExecutor mDelayableExecutor; private List<Consumer<Boolean>> mCallbacks = new ArrayList<>(); private final ProximitySensor.ProximitySensorListener mListener; private final AtomicBoolean mRegistered = new AtomicBoolean(); @Inject public ProximityCheck(ProximitySensor sensor, DelayableExecutor delayableExecutor) { mSensor = sensor; mSensor.setTag("prox_check"); mDelayableExecutor = delayableExecutor; mSensor.pause(); ProximitySensorListener listener = proximityEvent -> { mCallbacks.forEach( booleanConsumer -> booleanConsumer.accept( proximityEvent == null ? null : proximityEvent.getNear())); mCallbacks.clear(); mSensor.pause(); }; mSensor.register(listener); mListener = this::onProximityEvent; } /** Set a descriptive tag for the sensors registration. */ Loading @@ -272,7 +267,7 @@ public class ProximitySensor { @Override public void run() { mSensor.pause(); unregister(); mSensor.alertListeners(); } Loading @@ -284,11 +279,26 @@ public class ProximitySensor { 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(ProximityEvent proximityEvent) { mCallbacks.forEach( booleanConsumer -> booleanConsumer.accept( proximityEvent == null ? null : proximityEvent.getNear())); mCallbacks.clear(); unregister(); mRegistered.set(false); } } /** Implement to be notified of ProximityEvents. */ Loading
packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,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. ProximitySensor.ProximitySensorListener 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.ProximityEvent(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 Loading