Skip to content

Commit 6f05fe1

Browse files
authored
Merge pull request #67 from SamBergeron/master
Add the ability to select Query options when looking up workout samples
2 parents ff0d261 + bf9cc92 commit 6f05fe1

File tree

3 files changed

+50
-9
lines changed

3 files changed

+50
-9
lines changed

ios/Classes/Extensions+SwiftHealthKitReporterPlugin.swift

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import Flutter
99
import HealthKitReporter
10+
import HealthKit
1011

1112
// MARK: - MethodCall
1213
extension SwiftHealthKitReporterPlugin {
@@ -112,7 +113,7 @@ extension SwiftHealthKitReporterPlugin {
112113
result: result
113114
)
114115
case .workoutQuery:
115-
guard let arguments = call.arguments as? [String: Double] else {
116+
guard let arguments = call.arguments as? [String: Any] else {
116117
throwNoArgumentsError(result: result)
117118
return
118119
}
@@ -489,19 +490,34 @@ extension SwiftHealthKitReporterPlugin {
489490
}
490491
private func workoutQuery(
491492
reporter: HealthKitReporter,
492-
arguments: [String: Double],
493+
arguments: [String: Any],
493494
result: @escaping FlutterResult
494495
) {
495496
guard
496-
let startTimestamp = arguments["startTimestamp"],
497-
let endTimestamp = arguments["endTimestamp"]
497+
let startTimestamp = arguments["startTimestamp"] as? Double,
498+
let endTimestamp = arguments["endTimestamp"] as? Double,
499+
let option = arguments["singleQueryOption"] as? String?
498500
else {
499501
throwParsingArgumentsError(result: result, arguments: arguments)
500502
return
501503
}
504+
lazy var hkOptions:HKQueryOptions = {
505+
if (option != nil) {
506+
if (option == "strictStartDate") {
507+
return [.strictStartDate]
508+
} else if (option == "strictEndDate") {
509+
return [.strictEndDate]
510+
} else if (option == "notStrict") {
511+
return []
512+
}
513+
}
514+
// Default to both being strict
515+
return [.strictStartDate, .strictEndDate]
516+
}()
502517
let predicate = NSPredicate.samplesPredicate(
503518
startDate: Date.make(from: startTimestamp),
504-
endDate: Date.make(from: endTimestamp)
519+
endDate: Date.make(from: endTimestamp),
520+
options: hkOptions
505521
)
506522
do {
507523
let query = try reporter.reader.workoutQuery(

lib/health_kit_reporter.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:convert';
44

55
import 'package:flutter/services.dart';
66

7+
import 'model/SampleQueryOptions.dart';
78
import 'model/payload/activity_summary.dart';
89
import 'model/payload/category.dart';
910
import 'model/payload/characteristic/characteristic.dart';
@@ -389,10 +390,15 @@ class HealthKitReporter {
389390

390391
/// Returns [Workout] samples for the provided
391392
/// time interval predicate [predicate].
392-
///
393-
static Future<List<Workout>> workoutQuery(Predicate predicate) async {
394-
final result =
395-
await _methodChannel.invokeMethod('workoutQuery', predicate.map);
393+
/// [queryOption] parameter represents the options passable to the native HealthKit sample query
394+
static Future<List<Workout>> workoutQuery(Predicate predicate,
395+
{SampleQueryOption? queryOption}) async {
396+
var arguments = <String, dynamic>{};
397+
arguments.addAll(predicate.map);
398+
if (queryOption != null) {
399+
arguments["singleQueryOption"] = queryOption.value;
400+
}
401+
final result = await _methodChannel.invokeMethod('workoutQuery', arguments);
396402
final List<dynamic> list = jsonDecode(result);
397403
final workouts = <Workout>[];
398404
for (final Map<String, dynamic> map in list) {

lib/model/SampleQueryOptions.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:health_kit_reporter/health_kit_reporter.dart';
2+
3+
/// The query options are used in HealthKit when querying samples
4+
/// The default query option is both [strictStartDate] and [strictEndDate]
5+
/// this allows you to choose either of the 3 other options
6+
enum SampleQueryOption { strictStartDate, strictEndDate, notStrict }
7+
8+
extension Value on SampleQueryOption {
9+
String get value {
10+
switch (this) {
11+
case SampleQueryOption.strictStartDate:
12+
return "strictStartDate";
13+
case SampleQueryOption.strictEndDate:
14+
return "strictEndDate";
15+
case SampleQueryOption.notStrict:
16+
return "notStrict";
17+
}
18+
}
19+
}

0 commit comments

Comments
 (0)