From 66c773e0a4d1646a9a2b53201a3ff587b96817cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Bossi?= <62483708+TomoBossi@users.noreply.github.com> Date: Sat, 20 Jul 2024 12:17:45 -0300 Subject: [PATCH] Fixed(SensorAPI): Use shortest matched sensor Previously, one sensor name is a substring of another sensor name (like `ORIENTATION` and `DEVICE_ORIENTATION`), then the first matched sensor in available sensors list would get registered, depending on order of sensors. Now we use the shortest match for the requested sensor in the available sensors list, the shortest being an exact match if requested sensor is passed exactly (ignoring case). Closes #570 --- .../java/com/termux/api/apis/SensorAPI.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/termux/api/apis/SensorAPI.java b/app/src/main/java/com/termux/api/apis/SensorAPI.java index 6d67dc881..efa8fede4 100644 --- a/app/src/main/java/com/termux/api/apis/SensorAPI.java +++ b/app/src/main/java/com/termux/api/apis/SensorAPI.java @@ -287,17 +287,25 @@ protected static List getSensorsToListenTo(SensorManager sensorManager, } else { // try to find matching sensors that were sent in request - for (String sensorName : requestedSensors) { + for (String requestedSensor : requestedSensors) { // ignore case - sensorName = sensorName.toUpperCase(); + requestedSensor = requestedSensor.toUpperCase(); - for (Sensor sensor : availableSensors) { - if (sensor.getName().toUpperCase().contains(sensorName)) { - sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_UI); - sensorsToListenTo.add(sensor); - break; + Sensor shortestMatchSensor = null; + int shortestMatchSensorLength = Integer.MAX_VALUE; + + for (Sensor availableSensor : availableSensors) { + String sensorName = availableSensor.getName().toUpperCase(); + if (sensorName.contains(requestedSensor) && sensorName.length() < shortestMatchSensorLength) { + shortestMatchSensor = availableSensor; + shortestMatchSensorLength = sensorName.length(); } } + + if (shortestMatchSensor != null) { + sensorManager.registerListener(sensorEventListener, shortestMatchSensor, SensorManager.SENSOR_DELAY_UI); + sensorsToListenTo.add(shortestMatchSensor); + } } } return sensorsToListenTo;