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

Commit 3995f0db authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Unregister Touch Sensors for DOZE_AOD_DOCKED

DOZE_AOD_DOCKED should not have screen based trigger sensors
enabled. In fact, it can end up in inconsistent states currently.
When first entering it, the sensors are not enabled. But if the screen
then turns off (in a dark room) and then back on, the sensors are
left on from the prior state.

This change ensures that, when we ask to turn off touch based sensors,
they actually turn off.

Fixes: 172412931
Test: manual
Change-Id: I86f800cb75fee9f2d7e60655af4803e616a68fb2
Merged-In: I86f800cb75fee9f2d7e60655af4803e616a68fb2
parent 11ed014e
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.util.IndentingPrintWriter;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
@@ -80,6 +81,7 @@ public class DozeSensors {
    private long mDebounceFrom;
    private boolean mSettingRegistered;
    private boolean mListening;
    private boolean mListeningTouchScreenSensors;

    @VisibleForTesting
    public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum {
@@ -222,22 +224,25 @@ public class DozeSensors {
    /**
     * If sensors should be registered and sending signals.
     */
    public void setListening(boolean listen) {
        if (mListening == listen) {
    public void setListening(boolean listen, boolean includeTouchScreenSensors) {
        if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors) {
            return;
        }
        mListening = listen;
        mListeningTouchScreenSensors = includeTouchScreenSensors;
        updateListening();
    }

    /**
     * Registers/unregisters sensors based on internal state.
     */
    public void updateListening() {
    private void updateListening() {
        boolean anyListening = false;
        for (TriggerSensor s : mSensors) {
            s.setListening(mListening);
            if (mListening) {
            boolean listen = mListening
                    && (!s.mRequiresTouchscreen || mListeningTouchScreenSensors);
            s.setListening(listen);
            if (listen) {
                anyListening = true;
            }
        }
@@ -309,10 +314,14 @@ public class DozeSensors {

    /** Dump current state */
    public void dump(PrintWriter pw) {
        pw.println("mListening=" + mListening);
        pw.println("mListeningTouchScreenSensors=" + mListeningTouchScreenSensors);
        IndentingPrintWriter idpw = new IndentingPrintWriter(pw, "  ");
        idpw.increaseIndent();
        for (TriggerSensor s : mSensors) {
            pw.println("  Sensor: " + s.toString());
            idpw.println("Sensor: " + s.toString());
        }
        pw.println("  ProxSensor: " + mProximitySensor.toString());
        idpw.println("ProxSensor: " + mProximitySensor.toString());
    }

    /**
+10 −14
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.IndentingPrintWriter;
import com.android.systemui.Dependency;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager;
@@ -408,15 +409,12 @@ public class DozeTriggers implements DozeMachine.Part {
                break;
            case DOZE_PULSE_DONE:
                mDozeSensors.requestTemporaryDisable();
                // A pulse will temporarily disable sensors that require a touch screen.
                // Let's make sure that they are re-enabled when the pulse is over.
                mDozeSensors.updateListening();
                break;
            case FINISH:
                mBroadcastReceiver.unregister(mBroadcastDispatcher);
                mDozeHost.removeCallback(mHostCallback);
                mDockManager.removeListener(mDockEventListener);
                mDozeSensors.setListening(false);
                mDozeSensors.setListening(false, false);
                mDozeSensors.setProxListening(false);
                mWantSensors = false;
                mWantProx = false;
@@ -424,20 +422,16 @@ public class DozeTriggers implements DozeMachine.Part {
                break;
            default:
        }
        mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
    }

    @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);
            mDozeSensors.setListening(mWantSensors);
            mDozeSensors.setTouchscreenSensorsListening(mWantTouchScreenSensors);
        } else {
            mDozeSensors.setProxListening(false);
            mDozeSensors.setListening(mWantSensors);
        }
        mDozeSensors.setProxListening(mWantProx && (state == Display.STATE_DOZE
                || state == Display.STATE_DOZE_SUSPEND
                || state == Display.STATE_OFF));
        mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
    }

    private void checkTriggersAtInit() {
@@ -513,7 +507,9 @@ public class DozeTriggers implements DozeMachine.Part {

        pw.println(" pulsePending=" + mPulsePending);
        pw.println("DozeSensors:");
        mDozeSensors.dump(pw);
        IndentingPrintWriter idpw = new IndentingPrintWriter(pw, "  ");
        idpw.increaseIndent();
        mDozeSensors.dump(idpw);
    }

    private class TriggerReceiver extends BroadcastReceiver {
+4 −6
Original line number Diff line number Diff line
@@ -77,8 +77,6 @@ public class DozeSensorsTest extends SysuiTestCase {
    @Mock
    private Consumer<Boolean> mProxCallback;
    @Mock
    private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
    @Mock
    private TriggerSensor mTriggerSensor;
    @Mock
    private DozeLog mDozeLog;
@@ -110,7 +108,7 @@ public class DozeSensorsTest extends SysuiTestCase {

    @Test
    public void testSensorDebounce() {
        mDozeSensors.setListening(true);
        mDozeSensors.setListening(true, true);

        mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
        mTestableLooper.processAllMessages();
@@ -128,7 +126,7 @@ public class DozeSensorsTest extends SysuiTestCase {
    @Test
    public void testSetListening_firstTrue_registerSettingsObserver() {
        verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
        mDozeSensors.setListening(true);
        mDozeSensors.setListening(true, true);

        verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class));
    }
@@ -136,8 +134,8 @@ public class DozeSensorsTest extends SysuiTestCase {
    @Test
    public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() {
        verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
        mDozeSensors.setListening(true);
        mDozeSensors.setListening(true);
        mDozeSensors.setListening(true, true);
        mDozeSensors.setListening(true, true);

        verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class));
    }
+1 −0
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ public class DozeTriggersTest extends SysuiTestCase {

        clearInvocations(mSensors);
        mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE);
        mTriggers.transitionTo(DozeMachine.State.DOZE_PULSE_DONE, DozeMachine.State.DOZE_AOD);
        waitForSensorManager();
        verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
    }