Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce11e492 authored by Dave Mankoff's avatar Dave Mankoff Committed by Automerger Merge Worker
Browse files

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

Change-Id: I4cc7f3d5f3c479311e758cb2a1335afb7cbbb0a8
parents e4962134 fdd1900f
Loading
Loading
Loading
Loading
+21 −13
Original line number Diff line number Diff line
@@ -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) {
+26 −0
Original line number Diff line number Diff line
@@ -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