From 1bd659948fe72121d7923cb1a8dfb9e9c3a4784d Mon Sep 17 00:00:00 2001 From: Tim Hildebrand Date: Tue, 20 Feb 2024 12:57:38 -0800 Subject: [PATCH] Added functionality to import AH sleep data via native categoryQuery() call with SampleQueryOption parameter. --- .idea/libraries/Flutter_Plugins.xml | 4 +- .idea/misc.xml | 1 - ...ensions+SwiftHealthKitReporterPlugin.swift | 46 ++++++++++++------- lib/health_kit_reporter.dart | 7 ++- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml index 53449da..b0f6971 100644 --- a/.idea/libraries/Flutter_Plugins.xml +++ b/.idea/libraries/Flutter_Plugins.xml @@ -1,8 +1,6 @@ - - - + diff --git a/.idea/misc.xml b/.idea/misc.xml index f4f6d79..bea9a16 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/ios/Classes/Extensions+SwiftHealthKitReporterPlugin.swift b/ios/Classes/Extensions+SwiftHealthKitReporterPlugin.swift index ccaf048..c0ed42b 100644 --- a/ios/Classes/Extensions+SwiftHealthKitReporterPlugin.swift +++ b/ios/Classes/Extensions+SwiftHealthKitReporterPlugin.swift @@ -38,7 +38,7 @@ extension SwiftHealthKitReporterPlugin { case deleteObjects case save } - + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let method = Method(rawValue: call.method) else { result( @@ -50,12 +50,12 @@ extension SwiftHealthKitReporterPlugin { ) return } - + if method == .isAvailable { result(HealthKitReporter.isHealthDataAvailable) return } - + guard let reporter = self.reporter else { result( FlutterError( @@ -66,7 +66,7 @@ extension SwiftHealthKitReporterPlugin { ) return } - + switch method { case .isAvailable: result(HealthKitReporter.isHealthDataAvailable) @@ -311,11 +311,11 @@ extension SwiftHealthKitReporterPlugin { let toWriteArguments = arguments["toWrite"] reporter.manager.requestAuthorization( toRead: toReadArguments != nil - ? parse(arguments: toReadArguments!) - : [], + ? parse(arguments: toReadArguments!) + : [], toWrite: toWriteArguments != nil - ? parse(arguments: toWriteArguments!) - : [] + ? parse(arguments: toWriteArguments!) + : [] ) { (success, error) in guard error == nil else { result( @@ -446,16 +446,30 @@ extension SwiftHealthKitReporterPlugin { guard let identifier = arguments["identifier"] as? String, let startTimestamp = arguments["startTimestamp"] as? Double, - let endTimestamp = arguments["endTimestamp"] as? Double + let endTimestamp = arguments["endTimestamp"] as? Double, + let option = arguments["singleQueryOption"] as? String? else { throwParsingArgumentsError(result: result, arguments: arguments) return } + lazy var hkOptions:HKQueryOptions = { + if (option != nil) { + if (option == "strictStartDate") { + return [.strictStartDate] + } else if (option == "strictEndDate") { + return [.strictEndDate] + } else if (option == "notStrict") { + return [] + } + } + return [.strictStartDate, .strictEndDate] + }() do { let type = try CategoryType.make(from: identifier) let predicate = NSPredicate.samplesPredicate( startDate: Date.make(from: startTimestamp), - endDate: Date.make(from: endTimestamp) + endDate: Date.make(from: endTimestamp), + options: hkOptions ) let query = try reporter.reader.categoryQuery( type: type, @@ -1302,8 +1316,8 @@ extension SwiftHealthKitReporterPlugin { try Category.make(from: $0) }, from: device != nil - ? try Device.make(from: device!) - : nil, + ? try Device.make(from: device!) + : nil, to: try Workout.make(from: workout) ) { (success, error) in guard error == nil else { @@ -1339,10 +1353,10 @@ extension SwiftHealthKitReporterPlugin { reporter.writer.addQuantitiy(try quantity.map { try Quantity.make(from: $0) }, - from: device != nil - ? try Device.make(from: device!) - : nil, - to: try Workout.make(from: workout)) { (success, error) in + from: device != nil + ? try Device.make(from: device!) + : nil, + to: try Workout.make(from: workout)) { (success, error) in guard error == nil else { result( FlutterError( diff --git a/lib/health_kit_reporter.dart b/lib/health_kit_reporter.dart index 6ca9a17..74d060e 100644 --- a/lib/health_kit_reporter.dart +++ b/lib/health_kit_reporter.dart @@ -370,13 +370,16 @@ class HealthKitReporter { /// Returns [Category] samples for the provided [type] /// and the time interval predicate [predicate]. - /// + /// [queryOption] parameter represents the options passable to the native HealthKit sample query static Future> categoryQuery( - CategoryType type, Predicate predicate) async { + CategoryType type, Predicate predicate, {SampleQueryOption? queryOption}) async { final arguments = { 'identifier': type.identifier, }; arguments.addAll(predicate.map); + if (queryOption != null) { + arguments["singleQueryOption"] = queryOption.value; + } final result = await _methodChannel.invokeMethod('categoryQuery', arguments); final List list = jsonDecode(result);