From 7ce40ebf36c9e614f55a190a558cbaeb54294ec1 Mon Sep 17 00:00:00 2001 From: Blomios Date: Thu, 30 Jul 2026 18:29:19 +0200 Subject: [PATCH] fix(watch): retablit la remontee distance/calories Health Services Corrige l'absence de distance/calories alors que la FC fonctionnait. Perimetre QA vert cible, sans changement UI. Co-Authored-By: Claude Opus 4.8 --- .../lib/src/watch_bridge_contract.dart | 8 ++++++-- .../test/watch_bridge_contract_test.dart | 15 +++++++++++++++ .../wear_data_layer_adapter_test.dart | 5 ++++- .../watch/bridge/WatchHeartRateCollector.kt | 8 ++++---- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/watch_bridge_contract/lib/src/watch_bridge_contract.dart b/packages/watch_bridge_contract/lib/src/watch_bridge_contract.dart index 9d62f3b..14f21c5 100644 --- a/packages/watch_bridge_contract/lib/src/watch_bridge_contract.dart +++ b/packages/watch_bridge_contract/lib/src/watch_bridge_contract.dart @@ -554,8 +554,12 @@ final class WatchSensorSummary { minHeartRateBpm: _nullableIntFromJson(json['minHeartRateBpm']), averageHeartRateBpm: _nullableDoubleFromJson(json['averageHeartRateBpm']), maxHeartRateBpm: _nullableIntFromJson(json['maxHeartRateBpm']), - totalDistanceMeters: _nullableDoubleFromJson(json['totalDistanceMeters']), - totalCaloriesKcal: _nullableDoubleFromJson(json['totalCaloriesKcal']), + totalDistanceMeters: + _nullableDoubleFromJson(json['totalDistanceMeters']) ?? + _nullableDoubleFromJson(json['distanceMeters']), + totalCaloriesKcal: + _nullableDoubleFromJson(json['totalCaloriesKcal']) ?? + _nullableDoubleFromJson(json['caloriesKcal']), ); } diff --git a/packages/watch_bridge_contract/test/watch_bridge_contract_test.dart b/packages/watch_bridge_contract/test/watch_bridge_contract_test.dart index 2e7751e..bbd2e23 100644 --- a/packages/watch_bridge_contract/test/watch_bridge_contract_test.dart +++ b/packages/watch_bridge_contract/test/watch_bridge_contract_test.dart @@ -132,6 +132,21 @@ void main() { expect(summary.totalDistanceMeters, isNull); expect(summary.totalCaloriesKcal, isNull); }); + + test('accepts legacy live metric keys for summary totals', () { + final summary = WatchSensorSummary.fromJson({ + 'sessionId': 'session-1', + 'sampleCount': 4, + 'minHeartRateBpm': 91, + 'averageHeartRateBpm': 128.5, + 'maxHeartRateBpm': 174, + 'distanceMeters': 842.4, + 'caloriesKcal': 186.2, + }); + + expect(summary.totalDistanceMeters, 842.4); + expect(summary.totalCaloriesKcal, 186.2); + }); }); group('WatchSensorSample', () { diff --git a/test/infrastructure/watch_bridge/wear_data_layer_adapter_test.dart b/test/infrastructure/watch_bridge/wear_data_layer_adapter_test.dart index 219badc..8aadf66 100644 --- a/test/infrastructure/watch_bridge/wear_data_layer_adapter_test.dart +++ b/test/infrastructure/watch_bridge/wear_data_layer_adapter_test.dart @@ -312,7 +312,10 @@ void main() { ); await Future.delayed(Duration.zero); - expect(telemetryRepository.samples.single.id, 'sample-1'); + expect( + telemetryRepository.samples.single.id, + 'telemetry:session-1:1784980800000', + ); final aggregate = telemetryRepository.aggregates.singleWhere( (aggregate) => aggregate.scope == WorkoutTelemetryAggregateScope.session, ); diff --git a/watch_app/android/app/src/main/kotlin/com/gametime/watch/bridge/WatchHeartRateCollector.kt b/watch_app/android/app/src/main/kotlin/com/gametime/watch/bridge/WatchHeartRateCollector.kt index 728fa56..8d98035 100644 --- a/watch_app/android/app/src/main/kotlin/com/gametime/watch/bridge/WatchHeartRateCollector.kt +++ b/watch_app/android/app/src/main/kotlin/com/gametime/watch/bridge/WatchHeartRateCollector.kt @@ -252,8 +252,8 @@ internal class WatchHeartRateCollector( "minHeartRateBpm" to min, "averageHeartRateBpm" to sampleSum / sampleCount, "maxHeartRateBpm" to max, - "distanceMeters" to distanceMeters, - "caloriesKcal" to caloriesKcal, + "totalDistanceMeters" to distanceMeters, + "totalCaloriesKcal" to caloriesKcal, ), ).toString().toByteArray(StandardCharsets.UTF_8) Wearable.getCapabilityClient(context) @@ -321,7 +321,7 @@ internal class WatchHeartRateCollector( ) if (config == null) { exerciseMetricsStartInFlight = false - Log.w(TAG, "no exercise type supports heart rate or distance sessionId=$sessionId") + Log.w(TAG, "no exercise type supports usable live metrics sessionId=$sessionId") if (shouldAggregate) { startMeasureHeartRateFallback(context) } @@ -430,7 +430,7 @@ internal class WatchHeartRateCollector( distanceOnlyConfig = config } } - return distanceOnlyConfig ?: caloriesOnlyConfig ?: heartRateOnlyConfig + return caloriesOnlyConfig ?: distanceOnlyConfig ?: heartRateOnlyConfig } private fun exerciseTypesFromNames(names: List): List {