@@ -42,6 +42,7 @@ import androidx.health.connect.client.response.ReadRecordsResponse
4242import androidx.health.connect.client.time.TimeRangeFilter
4343import io.homeassistant.companion.android.common.R as commonR
4444import io.homeassistant.companion.android.common.sensors.SensorManager
45+ import io.homeassistant.companion.android.common.util.FailFast
4546import io.homeassistant.companion.android.common.util.STATE_UNKNOWN
4647import java.math.BigDecimal
4748import 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
0 commit comments