Track time between hardware sensor updates to restart the listener as needed (#3026)

* Check if listener got stuck for heart rate sensor and restart if needed

* Apply reset listener logic to other hardware sensors

* Review comments
This commit is contained in:
Daniel Shokouhi 2022-11-09 13:14:49 -08:00 committed by GitHub
parent affc60178e
commit 57b3b771b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 45 additions and 1 deletions

View file

@ -17,6 +17,7 @@ class LightSensorManager : SensorManager, SensorEventListener {
private const val TAG = "LightSensor"
private var isListenerRegistered = false
private var listenerLastRegistered = 0
private val lightSensor = SensorManager.BasicSensor(
"light_sensor",
"sensor",
@ -65,6 +66,12 @@ class LightSensorManager : SensorManager, SensorEventListener {
if (!isEnabled(latestContext, lightSensor.id))
return
val now = System.currentTimeMillis()
if (listenerLastRegistered + SensorManager.SENSOR_LISTENER_TIMEOUT < now && isListenerRegistered) {
Log.d(TAG, "Re-registering listener as it appears to be stuck")
mySensorManager.unregisterListener(this)
isListenerRegistered = false
}
mySensorManager = latestContext.getSystemService()!!
val lightSensors = mySensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
@ -76,6 +83,7 @@ class LightSensorManager : SensorManager, SensorEventListener {
)
Log.d(TAG, "Light sensor listener registered")
isListenerRegistered = true
listenerLastRegistered = now.toInt()
}
}

View file

@ -17,6 +17,7 @@ class PressureSensorManager : SensorManager, SensorEventListener {
private const val TAG = "PressureSensor"
private var isListenerRegistered = false
private var listenerLastRegistered = 0
private val pressureSensor = SensorManager.BasicSensor(
"pressure_sensor",
"sensor",
@ -63,6 +64,13 @@ class PressureSensorManager : SensorManager, SensorEventListener {
if (!isEnabled(latestContext, pressureSensor.id))
return
val now = System.currentTimeMillis()
if (listenerLastRegistered + SensorManager.SENSOR_LISTENER_TIMEOUT < now && isListenerRegistered) {
Log.d(TAG, "Re-registering listener as it appears to be stuck")
mySensorManager.unregisterListener(this)
isListenerRegistered = false
}
mySensorManager = latestContext.getSystemService()!!
val pressureSensors = mySensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)
@ -74,6 +82,7 @@ class PressureSensorManager : SensorManager, SensorEventListener {
)
Log.d(TAG, "Pressure sensor listener registered")
isListenerRegistered = true
listenerLastRegistered = now.toInt()
}
}

View file

@ -17,6 +17,7 @@ class ProximitySensorManager : SensorManager, SensorEventListener {
private const val TAG = "ProximitySensor"
private var isListenerRegistered = false
private var listenerLastRegistered = 0
private val proximitySensor = SensorManager.BasicSensor(
"proximity_sensor",
"sensor",
@ -62,6 +63,13 @@ class ProximitySensorManager : SensorManager, SensorEventListener {
if (!isEnabled(latestContext, proximitySensor.id))
return
val now = System.currentTimeMillis()
if (listenerLastRegistered + SensorManager.SENSOR_LISTENER_TIMEOUT < now && isListenerRegistered) {
Log.d(TAG, "Re-registering listener as it appears to be stuck")
mySensorManager.unregisterListener(this)
isListenerRegistered = false
}
mySensorManager = latestContext.getSystemService()!!
val proximitySensors = mySensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
@ -73,6 +81,7 @@ class ProximitySensorManager : SensorManager, SensorEventListener {
)
Log.d(TAG, "Proximity sensor listener registered")
isListenerRegistered = true
listenerLastRegistered = now.toInt()
maxRange = proximitySensors.maximumRange.roundToInt()
}
}

View file

@ -23,6 +23,7 @@ interface SensorManager {
const val STATE_CLASS_MEASUREMENT = "measurement"
const val STATE_CLASS_TOTAL = "total"
const val STATE_CLASS_TOTAL_INCREASING = "total_increasing"
const val SENSOR_LISTENER_TIMEOUT = 60000
}
val name: Int

View file

@ -18,6 +18,7 @@ class StepsSensorManager : SensorManager, SensorEventListener {
private const val TAG = "StepsSensor"
private var isListenerRegistered = false
private var listenerLastRegistered = 0
private val stepsSensor = SensorManager.BasicSensor(
"steps_sensor",
"sensor",
@ -71,6 +72,12 @@ class StepsSensorManager : SensorManager, SensorEventListener {
return
if (checkPermission(latestContext, stepsSensor.id)) {
val now = System.currentTimeMillis()
if (listenerLastRegistered + SensorManager.SENSOR_LISTENER_TIMEOUT < now && isListenerRegistered) {
Log.d(TAG, "Re-registering listener as it appears to be stuck")
mySensorManager.unregisterListener(this)
isListenerRegistered = false
}
mySensorManager = latestContext.getSystemService()!!
val stepsSensors = mySensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)
@ -82,6 +89,7 @@ class StepsSensorManager : SensorManager, SensorEventListener {
)
Log.d(TAG, "Steps sensor listener registered")
isListenerRegistered = true
listenerLastRegistered = now.toInt()
}
}
}

View file

@ -23,6 +23,7 @@ class HeartRateSensorManager : SensorManager, SensorEventListener {
private const val TAG = "HRSensor"
private var isListenerRegistered = false
private var listenerLastRegistered = 0
private val skipAccuracy = listOf(
SENSOR_STATUS_UNRELIABLE,
SENSOR_STATUS_NO_CONTACT
@ -74,6 +75,12 @@ class HeartRateSensorManager : SensorManager, SensorEventListener {
if (!isEnabled(latestContext, heartRate.id))
return
val now = System.currentTimeMillis()
if (listenerLastRegistered + 60000 < now && isListenerRegistered) {
Log.d(TAG, "Re-registering listener as it appears to be stuck")
mySensorManager.unregisterListener(this)
isListenerRegistered = false
}
mySensorManager = latestContext.getSystemService()!!
val heartRateSensor = mySensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE)
@ -85,6 +92,7 @@ class HeartRateSensorManager : SensorManager, SensorEventListener {
)
Log.d(TAG, "Heart Rate sensor listener registered")
isListenerRegistered = true
listenerLastRegistered = now.toInt()
}
}

View file

@ -22,7 +22,8 @@ class OnBodySensorManager : SensorManager, SensorEventListener {
commonR.string.sensor_name_on_body,
commonR.string.sensor_description_on_body,
"mdi:account",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
updateType = SensorManager.BasicSensor.UpdateType.INTENT
)
}