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

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

Merge "More defensive checks for ProximitySensor" into rvc-d1-dev am: 8ce8c004

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

Change-Id: I9418208460380e74aa403f4135d0df7dfc9cb224
parents 8052eb86 8ce8c004
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -86,9 +86,12 @@ public class ProximitySensor implements ThresholdSensor {
        public void onThresholdCrossed(ThresholdSensorEvent event) {
            // If we no longer have a "below" signal and the secondary sensor is not
            // considered "safe", then we need to turn it off.
            if (!mSecondarySafe && (!mLastPrimaryEvent.getBelow() || !event.getBelow())) {
            if (!mSecondarySafe
                    && (mLastPrimaryEvent == null
                    || !mLastPrimaryEvent.getBelow()
                    || !event.getBelow())) {
                mSecondaryThresholdSensor.pause();
                if (!mLastPrimaryEvent.getBelow()) {
                if (mLastPrimaryEvent == null || !mLastPrimaryEvent.getBelow()) {
                    // Only check the secondary as long as the primary thinks we're near.
                    mCancelSecondaryRunnable = null;
                    return;
@@ -100,8 +103,10 @@ public class ProximitySensor implements ThresholdSensor {
            }
            logDebug("Secondary sensor event: " + event.getBelow() + ".");

            if (!mPaused) {
                onSensorEvent(event);
            }
        }
    };

    @Inject
@@ -252,9 +257,10 @@ public class ProximitySensor implements ThresholdSensor {
            return;
        }
        if (mLastEvent != null) {
            ThresholdSensorEvent lastEvent = mLastEvent;  // Listeners can null out mLastEvent.
            List<ThresholdSensor.Listener> listeners = new ArrayList<>(mListeners);
            listeners.forEach(proximitySensorListener ->
                    proximitySensorListener.onThresholdCrossed(mLastEvent));
                    proximitySensorListener.onThresholdCrossed(lastEvent));
        }

        mAlerting.set(false);
+26 −0
Original line number Diff line number Diff line
@@ -152,6 +152,32 @@ public class ProximitySensorDualTest extends SysuiTestCase {
        assertFalse(mProximitySensor.isRegistered());
    }

    @Test
    public void testUnregisterDuringCallback() {
        ThresholdSensor.Listener listenerA = event -> mProximitySensor.pause();
        TestableListener listenerB = new TestableListener();

        assertFalse(mProximitySensor.isRegistered());
        mProximitySensor.register(listenerA);
        mProximitySensor.register(listenerB);
        assertTrue(mProximitySensor.isRegistered());
        assertFalse(mThresholdSensorPrimary.isPaused());
        assertTrue(mThresholdSensorSecondary.isPaused());
        assertNull(listenerB.mLastEvent);

        // listenerA will pause the proximity sensor, unregistering it.
        mThresholdSensorPrimary.triggerEvent(true, 0);
        mThresholdSensorSecondary.triggerEvent(true, 0);
        assertTrue(listenerB.mLastEvent.getBelow());
        assertEquals(1, listenerB.mCallCount);


        // A second call to trigger it should be ignored.
        mThresholdSensorSecondary.triggerEvent(false, 0);
        assertTrue(listenerB.mLastEvent.getBelow());
        assertEquals(1, listenerB.mCallCount);
    }

    @Test
    public void testPauseAndResume() {
        TestableListener listener = new TestableListener();