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

Commit 2a7d8041 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Leave Prox registered when safe to do so.

This CL allows a proximity sensor operating in dual mode to
leave its secondary sensor regitered where it is told it is
safe to do so. This is generally when the screen is in some
sort of doze or aod mode. The sensor does not itself manage
this state but expects clients to tell it when it it safe.

Fixes: 157717162
Test: atest SystemUITests && manual
Change-Id: Ie89e80aa7440b4964fb61c144ae3b8bc4808f0ac
parent 891fba38
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.Display;

import androidx.annotation.VisibleForTesting;

@@ -266,6 +267,13 @@ public class DozeSensors {
        }
    }

    void onScreenState(int state) {
        mProximitySensor.setSecondarySafe(
                state == Display.STATE_DOZE
                || state == Display.STATE_DOZE_SUSPEND
                || state == Display.STATE_OFF);
    }

    public void setProxListening(boolean listen) {
        if (mProximitySensor.isRegistered() && listen) {
            mProximitySensor.alertListeners();
+1 −0
Original line number Diff line number Diff line
@@ -423,6 +423,7 @@ public class DozeTriggers implements DozeMachine.Part {

    @Override
    public void onScreenState(int state) {
        mDozeSensors.onScreenState(state);
        if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND
                || state == Display.STATE_OFF) {
            mDozeSensors.setProxListening(mWantProx);
+26 −11
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ public class ProximitySensor implements ThresholdSensor {
    private final AtomicBoolean mAlerting = new AtomicBoolean();
    private Runnable mCancelSecondaryRunnable;
    private boolean mInitializedListeners = false;
    private boolean mSecondarySafe = false;

    private ThresholdSensor.Listener mPrimaryEventListener = new ThresholdSensor.Listener() {
        @Override
@@ -83,21 +84,22 @@ public class ProximitySensor implements ThresholdSensor {
    private ThresholdSensor.Listener mSecondaryEventListener = new ThresholdSensor.Listener() {
        @Override
        public void onThresholdCrossed(ThresholdSensorEvent event) {
            // Only check the secondary as long as the primary thinks we're near.
            if (!mLastPrimaryEvent.getBelow()) {
            // 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())) {
                mSecondaryThresholdSensor.pause();
                if (!mLastPrimaryEvent.getBelow()) {
                    // Only check the secondary as long as the primary thinks we're near.
                    mCancelSecondaryRunnable = null;
                    return;
            }
            logDebug("Secondary sensor event: " + event.getBelow() + ".");

            // This sensor should only be used briefly when uncovered.
            if (!event.getBelow()) {
                mSecondaryThresholdSensor.pause();
                } else {
                    // Check this sensor again in a moment.
                    mCancelSecondaryRunnable = mDelayableExecutor.executeDelayed(
                            mSecondaryThresholdSensor::resume, SECONDARY_PING_INTERVAL_MS);
                }
            }
            logDebug("Secondary sensor event: " + event.getBelow() + ".");

            onSensorEvent(event);
        }
    };
@@ -145,6 +147,15 @@ public class ProximitySensor implements ThresholdSensor {
        registerInternal();
    }

    /**
     * Sets that it is safe to leave the secondary sensor on indefinitely.
     */
    public void setSecondarySafe(boolean safe) {
        mSecondarySafe = safe;
        if (!mSecondarySafe) {
            mSecondaryThresholdSensor.pause();
        }
    }

    /**
     * Returns true if we are registered with the SensorManager.
@@ -278,6 +289,10 @@ public class ProximitySensor implements ThresholdSensor {
            return;
        }

        if (!mSecondarySafe && !event.getBelow()) {
            mSecondaryThresholdSensor.pause();
        }

        mLastEvent = event;
        alertListeners();
    }
+32 −0
Original line number Diff line number Diff line
@@ -292,6 +292,38 @@ public class ProximitySensorDualTest extends SysuiTestCase {
        mProximitySensor.unregister(listener);
    }

    @Test
    public void testSecondarySafe() {
        mProximitySensor.setSecondarySafe(true);

        TestableListener listener = new TestableListener();

        mProximitySensor.register(listener);
        assertFalse(mThresholdSensorPrimary.isPaused());
        assertTrue(mThresholdSensorSecondary.isPaused());
        assertNull(listener.mLastEvent);
        assertEquals(0, listener.mCallCount);

        mThresholdSensorPrimary.triggerEvent(true, 0);
        assertNull(listener.mLastEvent);
        assertEquals(0, listener.mCallCount);
        mThresholdSensorSecondary.triggerEvent(true, 0);
        assertTrue(listener.mLastEvent.getBelow());
        assertEquals(1, listener.mCallCount);

        // The secondary sensor should now remain resumed indefinitely.
        assertFalse(mThresholdSensorSecondary.isPaused());
        mThresholdSensorPrimary.triggerEvent(false, 1);
        assertFalse(listener.mLastEvent.getBelow());
        assertEquals(2, listener.mCallCount);

        // The secondary is still running, and not polling with the executor.
        assertFalse(mThresholdSensorSecondary.isPaused());
        assertEquals(0, mFakeExecutor.numPending());

        mProximitySensor.unregister(listener);
    }

    private static class TestableListener implements ThresholdSensor.Listener {
        ThresholdSensor.ThresholdSensorEvent mLastEvent;
        int mCallCount = 0;