Commit c97e721e authored by Evstropov Evgenii's avatar Evstropov Evgenii Committed by GitHub

Merge pull request #86 from AppsynthAsia/master

options to filter manually added informations / period flag to select the time interval / getDistanceSwimming
parents 5533d128 ca3d94b9
...@@ -55,6 +55,7 @@ export const Permissions = { ...@@ -55,6 +55,7 @@ export const Permissions = {
Zinc: "Zinc", Zinc: "Zinc",
Water: "Water", Water: "Water",
DistanceCycling: "DistanceCycling", DistanceCycling: "DistanceCycling",
DistanceSwimming: "DistanceSwimming",
DistanceWalkingRunning: "DistanceWalkingRunning", DistanceWalkingRunning: "DistanceWalkingRunning",
FlightsClimbed: "FlightsClimbed", FlightsClimbed: "FlightsClimbed",
HeartRate: "HeartRate", HeartRate: "HeartRate",
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
- (void)fitness_initializeStepEventObserver:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback; - (void)fitness_initializeStepEventObserver:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_getDistanceWalkingRunningOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback; - (void)fitness_getDistanceWalkingRunningOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_getDailyDistanceWalkingRunningSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback; - (void)fitness_getDailyDistanceWalkingRunningSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_getDailyDistanceSwimmingSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_getDistanceCyclingOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback; - (void)fitness_getDistanceCyclingOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_getDailyDistanceCyclingSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback; - (void)fitness_getDailyDistanceCyclingSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_getFlightsClimbedOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback; - (void)fitness_getFlightsClimbedOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
......
...@@ -102,6 +102,9 @@ ...@@ -102,6 +102,9 @@
BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false]; BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false];
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil]; NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]]; NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
NSUInteger period = [RCTAppleHealthKit uintFromOptions:input key:@"period" withDefault:60];
BOOL includeManuallyAdded = [RCTAppleHealthKit boolFromOptions:input key:@"includeManuallyAdded" withDefault:false];
if(startDate == nil){ if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]); callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return; return;
...@@ -111,10 +114,12 @@ ...@@ -111,10 +114,12 @@
[self fetchCumulativeSumStatisticsCollection:stepCountType [self fetchCumulativeSumStatisticsCollection:stepCountType
unit:unit unit:unit
period:period
startDate:startDate startDate:startDate
endDate:endDate endDate:endDate
ascending:ascending ascending:ascending
limit:limit limit:limit
includeManuallyAdded:includeManuallyAdded
completion:^(NSArray *arr, NSError *err){ completion:^(NSArray *arr, NSError *err){
if (err != nil) { if (err != nil) {
callback(@[RCTJSErrorFromNSError(err)]); callback(@[RCTJSErrorFromNSError(err)]);
...@@ -212,6 +217,8 @@ ...@@ -212,6 +217,8 @@
BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false]; BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false];
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil]; NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]]; NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
NSUInteger period = [RCTAppleHealthKit uintFromOptions:input key:@"period" withDefault:60];
BOOL includeManuallyAdded = [RCTAppleHealthKit boolFromOptions:input key:@"includeManuallyAdded" withDefault:false];
if(startDate == nil){ if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]); callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return; return;
...@@ -221,10 +228,46 @@ ...@@ -221,10 +228,46 @@
[self fetchCumulativeSumStatisticsCollection:quantityType [self fetchCumulativeSumStatisticsCollection:quantityType
unit:unit unit:unit
period:period
startDate:startDate
endDate:endDate
ascending:ascending
limit:limit
includeManuallyAdded:includeManuallyAdded
completion:^(NSArray *arr, NSError *err){
if (err != nil) {
NSLog(@"error with fetchCumulativeSumStatisticsCollection: %@", err);
callback(@[RCTMakeError(@"error with fetchCumulativeSumStatisticsCollection", err, nil)]);
return;
}
callback(@[[NSNull null], arr]);
}];
}
- (void)fitness_getDailyDistanceSwimmingSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
HKUnit *unit = [RCTAppleHealthKit hkUnitFromOptions:input key:@"unit" withDefault:[HKUnit meterUnit]];
NSUInteger limit = [RCTAppleHealthKit uintFromOptions:input key:@"limit" withDefault:HKObjectQueryNoLimit];
BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false];
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
NSUInteger period = [RCTAppleHealthKit uintFromOptions:input key:@"period" withDefault:60];
BOOL includeManuallyAdded = [RCTAppleHealthKit boolFromOptions:input key:@"includeManuallyAdded" withDefault:false];
if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return;
}
HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceSwimming];
[self fetchCumulativeSumStatisticsCollection:quantityType
unit:unit
period:period
startDate:startDate startDate:startDate
endDate:endDate endDate:endDate
ascending:ascending ascending:ascending
limit:limit limit:limit
includeManuallyAdded:includeManuallyAdded
completion:^(NSArray *arr, NSError *err){ completion:^(NSArray *arr, NSError *err){
if (err != nil) { if (err != nil) {
callback(@[RCTJSErrorFromNSError(err)]); callback(@[RCTJSErrorFromNSError(err)]);
...@@ -264,6 +307,8 @@ ...@@ -264,6 +307,8 @@
BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false]; BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false];
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil]; NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]]; NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
NSUInteger period = [RCTAppleHealthKit uintFromOptions:input key:@"period" withDefault:60];
BOOL includeManuallyAdded = [RCTAppleHealthKit boolFromOptions:input key:@"includeManuallyAdded" withDefault:false];
if(startDate == nil){ if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]); callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return; return;
...@@ -273,10 +318,12 @@ ...@@ -273,10 +318,12 @@
[self fetchCumulativeSumStatisticsCollection:quantityType [self fetchCumulativeSumStatisticsCollection:quantityType
unit:unit unit:unit
period:period
startDate:startDate startDate:startDate
endDate:endDate endDate:endDate
ascending:ascending ascending:ascending
limit:limit limit:limit
includeManuallyAdded:includeManuallyAdded
completion:^(NSArray *arr, NSError *err){ completion:^(NSArray *arr, NSError *err){
if (err != nil) { if (err != nil) {
callback(@[RCTJSErrorFromNSError(err)]); callback(@[RCTJSErrorFromNSError(err)]);
......
...@@ -50,7 +50,15 @@ ...@@ -50,7 +50,15 @@
ascending:(BOOL)asc ascending:(BOOL)asc
limit:(NSUInteger)lim limit:(NSUInteger)lim
completion:(void (^)(NSArray *, NSError *))completionHandler; completion:(void (^)(NSArray *, NSError *))completionHandler;
- (void)fetchCumulativeSumStatisticsCollection:(HKQuantityType *)quantityType
unit:(HKUnit *)unit
period:(NSUInteger)period
startDate:(NSDate *)startDate
endDate:(NSDate *)endDate
ascending:(BOOL)asc
limit:(NSUInteger)lim
includeManuallyAdded:(BOOL)includeManuallyAdded
completion:(void (^)(NSArray *, NSError *))completionHandler;
- (void)fetchSleepCategorySamplesForPredicate:(NSPredicate *)predicate - (void)fetchSleepCategorySamplesForPredicate:(NSPredicate *)predicate
......
...@@ -463,10 +463,10 @@ ...@@ -463,10 +463,10 @@
fromDate:[NSDate date]]; fromDate:[NSDate date]];
anchorComponents.hour = 0; anchorComponents.hour = 0;
NSDate *anchorDate = [calendar dateFromComponents:anchorComponents]; NSDate *anchorDate = [calendar dateFromComponents:anchorComponents];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"metadata.%K != YES", HKMetadataKeyWasUserEntered];
// Create the query // Create the query
HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType
quantitySamplePredicate:nil quantitySamplePredicate:predicate
options:HKStatisticsOptionCumulativeSum options:HKStatisticsOptionCumulativeSum
anchorDate:anchorDate anchorDate:anchorDate
intervalComponents:interval]; intervalComponents:interval];
...@@ -518,10 +518,87 @@ ...@@ -518,10 +518,87 @@
fromDate:[NSDate date]]; fromDate:[NSDate date]];
anchorComponents.hour = 0; anchorComponents.hour = 0;
NSDate *anchorDate = [calendar dateFromComponents:anchorComponents]; NSDate *anchorDate = [calendar dateFromComponents:anchorComponents];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"metadata.%K != YES", HKMetadataKeyWasUserEntered];
// Create the query
HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType
quantitySamplePredicate:predicate
options:HKStatisticsOptionCumulativeSum
anchorDate:anchorDate
intervalComponents:interval];
// Set the results handler
query.initialResultsHandler = ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *results, NSError *error) {
if (error) {
// Perform proper error handling here
NSLog(@"*** An error occurred while calculating the statistics: %@ ***", error.localizedDescription);
}
NSMutableArray *data = [NSMutableArray arrayWithCapacity:1];
[results enumerateStatisticsFromDate:startDate
toDate:endDate
withBlock:^(HKStatistics *result, BOOL *stop) {
HKQuantity *quantity = result.sumQuantity;
if (quantity) {
NSDate *startDate = result.startDate;
NSDate *endDate = result.endDate;
double value = [quantity doubleValueForUnit:unit];
NSString *startDateString = [RCTAppleHealthKit buildISO8601StringFromDate:startDate];
NSString *endDateString = [RCTAppleHealthKit buildISO8601StringFromDate:endDate];
NSDictionary *elem = @{
@"value" : @(value),
@"startDate" : startDateString,
@"endDate" : endDateString,
};
[data addObject:elem];
}
}];
// is ascending by default
if(asc == false) {
[RCTAppleHealthKit reverseNSMutableArray:data];
}
if((lim > 0) && ([data count] > lim)) {
NSArray* slicedArray = [data subarrayWithRange:NSMakeRange(0, lim)];
NSError *err;
completionHandler(slicedArray, err);
} else {
NSError *err;
completionHandler(data, err);
}
};
[self.healthStore executeQuery:query];
}
- (void)fetchCumulativeSumStatisticsCollection:(HKQuantityType *)quantityType
unit:(HKUnit *)unit
period:(NSUInteger)period
startDate:(NSDate *)startDate
endDate:(NSDate *)endDate
ascending:(BOOL)asc
limit:(NSUInteger)lim
includeManuallyAdded:(BOOL)includeManuallyAdded
completion:(void (^)(NSArray *, NSError *))completionHandler {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *interval = [[NSDateComponents alloc] init];
interval.minute = period;
NSDateComponents *anchorComponents = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
fromDate:startDate];
//anchorComponents.hour = 0;
NSDate *anchorDate = [calendar dateFromComponents:anchorComponents];
NSPredicate *predicate = nil;
if (includeManuallyAdded == false) {
predicate = [NSPredicate predicateWithFormat:@"metadata.%K != YES", HKMetadataKeyWasUserEntered];
}
// Create the query // Create the query
HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType
quantitySamplePredicate:nil quantitySamplePredicate:predicate
options:HKStatisticsOptionCumulativeSum options:HKStatisticsOptionCumulativeSum
anchorDate:anchorDate anchorDate:anchorDate
intervalComponents:interval]; intervalComponents:interval];
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
@"StepCount" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount], @"StepCount" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount],
@"DistanceWalkingRunning" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning], @"DistanceWalkingRunning" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning],
@"DistanceCycling" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling], @"DistanceCycling" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling],
@"DistanceSwimming" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceSwimming],
@"BasalEnergyBurned" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBasalEnergyBurned], @"BasalEnergyBurned" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBasalEnergyBurned],
@"ActiveEnergyBurned" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned], @"ActiveEnergyBurned" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned],
@"FlightsClimbed" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierFlightsClimbed], @"FlightsClimbed" : [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierFlightsClimbed],
......
...@@ -133,6 +133,8 @@ ...@@ -133,6 +133,8 @@
return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning]; return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning];
} else if ([type isEqual:@"Cycling"]){ } else if ([type isEqual:@"Cycling"]){
return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling]; return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling];
} else if ([type isEqual:@"Swimming"]){
return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceSwimming];
} }
// default [type isEqual:@"Workout"]) // default [type isEqual:@"Workout"])
return [HKObjectType workoutType]; return [HKObjectType workoutType];
......
...@@ -160,6 +160,11 @@ RCT_EXPORT_METHOD(getDailyDistanceWalkingRunningSamples:(NSDictionary *)input ca ...@@ -160,6 +160,11 @@ RCT_EXPORT_METHOD(getDailyDistanceWalkingRunningSamples:(NSDictionary *)input ca
[self fitness_getDailyDistanceWalkingRunningSamples:input callback:callback]; [self fitness_getDailyDistanceWalkingRunningSamples:input callback:callback];
} }
RCT_EXPORT_METHOD(getDailyDistanceSwimmingSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self fitness_getDailyDistanceSwimmingSamples:input callback:callback];
}
RCT_EXPORT_METHOD(getDistanceCycling:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback) RCT_EXPORT_METHOD(getDistanceCycling:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{ {
[self fitness_getDistanceCyclingOnDay:input callback:callback]; [self fitness_getDistanceCyclingOnDay:input callback:callback];
......
...@@ -123,6 +123,7 @@ AppleHealthKit.initHealthKit(options: Object, (err: string, results: Object) => ...@@ -123,6 +123,7 @@ AppleHealthKit.initHealthKit(options: Object, (err: string, results: Object) =>
* [getDailyStepCountSamples](/docs/getDailyStepCountSamples().md) * [getDailyStepCountSamples](/docs/getDailyStepCountSamples().md)
* [getDateOfBirth](/docs/getDateOfBirth().md) * [getDateOfBirth](/docs/getDateOfBirth().md)
* [getDistanceCycling](/docs/getDistanceCycling().md) * [getDistanceCycling](/docs/getDistanceCycling().md)
* [getDistanceSwimming](/docs/getDistanceSwimming().md)
* [getDistanceWalkingRunning](/docs/getDistanceWalkingRunning().md) * [getDistanceWalkingRunning](/docs/getDistanceWalkingRunning().md)
* [getFlightsClimbed](/docs/getFlightsClimbed().md) * [getFlightsClimbed](/docs/getFlightsClimbed().md)
* [getHeartRateSamples](/docs/getHeartRateSamples().md) * [getHeartRateSamples](/docs/getHeartRateSamples().md)
......
```javascript
let options = {
startDate: (new Date(2016,4,27)).toISOString(), // required
endDate: (new Date()).toISOString(), // optional; default now
ascending: false, // optional; default false
limit:10, // optional; default no limit
period: 60, // time interval in minutes optional: default 60
includeManuallyAdded: false. // optional: default false
};
```
```javascript
AppleHealthKit.getDailyDistanceSwimmingSamples(options, (err: Object, results: Array<Object>) => {
if (err) {
return;
}
console.log(results)
});
```
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment