From 7da499f32931506b90bae807551bf385556cd523 Mon Sep 17 00:00:00 2001 From: Xavier Jodoin Date: Wed, 13 Jul 2022 15:12:10 -0400 Subject: [PATCH 1/4] Add Apple Health Respiratory Rate --- packages/health/ios/Classes/SwiftHealthPlugin.swift | 2 ++ packages/health/lib/src/data_types.dart | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/health/ios/Classes/SwiftHealthPlugin.swift b/packages/health/ios/Classes/SwiftHealthPlugin.swift index d267f04e3..8043a280a 100644 --- a/packages/health/ios/Classes/SwiftHealthPlugin.swift +++ b/packages/health/ios/Classes/SwiftHealthPlugin.swift @@ -37,6 +37,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let IRREGULAR_HEART_RATE_EVENT = "IRREGULAR_HEART_RATE_EVENT" let LOW_HEART_RATE_EVENT = "LOW_HEART_RATE_EVENT" let RESTING_HEART_RATE = "RESTING_HEART_RATE" + let RESPIRATORY_RATE = "RESPIRATORY_RATE" let STEPS = "STEPS" let WAIST_CIRCUMFERENCE = "WAIST_CIRCUMFERENCE" let WALKING_HEART_RATE = "WALKING_HEART_RATE" @@ -811,6 +812,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { dataTypesDict[BASAL_ENERGY_BURNED] = HKSampleType.quantityType(forIdentifier: .basalEnergyBurned)! dataTypesDict[BLOOD_GLUCOSE] = HKSampleType.quantityType(forIdentifier: .bloodGlucose)! dataTypesDict[BLOOD_OXYGEN] = HKSampleType.quantityType(forIdentifier: .oxygenSaturation)! + dataTypesDict[RESPIRATORY_RATE] = HKSampleType.quantityType(forIdentifier: .respiratoryRate)! dataTypesDict[BLOOD_PRESSURE_DIASTOLIC] = HKSampleType.quantityType(forIdentifier: .bloodPressureDiastolic)! dataTypesDict[BLOOD_PRESSURE_SYSTOLIC] = HKSampleType.quantityType(forIdentifier: .bloodPressureSystolic)! dataTypesDict[BODY_FAT_PERCENTAGE] = HKSampleType.quantityType(forIdentifier: .bodyFatPercentage)! diff --git a/packages/health/lib/src/data_types.dart b/packages/health/lib/src/data_types.dart index cf8b0cbf9..fd7da638e 100644 --- a/packages/health/lib/src/data_types.dart +++ b/packages/health/lib/src/data_types.dart @@ -21,6 +21,7 @@ enum HealthDataType { HEART_RATE_VARIABILITY_SDNN, HEIGHT, RESTING_HEART_RATE, + RESPIRATORY_RATE, STEPS, WAIST_CIRCUMFERENCE, WALKING_HEART_RATE, From 83af0986427549050dbdd497abb8ac97d42add22 Mon Sep 17 00:00:00 2001 From: Xavier Jodoin Date: Thu, 14 Jul 2022 08:56:53 -0400 Subject: [PATCH 2/4] Add RESPIRATORY_RATE and PERIPHERAL_PERFUSION_INDEX data types --- packages/health/README.md | 2 ++ packages/health/ios/Classes/SwiftHealthPlugin.swift | 4 ++++ packages/health/lib/src/data_types.dart | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/packages/health/README.md b/packages/health/README.md index 78c16f83b..e9b0d3d83 100644 --- a/packages/health/README.md +++ b/packages/health/README.md @@ -33,6 +33,8 @@ Note that for Android, the target phone **needs** to have [Google Fit](https://w | HEART_RATE | BEATS_PER_MINUTE | yes | yes | | | HEIGHT | METERS | yes | yes | | | RESTING_HEART_RATE | BEATS_PER_MINUTE | yes | | | +| RESPIRATORY_RATE | RESPIRATIONS_PER_MINUTE | yes | | | +| PERIPHERAL_PERFUSION_INDEX | PERCENTAGE | yes | | | | STEPS | COUNT | yes | yes | | | WAIST_CIRCUMFERENCE | METERS | yes | | | | WALKING_HEART_RATE | BEATS_PER_MINUTE | yes | | | diff --git a/packages/health/ios/Classes/SwiftHealthPlugin.swift b/packages/health/ios/Classes/SwiftHealthPlugin.swift index 8043a280a..f30190b25 100644 --- a/packages/health/ios/Classes/SwiftHealthPlugin.swift +++ b/packages/health/ios/Classes/SwiftHealthPlugin.swift @@ -38,6 +38,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let LOW_HEART_RATE_EVENT = "LOW_HEART_RATE_EVENT" let RESTING_HEART_RATE = "RESTING_HEART_RATE" let RESPIRATORY_RATE = "RESPIRATORY_RATE" + let PERIPHERAL_PERFUSION_INDEX = "PERIPHERAL_PERFUSION_INDEX" let STEPS = "STEPS" let WAIST_CIRCUMFERENCE = "WAIST_CIRCUMFERENCE" let WALKING_HEART_RATE = "WALKING_HEART_RATE" @@ -105,6 +106,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let COUNT = "COUNT" let PERCENT = "PERCENT" let BEATS_PER_MINUTE = "BEATS_PER_MINUTE" + let RESPIRATIONS_PER_MINUTE = "RESPIRATIONS_PER_MINUTE" let MILLIGRAM_PER_DECILITER = "MILLIGRAM_PER_DECILITER" let UNKNOWN_UNIT = "UNKNOWN_UNIT" let NO_UNIT = "NO_UNIT" @@ -716,6 +718,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { unitDict[COUNT] = HKUnit.count() unitDict[PERCENT] = HKUnit.percent() 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[UNKNOWN_UNIT] = HKUnit.init(from: "") unitDict[NO_UNIT] = HKUnit.init(from: "") @@ -813,6 +816,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { dataTypesDict[BLOOD_GLUCOSE] = HKSampleType.quantityType(forIdentifier: .bloodGlucose)! dataTypesDict[BLOOD_OXYGEN] = HKSampleType.quantityType(forIdentifier: .oxygenSaturation)! dataTypesDict[RESPIRATORY_RATE] = HKSampleType.quantityType(forIdentifier: .respiratoryRate)! + dataTypesDict[PERIPHERAL_PERFUSION_INDEX] = HKSampleType.quantityType(forIdentifier: .peripheralPerfusionIndex)! dataTypesDict[BLOOD_PRESSURE_DIASTOLIC] = HKSampleType.quantityType(forIdentifier: .bloodPressureDiastolic)! dataTypesDict[BLOOD_PRESSURE_SYSTOLIC] = HKSampleType.quantityType(forIdentifier: .bloodPressureSystolic)! dataTypesDict[BODY_FAT_PERCENTAGE] = HKSampleType.quantityType(forIdentifier: .bodyFatPercentage)! diff --git a/packages/health/lib/src/data_types.dart b/packages/health/lib/src/data_types.dart index fd7da638e..076b9529d 100644 --- a/packages/health/lib/src/data_types.dart +++ b/packages/health/lib/src/data_types.dart @@ -22,6 +22,7 @@ enum HealthDataType { HEIGHT, RESTING_HEART_RATE, RESPIRATORY_RATE, + PERIPHERAL_PERFUSION_INDEX, STEPS, WAIST_CIRCUMFERENCE, WALKING_HEART_RATE, @@ -82,6 +83,8 @@ const List _dataTypeKeysIOS = [ HealthDataType.IRREGULAR_HEART_RATE_EVENT, HealthDataType.LOW_HEART_RATE_EVENT, HealthDataType.RESTING_HEART_RATE, + HealthDataType.RESPIRATORY_RATE, + HealthDataType.PERIPHERAL_PERFUSION_INDEX, HealthDataType.STEPS, HealthDataType.WAIST_CIRCUMFERENCE, HealthDataType.WALKING_HEART_RATE, @@ -145,6 +148,8 @@ const Map _dataTypeToUnit = { HealthDataType.ELECTRODERMAL_ACTIVITY: HealthDataUnit.SIEMEN, HealthDataType.FORCED_EXPIRATORY_VOLUME: HealthDataUnit.LITER, HealthDataType.HEART_RATE: HealthDataUnit.BEATS_PER_MINUTE, + HealthDataType.RESPIRATORY_RATE: HealthDataUnit.RESPIRATIONS_PER_MINUTE, + HealthDataType.PERIPHERAL_PERFUSION_INDEX: HealthDataUnit.PERCENT, HealthDataType.HEIGHT: HealthDataUnit.METER, HealthDataType.RESTING_HEART_RATE: HealthDataUnit.BEATS_PER_MINUTE, HealthDataType.STEPS: HealthDataUnit.COUNT, @@ -258,6 +263,7 @@ enum HealthDataUnit { // Other units BEATS_PER_MINUTE, + RESPIRATIONS_PER_MINUTE, MILLIGRAM_PER_DECILITER, UNKNOWN_UNIT, NO_UNIT, From 4b323fb6b86d92dac1d35b6453c75abed7557a4d Mon Sep 17 00:00:00 2001 From: Xavier Jodoin Date: Fri, 17 Mar 2023 14:46:43 -0400 Subject: [PATCH 3/4] downgrade intl --- packages/health/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/health/pubspec.yaml b/packages/health/pubspec.yaml index 8a2f48b83..3bc35efed 100644 --- a/packages/health/pubspec.yaml +++ b/packages/health/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - intl: ^0.18.0 + intl: ^0.17.0 device_info_plus: ^8.0.0 dev_dependencies: From 1d1aa45c608ca5ab7171bbc1e5555ff71238eea8 Mon Sep 17 00:00:00 2001 From: Matteo Hoffmann <51083363+hoffmatteo@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:48:42 +0200 Subject: [PATCH 4/4] Tested additions --- packages/health/example/lib/main.dart | 10 ++++++++-- packages/health/example/lib/util.dart | 14 ++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/health/example/lib/main.dart b/packages/health/example/lib/main.dart index 99877667d..07d8b62a4 100644 --- a/packages/health/example/lib/main.dart +++ b/packages/health/example/lib/main.dart @@ -35,7 +35,7 @@ class _HealthAppState extends State { // NOTE: These are only the ones supported on Androids new API Health Connect. // Both Android's Google Fit and iOS' HealthKit have more types that we support in the enum list [HealthDataType] // Add more - like AUDIOGRAM, HEADACHE_SEVERE etc. to try them. - static final types = dataTypesAndroid; + static final types = dataTypesIOS; // Or selected types // static final types = [ // HealthDataType.WEIGHT, @@ -169,7 +169,7 @@ class _HealthAppState extends State { 0.0, HealthDataType.SLEEP_AWAKE, earlier, now); success &= await health.writeHealthData( 0.0, HealthDataType.SLEEP_DEEP, earlier, now); - */ + success &= await health.writeHealthData( 50.0, HealthDataType.RESTING_HEART_RATE, earlier, now); @@ -180,6 +180,12 @@ class _HealthAppState extends State { success &= await health.writeHealthData( 50, HealthDataType.BASAL_ENERGY_BURNED, earlier, now); + */ + success &= await health.writeHealthData( + 50, HealthDataType.RESPIRATORY_RATE, earlier, now); + success &= await health.writeHealthData( + 50, HealthDataType.PERIPHERAL_PERFUSION_INDEX, earlier, now); + // Store an Audiogram // Uncomment these on iOS - only available on iOS // const frequencies = [125.0, 500.0, 1000.0, 2000.0, 4000.0, 8000.0]; diff --git a/packages/health/example/lib/util.dart b/packages/health/example/lib/util.dart index 725f85a48..2f72ef04a 100644 --- a/packages/health/example/lib/util.dart +++ b/packages/health/example/lib/util.dart @@ -21,13 +21,15 @@ const List dataTypesIOS = [ HealthDataType.HEART_RATE, HealthDataType.HEART_RATE_VARIABILITY_SDNN, HealthDataType.HEIGHT, - HealthDataType.HIGH_HEART_RATE_EVENT, - HealthDataType.IRREGULAR_HEART_RATE_EVENT, - HealthDataType.LOW_HEART_RATE_EVENT, + //HealthDataType.HIGH_HEART_RATE_EVENT, + HealthDataType.RESPIRATORY_RATE, + HealthDataType.PERIPHERAL_PERFUSION_INDEX, + //HealthDataType.IRREGULAR_HEART_RATE_EVENT, + //HealthDataType.LOW_HEART_RATE_EVENT, HealthDataType.RESTING_HEART_RATE, HealthDataType.STEPS, HealthDataType.WAIST_CIRCUMFERENCE, - HealthDataType.WALKING_HEART_RATE, + //HealthDataType.WALKING_HEART_RATE, HealthDataType.WEIGHT, HealthDataType.FLIGHTS_CLIMBED, HealthDataType.DISTANCE_WALKING_RUNNING, @@ -38,14 +40,14 @@ const List dataTypesIOS = [ HealthDataType.SLEEP_DEEP, HealthDataType.SLEEP_REM, HealthDataType.WATER, - HealthDataType.EXERCISE_TIME, + //HealthDataType.EXERCISE_TIME, HealthDataType.WORKOUT, HealthDataType.HEADACHE_NOT_PRESENT, HealthDataType.HEADACHE_MILD, HealthDataType.HEADACHE_MODERATE, HealthDataType.HEADACHE_SEVERE, HealthDataType.HEADACHE_UNSPECIFIED, - HealthDataType.ELECTROCARDIOGRAM, + //HealthDataType.ELECTROCARDIOGRAM, ]; /// List of data types available on Android