Merge "Do not report state change when receiving invalid sensor values" into tm-qpr-dev am: 30053d58f3
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20514286 Change-Id: Ie907d3b46493e65ada93616d1f382ac0a413c5d5 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -367,7 +367,7 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int newState = mOrderedStates[0].getIdentifier();
|
int newState = INVALID_DEVICE_STATE;
|
||||||
for (int i = 0; i < mOrderedStates.length; i++) {
|
for (int i = 0; i < mOrderedStates.length; i++) {
|
||||||
int state = mOrderedStates[i].getIdentifier();
|
int state = mOrderedStates[i].getIdentifier();
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
@@ -396,7 +396,7 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newState != mLastReportedState) {
|
if (newState != INVALID_DEVICE_STATE && newState != mLastReportedState) {
|
||||||
mLastReportedState = newState;
|
mLastReportedState = newState;
|
||||||
stateToReport = newState;
|
stateToReport = newState;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ public final class DeviceStateProviderImplTest {
|
|||||||
private final ArgumentCaptor<DeviceState[]> mDeviceStateArrayCaptor = ArgumentCaptor.forClass(
|
private final ArgumentCaptor<DeviceState[]> mDeviceStateArrayCaptor = ArgumentCaptor.forClass(
|
||||||
DeviceState[].class);
|
DeviceState[].class);
|
||||||
private final ArgumentCaptor<Integer> mIntegerCaptor = ArgumentCaptor.forClass(Integer.class);
|
private final ArgumentCaptor<Integer> mIntegerCaptor = ArgumentCaptor.forClass(Integer.class);
|
||||||
|
private static final int MAX_HINGE_ANGLE_EXCLUSIVE = 360;
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private SensorManager mSensorManager;
|
private SensorManager mSensorManager;
|
||||||
@@ -268,11 +269,7 @@ public final class DeviceStateProviderImplTest {
|
|||||||
assertEquals(1, mIntegerCaptor.getValue().intValue());
|
assertEquals(1, mIntegerCaptor.getValue().intValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
private DeviceStateProviderImpl create_sensorBasedProvider(Sensor sensor) {
|
||||||
public void create_sensor() throws Exception {
|
|
||||||
Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
|
|
||||||
when(mSensorManager.getSensorList(anyInt())).thenReturn(List.of(sensor));
|
|
||||||
|
|
||||||
String configString = "<device-state-config>\n"
|
String configString = "<device-state-config>\n"
|
||||||
+ " <device-state>\n"
|
+ " <device-state>\n"
|
||||||
+ " <identifier>1</identifier>\n"
|
+ " <identifier>1</identifier>\n"
|
||||||
@@ -310,14 +307,22 @@ public final class DeviceStateProviderImplTest {
|
|||||||
+ " <name>" + sensor.getName() + "</name>\n"
|
+ " <name>" + sensor.getName() + "</name>\n"
|
||||||
+ " <value>\n"
|
+ " <value>\n"
|
||||||
+ " <min-inclusive>180</min-inclusive>\n"
|
+ " <min-inclusive>180</min-inclusive>\n"
|
||||||
|
+ " <max>" + MAX_HINGE_ANGLE_EXCLUSIVE + "</max>\n"
|
||||||
+ " </value>\n"
|
+ " </value>\n"
|
||||||
+ " </sensor>\n"
|
+ " </sensor>\n"
|
||||||
+ " </conditions>\n"
|
+ " </conditions>\n"
|
||||||
+ " </device-state>\n"
|
+ " </device-state>\n"
|
||||||
+ "</device-state-config>\n";
|
+ "</device-state-config>\n";
|
||||||
DeviceStateProviderImpl.ReadableConfig config = new TestReadableConfig(configString);
|
DeviceStateProviderImpl.ReadableConfig config = new TestReadableConfig(configString);
|
||||||
DeviceStateProviderImpl provider = DeviceStateProviderImpl.createFromConfig(mContext,
|
return DeviceStateProviderImpl.createFromConfig(mContext,
|
||||||
config);
|
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);
|
DeviceStateProvider.Listener listener = mock(DeviceStateProvider.Listener.class);
|
||||||
provider.setListener(listener);
|
provider.setListener(listener);
|
||||||
@@ -370,6 +375,40 @@ public final class DeviceStateProviderImplTest {
|
|||||||
assertEquals(1, mIntegerCaptor.getValue().intValue());
|
assertEquals(1, mIntegerCaptor.getValue().intValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
@Test
|
||||||
public void create_invalidSensor() throws Exception {
|
public void create_invalidSensor() throws Exception {
|
||||||
Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
|
Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
|
||||||
|
|||||||
Reference in New Issue
Block a user