From 2e5a77e541bc0bcf9000d55517959ed1175c7b93 Mon Sep 17 00:00:00 2001 From: Gideon Zenz Date: Fri, 2 Jan 2026 22:43:49 +0100 Subject: [PATCH] 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 --- .../HealthConnectPermissionManager.kt | 20 +++++++++++++++++-- .../util/healthconnect/HealthConnectUtils.kt | 10 ++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectPermissionManager.kt b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectPermissionManager.kt index 992daf6829..8fdc75b874 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectPermissionManager.kt +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectPermissionManager.kt @@ -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 + ) } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectUtils.kt b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectUtils.kt index d1880c842d..c29de1250b 100755 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectUtils.kt +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/healthconnect/HealthConnectUtils.kt @@ -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 + } } }