From f5c1080f5c759f33eaff5057ccc50f9464c3ae48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Sat, 3 Aug 2024 11:44:09 +0200 Subject: [PATCH 1/2] Remove heart rate sensor for Wear OS 4+ --- .../companion/android/sensors/HeartRateSensorManager.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt b/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt index d8ec4993add..5658f0c3878 100755 --- a/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt @@ -12,6 +12,7 @@ import android.hardware.SensorManager.SENSOR_STATUS_ACCURACY_LOW import android.hardware.SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM import android.hardware.SensorManager.SENSOR_STATUS_NO_CONTACT import android.hardware.SensorManager.SENSOR_STATUS_UNRELIABLE +import android.os.Build import android.util.Log import androidx.core.content.getSystemService import io.homeassistant.companion.android.common.R as commonR @@ -57,8 +58,12 @@ class HeartRateSensorManager : SensorManager, SensorEventListener { } override fun hasSensor(context: Context): Boolean { + // Starting with Android 13 (T), background access requires BODY_SENSORS_BACKGROUND permission + // which must be allowlisted by OEMs. Because Home Assistant isn't allowlisted, the sensor only + // works while the app is visible and is practically useless, so don't make it available on 13+. val packageManager: PackageManager = context.packageManager - return packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HEART_RATE) + return Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && + packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HEART_RATE) } private lateinit var latestContext: Context From 078469ca23f04027acd536ed167f3ea6c02b6933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Fri, 6 Sep 2024 00:10:39 +0200 Subject: [PATCH 2/2] Rework: request background permission separately - Requesting the background permission separately seems to work and allows the user to keep using this sensor after changing the target SDK version --- wear/src/main/AndroidManifest.xml | 1 + .../companion/android/home/views/SensorUi.kt | 23 +++++++++++++++---- .../android/sensors/HeartRateSensorManager.kt | 12 +++++----- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index b16e17708d8..5713ace2bbc 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + = Build.VERSION_CODES.R && manager.requiredPermissions(basicSensor.id).contains(Manifest.permission.ACCESS_FINE_LOCATION) && - manager.requiredPermissions(basicSensor.id).contains(Manifest.permission.ACCESS_BACKGROUND_LOCATION) && - it.key == Manifest.permission.ACCESS_FINE_LOCATION && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + manager.requiredPermissions(basicSensor.id).contains(Manifest.permission.ACCESS_BACKGROUND_LOCATION) ) { backgroundRequest.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION) return@forEach } + if ( + it.key == Manifest.permission.BODY_SENSORS && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + manager.requiredPermissions(basicSensor.id).contains(Manifest.permission.BODY_SENSORS) && + manager.requiredPermissions(basicSensor.id).contains(Manifest.permission.BODY_SENSORS_BACKGROUND) + ) { + backgroundRequest.launch(Manifest.permission.BODY_SENSORS_BACKGROUND) + return@forEach + } if (!it.value) { allGranted = false } @@ -68,10 +76,17 @@ fun SensorUi( onSensorClicked(basicSensor.id, enabled) } else { permissionLaunch.launch( - if (permissions.size == 1 && permissions[0] == Manifest.permission.ACCESS_BACKGROUND_LOCATION) { + if (permissions.size == 1 && + ( + permissions[0] == Manifest.permission.ACCESS_BACKGROUND_LOCATION || + permissions[0] == Manifest.permission.BODY_SENSORS_BACKGROUND + ) + ) { permissions } else { - permissions.toSet().minus(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + permissions.toSet() + .minus(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + .minus(Manifest.permission.BODY_SENSORS_BACKGROUND) .toTypedArray() } ) diff --git a/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt b/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt index 5658f0c3878..069d70362f3 100755 --- a/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/sensors/HeartRateSensorManager.kt @@ -54,16 +54,16 @@ class HeartRateSensorManager : SensorManager, SensorEventListener { } override fun requiredPermissions(sensorId: String): Array { - return arrayOf(Manifest.permission.BODY_SENSORS) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf(Manifest.permission.BODY_SENSORS, Manifest.permission.BODY_SENSORS_BACKGROUND) + } else { + arrayOf(Manifest.permission.BODY_SENSORS) + } } override fun hasSensor(context: Context): Boolean { - // Starting with Android 13 (T), background access requires BODY_SENSORS_BACKGROUND permission - // which must be allowlisted by OEMs. Because Home Assistant isn't allowlisted, the sensor only - // works while the app is visible and is practically useless, so don't make it available on 13+. val packageManager: PackageManager = context.packageManager - return Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && - packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HEART_RATE) + return packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HEART_RATE) } private lateinit var latestContext: Context