Files
WerkoutIOS/iphone/Werkout_ios/HealthKitHelper.swift
Trey t bfb373c8af WIP
2024-07-02 11:46:09 -05:00

128 lines
5.0 KiB
Swift

//
// HealthKitHelper.swift
// Werkout_ios
//
// Created by Trey Tartt on 8/13/23.
//
import Foundation
import HealthKit
struct HealthKitWorkoutData {
var caloriesBurned: Double?
var minHeartRate: Double?
var maxHeartRate: Double?
var avgHeartRate: Double?
}
class HealthKitHelper {
// this is dirty and i dont care
var returnCount = 0
let healthStore = HKHealthStore()
var healthKitWorkoutData = HealthKitWorkoutData(
caloriesBurned: nil,
minHeartRate: nil,
maxHeartRate: nil,
avgHeartRate: nil)
var completion: ((HealthKitWorkoutData?) -> Void)?
func getDetails(forHealthKitUUID uuid: UUID, completion: @escaping ((HealthKitWorkoutData?) -> Void)) {
self.completion = completion
self.returnCount = 0
print("get details \(uuid.uuidString)")
let query = HKSampleQuery(sampleType: HKWorkoutType.workoutType(),
predicate: HKQuery.predicateForObject(with: uuid),
limit: HKObjectQueryNoLimit,
sortDescriptors: nil)
{ (sampleQuery, results, error ) -> Void in
if let queryError = error {
self.shitReturned()
self.shitReturned()
print( "There was an error while reading the samples: \(queryError.localizedDescription)")
self.completion?(nil)
} else {
for samples: HKSample in results! {
let workout: HKWorkout = (samples as! HKWorkout)
self.getTotalBurned(forWorkout: workout)
self.getHeartRateStuff(forWorkout: workout)
print("got workout")
}
}
}
healthStore.execute(query)
}
func getHeartRateStuff(forWorkout workout: HKWorkout) {
print("get heart")
let heartType = HKQuantityType.quantityType(forIdentifier: .heartRate)
let heartPredicate: NSPredicate? = HKQuery.predicateForSamples(withStart: workout.startDate,
end: workout.endDate,
options: HKQueryOptions.strictEndDate)
let heartQuery = HKStatisticsQuery(quantityType: heartType!,
quantitySamplePredicate: heartPredicate,
options: [.discreteAverage, .discreteMin, .discreteMax],
completionHandler: {(query: HKStatisticsQuery, result: HKStatistics?, error: Error?) -> Void in
if let result = result,
let minValue = result.minimumQuantity(),
let maxValue = result.maximumQuantity(),
let avgValue = result.averageQuantity() {
let _minHeartRate = minValue.doubleValue(
for: HKUnit(from: "count/min")
)
let _maxHeartRate = maxValue.doubleValue(
for: HKUnit(from: "count/min")
)
let _avgHeartRate = avgValue.doubleValue(
for: HKUnit(from: "count/min")
)
self.healthKitWorkoutData.avgHeartRate = _avgHeartRate
self.healthKitWorkoutData.minHeartRate = _minHeartRate
self.healthKitWorkoutData.maxHeartRate = _maxHeartRate
print("got heart")
}
self.shitReturned()
})
healthStore.execute(heartQuery)
}
func getTotalBurned(forWorkout workout: HKWorkout) {
print("get total burned")
let calType = HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)
let calPredicate: NSPredicate? = HKQuery.predicateForSamples(withStart: workout.startDate,
end: workout.endDate,
options: HKQueryOptions.strictEndDate)
let calQuery = HKStatisticsQuery(quantityType: calType!,
quantitySamplePredicate: calPredicate,
options: [.cumulativeSum],
completionHandler: {(query: HKStatisticsQuery, result: HKStatistics?, error: Error?) -> Void in
if let result = result {
self.healthKitWorkoutData.caloriesBurned = result.sumQuantity()?.doubleValue(for: HKUnit.kilocalorie()) ?? -1
print("got total burned")
}
self.shitReturned()
})
healthStore.execute(calQuery)
}
func shitReturned() {
DispatchQueue.main.async {
self.returnCount += 1
print("\(self.returnCount)")
if self.returnCount == 2 {
self.completion?(self.healthKitWorkoutData)
}
}
}
}