summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jiaming Liu <jiamingliu@google.com> 2022-11-18 00:02:07 +0000
committer Jiaming Liu <jiamingliu@google.com> 2022-11-18 18:58:31 +0000
commit497b56dbfb5346b399c40dc59fed2c8aecf55feb (patch)
treeecf3c9b7a861a3deed140af9e1fd853c163751da
parenta33294cf8e5091367bc1b22648b79e4c8964ecf6 (diff)
Do not report state change when receiving invalid sensor values
Currently we report the default state when none of the declared states matches the sensor values. This causes the device to switch to the CLOSED state when we receive invalid sensor values. We should instead make it a noop when receiving bad sensor data. Fix: 258990181 Test: atest com.android.server.policy.DeviceStateProviderImplTest#create_sensor Change-Id: I56c4513b7056911d5147f96223a410fe4332af3c
-rw-r--r--services/core/java/com/android/server/policy/DeviceStateProviderImpl.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java51
2 files changed, 47 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
index 9b7d19a725d1..1b7a07dcd5a7 100644
--- a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
+++ b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
@@ -358,7 +358,7 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
return;
}
- int newState = mOrderedStates[0].getIdentifier();
+ int newState = INVALID_DEVICE_STATE;
for (int i = 0; i < mOrderedStates.length; i++) {
int state = mOrderedStates[i].getIdentifier();
if (DEBUG) {
@@ -387,7 +387,7 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
}
}
- if (newState != mLastReportedState) {
+ if (newState != INVALID_DEVICE_STATE && newState != mLastReportedState) {
mLastReportedState = newState;
stateToReport = newState;
}
diff --git a/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java b/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java
index 90b19a450f48..6d2631ac3ad4 100644
--- a/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java
@@ -65,6 +65,7 @@ public final class DeviceStateProviderImplTest {
private final ArgumentCaptor<DeviceState[]> mDeviceStateArrayCaptor = ArgumentCaptor.forClass(
DeviceState[].class);
private final ArgumentCaptor<Integer> mIntegerCaptor = ArgumentCaptor.forClass(Integer.class);
+ private static final int MAX_HINGE_ANGLE_EXCLUSIVE = 360;
private Context mContext;
private SensorManager mSensorManager;
@@ -268,11 +269,7 @@ public final class DeviceStateProviderImplTest {
assertEquals(1, mIntegerCaptor.getValue().intValue());
}
- @Test
- public void create_sensor() throws Exception {
- Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
- when(mSensorManager.getSensorList(anyInt())).thenReturn(List.of(sensor));
-
+ private DeviceStateProviderImpl create_sensorBasedProvider(Sensor sensor) {
String configString = "<device-state-config>\n"
+ " <device-state>\n"
+ " <identifier>1</identifier>\n"
@@ -310,14 +307,22 @@ public final class DeviceStateProviderImplTest {
+ " <name>" + sensor.getName() + "</name>\n"
+ " <value>\n"
+ " <min-inclusive>180</min-inclusive>\n"
+ + " <max>" + MAX_HINGE_ANGLE_EXCLUSIVE + "</max>\n"
+ " </value>\n"
+ " </sensor>\n"
+ " </conditions>\n"
+ " </device-state>\n"
+ "</device-state-config>\n";
DeviceStateProviderImpl.ReadableConfig config = new TestReadableConfig(configString);
- DeviceStateProviderImpl provider = DeviceStateProviderImpl.createFromConfig(mContext,
+ return DeviceStateProviderImpl.createFromConfig(mContext,
config);
+ }
+
+ @Test
+ public void create_sensor() throws Exception {
+ Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
+ when(mSensorManager.getSensorList(anyInt())).thenReturn(List.of(sensor));
+ DeviceStateProviderImpl provider = create_sensorBasedProvider(sensor);
DeviceStateProvider.Listener listener = mock(DeviceStateProvider.Listener.class);
provider.setListener(listener);
@@ -371,6 +376,40 @@ public final class DeviceStateProviderImplTest {
}
@Test
+ public void test_invalidSensorValues() throws Exception {
+ // onStateChanged() should not be triggered by invalid sensor values.
+
+ Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
+ when(mSensorManager.getSensorList(anyInt())).thenReturn(List.of(sensor));
+ DeviceStateProviderImpl provider = create_sensorBasedProvider(sensor);
+
+ DeviceStateProvider.Listener listener = mock(DeviceStateProvider.Listener.class);
+ provider.setListener(listener);
+ Mockito.clearInvocations(listener);
+
+ // First, switch to a non-default state.
+ SensorEvent event1 = mock(SensorEvent.class);
+ event1.sensor = sensor;
+ FieldSetter.setField(event1, event1.getClass().getField("values"), new float[]{90});
+ provider.onSensorChanged(event1);
+ verify(listener).onStateChanged(mIntegerCaptor.capture());
+ assertEquals(2, mIntegerCaptor.getValue().intValue());
+
+ Mockito.clearInvocations(listener);
+
+ // Then, send an invalid sensor event, verify that onStateChanged() is not triggered.
+ SensorEvent event2 = mock(SensorEvent.class);
+ event2.sensor = sensor;
+ FieldSetter.setField(event2, event2.getClass().getField("values"),
+ new float[]{MAX_HINGE_ANGLE_EXCLUSIVE});
+
+ provider.onSensorChanged(event2);
+
+ verify(listener, never()).onSupportedDeviceStatesChanged(mDeviceStateArrayCaptor.capture());
+ verify(listener, never()).onStateChanged(mIntegerCaptor.capture());
+ }
+
+ @Test
public void create_invalidSensor() throws Exception {
Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
when(mSensorManager.getSensorList(anyInt())).thenReturn(List.of());