From dd6a32a5af51ffee1c4b2ef0f3e932bb6ed14914 Mon Sep 17 00:00:00 2001 From: bruce3x Date: Tue, 26 Dec 2023 17:10:13 +0800 Subject: [PATCH 1/2] feat: add `STAND_TIME` data type --- packages/health/README.md | 7 ++++--- packages/health/ios/Classes/SwiftHealthPlugin.swift | 4 +++- packages/health/lib/src/data_types.dart | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/health/README.md b/packages/health/README.md index f3d47d36a..c2b583427 100644 --- a/packages/health/README.md +++ b/packages/health/README.md @@ -23,7 +23,7 @@ Note that for Android, the target phone **needs** to have [Google Fit](https://w ## Data Types | **Data Type** | **Unit** | **iOS** | **Android (Google Fit)** | **Android (Health Connect)** | **Comments** | -| --------------------------- | ----------------------- | ------- | ------------------------ |------------------------------| -------------------------------------- | +|-----------------------------|-------------------------| ------- |--------------------------|------------------------------| -------------------------------------- | | ACTIVE_ENERGY_BURNED | CALORIES | yes | yes | yes | | | BASAL_ENERGY_BURNED | CALORIES | yes | | yes | | | BLOOD_GLUCOSE | MILLIGRAM_PER_DECILITER | yes | yes | yes | | @@ -37,8 +37,8 @@ Note that for Android, the target phone **needs** to have [Google Fit](https://w | HEART_RATE | BEATS_PER_MINUTE | yes | yes | yes | | | HEIGHT | METERS | yes | yes | yes | | | RESTING_HEART_RATE | BEATS_PER_MINUTE | yes | | yes | | -| RESPIRATORY_RATE | RESPIRATIONS_PER_MINUTE | yes | | yes | -| PERIPHERAL_PERFUSION_INDEX | PERCENTAGE | yes | | | +| RESPIRATORY_RATE | RESPIRATIONS_PER_MINUTE | yes | | yes | +| PERIPHERAL_PERFUSION_INDEX | PERCENTAGE | yes | | | | STEPS | COUNT | yes | yes | yes | | | WAIST_CIRCUMFERENCE | METERS | yes | | | | | WALKING_HEART_RATE | BEATS_PER_MINUTE | yes | | | | @@ -71,6 +71,7 @@ Note that for Android, the target phone **needs** to have [Google Fit](https://w | AUDIOGRAM | DECIBEL_HEARING_LEVEL | yes | | | | | ELECTROCARDIOGRAM | VOLT | yes | | | Requires Apple Watch to write the data | | NUTRITION | NO_UNIT | yes | yes | yes | | +| STAND_TIME | MINUTES | yes | | | | ## Setup diff --git a/packages/health/ios/Classes/SwiftHealthPlugin.swift b/packages/health/ios/Classes/SwiftHealthPlugin.swift index 36d560010..89f18882a 100644 --- a/packages/health/ios/Classes/SwiftHealthPlugin.swift +++ b/packages/health/ios/Classes/SwiftHealthPlugin.swift @@ -62,7 +62,8 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let HEADACHE_SEVERE = "HEADACHE_SEVERE" let ELECTROCARDIOGRAM = "ELECTROCARDIOGRAM" let NUTRITION = "NUTRITION" - + let STAND_TIME = "STAND_TIME" + // Health Unit types // MOLE_UNIT_WITH_MOLAR_MASS, // requires molar mass input - not supported yet // MOLE_UNIT_WITH_PREFIX_MOLAR_MASS, // requires molar mass & prefix input - not supported yet @@ -1052,6 +1053,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { dataTypesDict[WORKOUT] = HKSampleType.workoutType() dataTypesDict[NUTRITION] = HKSampleType.correlationType( forIdentifier: .food)! + dataTypesDict[STAND_TIME] = HKSampleType.quantityType(forIdentifier: .appleStandTime) healthDataTypes = Array(dataTypesDict.values) } diff --git a/packages/health/lib/src/data_types.dart b/packages/health/lib/src/data_types.dart index bca127cd0..1c2372834 100644 --- a/packages/health/lib/src/data_types.dart +++ b/packages/health/lib/src/data_types.dart @@ -49,6 +49,7 @@ enum HealthDataType { HEADACHE_SEVERE, HEADACHE_UNSPECIFIED, NUTRITION, + STAND_TIME, // Heart Rate events (specific to Apple Watch) HIGH_HEART_RATE_EVENT, @@ -114,6 +115,7 @@ const List _dataTypeKeysIOS = [ HealthDataType.HEADACHE_UNSPECIFIED, HealthDataType.ELECTROCARDIOGRAM, HealthDataType.NUTRITION, + HealthDataType.STAND_TIME, ]; /// List of data types available on Android @@ -208,6 +210,7 @@ const Map _dataTypeToUnit = { HealthDataType.ELECTROCARDIOGRAM: HealthDataUnit.VOLT, HealthDataType.NUTRITION: HealthDataUnit.NO_UNIT, + HealthDataType.STAND_TIME: HealthDataUnit.MINUTE, }; const PlatformTypeJsonValue = { From b6978abbba4ab6cf54a94ec34ebc4f8348d6bb50 Mon Sep 17 00:00:00 2001 From: bruce3x Date: Mon, 8 Jan 2024 18:56:52 +0800 Subject: [PATCH 2/2] feat: get data only from watch --- packages/health/ios/Classes/SwiftHealthPlugin.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/health/ios/Classes/SwiftHealthPlugin.swift b/packages/health/ios/Classes/SwiftHealthPlugin.swift index 89f18882a..280e5e3dd 100644 --- a/packages/health/ios/Classes/SwiftHealthPlugin.swift +++ b/packages/health/ios/Classes/SwiftHealthPlugin.swift @@ -582,10 +582,13 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let predicate = HKQuery.predicateForSamples( withStart: dateFrom, end: dateTo, options: .strictStartDate) + let watchPredicate = HKQuery.predicateForObjects(withDeviceProperty: HKDevicePropertyKeyModel, allowedValues: ["Watch"]) + let combinedPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate, watchPredicate]) + let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false) let query = HKSampleQuery( - sampleType: dataType, predicate: predicate, limit: limit, sortDescriptors: [sortDescriptor] + sampleType: dataType, predicate: combinedPredicate, limit: limit, sortDescriptors: [sortDescriptor] ) { [self] x, samplesOrNil, error in