Organize files

This commit is contained in:
Christoph Hagen
2024-03-20 14:51:46 +01:00
parent ee1993e757
commit 98dffd56e4
28 changed files with 18 additions and 261 deletions

View File

@@ -1,227 +0,0 @@
import Foundation
import HealthKit
import HealthKitExtensions
func insertExamplesOfAllTypes() async throws {
let store = HealthStore()
guard try await requestAllPermissions(in: store) else {
return
}
var startDate = Date(timeIntervalSinceReferenceDate: 700_000_000)
try await insertCategoryTypes(in: store, startDate: &startDate)
try await insertQuantityTypes(in: store, startDate: &startDate)
}
func requestAllPermissions(in store: HealthStore) async throws -> Bool {
let writable: [HKSampleContainer.Type] = HKQuantityType.writableTypes + HKCorrelationType.writableTypes + HKCategoryType.writableTypes
let readable: [HKObjectContainer.Type] = HKQuantityType.readableTypes + HKCorrelationType.readableTypes + HKCategoryType.readableTypes
try await store.requestAuthorization(toShare: writable, read: readable)
var hasAllPermissions = true
writable.forEach {
if store.authorizationStatus(for: $0) != .sharingAuthorized {
print("Missing permission for \($0.objectType)")
hasAllPermissions = false
}
}
return hasAllPermissions
}
private func insertCategoryTypes(in store: HealthStore, startDate: inout Date) async throws {
func make<T>(convert: (Date, Date) -> T) -> T where T: HKObjectContainer {
let result = convert(startDate, startDate.addingTimeInterval(1))
print("\(startDate.timeIntervalSinceReferenceDate): \(T.objectType)")
startDate.addTimeInterval(1)
return result
}
let categorySamples: [HKCategorySampleContainer] = [
make { MindfulSession(start: $0, end: $1) },
make { HandwashingEvent(start: $0, end: $1) },
make { ToothbrushingEvent(start: $0, end: $1) },
make { CervicalMucusQuality(value: .creamy, start: $0, end: $1) },
make { Contraceptive(value: .implant, start: $0, end: $1) },
make { IntermenstrualBleeding(start: $0, end: $1) },
make { Lactation(start: $0, end: $1) },
make { MenstrualFlow(value: .heavy, cycleStart: true, start: $0, end: $1) },
make { OvulationTestResult(value: .negative, start: $0, end: $1) },
make { Pregnancy(start: $0, end: $1) },
make { PregnancyTestResult(value: .positive, start: $0, end: $1) },
make { SexualActivity(protectionUsed: true, start: $0, end: $1) },
make { SleepAnalysis(value: .asleepREM, start: $0, end: $1) },
make { AbdominalCramps(value: .moderate, start: $0, end: $1) },
make { Acne(value: .moderate, start: $0, end: $1) },
make { AppetiteChanges(value: .decreased, start: $0, end: $1) },
make { BladderIncontinence(value: .moderate, start: $0, end: $1) },
make { Bloating(value: .moderate, start: $0, end: $1) },
make { BreastPain(value: .moderate, start: $0, end: $1) },
make { ChestTightnessOrPain(value: .moderate, start: $0, end: $1) },
make { Chills(value: .moderate, start: $0, end: $1) },
make { Constipation(value: .moderate, start: $0, end: $1) },
make { Coughing(value: .moderate, start: $0, end: $1) },
make { Diarrhea(value: .moderate, start: $0, end: $1) },
make { Dizziness(value: .moderate, start: $0, end: $1) },
make { DrySkin(value: .moderate, start: $0, end: $1) },
make { Fainting(value: .moderate, start: $0, end: $1) },
make { Fatigue(value: .moderate, start: $0, end: $1) },
make { Fever(value: .moderate, start: $0, end: $1) },
make { GeneralizedBodyAche(value: .moderate, start: $0, end: $1) },
make { HairLoss(value: .moderate, start: $0, end: $1) },
make { Headache(value: .moderate, start: $0, end: $1) },
make { Heartburn(value: .moderate, start: $0, end: $1) },
make { HotFlashes(value: .moderate, start: $0, end: $1) },
make { LossOfSmell(value: .moderate, start: $0, end: $1) },
make { LossOfTaste(value: .moderate, start: $0, end: $1) },
make { LowerBackPain(value: .moderate, start: $0, end: $1) },
make { MemoryLapse(value: .moderate, start: $0, end: $1) },
make { MoodChanges(value: .present, start: $0, end: $1) },
make { Nausea(value: .moderate, start: $0, end: $1) },
make { NightSweats(value: .moderate, start: $0, end: $1) },
make { PelvicPain(value: .moderate, start: $0, end: $1) },
make { RapidPoundingOrFlutteringHeartbeat(value: .moderate, start: $0, end: $1) },
make { RunnyNose(value: .moderate, start: $0, end: $1) },
make { ShortnessOfBreath(value: .moderate, start: $0, end: $1) },
make { SinusCongestion(value: .moderate, start: $0, end: $1) },
make { SkippedHeartbeat(value: .moderate, start: $0, end: $1) },
make { SleepChanges(value: .present, start: $0, end: $1) },
make { SoreThroat(value: .moderate, start: $0, end: $1) },
make { VaginalDryness(value: .moderate, start: $0, end: $1) },
make { Vomiting(value: .moderate, start: $0, end: $1) },
make { Wheezing(value: .moderate, start: $0, end: $1) },
]
print("Saving...")
try await store.save(categorySamples)
print("Done.")
}
private func insertQuantityTypes(in store: HealthStore, startDate: inout Date) async throws {
func make<T>(convert: (Date, Date) -> T) -> T where T: HKObjectContainer {
let result = convert(startDate, startDate.addingTimeInterval(1))
print("\(startDate.timeIntervalSinceReferenceDate): \(T.objectType)")
startDate.addTimeInterval(1)
return result
}
let samples: [HKQuantitySampleContainer] = [
make { BodyFatPercentage(value: 10.0, start: $0, end: $1) },
make { BodyMass(value: 80.0, start: $0, end: $1) },
make { BodyMassIndex(value: 25.0, start: $0, end: $1) },
make { ElectrodermalActivity(value: 6.0, start: $0, end: $1) },
make { Height(value: 1.80, start: $0, end: $1) },
make { LeanBodyMass(value: 65.0, start: $0, end: $1) },
make { WaistCircumference(value: 1.0, start: $0, end: $1) },
make { ActiveEnergyBurned(value: 1.0, start: $0, end: $1) },
make { BasalEnergyBurned(value: 1.0, start: $0, end: $1) },
//make { CyclingCadence(value: 1.0, start: $0, end: $1) },
//make { CyclingFunctionalThresholdPower(value: 1.0, start: $0, end: $1) },
//make { CyclingPower(value: 1.0, start: $0, end: $1) },
//make { CyclingSpeed(value: 1.0, start: $0, end: $1) },
make { DistanceCycling(value: 1.0, start: $0, end: $1) },
make { DistanceDownhillSnowSports(value: 1.0, start: $0, end: $1) },
make { DistanceSwimming(value: 1.0, start: $0, end: $1) },
make { DistanceWalkingRunning(value: 1.0, start: $0, end: $1) },
make { DistanceWheelchair(value: 1.0, start: $0, end: $1) },
make { FlightsClimbed(value: 1.0, start: $0, end: $1) },
//make { PhysicalEffort(value: 1.0, start: $0, end: $1) },
make { PushCount(value: 1.0, start: $0, end: $1) },
make { RunningPower(value: 1.0, start: $0, end: $1) },
make { RunningSpeed(value: 1.0, start: $0, end: $1) },
make { StepCount(value: 1.0, start: $0, end: $1) },
make { SwimmingStrokeCount(value: 1.0, start: $0, end: $1) },
make { UnderwaterDepth(value: 1.0, start: $0, end: $1) },
make { EnvironmentalAudioExposure(value: 1.0, start: $0, end: $1) },
make { EnvironmentalSoundReduction(value: 1.0, start: $0, end: $1) },
make { HeadphoneAudioExposure(value: 1.0, start: $0, end: $1) },
make { HeartRate(countsPerSecond: 1.0, motionContext: .sedentary, start: $0, end: $1) },
make { HeartRateRecoveryOneMinute(value: 1.0, start: $0, end: $1) },
make { HeartRateVariabilitySDNN(value: 1.0, start: $0, end: $1) },
make { PeripheralPerfusionIndex(value: 1.0, start: $0, end: $1) },
make { RestingHeartRate(value: 1.0, start: $0, end: $1) },
make { Vo2Max(value: 1.0, testType: .maxExercise, start: $0, end: $1) },
make { RunningGroundContactTime(value: 1.0, start: $0, end: $1) },
make { RunningStrideLength(value: 1.0, start: $0, end: $1) },
make { RunningVerticalOscillation(value: 1.0, start: $0, end: $1) },
make { SixMinuteWalkTestDistance(value: 1.0, start: $0, end: $1) },
make { StairAscentSpeed(value: 1.0, start: $0, end: $1) },
make { StairDescentSpeed(value: 1.0, start: $0, end: $1) },
make { WalkingDoubleSupportPercentage(value: 1.0, start: $0, end: $1) },
make { WalkingSpeed(value: 1.0, start: $0, end: $1) },
make { WalkingStepLength(value: 1.0, start: $0, end: $1) },
make { DietaryBiotin(value: 1.0, start: $0, end: $1) },
make { DietaryCaffeine(value: 1.0, start: $0, end: $1) },
make { DietaryCalcium(value: 1.0, start: $0, end: $1) },
make { DietaryCarbohydrates(value: 1.0, start: $0, end: $1) },
make { DietaryChloride(value: 1.0, start: $0, end: $1) },
make { DietaryCholesterol(value: 1.0, start: $0, end: $1) },
make { DietaryChromium(value: 1.0, start: $0, end: $1) },
make { DietaryCopper(value: 1.0, start: $0, end: $1) },
make { DietaryEnergyConsumed(value: 1.0, start: $0, end: $1) },
make { DietaryFatMonounsaturated(value: 1.0, start: $0, end: $1) },
make { DietaryFatPolyunsaturated(value: 1.0, start: $0, end: $1) },
make { DietaryFatSaturated(value: 1.0, start: $0, end: $1) },
make { DietaryFatTotal(value: 1.0, start: $0, end: $1) },
make { DietaryFiber(value: 1.0, start: $0, end: $1) },
make { DietaryFolate(value: 1.0, start: $0, end: $1) },
make { DietaryIodine(value: 1.0, start: $0, end: $1) },
make { DietaryIron(value: 1.0, start: $0, end: $1) },
make { DietaryMagnesium(value: 1.0, start: $0, end: $1) },
make { DietaryManganese(value: 1.0, start: $0, end: $1) },
make { DietaryMolybdenum(value: 1.0, start: $0, end: $1) },
make { DietaryNiacin(value: 1.0, start: $0, end: $1) },
make { DietaryPantothenicAcid(value: 1.0, start: $0, end: $1) },
make { DietaryPhosphorus(value: 1.0, start: $0, end: $1) },
make { DietaryPotassium(value: 1.0, start: $0, end: $1) },
make { DietaryProtein(value: 1.0, start: $0, end: $1) },
make { DietaryRiboflavin(value: 1.0, start: $0, end: $1) },
make { DietarySelenium(value: 1.0, start: $0, end: $1) },
make { DietarySodium(value: 1.0, start: $0, end: $1) },
make { DietarySugar(value: 1.0, start: $0, end: $1) },
make { DietaryThiamin(value: 1.0, start: $0, end: $1) },
make { DietaryVitaminA(value: 1.0, start: $0, end: $1) },
make { DietaryVitaminB6(value: 1.0, start: $0, end: $1) },
make { DietaryVitaminB12(value: 1.0, start: $0, end: $1) },
make { DietaryVitaminC(value: 1.0, start: $0, end: $1) },
make { DietaryVitaminD(value: 1.0, start: $0, end: $1) },
make { DietaryVitaminE(value: 1.0, start: $0, end: $1) },
make { DietaryVitaminK(value: 1.0, start: $0, end: $1) },
make { DietaryWater(value: 1.0, start: $0, end: $1) },
make { DietaryZinc(value: 1.0, start: $0, end: $1) },
make { BloodPressureDiastolic(value: 1.0, start: $0, end: $1) },
make { BloodPressureSystolic(value: 1.0, start: $0, end: $1) },
make { InsulinDelivery(amount: 1.0, reason: .basal, start: $0, end: $1) },
make { NumberOfAlcoholicBeverages(value: 1.0, start: $0, end: $1) },
make { NumberOfTimesFallen(value: 1.0, start: $0, end: $1) },
//make { TimeInDaylight(value: 1.0, start: $0, end: $1) },
make { UvExposure(value: 1.0, start: $0, end: $1) },
make { WaterTemperature(value: 1.0, start: $0, end: $1) },
make { BasalBodyTemperature(value: 1.0, start: $0, end: $1) },
make { ForcedExpiratoryVolume1(value: 1.0, start: $0, end: $1) },
make { ForcedVitalCapacity(value: 1.0, start: $0, end: $1) },
make { InhalerUsage(value: 1.0, start: $0, end: $1) },
make { OxygenSaturation(value: 1.0, start: $0, end: $1) },
make { PeakExpiratoryFlowRate(value: 1.0, start: $0, end: $1) },
make { RespiratoryRate(value: 1.0, start: $0, end: $1) },
make { BloodGlucose(value: 1.0, start: $0, end: $1) },
make { BodyTemperature(value: 1.0, start: $0, end: $1) },
]
let allowed = Set(HKQuantityType.writableTypes.map { $0.quantitySampleType })
samples.forEach {
if !allowed.contains($0.quantitySampleType) {
print("Can't write: \($0.quantitySampleType)")
}
}
print("Saving...")
try await store.save(samples)
print("Done.")
}