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

Commit 28eaae39 authored by Beverly's avatar Beverly Committed by Beverly Tai
Browse files

Don't unregister doze sensors that have been requested

Previously, if we were already registered for the sensor,
we may mistakenly unregister for it even though we still wanted to
listen for it.

Test: atest DozeSensorsTest
Fixes: 197100880
Change-Id: Iaba61e10472dd61b95aac2002301dbf29c2cad8a
parent 0d1290e7
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -456,13 +456,24 @@ public class DozeSensors {

        public void updateListening() {
            if (!mConfigured || mSensor == null) return;
            if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting)
                    && !mRegistered) {
            if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting)) {
                if (!mRegistered) {
                    mRegistered = mSensorManager.requestTriggerSensor(this, mSensor);
                if (DEBUG) Log.d(TAG, "requestTriggerSensor " + mRegistered);
                    if (DEBUG) {
                        Log.d(TAG, "requestTriggerSensor[" + mSensor
                                + "] " + mRegistered);
                    }
                } else {
                    if (DEBUG) {
                        Log.d(TAG, "requestTriggerSensor[" + mSensor
                                + "] already registered");
                    }
                }
            } else if (mRegistered) {
                final boolean rt = mSensorManager.cancelTriggerSensor(this, mSensor);
                if (DEBUG) Log.d(TAG, "cancelTriggerSensor " + rt);
                if (DEBUG) {
                    Log.d(TAG, "cancelTriggerSensor[" + mSensor + "] " + rt);
                }
                mRegistered = false;
            }
        }
+101 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ public class DozeSensorsTest extends SysuiTestCase {
    private FakeSettings mFakeSettings = new FakeSettings();
    private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener;
    private TestableLooper mTestableLooper;
    private DozeSensors mDozeSensors;
    private TestableDozeSensors mDozeSensors;
    private TriggerSensor mSensorTap;

    @Before
@@ -170,6 +170,94 @@ public class DozeSensorsTest extends SysuiTestCase {
        assertTrue(mSensorTap.mRequested);
    }

    @Test
    public void testDozeSensorSetListening() {
        // GIVEN doze sensors enabled
        when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);

        // GIVEN a trigger sensor
        Sensor mockSensor = mock(Sensor.class);
        TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
                mockSensor,
                /* settingEnabled */ true,
                /* requiresTouchScreen */ true);
        when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
                .thenReturn(true);

        // WHEN we want to listen for the trigger sensor
        triggerSensor.setListening(true);

        // THEN the sensor is registered
        assertTrue(triggerSensor.mRegistered);
    }

    @Test
    public void testDozeSensorSettingDisabled() {
        // GIVEN doze sensors enabled
        when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);

        // GIVEN a trigger sensor
        Sensor mockSensor = mock(Sensor.class);
        TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
                mockSensor,
                /* settingEnabled*/ false,
                /* requiresTouchScreen */ true);
        when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
                .thenReturn(true);

        // WHEN setListening is called
        triggerSensor.setListening(true);

        // THEN the sensor is not registered
        assertFalse(triggerSensor.mRegistered);
    }

    @Test
    public void testDozeSensorIgnoreSetting() {
        // GIVEN doze sensors enabled
        when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);

        // GIVEN a trigger sensor that's
        Sensor mockSensor = mock(Sensor.class);
        TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
                mockSensor,
                /* settingEnabled*/ false,
                /* requiresTouchScreen */ true);
        when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
                .thenReturn(true);

        // GIVEN sensor is listening
        triggerSensor.setListening(true);

        // WHEN ignoreSetting is called
        triggerSensor.ignoreSetting(true);

        // THEN the sensor is registered
        assertTrue(triggerSensor.mRegistered);
    }

    @Test
    public void testUpdateListeningAfterAlreadyRegistered() {
        // GIVEN doze sensors enabled
        when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);

        // GIVEN a trigger sensor
        Sensor mockSensor = mock(Sensor.class);
        TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
                mockSensor,
                /* settingEnabled*/ true,
                /* requiresTouchScreen */ true);
        when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
                .thenReturn(true);

        // WHEN setListening is called AND updateListening is called
        triggerSensor.setListening(true);
        triggerSensor.updateListening();

        // THEN the sensor is still registered
        assertTrue(triggerSensor.mRegistered);
    }

    private class TestableDozeSensors extends DozeSensors {

        TestableDozeSensors() {
@@ -187,5 +275,17 @@ public class DozeSensorsTest extends SysuiTestCase {
            }
            mSensors = new TriggerSensor[] {mTriggerSensor, mSensorTap};
        }

        public TriggerSensor createDozeSensor(Sensor sensor, boolean settingEnabled,
                boolean requiresTouchScreen) {
            return new TriggerSensor(/* sensor */ sensor,
                    /* setting name */ "test_setting",
                    /* settingDefault */ settingEnabled,
                    /* configured */ true,
                    /* pulseReason*/ 0,
                    /* reportsTouchCoordinate*/ false,
                    requiresTouchScreen,
                    mDozeLog);
        }
    }
}