Convert device state sensor type from int to String.

This converts the sensor type within the device state config file from
a raw int type to its fully qualified Sensor string type. For ex, a hinge
sensor that was previously identified with "36" would now be identified
with "android.sensor.hinge_angle".

Bug: 159401801
Test: atest DeviceStateProviderImplTest
Change-Id: I32ff9db11f68d602f7084d5308f0435bf418e522
This commit is contained in:
Darryl L Johnson
2020-11-30 13:52:24 -08:00
parent fcdc5c4c1d
commit ad0b38bdbd
4 changed files with 34 additions and 22 deletions

View File

@@ -158,7 +158,6 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
// switch there is no need to register for a callback.
boolean shouldListenToLidSwitch = false;
final SensorManager sensorManager = mContext.getSystemService(SensorManager.class);
// The set of Sensor(s) that this instance should register to receive SensorEvent(s) from.
final ArraySet<Sensor> sensorsToListenTo = new ArraySet<>();
@@ -182,19 +181,10 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
List<SensorCondition> sensorConditions = conditions.getSensor();
for (int j = 0; j < sensorConditions.size(); j++) {
SensorCondition sensorCondition = sensorConditions.get(j);
final int expectedSensorType = sensorCondition.getType().intValue();
final String expectedSensorType = sensorCondition.getType();
final String expectedSensorName = sensorCondition.getName();
List<Sensor> sensors = sensorManager.getSensorList(expectedSensorType);
Sensor foundSensor = null;
for (int sensorIndex = 0; sensorIndex < sensors.size(); sensorIndex++) {
Sensor sensor = sensors.get(sensorIndex);
if (sensor.getName().equals(expectedSensorName)) {
foundSensor = sensor;
break;
}
}
final Sensor foundSensor = findSensor(expectedSensorType, expectedSensorName);
if (foundSensor == null) {
throw new IllegalStateException("Failed to find Sensor with type: "
+ expectedSensorType + " and name: " + expectedSensorName);
@@ -221,12 +211,33 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
inputManager.registerLidSwitchCallback(this);
}
final SensorManager sensorManager = mContext.getSystemService(SensorManager.class);
for (int i = 0; i < sensorsToListenTo.size(); i++) {
Sensor sensor = sensorsToListenTo.valueAt(i);
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
}
}
@Nullable
private Sensor findSensor(String type, String name) {
final SensorManager sensorManager = mContext.getSystemService(SensorManager.class);
final List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (int sensorIndex = 0; sensorIndex < sensors.size(); sensorIndex++) {
final Sensor sensor = sensors.get(sensorIndex);
final String sensorType = sensor.getStringType();
final String sensorName = sensor.getName();
if (sensorType == null || sensorName == null) {
continue;
}
if (sensorType.equals(type) && sensorName.equals(name)) {
return sensor;
}
}
return null;
}
@Override
public void setListener(Listener listener) {
synchronized (mLock) {

View File

@@ -57,8 +57,8 @@
<xs:complexType name="sensorCondition">
<xs:sequence>
<xs:element name="type" type="xs:string" />
<xs:element name="name" type="xs:string" />
<xs:element name="type" type="xs:positiveInteger" />
<xs:element name="value" type="numericRange" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

View File

@@ -44,10 +44,10 @@ package com.android.server.policy.devicestate.config {
public class SensorCondition {
ctor public SensorCondition();
method public String getName();
method public java.math.BigInteger getType();
method public String getType();
method public java.util.List<com.android.server.policy.devicestate.config.NumericRange> getValue();
method public void setName(String);
method public void setType(java.math.BigInteger);
method public void setType(String);
}
public class XmlParser {

View File

@@ -23,6 +23,7 @@ import static com.android.server.policy.DeviceStateProviderImpl.DEFAULT_DEVICE_S
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -170,16 +171,16 @@ public final class DeviceStateProviderImplTest {
@Test
public void create_sensor() throws Exception {
Sensor sensor = newSensor("sensor", Sensor.TYPE_HINGE_ANGLE);
when(mSensorManager.getSensorList(eq(sensor.getType()))).thenReturn(List.of(sensor));
Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
when(mSensorManager.getSensorList(anyInt())).thenReturn(List.of(sensor));
String configString = "<device-state-config>\n"
+ " <device-state>\n"
+ " <identifier>1</identifier>\n"
+ " <conditions>\n"
+ " <sensor>\n"
+ " <type>" + sensor.getStringType() + "</type>\n"
+ " <name>" + sensor.getName() + "</name>\n"
+ " <type>" + sensor.getType() + "</type>\n"
+ " <value>\n"
+ " <max>90</max>\n"
+ " </value>\n"
@@ -190,8 +191,8 @@ public final class DeviceStateProviderImplTest {
+ " <identifier>2</identifier>\n"
+ " <conditions>\n"
+ " <sensor>\n"
+ " <type>" + sensor.getStringType() + "</type>\n"
+ " <name>" + sensor.getName() + "</name>\n"
+ " <type>" + sensor.getType() + "</type>\n"
+ " <value>\n"
+ " <min-inclusive>90</min-inclusive>\n"
+ " <max>180</max>\n"
@@ -203,8 +204,8 @@ public final class DeviceStateProviderImplTest {
+ " <identifier>3</identifier>\n"
+ " <conditions>\n"
+ " <sensor>\n"
+ " <type>" + sensor.getStringType() + "</type>\n"
+ " <name>" + sensor.getName() + "</name>\n"
+ " <type>" + sensor.getType() + "</type>\n"
+ " <value>\n"
+ " <min-inclusive>180</min-inclusive>\n"
+ " </value>\n"
@@ -262,13 +263,13 @@ public final class DeviceStateProviderImplTest {
assertEquals(1, mIntegerCaptor.getValue().intValue());
}
private static Sensor newSensor(String name, int type) throws Exception {
private static Sensor newSensor(String name, String type) throws Exception {
Constructor<Sensor> constructor = Sensor.class.getDeclaredConstructor();
constructor.setAccessible(true);
Sensor sensor = constructor.newInstance();
FieldSetter.setField(sensor, Sensor.class.getDeclaredField("mName"), name);
FieldSetter.setField(sensor, Sensor.class.getDeclaredField("mType"), type);
FieldSetter.setField(sensor, Sensor.class.getDeclaredField("mStringType"), type);
return sensor;
}