From 22795eda2003d435c4a485039a6fbd9dc657052b Mon Sep 17 00:00:00 2001 From: "IKEMOTO, Masahiro" Date: Thu, 17 Apr 2025 16:00:46 +0900 Subject: [PATCH 1/2] Add SPEED(Android), WALKING_SPEED(iOS) data types. --- .../kotlin/cachet/plugins/health/HealthPlugin.kt | 15 +++++++++++++++ packages/health/example/lib/util.dart | 2 ++ .../health/ios/Classes/SwiftHealthPlugin.swift | 4 ++++ packages/health/lib/health.g.dart | 3 +++ packages/health/lib/src/heath_data_types.dart | 9 ++++++++- 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt b/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt index a9c23af2c..c53fb814d 100644 --- a/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt +++ b/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt @@ -55,6 +55,7 @@ const val LEAN_BODY_MASS = "LEAN_BODY_MASS" const val BODY_TEMPERATURE = "BODY_TEMPERATURE" const val BODY_WATER_MASS = "BODY_WATER_MASS" const val DISTANCE_DELTA = "DISTANCE_DELTA" +const val SPEED = "SPEED" const val FLIGHTS_CLIMBED = "FLIGHTS_CLIMBED" const val HEART_RATE = "HEART_RATE" const val HEART_RATE_VARIABILITY_RMSSD = "HEART_RATE_VARIABILITY_RMSSD" @@ -1327,6 +1328,19 @@ class HealthPlugin(private var channel: MethodChannel? = null) : ), ) + is SpeedRecord -> + return record.samples.map { + mapOf( + "uuid" to metadata.id, + "value" to it.speed.inMetersPerSecond, + "date_from" to it.time.toEpochMilli(), + "date_to" to it.time.toEpochMilli(), + "source_id" to "", + "source_name" to metadata.dataOrigin.packageName, + "recording_method" to metadata.recordingMethod + ) + } + is HydrationRecord -> return listOf( mapOf( @@ -2482,6 +2496,7 @@ class HealthPlugin(private var channel: MethodChannel? = null) : BLOOD_GLUCOSE to BloodGlucoseRecord::class, HEART_RATE_VARIABILITY_RMSSD to HeartRateVariabilityRmssdRecord::class, DISTANCE_DELTA to DistanceRecord::class, + SPEED to SpeedRecord::class, WATER to HydrationRecord::class, SLEEP_ASLEEP to SleepSessionRecord::class, SLEEP_AWAKE to SleepSessionRecord::class, diff --git a/packages/health/example/lib/util.dart b/packages/health/example/lib/util.dart index d896c6b02..af0718e93 100644 --- a/packages/health/example/lib/util.dart +++ b/packages/health/example/lib/util.dart @@ -29,6 +29,7 @@ const List dataTypesIOS = [ HealthDataType.WEIGHT, HealthDataType.FLIGHTS_CLIMBED, HealthDataType.DISTANCE_WALKING_RUNNING, + HealthDataType.WALKING_SPEED, HealthDataType.MINDFULNESS, HealthDataType.SLEEP_AWAKE, HealthDataType.SLEEP_ASLEEP, @@ -87,6 +88,7 @@ const List dataTypesAndroid = [ HealthDataType.HEART_RATE_VARIABILITY_RMSSD, HealthDataType.STEPS, HealthDataType.DISTANCE_DELTA, + HealthDataType.SPEED, HealthDataType.RESPIRATORY_RATE, HealthDataType.SLEEP_ASLEEP, HealthDataType.SLEEP_AWAKE_IN_BED, diff --git a/packages/health/ios/Classes/SwiftHealthPlugin.swift b/packages/health/ios/Classes/SwiftHealthPlugin.swift index 8b4fa1bbf..4c79b79b7 100644 --- a/packages/health/ios/Classes/SwiftHealthPlugin.swift +++ b/packages/health/ios/Classes/SwiftHealthPlugin.swift @@ -140,6 +140,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let DISTANCE_WALKING_RUNNING = "DISTANCE_WALKING_RUNNING" let DISTANCE_SWIMMING = "DISTANCE_SWIMMING" let DISTANCE_CYCLING = "DISTANCE_CYCLING" + let WALKING_SPEED = "WALKING_SPEED" let FLIGHTS_CLIMBED = "FLIGHTS_CLIMBED" let MINDFULNESS = "MINDFULNESS" let SLEEP_ASLEEP = "SLEEP_ASLEEP" @@ -216,6 +217,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let BEATS_PER_MINUTE = "BEATS_PER_MINUTE" let RESPIRATIONS_PER_MINUTE = "RESPIRATIONS_PER_MINUTE" let MILLIGRAM_PER_DECILITER = "MILLIGRAM_PER_DECILITER" + let METER_PER_SECOND = "METER_PER_SECOND" let UNKNOWN_UNIT = "UNKNOWN_UNIT" let NO_UNIT = "NO_UNIT" @@ -1391,6 +1393,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { unitDict[BEATS_PER_MINUTE] = HKUnit.init(from: "count/min") unitDict[RESPIRATIONS_PER_MINUTE] = HKUnit.init(from: "count/min") unitDict[MILLIGRAM_PER_DECILITER] = HKUnit.init(from: "mg/dL") + unitDict[METER_PER_SECOND] = HKUnit.init(from: "m/s") unitDict[UNKNOWN_UNIT] = HKUnit.init(from: "") unitDict[NO_UNIT] = HKUnit.init(from: "") @@ -1700,6 +1703,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { if #available(iOS 14.0, *) { dataTypesDict[ELECTROCARDIOGRAM] = HKSampleType.electrocardiogramType() + dataTypesDict[WALKING_SPEED] = HKSampleType.quantityType(forIdentifier: .walkingSpeed) unitDict[VOLT] = HKUnit.volt() unitDict[INCHES_OF_MERCURY] = HKUnit.inchesOfMercury() diff --git a/packages/health/lib/health.g.dart b/packages/health/lib/health.g.dart index d985c19dc..eb593f763 100644 --- a/packages/health/lib/health.g.dart +++ b/packages/health/lib/health.g.dart @@ -138,6 +138,8 @@ const _$HealthDataTypeEnumMap = { HealthDataType.HEADACHE_UNSPECIFIED: 'HEADACHE_UNSPECIFIED', HealthDataType.NUTRITION: 'NUTRITION', HealthDataType.UV_INDEX: 'UV_INDEX', + HealthDataType.WALKING_SPEED: 'WALKING_SPEED', + HealthDataType.SPEED: 'SPEED', HealthDataType.GENDER: 'GENDER', HealthDataType.BIRTH_DATE: 'BIRTH_DATE', HealthDataType.BLOOD_TYPE: 'BLOOD_TYPE', @@ -200,6 +202,7 @@ const _$HealthDataUnitEnumMap = { HealthDataUnit.BEATS_PER_MINUTE: 'BEATS_PER_MINUTE', HealthDataUnit.RESPIRATIONS_PER_MINUTE: 'RESPIRATIONS_PER_MINUTE', HealthDataUnit.MILLIGRAM_PER_DECILITER: 'MILLIGRAM_PER_DECILITER', + HealthDataUnit.METER_PER_SECOND: 'METER_PER_SECOND', HealthDataUnit.UNKNOWN_UNIT: 'UNKNOWN_UNIT', HealthDataUnit.NO_UNIT: 'NO_UNIT', }; diff --git a/packages/health/lib/src/heath_data_types.dart b/packages/health/lib/src/heath_data_types.dart index 6ab42d8d8..adcf0a837 100644 --- a/packages/health/lib/src/heath_data_types.dart +++ b/packages/health/lib/src/heath_data_types.dart @@ -71,6 +71,8 @@ enum HealthDataType { DISTANCE_CYCLING, FLIGHTS_CLIMBED, DISTANCE_DELTA, + WALKING_SPEED, + SPEED, MINDFULNESS, WATER, SLEEP_ASLEEP, @@ -108,7 +110,7 @@ enum HealthDataType { ELECTROCARDIOGRAM, // Health Connect - TOTAL_CALORIES_BURNED + TOTAL_CALORIES_BURNED, } /// Access types for Health Data. @@ -190,6 +192,7 @@ const List dataTypeKeysIOS = [ HealthDataType.DISTANCE_WALKING_RUNNING, HealthDataType.DISTANCE_SWIMMING, HealthDataType.DISTANCE_CYCLING, + HealthDataType.WALKING_SPEED, HealthDataType.MINDFULNESS, HealthDataType.SLEEP_ASLEEP, HealthDataType.SLEEP_AWAKE, @@ -235,6 +238,7 @@ const List dataTypeKeysAndroid = [ HealthDataType.STEPS, HealthDataType.WEIGHT, HealthDataType.DISTANCE_DELTA, + HealthDataType.SPEED, HealthDataType.SLEEP_ASLEEP, HealthDataType.SLEEP_AWAKE_IN_BED, HealthDataType.SLEEP_AWAKE, @@ -326,6 +330,8 @@ const Map dataTypeToUnit = { HealthDataType.DISTANCE_CYCLING: HealthDataUnit.METER, HealthDataType.FLIGHTS_CLIMBED: HealthDataUnit.COUNT, HealthDataType.DISTANCE_DELTA: HealthDataUnit.METER, + HealthDataType.WALKING_SPEED: HealthDataUnit.METER_PER_SECOND, + HealthDataType.SPEED: HealthDataUnit.METER_PER_SECOND, HealthDataType.WATER: HealthDataUnit.LITER, HealthDataType.SLEEP_ASLEEP: HealthDataUnit.MINUTE, @@ -453,6 +459,7 @@ enum HealthDataUnit { BEATS_PER_MINUTE, RESPIRATIONS_PER_MINUTE, MILLIGRAM_PER_DECILITER, + METER_PER_SECOND, UNKNOWN_UNIT, NO_UNIT, } From 6af62eb35640bbe2107414102e5ff6c6fa4bd343 Mon Sep 17 00:00:00 2001 From: Alireza Hajebrahimi <6937697+iarata@users.noreply.github.com> Date: Thu, 12 Jun 2025 10:39:38 +0200 Subject: [PATCH 2/2] Updated CHANGELOG --- packages/health/CHANGELOG.md | 6 ++++++ packages/health/README.md | 1 + packages/health/ios/health.podspec | 2 +- packages/health/pubspec.yaml | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/health/CHANGELOG.md b/packages/health/CHANGELOG.md index 39ee691fb..e90b62aaa 100644 --- a/packages/health/CHANGELOG.md +++ b/packages/health/CHANGELOG.md @@ -1,3 +1,9 @@ +## 13.0.2 + +* Android: Add `SPEED` health data type - PR [#1183](https://github.com/cph-cachet/flutter-plugins/pull/1183) +* iOS: Add `WALKING_SPEED` health data type - PR [#1183](https://github.com/cph-cachet/flutter-plugins/pull/1183) +* Add `METER_PER_SECOND` health data unit + ## 13.0.1 * Refactored Swift native implementation - See PR [#1175](https://github.com/cph-cachet/flutter-plugins/pull/1175) and [#1208](https://github.com/cph-cachet/flutter-plugins/pull/1208) for more information: diff --git a/packages/health/README.md b/packages/health/README.md index 65db40ed6..916fdb786 100644 --- a/packages/health/README.md +++ b/packages/health/README.md @@ -385,6 +385,7 @@ The plugin supports the following [`HealthDataType`](https://pub.dev/documentati | UNDERWATER_DEPTH | METER | yes | | Related to/Requires Apple Watch Ultra's Underwater Diving Workout | | UV_INDEX | COUNT | yes | | | | LEAN_BODY_MASS | KILOGRAMS | yes | yes | | +| WALKING_SPEED | METER_PER_SECOND | yes | (yes) | On Android this will be recorded as `SPEED` with similar unit | ## Workout Types diff --git a/packages/health/ios/health.podspec b/packages/health/ios/health.podspec index 0c7782db1..19a1b64f6 100644 --- a/packages/health/ios/health.podspec +++ b/packages/health/ios/health.podspec @@ -3,7 +3,7 @@ # Pod::Spec.new do |s| s.name = 'health' - s.version = '13.0.1' + s.version = '13.0.2' s.summary = 'Wrapper for Apple\'s HealthKit on iOS and Google\'s Health Connect on Android.' s.description = <<-DESC Wrapper for Apple's HealthKit on iOS and Google's Health Connect on Android. diff --git a/packages/health/pubspec.yaml b/packages/health/pubspec.yaml index d923a0955..32bbad088 100644 --- a/packages/health/pubspec.yaml +++ b/packages/health/pubspec.yaml @@ -1,6 +1,6 @@ name: health description: Wrapper for Apple's HealthKit on iOS and Google's Health Connect on Android. -version: 13.0.1 +version: 13.0.2 homepage: https://github.com/cph-cachet/flutter-plugins/tree/master/packages/health environment: