Skip to content

Commit a02438b

Browse files
TimoPtrjpelgrom
andauthored
Request PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND for HealtConnectSensor (#5510)
* Request PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND for HealtConnectSensor * Update changelog --------- Co-authored-by: Joris Pelgröm <jpelgrom@users.noreply.github.com>
1 parent 2c8e758 commit a02438b

4 files changed

Lines changed: 39 additions & 33 deletions

File tree

app/src/full/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<uses-permission android:name="com.google.android.gms.permission.CAR_FUEL" />
77
<uses-permission android:name="com.google.android.gms.permission.CAR_MILEAGE" />
88
<uses-permission android:name="com.google.android.gms.permission.CAR_SPEED" />
9+
<uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
910
<uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED" />
1011
<!-- <uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE" />-->
1112
<!-- <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE" />-->

app/src/full/kotlin/io/homeassistant/companion/android/sensors/HealthConnectSensorManager.kt

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import androidx.health.connect.client.response.ReadRecordsResponse
4242
import androidx.health.connect.client.time.TimeRangeFilter
4343
import io.homeassistant.companion.android.common.R as commonR
4444
import io.homeassistant.companion.android.common.sensors.SensorManager
45+
import io.homeassistant.companion.android.common.util.FailFast
4546
import io.homeassistant.companion.android.common.util.STATE_UNKNOWN
4647
import java.math.BigDecimal
4748
import java.math.RoundingMode
@@ -344,45 +345,48 @@ class HealthConnectSensorManager : SensorManager {
344345
entityCategory = SensorManager.ENTITY_CATEGORY_DIAGNOSTIC,
345346
deviceClass = "weight",
346347
)
348+
349+
private val sensorPermissionMap = mapOf(
350+
activeCaloriesBurned.id to ActiveCaloriesBurnedRecord::class,
351+
basalBodyTemperature.id to BasalBodyTemperatureRecord::class,
352+
basalMetabolicRate.id to BasalMetabolicRateRecord::class,
353+
bloodGlucose.id to BloodGlucoseRecord::class,
354+
bodyFat.id to BodyFatRecord::class,
355+
bodyWaterMass.id to BodyWaterMassRecord::class,
356+
bodyTemperature.id to BodyTemperatureRecord::class,
357+
boneMass.id to BoneMassRecord::class,
358+
diastolicBloodPressure.id to BloodPressureRecord::class,
359+
distance.id to DistanceRecord::class,
360+
elevationGained.id to ElevationGainedRecord::class,
361+
floorsClimbed.id to FloorsClimbedRecord::class,
362+
heartRate.id to HeartRateRecord::class,
363+
heartRateVariability.id to HeartRateVariabilityRmssdRecord::class,
364+
height.id to HeightRecord::class,
365+
hydration.id to HydrationRecord::class,
366+
leanBodyMass.id to LeanBodyMassRecord::class,
367+
oxygenSaturation.id to OxygenSaturationRecord::class,
368+
respiratoryRate.id to RespiratoryRateRecord::class,
369+
restingHeartRate.id to RestingHeartRateRecord::class,
370+
sleepDuration.id to SleepSessionRecord::class,
371+
steps.id to StepsRecord::class,
372+
systolicBloodPressure.id to BloodPressureRecord::class,
373+
totalCaloriesBurned.id to TotalCaloriesBurnedRecord::class,
374+
vo2Max.id to Vo2MaxRecord::class,
375+
weight.id to WeightRecord::class,
376+
)
347377
}
348378

349379
override val name: Int
350380
get() = commonR.string.sensor_name_health_connect
351381

352382
override fun requiredPermissions(sensorId: String): Array<String> {
353-
return try {
354-
when {
355-
(sensorId == activeCaloriesBurned.id) -> arrayOf(HealthPermission.getReadPermission(ActiveCaloriesBurnedRecord::class))
356-
(sensorId == basalBodyTemperature.id) -> arrayOf(HealthPermission.getReadPermission(BasalBodyTemperatureRecord::class))
357-
(sensorId == basalMetabolicRate.id) -> arrayOf(HealthPermission.getReadPermission(BasalMetabolicRateRecord::class))
358-
(sensorId == bloodGlucose.id) -> arrayOf(HealthPermission.getReadPermission(BloodGlucoseRecord::class))
359-
(sensorId == bodyFat.id) -> arrayOf(HealthPermission.getReadPermission(BodyFatRecord::class))
360-
(sensorId == bodyWaterMass.id) -> arrayOf(HealthPermission.getReadPermission(BodyWaterMassRecord::class))
361-
(sensorId == bodyTemperature.id) -> arrayOf(HealthPermission.getReadPermission(BodyTemperatureRecord::class))
362-
(sensorId == boneMass.id) -> arrayOf(HealthPermission.getReadPermission(BoneMassRecord::class))
363-
(sensorId == diastolicBloodPressure.id) -> arrayOf(HealthPermission.getReadPermission(BloodPressureRecord::class))
364-
(sensorId == distance.id) -> arrayOf(HealthPermission.getReadPermission(DistanceRecord::class))
365-
(sensorId == elevationGained.id) -> arrayOf(HealthPermission.getReadPermission(ElevationGainedRecord::class))
366-
(sensorId == floorsClimbed.id) -> arrayOf(HealthPermission.getReadPermission(FloorsClimbedRecord::class))
367-
(sensorId == heartRate.id) -> arrayOf(HealthPermission.getReadPermission(HeartRateRecord::class))
368-
(sensorId == heartRateVariability.id) -> arrayOf(HealthPermission.getReadPermission(HeartRateVariabilityRmssdRecord::class))
369-
(sensorId == height.id) -> arrayOf(HealthPermission.getReadPermission(HeightRecord::class))
370-
(sensorId == hydration.id) -> arrayOf(HealthPermission.getReadPermission(HydrationRecord::class))
371-
(sensorId == leanBodyMass.id) -> arrayOf(HealthPermission.getReadPermission(LeanBodyMassRecord::class))
372-
(sensorId == oxygenSaturation.id) -> arrayOf(HealthPermission.getReadPermission(OxygenSaturationRecord::class))
373-
(sensorId == respiratoryRate.id) -> arrayOf(HealthPermission.getReadPermission(RespiratoryRateRecord::class))
374-
(sensorId == restingHeartRate.id) -> arrayOf(HealthPermission.getReadPermission(RestingHeartRateRecord::class))
375-
(sensorId == sleepDuration.id) -> arrayOf(HealthPermission.getReadPermission(SleepSessionRecord::class))
376-
(sensorId == steps.id) -> arrayOf(HealthPermission.getReadPermission(StepsRecord::class))
377-
(sensorId == systolicBloodPressure.id) -> arrayOf(HealthPermission.getReadPermission(BloodPressureRecord::class))
378-
(sensorId == totalCaloriesBurned.id) -> arrayOf(HealthPermission.getReadPermission(TotalCaloriesBurnedRecord::class))
379-
(sensorId == vo2Max.id) -> arrayOf(HealthPermission.getReadPermission(Vo2MaxRecord::class))
380-
(sensorId == weight.id) -> arrayOf(HealthPermission.getReadPermission(WeightRecord::class))
381-
else -> arrayOf()
383+
return FailFast.failOnCatch({ "Unable to get required permissions for $sensorId" }, emptyArray<String>()) {
384+
val permissions = sensorPermissionMap[sensorId]?.let { recordClass ->
385+
val readPermission = HealthPermission.getReadPermission(recordClass)
386+
arrayOf(readPermission, HealthPermission.PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND)
382387
}
383-
} catch (e: Exception) {
384-
Timber.e(e, "Unable to get required permissions")
385-
arrayOf()
388+
FailFast.failWhen(permissions == null) { "Missing sensor mapping for $sensorId" }
389+
permissions ?: emptyArray()
386390
}
387391
}
388392

app/src/main/res/xml/changelog_master.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<changelog xmlns:tools="http://schemas.android.com/tools"
33
tools:ignore="MissingDefaultResource">
44
<release version="2025.7.2 - Main" versioncode="3">
5+
<change>Health Connect sensors now require permission to access health data in the background</change>
56
<change>Gestures for the main Home Assistant UI can now be changed</change>
67
<change>Downloading snapshots from camera card is now working</change>
78
<change>Bug fixes and dependency updates</change>

common/src/main/kotlin/io/homeassistant/companion/android/common/util/FailFast.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ object FailFast {
9090
* @param block The block of code to execute.
9191
*/
9292
fun failOnCatch(message: () -> String? = { null }, block: () -> Unit) {
93-
failOnCatch<Unit>(message, Unit, block)
93+
failOnCatch(message, Unit, block)
9494
}
9595

9696
/**

0 commit comments

Comments
 (0)