Add On Body sensor for Wear OS (#2961)

* Add On Body sensor for Wear OS

* Remove unnecessary requirement
This commit is contained in:
Daniel Shokouhi 2022-10-21 10:47:20 -07:00 committed by GitHub
parent 1d3e8d67e9
commit e8fe823312
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 101 additions and 1 deletions

View file

@ -932,4 +932,6 @@
<string name="sensor_name_display_sensors">Display Sensors</string>
<string name="sensor_name_screen_off_timeout">Screen Off Timeout</string>
<string name="sensor_description_screen_off_timeout">The current duration of idle time before the screen turns off in milliseconds</string>
<string name="sensor_name_on_body">On Body Sensor</string>
<string name="sensor_description_on_body">Indicates whether the device is on body</string>
</resources>

View file

@ -0,0 +1,97 @@
package io.homeassistant.companion.android.sensors
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager.SENSOR_DELAY_NORMAL
import android.util.Log
import androidx.core.content.getSystemService
import io.homeassistant.companion.android.common.sensors.SensorManager
import kotlin.math.roundToInt
import io.homeassistant.companion.android.common.R as commonR
class OnBodySensorManager : SensorManager, SensorEventListener {
companion object {
private const val TAG = "OnBodySensor"
private var isListenerRegistered = false
private val onBodySensor = SensorManager.BasicSensor(
"on_body",
"binary_sensor",
commonR.string.sensor_name_on_body,
commonR.string.sensor_description_on_body,
"mdi:account",
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC
)
}
private lateinit var latestContext: Context
private lateinit var mySensorManager: android.hardware.SensorManager
override fun docsLink(): String {
return "https://companion.home-assistant.io/docs/core/sensors#on-body-sensor"
}
override val enabledByDefault: Boolean
get() = false
override val name: Int
get() = commonR.string.sensor_name_on_body
override fun getAvailableSensors(context: Context): List<SensorManager.BasicSensor> {
return listOf(onBodySensor)
}
override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray()
}
override fun hasSensor(context: Context): Boolean {
mySensorManager = context.getSystemService()!!
return mySensorManager.getDefaultSensor(Sensor.TYPE_LOW_LATENCY_OFFBODY_DETECT, true) != null
}
override fun requestSensorUpdate(context: Context) {
latestContext = context
updateOnBodySensor()
}
private fun updateOnBodySensor() {
if (!isEnabled(latestContext, onBodySensor.id))
return
mySensorManager = latestContext.getSystemService()!!
val onBodySensors = mySensorManager.getDefaultSensor(Sensor.TYPE_LOW_LATENCY_OFFBODY_DETECT, true)
if (onBodySensors != null && !isListenerRegistered) {
mySensorManager.registerListener(
this,
onBodySensors,
SENSOR_DELAY_NORMAL
)
Log.d(TAG, "On body sensor listener registered")
isListenerRegistered = true
}
}
override fun onAccuracyChanged(p0: Sensor?, p1: Int) {
// Nothing happening here but we are required to call onAccuracyChanged for sensor events
}
override fun onSensorChanged(event: SensorEvent?) {
if (event?.sensor?.type == Sensor.TYPE_LOW_LATENCY_OFFBODY_DETECT) {
val state = event.values[0].roundToInt() != 0
Log.d(TAG, "onbody state: $state and ${event.values[0]}")
onSensorUpdated(
latestContext,
onBodySensor,
state,
if (state) onBodySensor.statelessIcon else "mdi:account-off",
mapOf()
)
}
// Send update immediately
SensorWorker.start(latestContext)
}
}

View file

@ -27,7 +27,8 @@ class SensorReceiver : SensorReceiverBase() {
const val TAG = "SensorReceiver"
val MANAGERS = listOf(
BatterySensorManager(),
NetworkSensorManager()
NetworkSensorManager(),
OnBodySensorManager()
)
const val ACTION_REQUEST_SENSORS_UPDATE =