From 28eaae399750d5347b1a7088fc8201eede41565f Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 19 Aug 2021 14:10:40 -0400 Subject: [PATCH] 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 --- .../android/systemui/doze/DozeSensors.java | 21 +++- .../systemui/doze/DozeSensorsTest.java | 102 +++++++++++++++++- 2 files changed, 117 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index b2db86f161043..55e6154b829d1 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -456,13 +456,24 @@ public class DozeSensors { public void updateListening() { if (!mConfigured || mSensor == null) return; - if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting) - && !mRegistered) { - mRegistered = mSensorManager.requestTriggerSensor(this, mSensor); - if (DEBUG) Log.d(TAG, "requestTriggerSensor " + mRegistered); + if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting)) { + if (!mRegistered) { + mRegistered = mSensorManager.requestTriggerSensor(this, mSensor); + 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; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index 0c94f09c8572a..5c4c27ccc4ca7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -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); + } } }