Loading services/core/java/com/android/server/policy/DeviceStateProviderImpl.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; } } Loading services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java +45 −6 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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" Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading
services/core/java/com/android/server/policy/DeviceStateProviderImpl.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; } } Loading
services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java +45 −6 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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" Loading Loading @@ -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); Loading Loading @@ -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); Loading