Add missing Health Connect permissions and WORKOUTS data type

- Add PERMISSION_WRITE_EXERCISE_ROUTE import to HealthConnectPermissionManager
- Include ElevationGainedRecord, PowerRecord, SpeedRecord, and ExerciseRoute permissions in requiredHealthConnectPermissions
- Add WORKOUTS enum to HealthConnectDataType with comprehensive permission mapping
- Handle WORKOUTS branches in HealthConnectUtils when expressions for exhaustiveness
This commit is contained in:
Gideon Zenz
2026-01-03 15:03:21 +01:00
committed by José Rebelo
parent aea638d4be
commit 2e5a77e541
2 changed files with 28 additions and 2 deletions
@@ -21,6 +21,7 @@ import androidx.core.content.edit
import androidx.fragment.app.FragmentActivity
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.permission.HealthPermission
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_WRITE_EXERCISE_ROUTE
import androidx.health.connect.client.records.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@@ -61,7 +62,11 @@ object HealthConnectPermissionManager {
HealthPermission.getWritePermission(WeightRecord::class),
HealthPermission.getWritePermission(OxygenSaturationRecord::class),
HealthPermission.getWritePermission(BodyTemperatureRecord::class),
HealthPermission.getWritePermission(SkinTemperatureRecord::class)
HealthPermission.getWritePermission(SkinTemperatureRecord::class),
HealthPermission.getWritePermission(ElevationGainedRecord::class),
HealthPermission.getWritePermission(PowerRecord::class),
HealthPermission.getWritePermission(SpeedRecord::class),
PERMISSION_WRITE_EXERCISE_ROUTE
)
enum class HealthConnectDataType {
@@ -71,7 +76,8 @@ object HealthConnectPermissionManager {
HRV,
WEIGHT,
SPO2,
TEMPERATURE
TEMPERATURE,
WORKOUTS
}
@JvmStatic
@@ -93,6 +99,16 @@ object HealthConnectPermissionManager {
HealthPermission.getWritePermission(BodyTemperatureRecord::class),
HealthPermission.getWritePermission(SkinTemperatureRecord::class)
)
HealthConnectDataType.WORKOUTS -> setOf(
HealthPermission.getWritePermission(ExerciseSessionRecord::class),
HealthPermission.getWritePermission(DistanceRecord::class),
HealthPermission.getWritePermission(HeartRateRecord::class),
HealthPermission.getWritePermission(TotalCaloriesBurnedRecord::class),
HealthPermission.getWritePermission(ElevationGainedRecord::class),
HealthPermission.getWritePermission(SpeedRecord::class),
HealthPermission.getWritePermission(PowerRecord::class),
PERMISSION_WRITE_EXERCISE_ROUTE
)
}
}
@@ -602,6 +602,11 @@ class HealthConnectUtils {
healthConnectClient, gbDevice, metadata, offset,
currentSliceStartTs, currentSliceEndTs, grantedPermissions
))
HealthConnectPermissionManager.HealthConnectDataType.WORKOUTS -> {
// WORKOUTS are synced as part of ACTIVITY data type via RecordedWorkoutSyncer
// This branch exists for exhaustiveness but is not expected to be called directly
CompanionLogger.debug("$HC_SYNC_TAG WORKOUTS data type encountered in syncDataTypeSlice - workouts are synced via ACTIVITY data type")
}
}
return sliceStats
@@ -704,6 +709,11 @@ class HealthConnectUtils {
// For SpO2 and Temperature, there might be a specific provider or fallback to general sample provider
HealthConnectPermissionManager.HealthConnectDataType.SPO2 -> coordinator.getSpo2SampleProvider(device, db.daoSession) // Potentially add fallback if needed: ?: coordinator.getSampleProvider(device, db.daoSession)
HealthConnectPermissionManager.HealthConnectDataType.TEMPERATURE -> coordinator.getTemperatureSampleProvider(device, db.daoSession) // Potentially add fallback: ?: coordinator.getSampleProvider(device, db.daoSession)
HealthConnectPermissionManager.HealthConnectDataType.WORKOUTS -> {
// WORKOUTS use BaseActivitySummary which is accessed via DBHandler, not a sample provider
// This function is only called for timestamp retrieval, which isn't applicable to workouts
null
}
}
}