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

Commit d2215856 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Ensure ProxCheck doesn't unregister ProxSensor" into rvc-dev am: 6bb0f4c6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11757752

Change-Id: I1a4a149273b88794b1520c7bd6830b71bbc3af67
parents bcc210e0 6bb0f4c6
Loading
Loading
Loading
Loading
+24 −14
Original line number Diff line number Diff line
@@ -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);
    }
@@ -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. */
@@ -272,7 +267,7 @@ public class ProximitySensor {

        @Override
        public void run() {
            mSensor.pause();
            unregister();
            mSensor.alertListeners();
        }

@@ -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. */
+26 −0
Original line number Diff line number Diff line
@@ -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