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
This commit is contained in:
Beverly
2021-08-19 14:10:40 -04:00
committed by Beverly Tai
parent 0d1290e7c3
commit 28eaae3997
2 changed files with 117 additions and 6 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}