From 484c2ce07c226af9f6083cc3ea8e20242961f5d4 Mon Sep 17 00:00:00 2001 From: Vishnu Ravi Date: Thu, 28 Mar 2024 17:35:17 -0400 Subject: [PATCH] Add StrokeCog files (#2) --- StrokeCog.xcodeproj/project.pbxproj | 1422 +++++++++++++++++ StrokeCog.xcodeproj/project.pbxproj.license | 6 + .../contents.xcworkspacedata | 7 + .../contents.xcworkspacedata.license | 6 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../IDEWorkspaceChecks.plist.license | 6 + .../xcshareddata/swiftpm/Package.resolved | 321 ++++ .../swiftpm/Package.resolved.license | 6 + .../xcshareddata/xcschemes/StrokeCog.xcscheme | 126 ++ .../xcschemes/StrokeCog.xcscheme.license | 6 + StrokeCog.xctestplan | 44 + StrokeCog.xctestplan.license | 6 + StrokeCog/Account/AccountButton.swift | 38 + StrokeCog/Account/AccountSetupHeader.swift | 43 + StrokeCog/Account/AccountSheet.swift | 91 ++ StrokeCog/Contacts/Contacts.swift | 78 + .../Contributions/ContributionsList.swift | 53 + .../Contributions/Package+LicenseType.swift | 104 ++ StrokeCog/Contributions/PackageCell.swift | 73 + StrokeCog/Contributions/PackageHelper.swift | 26 + StrokeCog/Helper/Binding+Negate.swift | 20 + StrokeCog/Helper/Bundle+Image.swift | 30 + .../CodableArray+RawRepresentable.swift | 28 + StrokeCog/Home.swift | 86 + StrokeCog/MockUpload/MockUpload.swift | 41 + StrokeCog/Onboarding/AccountOnboarding.swift | 64 + StrokeCog/Onboarding/Consent.swift | 49 + .../Onboarding/HealthKitPermissions.swift | 77 + StrokeCog/Onboarding/InterestingModules.swift | 54 + .../Onboarding/NotificationPermissions.swift | 77 + StrokeCog/Onboarding/OnboardingFlow.swift | 79 + StrokeCog/Onboarding/Welcome.swift | 63 + StrokeCog/Resources/AppIcon.png | Bin 0 -> 94218 bytes StrokeCog/Resources/AppIcon.png.license | 6 + .../AccentColor.colorset/Contents.json | 11 + .../Contents.json.license | 6 + .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 94218 bytes .../AppIcon.appiconset/AppIcon.png.license | 6 + .../AppIcon.appiconset/Contents.json | 14 + .../AppIcon.appiconset/Contents.json.license | 6 + .../Resources/Assets.xcassets/Contents.json | 6 + .../Assets.xcassets/Contents.json.license | 6 + StrokeCog/Resources/ConsentDocument.md | 1 + .../Resources/ConsentDocument.md.license | 6 + StrokeCog/Resources/Localizable.xcstrings | 545 +++++++ .../Resources/Localizable.xcstrings.license | 6 + .../Resources/SocialSupportQuestionnaire.json | 387 +++++ .../SocialSupportQuestionnaire.json.license | 6 + StrokeCog/Schedule/Bundle+Questionnaire.swift | 26 + StrokeCog/Schedule/EventContext.swift | 25 + StrokeCog/Schedule/EventContextView.swift | 81 + StrokeCog/Schedule/ModalView.swift | 47 + StrokeCog/Schedule/ScheduleView.swift | 119 ++ StrokeCog/Schedule/StrokeCogScheduler.swift | 49 + StrokeCog/Schedule/StrokeCogTaskContext.swift | 40 + StrokeCog/SharedContext/FeatureFlags.swift | 26 + StrokeCog/SharedContext/StorageKeys.swift | 21 + StrokeCog/StrokeCog.swift | 36 + StrokeCog/StrokeCogDelegate.swift | 84 + StrokeCog/StrokeCogStandard.swift | 203 +++ StrokeCog/StrokeCogTestingSetup.swift | 34 + .../Supporting Files/GoogleService-Info.plist | 34 + .../GoogleService-Info.plist.license | 5 + StrokeCog/Supporting Files/Info.plist | 17 + StrokeCog/Supporting Files/Info.plist.license | 6 + .../Supporting Files/StrokeCog.entitlements | 16 + .../StrokeCog.entitlements.license | 6 + StrokeCogTests/StrokeCogTests.swift | 17 + StrokeCogUITests/ContactsTests.swift | 39 + StrokeCogUITests/ContributionsTest.swift | 39 + StrokeCogUITests/MockUploadTests.swift | 32 + StrokeCogUITests/OnboardingTests.swift | 224 +++ StrokeCogUITests/SchedulerTests.swift | 36 + 73 files changed, 5412 insertions(+) create mode 100644 StrokeCog.xcodeproj/project.pbxproj create mode 100644 StrokeCog.xcodeproj/project.pbxproj.license create mode 100644 StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata.license create mode 100644 StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist.license create mode 100644 StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved.license create mode 100644 StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme create mode 100644 StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme.license create mode 100644 StrokeCog.xctestplan create mode 100644 StrokeCog.xctestplan.license create mode 100644 StrokeCog/Account/AccountButton.swift create mode 100644 StrokeCog/Account/AccountSetupHeader.swift create mode 100644 StrokeCog/Account/AccountSheet.swift create mode 100644 StrokeCog/Contacts/Contacts.swift create mode 100644 StrokeCog/Contributions/ContributionsList.swift create mode 100644 StrokeCog/Contributions/Package+LicenseType.swift create mode 100644 StrokeCog/Contributions/PackageCell.swift create mode 100644 StrokeCog/Contributions/PackageHelper.swift create mode 100644 StrokeCog/Helper/Binding+Negate.swift create mode 100644 StrokeCog/Helper/Bundle+Image.swift create mode 100644 StrokeCog/Helper/CodableArray+RawRepresentable.swift create mode 100644 StrokeCog/Home.swift create mode 100644 StrokeCog/MockUpload/MockUpload.swift create mode 100644 StrokeCog/Onboarding/AccountOnboarding.swift create mode 100644 StrokeCog/Onboarding/Consent.swift create mode 100644 StrokeCog/Onboarding/HealthKitPermissions.swift create mode 100644 StrokeCog/Onboarding/InterestingModules.swift create mode 100644 StrokeCog/Onboarding/NotificationPermissions.swift create mode 100644 StrokeCog/Onboarding/OnboardingFlow.swift create mode 100644 StrokeCog/Onboarding/Welcome.swift create mode 100644 StrokeCog/Resources/AppIcon.png create mode 100644 StrokeCog/Resources/AppIcon.png.license create mode 100644 StrokeCog/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 StrokeCog/Resources/Assets.xcassets/AccentColor.colorset/Contents.json.license create mode 100644 StrokeCog/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png create mode 100644 StrokeCog/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png.license create mode 100644 StrokeCog/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 StrokeCog/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json.license create mode 100644 StrokeCog/Resources/Assets.xcassets/Contents.json create mode 100644 StrokeCog/Resources/Assets.xcassets/Contents.json.license create mode 100644 StrokeCog/Resources/ConsentDocument.md create mode 100644 StrokeCog/Resources/ConsentDocument.md.license create mode 100644 StrokeCog/Resources/Localizable.xcstrings create mode 100644 StrokeCog/Resources/Localizable.xcstrings.license create mode 100644 StrokeCog/Resources/SocialSupportQuestionnaire.json create mode 100644 StrokeCog/Resources/SocialSupportQuestionnaire.json.license create mode 100644 StrokeCog/Schedule/Bundle+Questionnaire.swift create mode 100644 StrokeCog/Schedule/EventContext.swift create mode 100644 StrokeCog/Schedule/EventContextView.swift create mode 100644 StrokeCog/Schedule/ModalView.swift create mode 100644 StrokeCog/Schedule/ScheduleView.swift create mode 100644 StrokeCog/Schedule/StrokeCogScheduler.swift create mode 100644 StrokeCog/Schedule/StrokeCogTaskContext.swift create mode 100644 StrokeCog/SharedContext/FeatureFlags.swift create mode 100644 StrokeCog/SharedContext/StorageKeys.swift create mode 100644 StrokeCog/StrokeCog.swift create mode 100644 StrokeCog/StrokeCogDelegate.swift create mode 100644 StrokeCog/StrokeCogStandard.swift create mode 100644 StrokeCog/StrokeCogTestingSetup.swift create mode 100644 StrokeCog/Supporting Files/GoogleService-Info.plist create mode 100644 StrokeCog/Supporting Files/GoogleService-Info.plist.license create mode 100644 StrokeCog/Supporting Files/Info.plist create mode 100644 StrokeCog/Supporting Files/Info.plist.license create mode 100644 StrokeCog/Supporting Files/StrokeCog.entitlements create mode 100644 StrokeCog/Supporting Files/StrokeCog.entitlements.license create mode 100644 StrokeCogTests/StrokeCogTests.swift create mode 100644 StrokeCogUITests/ContactsTests.swift create mode 100644 StrokeCogUITests/ContributionsTest.swift create mode 100644 StrokeCogUITests/MockUploadTests.swift create mode 100644 StrokeCogUITests/OnboardingTests.swift create mode 100644 StrokeCogUITests/SchedulerTests.swift diff --git a/StrokeCog.xcodeproj/project.pbxproj b/StrokeCog.xcodeproj/project.pbxproj new file mode 100644 index 0000000..32e5ab3 --- /dev/null +++ b/StrokeCog.xcodeproj/project.pbxproj @@ -0,0 +1,1422 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 27FA29902A388E9B009CAC45 /* ModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27FA298F2A388E9B009CAC45 /* ModalView.swift */; }; + 2F1AC9DF2B4E840E00C24973 /* StrokeCog.docc in Sources */ = {isa = PBXBuildFile; fileRef = 2F1AC9DE2B4E840E00C24973 /* StrokeCog.docc */; }; + 2F1B52CE2A4F5CCE003AE151 /* MockUploadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F1B52CD2A4F5CCE003AE151 /* MockUploadTests.swift */; }; + 2F3D4ABC2A4E7C290068FB2F /* SpeziScheduler in Frameworks */ = {isa = PBXBuildFile; productRef = 2F3D4ABB2A4E7C290068FB2F /* SpeziScheduler */; }; + 2F49B7762980407C00BCB272 /* Spezi in Frameworks */ = {isa = PBXBuildFile; productRef = 2F49B7752980407B00BCB272 /* Spezi */; }; + 2F4E237E2989A2FE0013F3D9 /* OnboardingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F4E237D2989A2FE0013F3D9 /* OnboardingTests.swift */; }; + 2F4E23832989D51F0013F3D9 /* StrokeCogTestingSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F4E23822989D51F0013F3D9 /* StrokeCogTestingSetup.swift */; }; + 2F4E23872989DB360013F3D9 /* ContactsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F4E23862989DB360013F3D9 /* ContactsTests.swift */; }; + 2F4FC8D729EE69D300BFFE26 /* MockUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F4FC8D629EE69D300BFFE26 /* MockUpload.swift */; }; + 2F5E32BD297E05EA003432F8 /* StrokeCogDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5E32BC297E05EA003432F8 /* StrokeCogDelegate.swift */; }; + 2F6025CB29BBE70F0045459E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2F6025CA29BBE70F0045459E /* GoogleService-Info.plist */; }; + 2F65B44E2A3B8B0600A36932 /* NotificationPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F65B44D2A3B8B0600A36932 /* NotificationPermissions.swift */; }; + 2FA0BFED2ACC977500E0EF83 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2FA0BFEC2ACC977500E0EF83 /* Localizable.xcstrings */; }; + 2FB099AF2A875DF100B20952 /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 2FB099AE2A875DF100B20952 /* FirebaseAuth */; }; + 2FB099B12A875DF100B20952 /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = 2FB099B02A875DF100B20952 /* FirebaseFirestore */; }; + 2FB099B32A875DF100B20952 /* FirebaseFirestoreSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 2FB099B22A875DF100B20952 /* FirebaseFirestoreSwift */; }; + 2FB099B62A875E2B00B20952 /* HealthKitOnFHIR in Frameworks */ = {isa = PBXBuildFile; productRef = 2FB099B52A875E2B00B20952 /* HealthKitOnFHIR */; }; + 2FBD738C2A3BD150004228E7 /* SpeziScheduler in Frameworks */ = {isa = PBXBuildFile; productRef = 2FBD738B2A3BD150004228E7 /* SpeziScheduler */; }; + 2FC3439029EE6346002D773C /* SocialSupportQuestionnaire.json in Resources */ = {isa = PBXBuildFile; fileRef = 2FE5DC5529EDD811004B9AB4 /* SocialSupportQuestionnaire.json */; }; + 2FC3439129EE6349002D773C /* AppIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 2FE5DC2A29EDD78D004B9AB4 /* AppIcon.png */; }; + 2FC3439229EE634B002D773C /* ConsentDocument.md in Resources */ = {isa = PBXBuildFile; fileRef = 2FE5DC2C29EDD78E004B9AB4 /* ConsentDocument.md */; }; + 2FC975A82978F11A00BA99FE /* Home.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FC975A72978F11A00BA99FE /* Home.swift */; }; + 2FE5DC2629EDD38A004B9AB4 /* Contacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC2529EDD38A004B9AB4 /* Contacts.swift */; }; + 2FE5DC3529EDD7CA004B9AB4 /* Consent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC2F29EDD7CA004B9AB4 /* Consent.swift */; }; + 2FE5DC3629EDD7CA004B9AB4 /* HealthKitPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC3029EDD7CA004B9AB4 /* HealthKitPermissions.swift */; }; + 2FE5DC3729EDD7CA004B9AB4 /* OnboardingFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC3129EDD7CA004B9AB4 /* OnboardingFlow.swift */; }; + 2FE5DC3829EDD7CA004B9AB4 /* InterestingModules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC3229EDD7CA004B9AB4 /* InterestingModules.swift */; }; + 2FE5DC3A29EDD7CA004B9AB4 /* Welcome.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC3429EDD7CA004B9AB4 /* Welcome.swift */; }; + 2FE5DC4029EDD7EE004B9AB4 /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC3E29EDD7ED004B9AB4 /* FeatureFlags.swift */; }; + 2FE5DC4129EDD7EE004B9AB4 /* StorageKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC3F29EDD7EE004B9AB4 /* StorageKeys.swift */; }; + 2FE5DC4529EDD7F2004B9AB4 /* Binding+Negate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4229EDD7F2004B9AB4 /* Binding+Negate.swift */; }; + 2FE5DC4629EDD7F2004B9AB4 /* Bundle+Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4329EDD7F2004B9AB4 /* Bundle+Image.swift */; }; + 2FE5DC4729EDD7F2004B9AB4 /* CodableArray+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4429EDD7F2004B9AB4 /* CodableArray+RawRepresentable.swift */; }; + 2FE5DC4E29EDD7FA004B9AB4 /* ScheduleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4829EDD7FA004B9AB4 /* ScheduleView.swift */; }; + 2FE5DC4F29EDD7FA004B9AB4 /* EventContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4929EDD7FA004B9AB4 /* EventContext.swift */; }; + 2FE5DC5029EDD7FA004B9AB4 /* EventContextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4A29EDD7FA004B9AB4 /* EventContextView.swift */; }; + 2FE5DC5129EDD7FA004B9AB4 /* StrokeCogTaskContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4B29EDD7FA004B9AB4 /* StrokeCogTaskContext.swift */; }; + 2FE5DC5229EDD7FA004B9AB4 /* StrokeCogScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4C29EDD7FA004B9AB4 /* StrokeCogScheduler.swift */; }; + 2FE5DC5329EDD7FA004B9AB4 /* Bundle+Questionnaire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DC4D29EDD7FA004B9AB4 /* Bundle+Questionnaire.swift */; }; + 2FE5DC6429EDD883004B9AB4 /* SpeziAccount in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC6329EDD883004B9AB4 /* SpeziAccount */; }; + 2FE5DC6729EDD894004B9AB4 /* SpeziContact in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC6629EDD894004B9AB4 /* SpeziContact */; }; + 2FE5DC7229EDD8D3004B9AB4 /* SpeziHealthKit in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC7129EDD8D3004B9AB4 /* SpeziHealthKit */; }; + 2FE5DC7529EDD8E6004B9AB4 /* SpeziFirebaseAccount in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC7429EDD8E6004B9AB4 /* SpeziFirebaseAccount */; }; + 2FE5DC7729EDD8E6004B9AB4 /* SpeziFirebaseConfiguration in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC7629EDD8E6004B9AB4 /* SpeziFirebaseConfiguration */; }; + 2FE5DC7929EDD8E6004B9AB4 /* SpeziFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC7829EDD8E6004B9AB4 /* SpeziFirestore */; }; + 2FE5DC8429EDD934004B9AB4 /* SpeziQuestionnaire in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC8329EDD934004B9AB4 /* SpeziQuestionnaire */; }; + 2FE5DC8A29EDD972004B9AB4 /* SpeziLocalStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC8929EDD972004B9AB4 /* SpeziLocalStorage */; }; + 2FE5DC8C29EDD972004B9AB4 /* SpeziSecureStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC8B29EDD972004B9AB4 /* SpeziSecureStorage */; }; + 2FE5DC8F29EDD980004B9AB4 /* SpeziViews in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC8E29EDD980004B9AB4 /* SpeziViews */; }; + 2FE5DC9929EDD9D9004B9AB4 /* XCTestExtensions in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC9829EDD9D9004B9AB4 /* XCTestExtensions */; }; + 2FE5DC9C29EDD9EF004B9AB4 /* XCTHealthKit in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC9B29EDD9EF004B9AB4 /* XCTHealthKit */; }; + 2FE5DCB129EE6107004B9AB4 /* AccountOnboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DCAC29EE6107004B9AB4 /* AccountOnboarding.swift */; }; + 2FF53D8B2A8725DE00042B76 /* SpeziMockWebService in Frameworks */ = {isa = PBXBuildFile; productRef = 2FF53D8A2A8725DE00042B76 /* SpeziMockWebService */; }; + 2FF53D8D2A8729D600042B76 /* StrokeCogStandard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FF53D8C2A8729D600042B76 /* StrokeCogStandard.swift */; }; + 5661551D2AB8384200209B80 /* SwiftPackageList in Frameworks */ = {isa = PBXBuildFile; productRef = 5661551C2AB8384200209B80 /* SwiftPackageList */; }; + 566155292AB8447C00209B80 /* Package+LicenseType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 566155282AB8447C00209B80 /* Package+LicenseType.swift */; }; + 5661552E2AB854C000209B80 /* PackageHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5661552D2AB854C000209B80 /* PackageHelper.swift */; }; + 5680DD392AB8983D004E6D4A /* PackageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5680DD382AB8983D004E6D4A /* PackageCell.swift */; }; + 5680DD3E2AB8CD84004E6D4A /* ContributionsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5680DD3D2AB8CD84004E6D4A /* ContributionsTest.swift */; }; + 56F6F2A02AB441930022FE5A /* ContributionsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56F6F29F2AB441930022FE5A /* ContributionsList.swift */; }; + 653A2551283387FE005D4D48 /* StrokeCog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653A2550283387FE005D4D48 /* StrokeCog.swift */; }; + 653A255528338800005D4D48 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 653A255428338800005D4D48 /* Assets.xcassets */; }; + 653A256228338800005D4D48 /* StrokeCogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653A256128338800005D4D48 /* StrokeCogTests.swift */; }; + 653A256C28338800005D4D48 /* SchedulerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653A256B28338800005D4D48 /* SchedulerTests.swift */; }; + 9733CFC62A8066DE001B7ABC /* SpeziOnboarding in Frameworks */ = {isa = PBXBuildFile; productRef = 2FE5DC8029EDD91D004B9AB4 /* SpeziOnboarding */; }; + 9739A0C62AD7B5730084BEA5 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 9739A0C52AD7B5730084BEA5 /* FirebaseStorage */; }; + 97D73D6A2AD860AD00B47FA0 /* SpeziFirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 97D73D692AD860AD00B47FA0 /* SpeziFirebaseStorage */; }; + A92E4DF02BAA001100AC8DE8 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = A92E4DEF2BAA001100AC8DE8 /* OrderedCollections */; }; + A9720E432ABB68CC00872D23 /* AccountSetupHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9720E422ABB68CC00872D23 /* AccountSetupHeader.swift */; }; + A9D83F962B083794000D0C78 /* SpeziFirebaseAccountStorage in Frameworks */ = {isa = PBXBuildFile; productRef = A9D83F952B083794000D0C78 /* SpeziFirebaseAccountStorage */; }; + A9DFE8A92ABE551400428242 /* AccountButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9DFE8A82ABE551400428242 /* AccountButton.swift */; }; + A9FE7AD02AA39BAB0077B045 /* AccountSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FE7ACF2AA39BAB0077B045 /* AccountSheet.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 653A255E28338800005D4D48 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 653A2545283387FE005D4D48 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 653A254C283387FE005D4D48; + remoteInfo = StrokeCog; + }; + 653A256828338800005D4D48 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 653A2545283387FE005D4D48 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 653A254C283387FE005D4D48; + remoteInfo = StrokeCog; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 27FA298F2A388E9B009CAC45 /* ModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalView.swift; sourceTree = ""; }; + 2F1AC9DE2B4E840E00C24973 /* StrokeCog.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = StrokeCog.docc; sourceTree = ""; }; + 2F1B52CD2A4F5CCE003AE151 /* MockUploadTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockUploadTests.swift; sourceTree = ""; }; + 2F4E237D2989A2FE0013F3D9 /* OnboardingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingTests.swift; sourceTree = ""; }; + 2F4E23822989D51F0013F3D9 /* StrokeCogTestingSetup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrokeCogTestingSetup.swift; sourceTree = ""; }; + 2F4E23862989DB360013F3D9 /* ContactsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsTests.swift; sourceTree = ""; }; + 2F4FC8D629EE69D300BFFE26 /* MockUpload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockUpload.swift; sourceTree = ""; }; + 2F5E32BC297E05EA003432F8 /* StrokeCogDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrokeCogDelegate.swift; sourceTree = ""; }; + 2F6025CA29BBE70F0045459E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 2F65B44D2A3B8B0600A36932 /* NotificationPermissions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPermissions.swift; sourceTree = ""; }; + 2FA0BFEC2ACC977500E0EF83 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 2FAEC07F297F583900C11C42 /* StrokeCog.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StrokeCog.entitlements; sourceTree = ""; }; + 2FC94CD4298B0A1D009C8209 /* StrokeCog.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = StrokeCog.xctestplan; sourceTree = ""; }; + 2FC975A72978F11A00BA99FE /* Home.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home.swift; sourceTree = ""; }; + 2FE5DC2529EDD38A004B9AB4 /* Contacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contacts.swift; sourceTree = ""; }; + 2FE5DC2A29EDD78D004B9AB4 /* AppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon.png; sourceTree = ""; }; + 2FE5DC2C29EDD78E004B9AB4 /* ConsentDocument.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = ConsentDocument.md; sourceTree = ""; }; + 2FE5DC2F29EDD7CA004B9AB4 /* Consent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Consent.swift; sourceTree = ""; }; + 2FE5DC3029EDD7CA004B9AB4 /* HealthKitPermissions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HealthKitPermissions.swift; sourceTree = ""; }; + 2FE5DC3129EDD7CA004B9AB4 /* OnboardingFlow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingFlow.swift; sourceTree = ""; }; + 2FE5DC3229EDD7CA004B9AB4 /* InterestingModules.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InterestingModules.swift; sourceTree = ""; }; + 2FE5DC3429EDD7CA004B9AB4 /* Welcome.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Welcome.swift; sourceTree = ""; }; + 2FE5DC3E29EDD7ED004B9AB4 /* FeatureFlags.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeatureFlags.swift; sourceTree = ""; }; + 2FE5DC3F29EDD7EE004B9AB4 /* StorageKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageKeys.swift; sourceTree = ""; }; + 2FE5DC4229EDD7F2004B9AB4 /* Binding+Negate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Binding+Negate.swift"; sourceTree = ""; }; + 2FE5DC4329EDD7F2004B9AB4 /* Bundle+Image.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Image.swift"; sourceTree = ""; }; + 2FE5DC4429EDD7F2004B9AB4 /* CodableArray+RawRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CodableArray+RawRepresentable.swift"; sourceTree = ""; }; + 2FE5DC4829EDD7FA004B9AB4 /* ScheduleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduleView.swift; sourceTree = ""; }; + 2FE5DC4929EDD7FA004B9AB4 /* EventContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventContext.swift; sourceTree = ""; }; + 2FE5DC4A29EDD7FA004B9AB4 /* EventContextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventContextView.swift; sourceTree = ""; }; + 2FE5DC4B29EDD7FA004B9AB4 /* StrokeCogTaskContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StrokeCogTaskContext.swift; sourceTree = ""; }; + 2FE5DC4C29EDD7FA004B9AB4 /* StrokeCogScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StrokeCogScheduler.swift; sourceTree = ""; }; + 2FE5DC4D29EDD7FA004B9AB4 /* Bundle+Questionnaire.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Questionnaire.swift"; sourceTree = ""; }; + 2FE5DC5529EDD811004B9AB4 /* SocialSupportQuestionnaire.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = SocialSupportQuestionnaire.json; sourceTree = ""; }; + 2FE5DCAC29EE6107004B9AB4 /* AccountOnboarding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountOnboarding.swift; sourceTree = ""; }; + 2FF53D8C2A8729D600042B76 /* StrokeCogStandard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StrokeCogStandard.swift; sourceTree = ""; }; + 566155282AB8447C00209B80 /* Package+LicenseType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Package+LicenseType.swift"; sourceTree = ""; }; + 5661552D2AB854C000209B80 /* PackageHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PackageHelper.swift; sourceTree = ""; }; + 5680DD382AB8983D004E6D4A /* PackageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PackageCell.swift; sourceTree = ""; }; + 5680DD3D2AB8CD84004E6D4A /* ContributionsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributionsTest.swift; sourceTree = ""; }; + 56F6F29F2AB441930022FE5A /* ContributionsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributionsList.swift; sourceTree = ""; }; + 653A254D283387FE005D4D48 /* StrokeCog.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StrokeCog.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 653A2550283387FE005D4D48 /* StrokeCog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrokeCog.swift; sourceTree = ""; }; + 653A255428338800005D4D48 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 653A255D28338800005D4D48 /* StrokeCogTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StrokeCogTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 653A256128338800005D4D48 /* StrokeCogTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrokeCogTests.swift; sourceTree = ""; }; + 653A256728338800005D4D48 /* StrokeCogUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StrokeCogUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 653A256B28338800005D4D48 /* SchedulerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchedulerTests.swift; sourceTree = ""; }; + 653A258928339462005D4D48 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A9720E422ABB68CC00872D23 /* AccountSetupHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSetupHeader.swift; sourceTree = ""; }; + A9DFE8A82ABE551400428242 /* AccountButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountButton.swift; sourceTree = ""; }; + A9FE7ACF2AA39BAB0077B045 /* AccountSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSheet.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 653A254A283387FE005D4D48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9733CFC62A8066DE001B7ABC /* SpeziOnboarding in Frameworks */, + 2FE5DC6429EDD883004B9AB4 /* SpeziAccount in Frameworks */, + 2FB099AF2A875DF100B20952 /* FirebaseAuth in Frameworks */, + 97D73D6A2AD860AD00B47FA0 /* SpeziFirebaseStorage in Frameworks */, + 2FE5DC6729EDD894004B9AB4 /* SpeziContact in Frameworks */, + 2FE5DC8429EDD934004B9AB4 /* SpeziQuestionnaire in Frameworks */, + 2FB099B32A875DF100B20952 /* FirebaseFirestoreSwift in Frameworks */, + 5661551D2AB8384200209B80 /* SwiftPackageList in Frameworks */, + 2FB099B12A875DF100B20952 /* FirebaseFirestore in Frameworks */, + A9D83F962B083794000D0C78 /* SpeziFirebaseAccountStorage in Frameworks */, + 2FB099B62A875E2B00B20952 /* HealthKitOnFHIR in Frameworks */, + 2FE5DC8A29EDD972004B9AB4 /* SpeziLocalStorage in Frameworks */, + 2FE5DC8C29EDD972004B9AB4 /* SpeziSecureStorage in Frameworks */, + 2FE5DC7529EDD8E6004B9AB4 /* SpeziFirebaseAccount in Frameworks */, + A92E4DF02BAA001100AC8DE8 /* OrderedCollections in Frameworks */, + 9739A0C62AD7B5730084BEA5 /* FirebaseStorage in Frameworks */, + 2FF53D8B2A8725DE00042B76 /* SpeziMockWebService in Frameworks */, + 2FE5DC7229EDD8D3004B9AB4 /* SpeziHealthKit in Frameworks */, + 2F49B7762980407C00BCB272 /* Spezi in Frameworks */, + 2FE5DC8F29EDD980004B9AB4 /* SpeziViews in Frameworks */, + 2F3D4ABC2A4E7C290068FB2F /* SpeziScheduler in Frameworks */, + 2FBD738C2A3BD150004228E7 /* SpeziScheduler in Frameworks */, + 2FE5DC7929EDD8E6004B9AB4 /* SpeziFirestore in Frameworks */, + 2FE5DC7729EDD8E6004B9AB4 /* SpeziFirebaseConfiguration in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 653A255A28338800005D4D48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 653A256428338800005D4D48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2FE5DC9929EDD9D9004B9AB4 /* XCTestExtensions in Frameworks */, + 2FE5DC9C29EDD9EF004B9AB4 /* XCTHealthKit in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2F4FC8D529EE69BE00BFFE26 /* MockUpload */ = { + isa = PBXGroup; + children = ( + 2F4FC8D629EE69D300BFFE26 /* MockUpload.swift */, + ); + path = MockUpload; + sourceTree = ""; + }; + 2FC9759D2978E30800BA99FE /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 2FAEC07F297F583900C11C42 /* StrokeCog.entitlements */, + 653A258928339462005D4D48 /* Info.plist */, + 2F6025CA29BBE70F0045459E /* GoogleService-Info.plist */, + 2F1AC9DE2B4E840E00C24973 /* StrokeCog.docc */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; + 2FE5DC2729EDD38D004B9AB4 /* Contacts */ = { + isa = PBXGroup; + children = ( + 2FE5DC2529EDD38A004B9AB4 /* Contacts.swift */, + ); + path = Contacts; + sourceTree = ""; + }; + 2FE5DC2829EDD398004B9AB4 /* Onboarding */ = { + isa = PBXGroup; + children = ( + 2FE5DC3129EDD7CA004B9AB4 /* OnboardingFlow.swift */, + 2FE5DC3429EDD7CA004B9AB4 /* Welcome.swift */, + 2FE5DC3229EDD7CA004B9AB4 /* InterestingModules.swift */, + 2FE5DCAC29EE6107004B9AB4 /* AccountOnboarding.swift */, + 2FE5DC2F29EDD7CA004B9AB4 /* Consent.swift */, + 2FE5DC3029EDD7CA004B9AB4 /* HealthKitPermissions.swift */, + 2F65B44D2A3B8B0600A36932 /* NotificationPermissions.swift */, + ); + path = Onboarding; + sourceTree = ""; + }; + 2FE5DC2D29EDD792004B9AB4 /* Resources */ = { + isa = PBXGroup; + children = ( + 653A255428338800005D4D48 /* Assets.xcassets */, + 2FA0BFEC2ACC977500E0EF83 /* Localizable.xcstrings */, + 2FE5DC2C29EDD78E004B9AB4 /* ConsentDocument.md */, + 2FE5DC2A29EDD78D004B9AB4 /* AppIcon.png */, + 2FE5DC5529EDD811004B9AB4 /* SocialSupportQuestionnaire.json */, + ); + path = Resources; + sourceTree = ""; + }; + 2FE5DC3B29EDD7D0004B9AB4 /* Schedule */ = { + isa = PBXGroup; + children = ( + 2FE5DC4D29EDD7FA004B9AB4 /* Bundle+Questionnaire.swift */, + 2FE5DC4929EDD7FA004B9AB4 /* EventContext.swift */, + 2FE5DC4A29EDD7FA004B9AB4 /* EventContextView.swift */, + 2FE5DC4829EDD7FA004B9AB4 /* ScheduleView.swift */, + 2FE5DC4C29EDD7FA004B9AB4 /* StrokeCogScheduler.swift */, + 2FE5DC4B29EDD7FA004B9AB4 /* StrokeCogTaskContext.swift */, + 27FA298F2A388E9B009CAC45 /* ModalView.swift */, + ); + path = Schedule; + sourceTree = ""; + }; + 2FE5DC3C29EDD7DA004B9AB4 /* SharedContext */ = { + isa = PBXGroup; + children = ( + 2FE5DC3E29EDD7ED004B9AB4 /* FeatureFlags.swift */, + 2FE5DC3F29EDD7EE004B9AB4 /* StorageKeys.swift */, + ); + path = SharedContext; + sourceTree = ""; + }; + 2FE5DC3D29EDD7E4004B9AB4 /* Helper */ = { + isa = PBXGroup; + children = ( + 2FE5DC4229EDD7F2004B9AB4 /* Binding+Negate.swift */, + 2FE5DC4329EDD7F2004B9AB4 /* Bundle+Image.swift */, + 2FE5DC4429EDD7F2004B9AB4 /* CodableArray+RawRepresentable.swift */, + ); + path = Helper; + sourceTree = ""; + }; + 56F6F29E2AB441640022FE5A /* Contributions */ = { + isa = PBXGroup; + children = ( + 56F6F29F2AB441930022FE5A /* ContributionsList.swift */, + 5680DD382AB8983D004E6D4A /* PackageCell.swift */, + 566155282AB8447C00209B80 /* Package+LicenseType.swift */, + 5661552D2AB854C000209B80 /* PackageHelper.swift */, + ); + path = Contributions; + sourceTree = ""; + }; + 653A2544283387FE005D4D48 = { + isa = PBXGroup; + children = ( + 2FC94CD4298B0A1D009C8209 /* StrokeCog.xctestplan */, + 653A254F283387FE005D4D48 /* StrokeCog */, + 653A256028338800005D4D48 /* StrokeCogTests */, + 653A256A28338800005D4D48 /* StrokeCogUITests */, + 653A254E283387FE005D4D48 /* Products */, + 653A258B283395A7005D4D48 /* Frameworks */, + ); + sourceTree = ""; + }; + 653A254E283387FE005D4D48 /* Products */ = { + isa = PBXGroup; + children = ( + 653A254D283387FE005D4D48 /* StrokeCog.app */, + 653A255D28338800005D4D48 /* StrokeCogTests.xctest */, + 653A256728338800005D4D48 /* StrokeCogUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 653A254F283387FE005D4D48 /* StrokeCog */ = { + isa = PBXGroup; + children = ( + 653A2550283387FE005D4D48 /* StrokeCog.swift */, + 2F5E32BC297E05EA003432F8 /* StrokeCogDelegate.swift */, + 2FF53D8C2A8729D600042B76 /* StrokeCogStandard.swift */, + 2F4E23822989D51F0013F3D9 /* StrokeCogTestingSetup.swift */, + 2FC975A72978F11A00BA99FE /* Home.swift */, + A9720E412ABB68B300872D23 /* Account */, + 2FE5DC2829EDD398004B9AB4 /* Onboarding */, + 2FE5DC3B29EDD7D0004B9AB4 /* Schedule */, + 2FE5DC2729EDD38D004B9AB4 /* Contacts */, + 56F6F29E2AB441640022FE5A /* Contributions */, + 2F4FC8D529EE69BE00BFFE26 /* MockUpload */, + 2FE5DC3C29EDD7DA004B9AB4 /* SharedContext */, + 2FE5DC3D29EDD7E4004B9AB4 /* Helper */, + 2FE5DC2D29EDD792004B9AB4 /* Resources */, + 2FC9759D2978E30800BA99FE /* Supporting Files */, + ); + path = StrokeCog; + sourceTree = ""; + }; + 653A256028338800005D4D48 /* StrokeCogTests */ = { + isa = PBXGroup; + children = ( + 653A256128338800005D4D48 /* StrokeCogTests.swift */, + ); + path = StrokeCogTests; + sourceTree = ""; + }; + 653A256A28338800005D4D48 /* StrokeCogUITests */ = { + isa = PBXGroup; + children = ( + 2F4E237D2989A2FE0013F3D9 /* OnboardingTests.swift */, + 653A256B28338800005D4D48 /* SchedulerTests.swift */, + 2F4E23862989DB360013F3D9 /* ContactsTests.swift */, + 2F1B52CD2A4F5CCE003AE151 /* MockUploadTests.swift */, + 5680DD3D2AB8CD84004E6D4A /* ContributionsTest.swift */, + ); + path = StrokeCogUITests; + sourceTree = ""; + }; + 653A258B283395A7005D4D48 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + A9720E412ABB68B300872D23 /* Account */ = { + isa = PBXGroup; + children = ( + A9FE7ACF2AA39BAB0077B045 /* AccountSheet.swift */, + A9720E422ABB68CC00872D23 /* AccountSetupHeader.swift */, + A9DFE8A82ABE551400428242 /* AccountButton.swift */, + ); + path = Account; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 653A254C283387FE005D4D48 /* StrokeCog */ = { + isa = PBXNativeTarget; + buildConfigurationList = 653A257128338800005D4D48 /* Build configuration list for PBXNativeTarget "StrokeCog" */; + buildPhases = ( + 653A2549283387FE005D4D48 /* Sources */, + 653A254A283387FE005D4D48 /* Frameworks */, + 653A254B283387FE005D4D48 /* Resources */, + 2F5B528D29BD237B002020B7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 566155222AB83CF200209B80 /* PBXTargetDependency */, + ); + name = StrokeCog; + packageProductDependencies = ( + 2F49B7752980407B00BCB272 /* Spezi */, + 2FE5DC6329EDD883004B9AB4 /* SpeziAccount */, + 2FE5DC6629EDD894004B9AB4 /* SpeziContact */, + 2FE5DC7129EDD8D3004B9AB4 /* SpeziHealthKit */, + 2FE5DC7429EDD8E6004B9AB4 /* SpeziFirebaseAccount */, + 2FE5DC7629EDD8E6004B9AB4 /* SpeziFirebaseConfiguration */, + 2FE5DC7829EDD8E6004B9AB4 /* SpeziFirestore */, + 2FE5DC8329EDD934004B9AB4 /* SpeziQuestionnaire */, + 2FE5DC8929EDD972004B9AB4 /* SpeziLocalStorage */, + 2FE5DC8B29EDD972004B9AB4 /* SpeziSecureStorage */, + 2FE5DC8E29EDD980004B9AB4 /* SpeziViews */, + 2FBD738B2A3BD150004228E7 /* SpeziScheduler */, + 2F3D4ABB2A4E7C290068FB2F /* SpeziScheduler */, + 2FE5DC8029EDD91D004B9AB4 /* SpeziOnboarding */, + 2FF53D8A2A8725DE00042B76 /* SpeziMockWebService */, + 2FB099AE2A875DF100B20952 /* FirebaseAuth */, + 2FB099B02A875DF100B20952 /* FirebaseFirestore */, + 2FB099B22A875DF100B20952 /* FirebaseFirestoreSwift */, + 2FB099B52A875E2B00B20952 /* HealthKitOnFHIR */, + 5661551C2AB8384200209B80 /* SwiftPackageList */, + 9739A0C52AD7B5730084BEA5 /* FirebaseStorage */, + 97D73D692AD860AD00B47FA0 /* SpeziFirebaseStorage */, + A9D83F952B083794000D0C78 /* SpeziFirebaseAccountStorage */, + A92E4DEF2BAA001100AC8DE8 /* OrderedCollections */, + ); + productName = StrokeCog; + productReference = 653A254D283387FE005D4D48 /* StrokeCog.app */; + productType = "com.apple.product-type.application"; + }; + 653A255C28338800005D4D48 /* StrokeCogTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 653A257428338800005D4D48 /* Build configuration list for PBXNativeTarget "StrokeCogTests" */; + buildPhases = ( + 653A255928338800005D4D48 /* Sources */, + 653A255A28338800005D4D48 /* Frameworks */, + 653A255B28338800005D4D48 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 653A255F28338800005D4D48 /* PBXTargetDependency */, + ); + name = StrokeCogTests; + productName = StrokeCogTests; + productReference = 653A255D28338800005D4D48 /* StrokeCogTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 653A256628338800005D4D48 /* StrokeCogUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 653A257728338800005D4D48 /* Build configuration list for PBXNativeTarget "StrokeCogUITests" */; + buildPhases = ( + 653A256328338800005D4D48 /* Sources */, + 653A256428338800005D4D48 /* Frameworks */, + 653A256528338800005D4D48 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 653A256928338800005D4D48 /* PBXTargetDependency */, + ); + name = StrokeCogUITests; + packageProductDependencies = ( + 2FE5DC9829EDD9D9004B9AB4 /* XCTestExtensions */, + 2FE5DC9B29EDD9EF004B9AB4 /* XCTHealthKit */, + ); + productName = StrokeCogUITests; + productReference = 653A256728338800005D4D48 /* StrokeCogUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 653A2545283387FE005D4D48 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1340; + LastUpgradeCheck = 1520; + TargetAttributes = { + 653A254C283387FE005D4D48 = { + CreatedOnToolsVersion = 13.4; + }; + 653A255C28338800005D4D48 = { + CreatedOnToolsVersion = 13.4; + TestTargetID = 653A254C283387FE005D4D48; + }; + 653A256628338800005D4D48 = { + CreatedOnToolsVersion = 13.4; + TestTargetID = 653A254C283387FE005D4D48; + }; + }; + }; + buildConfigurationList = 653A2548283387FE005D4D48 /* Build configuration list for PBXProject "StrokeCog" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 653A2544283387FE005D4D48; + packageReferences = ( + 2F49B7742980407B00BCB272 /* XCRemoteSwiftPackageReference "Spezi" */, + 2FE5DC6229EDD883004B9AB4 /* XCRemoteSwiftPackageReference "SpeziAccount" */, + 2FE5DC6529EDD894004B9AB4 /* XCRemoteSwiftPackageReference "SpeziContact" */, + 2FE5DC7029EDD8D3004B9AB4 /* XCRemoteSwiftPackageReference "SpeziHealthKit" */, + 2FE5DC7329EDD8E6004B9AB4 /* XCRemoteSwiftPackageReference "SpeziFirebase" */, + 2FE5DC8229EDD934004B9AB4 /* XCRemoteSwiftPackageReference "SpeziQuestionnaire" */, + 2FE5DC8829EDD972004B9AB4 /* XCRemoteSwiftPackageReference "SpeziStorage" */, + 2FE5DC8D29EDD980004B9AB4 /* XCRemoteSwiftPackageReference "SpeziViews" */, + 2FE5DC9029EDD9C3004B9AB4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + 2FE5DC9729EDD9D9004B9AB4 /* XCRemoteSwiftPackageReference "XCTestExtensions" */, + 2FE5DC9A29EDD9EF004B9AB4 /* XCRemoteSwiftPackageReference "XCTHealthKit" */, + 2F3D4ABA2A4E7C290068FB2F /* XCRemoteSwiftPackageReference "SpeziScheduler" */, + 97F466E62A76BBEE005DC9B4 /* XCRemoteSwiftPackageReference "SpeziOnboarding" */, + 2FE750CA2A87240100723EAE /* XCRemoteSwiftPackageReference "SpeziMockWebService" */, + 2FB099B42A875E2B00B20952 /* XCRemoteSwiftPackageReference "HealthKitOnFHIR" */, + 5661551B2AB8384200209B80 /* XCRemoteSwiftPackageReference "swift-package-list" */, + A92E4DEE2BAA001100AC8DE8 /* XCRemoteSwiftPackageReference "swift-collections" */, + ); + productRefGroup = 653A254E283387FE005D4D48 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 653A254C283387FE005D4D48 /* StrokeCog */, + 653A255C28338800005D4D48 /* StrokeCogTests */, + 653A256628338800005D4D48 /* StrokeCogUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 653A254B283387FE005D4D48 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2FC3439229EE634B002D773C /* ConsentDocument.md in Resources */, + 2FC3439129EE6349002D773C /* AppIcon.png in Resources */, + 653A255528338800005D4D48 /* Assets.xcassets in Resources */, + 2FC3439029EE6346002D773C /* SocialSupportQuestionnaire.json in Resources */, + 2FA0BFED2ACC977500E0EF83 /* Localizable.xcstrings in Resources */, + 2F6025CB29BBE70F0045459E /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 653A255B28338800005D4D48 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 653A256528338800005D4D48 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2F5B528D29BD237B002020B7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\n if which swiftlint > /dev/null; then\n swiftlint\n else\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\n fi\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 653A2549283387FE005D4D48 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2FE5DC4129EDD7EE004B9AB4 /* StorageKeys.swift in Sources */, + 2FE5DCB129EE6107004B9AB4 /* AccountOnboarding.swift in Sources */, + 2F4FC8D729EE69D300BFFE26 /* MockUpload.swift in Sources */, + 2FE5DC3A29EDD7CA004B9AB4 /* Welcome.swift in Sources */, + 2FE5DC3829EDD7CA004B9AB4 /* InterestingModules.swift in Sources */, + 2FE5DC3529EDD7CA004B9AB4 /* Consent.swift in Sources */, + 2FE5DC4529EDD7F2004B9AB4 /* Binding+Negate.swift in Sources */, + 2FC975A82978F11A00BA99FE /* Home.swift in Sources */, + 2FE5DC4E29EDD7FA004B9AB4 /* ScheduleView.swift in Sources */, + A9DFE8A92ABE551400428242 /* AccountButton.swift in Sources */, + 2FE5DC3729EDD7CA004B9AB4 /* OnboardingFlow.swift in Sources */, + 2F1AC9DF2B4E840E00C24973 /* StrokeCog.docc in Sources */, + 2FF53D8D2A8729D600042B76 /* StrokeCogStandard.swift in Sources */, + 2FE5DC4729EDD7F2004B9AB4 /* CodableArray+RawRepresentable.swift in Sources */, + A9720E432ABB68CC00872D23 /* AccountSetupHeader.swift in Sources */, + 2FE5DC4029EDD7EE004B9AB4 /* FeatureFlags.swift in Sources */, + 2FE5DC4629EDD7F2004B9AB4 /* Bundle+Image.swift in Sources */, + 2FE5DC4F29EDD7FA004B9AB4 /* EventContext.swift in Sources */, + 2FE5DC5029EDD7FA004B9AB4 /* EventContextView.swift in Sources */, + 2F4E23832989D51F0013F3D9 /* StrokeCogTestingSetup.swift in Sources */, + 2FE5DC5329EDD7FA004B9AB4 /* Bundle+Questionnaire.swift in Sources */, + 2FE5DC5129EDD7FA004B9AB4 /* StrokeCogTaskContext.swift in Sources */, + 56F6F2A02AB441930022FE5A /* ContributionsList.swift in Sources */, + 566155292AB8447C00209B80 /* Package+LicenseType.swift in Sources */, + 5680DD392AB8983D004E6D4A /* PackageCell.swift in Sources */, + 2F5E32BD297E05EA003432F8 /* StrokeCogDelegate.swift in Sources */, + 2FE5DC5229EDD7FA004B9AB4 /* StrokeCogScheduler.swift in Sources */, + A9FE7AD02AA39BAB0077B045 /* AccountSheet.swift in Sources */, + 653A2551283387FE005D4D48 /* StrokeCog.swift in Sources */, + 2FE5DC3629EDD7CA004B9AB4 /* HealthKitPermissions.swift in Sources */, + 2F65B44E2A3B8B0600A36932 /* NotificationPermissions.swift in Sources */, + 5661552E2AB854C000209B80 /* PackageHelper.swift in Sources */, + 27FA29902A388E9B009CAC45 /* ModalView.swift in Sources */, + 2FE5DC2629EDD38A004B9AB4 /* Contacts.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 653A255928338800005D4D48 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 653A256228338800005D4D48 /* StrokeCogTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 653A256328338800005D4D48 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5680DD3E2AB8CD84004E6D4A /* ContributionsTest.swift in Sources */, + 2F4E23872989DB360013F3D9 /* ContactsTests.swift in Sources */, + 2F4E237E2989A2FE0013F3D9 /* OnboardingTests.swift in Sources */, + 2F1B52CE2A4F5CCE003AE151 /* MockUploadTests.swift in Sources */, + 653A256C28338800005D4D48 /* SchedulerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 566155222AB83CF200209B80 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = 566155212AB83CF200209B80 /* SwiftPackageListJSONPlugin */; + }; + 653A255F28338800005D4D48 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 653A254C283387FE005D4D48 /* StrokeCog */; + targetProxy = 653A255E28338800005D4D48 /* PBXContainerItemProxy */; + }; + 653A256928338800005D4D48 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 653A254C283387FE005D4D48 /* StrokeCog */; + targetProxy = 653A256828338800005D4D48 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 2FEE10302998C89C000822E1 /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = TEST; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Test; + }; + 2FEE10312998C89C000822E1 /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "StrokeCog/Supporting Files/StrokeCog.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "StrokeCog/Supporting Files/Info.plist"; + INFOPLIST_KEY_NSCameraUsageDescription = "This message should never appear. Please adjust this when you start using camera information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSHealthShareUsageDescription = "The StrokeCog uses the step count to demonstrate Spezi's integration with HealthKit."; + INFOPLIST_KEY_NSHealthUpdateUsageDescription = "The StrokeCog uses the step count to demonstrate Spezi's integration with HealthKit."; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "This message should never appear. Please adjust this when you start using location information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "This message should never appear. Please adjust this when you start using location information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "This message should never appear. Please adjust this when you start using microphone information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSMotionUsageDescription = "This message should never appear. Please adjust this when you start using motion information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "This message should never appear. Please adjust this when you start using speecg information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIStrokeCoglicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIStrokeCoglicationSupportsIndirectInputEvents = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecog; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Test; + }; + 2FEE10322998C89C000822E1 /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 637867499T; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecog.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StrokeCog.app/StrokeCog"; + }; + name = Test; + }; + 2FEE10332998C89C000822E1 /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 637867499T; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecoguitests; + PRODUCT_NAME = "$(TARGET_NAME)"; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = StrokeCog; + }; + name = Test; + }; + 653A256F28338800005D4D48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 653A257028338800005D4D48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 653A257228338800005D4D48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "StrokeCog/Supporting Files/StrokeCog.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "StrokeCog/Supporting Files/Info.plist"; + INFOPLIST_KEY_NSCameraUsageDescription = "This message should never appear. Please adjust this when you start using camera information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSHealthShareUsageDescription = "The StrokeCog uses the step count to demonstrate Spezi's integration with HealthKit."; + INFOPLIST_KEY_NSHealthUpdateUsageDescription = "The StrokeCog uses the step count to demonstrate Spezi's integration with HealthKit."; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "This message should never appear. Please adjust this when you start using location information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "This message should never appear. Please adjust this when you start using location information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "This message should never appear. Please adjust this when you start using microphone information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSMotionUsageDescription = "This message should never appear. Please adjust this when you start using motion information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "This message should never appear. Please adjust this when you start using speecg information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIStrokeCoglicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIStrokeCoglicationSupportsIndirectInputEvents = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecog; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 653A257328338800005D4D48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "StrokeCog/Supporting Files/StrokeCog.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 637867499T; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "StrokeCog/Supporting Files/Info.plist"; + INFOPLIST_KEY_NSCameraUsageDescription = "This message should never appear. Please adjust this when you start using camera information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSHealthShareUsageDescription = "The StrokeCog uses the step count to demonstrate Spezi's integration with HealthKit."; + INFOPLIST_KEY_NSHealthUpdateUsageDescription = "The StrokeCog uses the step count to demonstrate Spezi's integration with HealthKit."; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "This message should never appear. Please adjust this when you start using location information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "This message should never appear. Please adjust this when you start using location information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "This message should never appear. Please adjust this when you start using microphone information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSMotionUsageDescription = "This message should never appear. Please adjust this when you start using motion information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "This message should never appear. Please adjust this when you start using speecg information. We have to put this in here as ResearchKit has the possibility to use it and not putting it here returns an error on AppStore Connect."; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIStrokeCoglicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIStrokeCoglicationSupportsIndirectInputEvents = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecog; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "StrokeCog"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 653A257528338800005D4D48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 637867499T; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecog.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StrokeCog.app/StrokeCog"; + }; + name = Debug; + }; + 653A257628338800005D4D48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 637867499T; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecog.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StrokeCog.app/StrokeCog"; + }; + name = Release; + }; + 653A257828338800005D4D48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 637867499T; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecoguitests; + PRODUCT_NAME = "$(TARGET_NAME)"; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = StrokeCog; + }; + name = Debug; + }; + 653A257928338800005D4D48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 637867499T; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.odden.strokecoguitests; + PRODUCT_NAME = "$(TARGET_NAME)"; + "SWIFT_ELicenseRef-StrokeCog_LOC_STRINGS" = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = StrokeCog; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 653A2548283387FE005D4D48 /* Build configuration list for PBXProject "StrokeCog" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 653A256F28338800005D4D48 /* Debug */, + 2FEE10302998C89C000822E1 /* Test */, + 653A257028338800005D4D48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 653A257128338800005D4D48 /* Build configuration list for PBXNativeTarget "StrokeCog" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 653A257228338800005D4D48 /* Debug */, + 2FEE10312998C89C000822E1 /* Test */, + 653A257328338800005D4D48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 653A257428338800005D4D48 /* Build configuration list for PBXNativeTarget "StrokeCogTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 653A257528338800005D4D48 /* Debug */, + 2FEE10322998C89C000822E1 /* Test */, + 653A257628338800005D4D48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 653A257728338800005D4D48 /* Build configuration list for PBXNativeTarget "StrokeCogUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 653A257828338800005D4D48 /* Debug */, + 2FEE10332998C89C000822E1 /* Test */, + 653A257928338800005D4D48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 2F3D4ABA2A4E7C290068FB2F /* XCRemoteSwiftPackageReference "SpeziScheduler" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziScheduler.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.8.0; + }; + }; + 2F49B7742980407B00BCB272 /* XCRemoteSwiftPackageReference "Spezi" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/Spezi"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.1.0; + }; + }; + 2FB099B42A875E2B00B20952 /* XCRemoteSwiftPackageReference "HealthKitOnFHIR" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordBDHG/HealthKitOnFHIR.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.2.4; + }; + }; + 2FE5DC6229EDD883004B9AB4 /* XCRemoteSwiftPackageReference "SpeziAccount" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziAccount.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.1.0; + }; + }; + 2FE5DC6529EDD894004B9AB4 /* XCRemoteSwiftPackageReference "SpeziContact" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziContact.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 2FE5DC7029EDD8D3004B9AB4 /* XCRemoteSwiftPackageReference "SpeziHealthKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziHealthKit.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.5.0; + }; + }; + 2FE5DC7329EDD8E6004B9AB4 /* XCRemoteSwiftPackageReference "SpeziFirebase" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziFirebase.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 2FE5DC8229EDD934004B9AB4 /* XCRemoteSwiftPackageReference "SpeziQuestionnaire" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziQuestionnaire.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 2FE5DC8829EDD972004B9AB4 /* XCRemoteSwiftPackageReference "SpeziStorage" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziStorage.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 2FE5DC8D29EDD980004B9AB4 /* XCRemoteSwiftPackageReference "SpeziViews" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziViews.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 2FE5DC9029EDD9C3004B9AB4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 10.17.0; + }; + }; + 2FE5DC9729EDD9D9004B9AB4 /* XCRemoteSwiftPackageReference "XCTestExtensions" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordBDHG/XCTestExtensions.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.4.8; + }; + }; + 2FE5DC9A29EDD9EF004B9AB4 /* XCRemoteSwiftPackageReference "XCTHealthKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordBDHG/XCTHealthKit.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.3.5; + }; + }; + 2FE750CA2A87240100723EAE /* XCRemoteSwiftPackageReference "SpeziMockWebService" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziMockWebService.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 5661551B2AB8384200209B80 /* XCRemoteSwiftPackageReference "swift-package-list" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/FelixHerrmann/swift-package-list"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.0.10; + }; + }; + 97F466E62A76BBEE005DC9B4 /* XCRemoteSwiftPackageReference "SpeziOnboarding" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/StanfordSpezi/SpeziOnboarding"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + A92E4DEE2BAA001100AC8DE8 /* XCRemoteSwiftPackageReference "swift-collections" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-collections.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.1.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 2F3D4ABB2A4E7C290068FB2F /* SpeziScheduler */ = { + isa = XCSwiftPackageProductDependency; + package = 2F3D4ABA2A4E7C290068FB2F /* XCRemoteSwiftPackageReference "SpeziScheduler" */; + productName = SpeziScheduler; + }; + 2F49B7752980407B00BCB272 /* Spezi */ = { + isa = XCSwiftPackageProductDependency; + package = 2F49B7742980407B00BCB272 /* XCRemoteSwiftPackageReference "Spezi" */; + productName = Spezi; + }; + 2FB099AE2A875DF100B20952 /* FirebaseAuth */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC9029EDD9C3004B9AB4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAuth; + }; + 2FB099B02A875DF100B20952 /* FirebaseFirestore */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC9029EDD9C3004B9AB4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseFirestore; + }; + 2FB099B22A875DF100B20952 /* FirebaseFirestoreSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC9029EDD9C3004B9AB4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseFirestoreSwift; + }; + 2FB099B52A875E2B00B20952 /* HealthKitOnFHIR */ = { + isa = XCSwiftPackageProductDependency; + package = 2FB099B42A875E2B00B20952 /* XCRemoteSwiftPackageReference "HealthKitOnFHIR" */; + productName = HealthKitOnFHIR; + }; + 2FBD738B2A3BD150004228E7 /* SpeziScheduler */ = { + isa = XCSwiftPackageProductDependency; + productName = SpeziScheduler; + }; + 2FE5DC6329EDD883004B9AB4 /* SpeziAccount */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC6229EDD883004B9AB4 /* XCRemoteSwiftPackageReference "SpeziAccount" */; + productName = SpeziAccount; + }; + 2FE5DC6629EDD894004B9AB4 /* SpeziContact */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC6529EDD894004B9AB4 /* XCRemoteSwiftPackageReference "SpeziContact" */; + productName = SpeziContact; + }; + 2FE5DC7129EDD8D3004B9AB4 /* SpeziHealthKit */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC7029EDD8D3004B9AB4 /* XCRemoteSwiftPackageReference "SpeziHealthKit" */; + productName = SpeziHealthKit; + }; + 2FE5DC7429EDD8E6004B9AB4 /* SpeziFirebaseAccount */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC7329EDD8E6004B9AB4 /* XCRemoteSwiftPackageReference "SpeziFirebase" */; + productName = SpeziFirebaseAccount; + }; + 2FE5DC7629EDD8E6004B9AB4 /* SpeziFirebaseConfiguration */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC7329EDD8E6004B9AB4 /* XCRemoteSwiftPackageReference "SpeziFirebase" */; + productName = SpeziFirebaseConfiguration; + }; + 2FE5DC7829EDD8E6004B9AB4 /* SpeziFirestore */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC7329EDD8E6004B9AB4 /* XCRemoteSwiftPackageReference "SpeziFirebase" */; + productName = SpeziFirestore; + }; + 2FE5DC8029EDD91D004B9AB4 /* SpeziOnboarding */ = { + isa = XCSwiftPackageProductDependency; + package = 97F466E62A76BBEE005DC9B4 /* XCRemoteSwiftPackageReference "SpeziOnboarding" */; + productName = SpeziOnboarding; + }; + 2FE5DC8329EDD934004B9AB4 /* SpeziQuestionnaire */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC8229EDD934004B9AB4 /* XCRemoteSwiftPackageReference "SpeziQuestionnaire" */; + productName = SpeziQuestionnaire; + }; + 2FE5DC8929EDD972004B9AB4 /* SpeziLocalStorage */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC8829EDD972004B9AB4 /* XCRemoteSwiftPackageReference "SpeziStorage" */; + productName = SpeziLocalStorage; + }; + 2FE5DC8B29EDD972004B9AB4 /* SpeziSecureStorage */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC8829EDD972004B9AB4 /* XCRemoteSwiftPackageReference "SpeziStorage" */; + productName = SpeziSecureStorage; + }; + 2FE5DC8E29EDD980004B9AB4 /* SpeziViews */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC8D29EDD980004B9AB4 /* XCRemoteSwiftPackageReference "SpeziViews" */; + productName = SpeziViews; + }; + 2FE5DC9829EDD9D9004B9AB4 /* XCTestExtensions */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC9729EDD9D9004B9AB4 /* XCRemoteSwiftPackageReference "XCTestExtensions" */; + productName = XCTestExtensions; + }; + 2FE5DC9B29EDD9EF004B9AB4 /* XCTHealthKit */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC9A29EDD9EF004B9AB4 /* XCRemoteSwiftPackageReference "XCTHealthKit" */; + productName = XCTHealthKit; + }; + 2FF53D8A2A8725DE00042B76 /* SpeziMockWebService */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE750CA2A87240100723EAE /* XCRemoteSwiftPackageReference "SpeziMockWebService" */; + productName = SpeziMockWebService; + }; + 5661551C2AB8384200209B80 /* SwiftPackageList */ = { + isa = XCSwiftPackageProductDependency; + package = 5661551B2AB8384200209B80 /* XCRemoteSwiftPackageReference "swift-package-list" */; + productName = SwiftPackageList; + }; + 566155212AB83CF200209B80 /* SwiftPackageListJSONPlugin */ = { + isa = XCSwiftPackageProductDependency; + package = 5661551B2AB8384200209B80 /* XCRemoteSwiftPackageReference "swift-package-list" */; + productName = "plugin:SwiftPackageListJSONPlugin"; + }; + 9739A0C52AD7B5730084BEA5 /* FirebaseStorage */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC9029EDD9C3004B9AB4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseStorage; + }; + 97D73D692AD860AD00B47FA0 /* SpeziFirebaseStorage */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC7329EDD8E6004B9AB4 /* XCRemoteSwiftPackageReference "SpeziFirebase" */; + productName = SpeziFirebaseStorage; + }; + A92E4DEF2BAA001100AC8DE8 /* OrderedCollections */ = { + isa = XCSwiftPackageProductDependency; + package = A92E4DEE2BAA001100AC8DE8 /* XCRemoteSwiftPackageReference "swift-collections" */; + productName = OrderedCollections; + }; + A9D83F952B083794000D0C78 /* SpeziFirebaseAccountStorage */ = { + isa = XCSwiftPackageProductDependency; + package = 2FE5DC7329EDD8E6004B9AB4 /* XCRemoteSwiftPackageReference "SpeziFirebase" */; + productName = SpeziFirebaseAccountStorage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 653A2545283387FE005D4D48 /* Project object */; +} diff --git a/StrokeCog.xcodeproj/project.pbxproj.license b/StrokeCog.xcodeproj/project.pbxproj.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog.xcodeproj/project.pbxproj.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata.license b/StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog.xcodeproj/project.xcworkspace/contents.xcworkspacedata.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist.license b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..d592ae6 --- /dev/null +++ b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,321 @@ +{ + "originHash" : "9ddbf125e828f8f258514b9b7b616777823852827ae6b79035a44b66b986b5e0", + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "7ce7be095bc3ed3c98b009532fe2d7698c132614", + "version" : "1.2024011601.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "3e464dad87dad2d29bb29a97836789bf0f8f67d2", + "version" : "10.18.1" + } + }, + { + "identity" : "fhirmodels", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/FHIRModels.git", + "state" : { + "revision" : "861afd5816a98d38f86220eab2f812d76cad84a0", + "version" : "0.5.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk.git", + "state" : { + "revision" : "888f0b6026e2441a69e3ee2ad5293c7a92031e62", + "version" : "10.23.1" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "c7a5917ebe48d69f421aadf154ef3969c8b7f12d", + "version" : "10.23.1" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "a637d318ae7ae246b02d7305121275bc75ed5565", + "version" : "9.4.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "26c898aed8bed13b8a63057ee26500abbbcb8d55", + "version" : "7.13.1" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "67043f6389d0e28b38fa02d1c6952afeb04d807f", + "version" : "1.62.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "9534039303015a84837090d20fa21cae6e5eadb6", + "version" : "3.3.2" + } + }, + { + "identity" : "healthkitonfhir", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordBDHG/HealthKitOnFHIR.git", + "state" : { + "revision" : "00d64d38a8f0d826ee9e27b6f3ce32314a29fd3e", + "version" : "0.2.6" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "43aaef65e0c665daadf848761d560e446d350d3d", + "version" : "1.22.4" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "researchkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordBDHG/ResearchKit", + "state" : { + "revision" : "6b28cdf0d06c3d6e96b5585369968b85deac96e0", + "version" : "2.2.29" + } + }, + { + "identity" : "researchkitonfhir", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordBDHG/ResearchKitOnFHIR", + "state" : { + "revision" : "7c2efdcb17796fc9ee686900304dbbe9dd4aaf85", + "version" : "1.1.2" + } + }, + { + "identity" : "spezi", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/Spezi", + "state" : { + "revision" : "c43e4fa3d3938a847de2b677091a34ddaea5bc76", + "version" : "1.2.3" + } + }, + { + "identity" : "speziaccount", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziAccount.git", + "state" : { + "revision" : "a7d289ef3be54de62b25dc92e8f7ff1a0f093906", + "version" : "1.2.1" + } + }, + { + "identity" : "spezicontact", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziContact.git", + "state" : { + "revision" : "494b776f8c98d771e4a609a1fb706097dba4c030", + "version" : "1.0.0" + } + }, + { + "identity" : "spezifirebase", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziFirebase.git", + "state" : { + "revision" : "e05e665b7da39aa399ecd7fba393aab49b8f3034", + "version" : "1.0.1" + } + }, + { + "identity" : "spezifoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziFoundation", + "state" : { + "revision" : "01af5b91a54f30ddd121258e81aff2ddc2a99ff9", + "version" : "1.0.4" + } + }, + { + "identity" : "spezihealthkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziHealthKit.git", + "state" : { + "revision" : "1e9cb5a6036ac7f4ff37ea1c3ed4898103339ad1", + "version" : "0.5.3" + } + }, + { + "identity" : "spezimockwebservice", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziMockWebService.git", + "state" : { + "revision" : "b18067d3499e630bbd995ef05a296ef8fdd42528", + "version" : "1.0.0" + } + }, + { + "identity" : "spezionboarding", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziOnboarding", + "state" : { + "revision" : "4971a82e94996ce0c3d8ecf64fdeec874a1f20d6", + "version" : "1.1.1" + } + }, + { + "identity" : "speziquestionnaire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziQuestionnaire.git", + "state" : { + "revision" : "f9d9b6d99bb1e00bda2974b440dca8367733d591", + "version" : "1.1.0" + } + }, + { + "identity" : "spezischeduler", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziScheduler.git", + "state" : { + "revision" : "eed3980f20b01a788720c869010e3fe2fbfcd1fd", + "version" : "0.8.2" + } + }, + { + "identity" : "spezistorage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziStorage.git", + "state" : { + "revision" : "b958df9b31f24800388a7bfc28f457ce7b82556c", + "version" : "1.0.2" + } + }, + { + "identity" : "speziviews", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordSpezi/SpeziViews.git", + "state" : { + "revision" : "4d2a724d97c8f19ac7de7aa2c046b1cb3ef7b279", + "version" : "1.3.1" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser", + "state" : { + "revision" : "46989693916f56d1186bd59ac15124caef896560", + "version" : "1.3.1" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-package-list", + "kind" : "remoteSourceControl", + "location" : "https://github.com/FelixHerrmann/swift-package-list", + "state" : { + "revision" : "412180a72b9a1f8262213c16459e3533b0385ea5", + "version" : "3.1.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "9f0c76544701845ad98716f3f6a774a892152bcb", + "version" : "1.26.0" + } + }, + { + "identity" : "xctestextensions", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordBDHG/XCTestExtensions.git", + "state" : { + "revision" : "1fe9b8e76aeb7a132af37bfa0892160c9b662dcc", + "version" : "0.4.10" + } + }, + { + "identity" : "xcthealthkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordBDHG/XCTHealthKit.git", + "state" : { + "revision" : "6e9344a2d632b801d94fe3bbd1d891817e032103", + "version" : "0.3.5" + } + }, + { + "identity" : "xctruntimeassertions", + "kind" : "remoteSourceControl", + "location" : "https://github.com/StanfordBDHG/XCTRuntimeAssertions", + "state" : { + "revision" : "51da3403f128b120705571ce61e0fe190f8889e6", + "version" : "1.0.1" + } + } + ], + "version" : 3 +} diff --git a/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved.license b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme b/StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme new file mode 100644 index 0000000..4b87a49 --- /dev/null +++ b/StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme.license b/StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog.xcodeproj/xcshareddata/xcschemes/StrokeCog.xcscheme.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCog.xctestplan b/StrokeCog.xctestplan new file mode 100644 index 0000000..343fe16 --- /dev/null +++ b/StrokeCog.xctestplan @@ -0,0 +1,44 @@ +{ + "configurations" : [ + { + "id" : "6C9DABEF-5835-4523-A115-B83B0C6E3BBC", + "name" : "Default", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : { + "targets" : [ + { + "containerPath" : "container:StrokeCog.xcodeproj", + "identifier" : "653A254C283387FE005D4D48", + "name" : "StrokeCog" + } + ] + }, + "targetForVariableExpansion" : { + "containerPath" : "container:StrokeCog.xcodeproj", + "identifier" : "653A254C283387FE005D4D48", + "name" : "StrokeCog" + } + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:StrokeCog.xcodeproj", + "identifier" : "653A255C28338800005D4D48", + "name" : "StrokeCogTests" + } + }, + { + "target" : { + "containerPath" : "container:StrokeCog.xcodeproj", + "identifier" : "653A256628338800005D4D48", + "name" : "StrokeCogUITests" + } + } + ], + "version" : 1 +} diff --git a/StrokeCog.xctestplan.license b/StrokeCog.xctestplan.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog.xctestplan.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCog/Account/AccountButton.swift b/StrokeCog/Account/AccountButton.swift new file mode 100644 index 0000000..fa31846 --- /dev/null +++ b/StrokeCog/Account/AccountButton.swift @@ -0,0 +1,38 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SwiftUI + + +struct AccountButton: View { + static let shouldDisplay = !FeatureFlags.disableFirebase || ProcessInfo.processInfo.isPreviewSimulator + + @Binding private var isPresented: Bool + + + var body: some View { + Button(action: { + isPresented = true + }) { + Image(systemName: "person.crop.circle") + } + .accessibilityLabel("ACCOUNT_TITLE") + } + + + init(isPresented: Binding) { + self._isPresented = isPresented + } +} + + +#if DEBUG +#Preview(traits: .sizeThatFitsLayout) { + AccountButton(isPresented: .constant(false)) +} +#endif diff --git a/StrokeCog/Account/AccountSetupHeader.swift b/StrokeCog/Account/AccountSetupHeader.swift new file mode 100644 index 0000000..e1245d6 --- /dev/null +++ b/StrokeCog/Account/AccountSetupHeader.swift @@ -0,0 +1,43 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziAccount +import SwiftUI + + +struct AccountSetupHeader: View { + @Environment(Account.self) private var account + @Environment(\._accountSetupState) private var setupState + + + var body: some View { + VStack { + Text("ACCOUNT_TITLE") + .font(.largeTitle) + .bold() + .padding(.bottom) + .padding(.top, 30) + Text("ACCOUNT_SUBTITLE") + .padding(.bottom, 8) + if account.signedIn, case .generic = setupState { + Text("ACCOUNT_SIGNED_IN_DESCRIPTION") + } else { + Text("ACCOUNT_SETUP_DESCRIPTION") + } + } + .multilineTextAlignment(.center) + } +} + + +#if DEBUG +#Preview { + AccountSetupHeader() + .environment(Account()) +} +#endif diff --git a/StrokeCog/Account/AccountSheet.swift b/StrokeCog/Account/AccountSheet.swift new file mode 100644 index 0000000..8db07bd --- /dev/null +++ b/StrokeCog/Account/AccountSheet.swift @@ -0,0 +1,91 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziAccount +import SwiftUI + + +struct AccountSheet: View { + @Environment(\.dismiss) var dismiss + + @Environment(Account.self) private var account + @Environment(\.accountRequired) var accountRequired + + @State var isInSetup = false + @State var overviewIsEditing = false + + + var body: some View { + NavigationStack { + ZStack { + if account.signedIn && !isInSetup { + AccountOverview(isEditing: $overviewIsEditing) { + NavigationLink { + ContributionsList() + } label: { + Text("LICENSE_INFO_TITLE") + } + } + .onDisappear { + overviewIsEditing = false + } + .toolbar { + if !overviewIsEditing { + closeButton + } + } + } else { + AccountSetup { _ in + dismiss() // we just signed in, dismiss the account setup sheet + } header: { + AccountSetupHeader() + } + .onAppear { + isInSetup = true + } + .toolbar { + if !accountRequired { + closeButton + } + } + } + } + } + } + + var closeButton: some ToolbarContent { + ToolbarItem(placement: .cancellationAction) { + Button("CLOSE") { + dismiss() + } + } + } +} + + +#if DEBUG +#Preview("AccountSheet") { + let details = AccountDetails.Builder() + .set(\.userId, value: "lelandstanford@stanford.edu") + .set(\.name, value: PersonNameComponents(givenName: "Leland", familyName: "Stanford")) + + return AccountSheet() + .previewWith { + AccountConfiguration(building: details, active: MockUserIdPasswordAccountService()) + } +} + +#Preview("AccountSheet SignIn") { + AccountSheet() + .previewWith { + AccountConfiguration { + MockUserIdPasswordAccountService() + } + } +} +#endif diff --git a/StrokeCog/Contacts/Contacts.swift b/StrokeCog/Contacts/Contacts.swift new file mode 100644 index 0000000..f5b8b36 --- /dev/null +++ b/StrokeCog/Contacts/Contacts.swift @@ -0,0 +1,78 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Foundation +import SpeziContact +import SwiftUI + + +/// Displays the contacts for the StrokeCog. +struct Contacts: View { + let contacts = [ + Contact( + name: PersonNameComponents( + givenName: "Leland", + familyName: "Stanford" + ), + image: Image(systemName: "figure.wave.circle"), // swiftlint:disable:this accessibility_label_for_image + title: "University Founder", + description: String(localized: "LELAND_STANFORD_BIO"), + organization: "Stanford University", + address: { + let address = CNMutablePostalAddress() + address.country = "USA" + address.state = "CA" + address.postalCode = "94305" + address.city = "Stanford" + address.street = "450 Serra Mall" + return address + }(), + contactOptions: [ + .call("+1 (650) 723-2300"), + .text("+1 (650) 723-2300"), + .email(addresses: ["contact@stanford.edu"]), + ContactOption( + image: Image(systemName: "safari.fill"), // swiftlint:disable:this accessibility_label_for_image + title: "Website", + action: { + if let url = URL(string: "https://stanford.edu") { + UIApplication.shared.open(url) + } + } + ) + ] + ) + ] + + @Binding var presentingAccount: Bool + + + var body: some View { + NavigationStack { + ContactsList(contacts: contacts) + .navigationTitle(String(localized: "CONTACTS_NAVIGATION_TITLE")) + .toolbar { + if AccountButton.shouldDisplay { + AccountButton(isPresented: $presentingAccount) + } + } + } + } + + + init(presentingAccount: Binding) { + self._presentingAccount = presentingAccount + } +} + + +#if DEBUG +#Preview { + Contacts(presentingAccount: .constant(false)) +} +#endif diff --git a/StrokeCog/Contributions/ContributionsList.swift b/StrokeCog/Contributions/ContributionsList.swift new file mode 100644 index 0000000..5c029f8 --- /dev/null +++ b/StrokeCog/Contributions/ContributionsList.swift @@ -0,0 +1,53 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SwiftPackageList +import SwiftUI + + +struct ContributionsList: View { + var packages: [Package] = PackageHelper.getPackageList() + + var body: some View { + List { + Section(footer: Text("PROJECT_LICENSE_DESCRIPTION")) { + Text("CONTRIBUTIONS_LIST_DESCRIPTION") + } + Section( + header: Text("CONTRIBUTIONS_LIST_HEADER"), + footer: Text("CONTRIBUTIONS_LIST_FOOTER") + ) { + ForEach(packages.sorted(by: { $0.name < $1.name }), id: \.name) { package in + PackageCell(package: package) + } + } + } + .navigationTitle("LICENSE_INFO_TITLE") + .navigationBarTitleDisplayMode(.inline) + } +} + + +#if DEBUG +#Preview { + let mockPackages = [ + Package( + name: "MockPackage", + version: "1.0", + branch: nil, + revision: "0", + // We use a force unwrap in the preview as we can not recover from an error here + // and the code will never end up in a production environment. + // swiftlint:disable:next force_unwrapping + repositoryURL: URL(string: "github.com")!, + license: "MIT License" + ) + ] + return ContributionsList(packages: mockPackages) +} +#endif diff --git a/StrokeCog/Contributions/Package+LicenseType.swift b/StrokeCog/Contributions/Package+LicenseType.swift new file mode 100644 index 0000000..95eaae6 --- /dev/null +++ b/StrokeCog/Contributions/Package+LicenseType.swift @@ -0,0 +1,104 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Foundation +import SwiftPackageList + + +// This section of code is based on the SwiftPackageList package: +// - Original code: https://github.com/FelixHerrmann/swift-package-list/issues/43 +enum LicenseType { + case mit + case apachev2 + case gplv2 + case gplv3 + case bsd2 + case bsd3 + case bsd4 + case zlib + + /// SPDX-License-Identifier for the UI + var spdxIdentifier: String { + switch self { + case .mit: return "MIT" + case .apachev2: return "Apache-2.0" + case .gplv2: return "GPL-2.0" + case .gplv3: return "GPL-3.0" + case .bsd2: return "BSD-2-Clause" + case .bsd3: return "BSD-3-Clause" + case .bsd4: return "BSD-4-Clause" + case .zlib: return "Zlib" + } + } + + /// Initializer that scans the license document for common licenses and versions + init?(license: String) { + let license = license + .replacingOccurrences(of: "\\s+|\\n", with: " ", options: .regularExpression) + + if license.contains(mitText) { + self = .mit + } else if license.contains(apacheText) && license.contains("Version 2.0") { + self = .apachev2 + } else if license.contains(gnuText) && license.contains("Version 2") { + self = .gplv2 + } else if license.contains(gnuText) && license.contains("Version 3") { + self = .gplv3 + } else if license.contains(bsdFourClauseText) { + self = .bsd4 + } else if license.range(of: bsdThreeClausePattern, options: .regularExpression) != nil { + self = .bsd3 + } else if license.contains(bsdTwoClauseText) { + self = .bsd2 + } else if license.range(of: zlibPattern, options: .regularExpression) != nil { + self = .zlib + } else { + return nil + } + } +} + + +// Constants representing typical text and regular expression patterns often found in license files. +// They are used for matching and identifying different types of licenses within text documents. +private let mitText = "MIT License" +private let apacheText = "Apache License" +private let gnuText = "GNU GENERAL PUBLIC LICENSE" +private let bsdTwoClauseText = + """ + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met + """ +private let bsdThreeClausePattern = + """ + Neither the name of (.+) nor the names of (.+) may be used to endorse or promote products derived from this software \ + without specific prior written permission + """ +private let bsdFourClauseText = + """ + All advertising materials mentioning features or use of this software must display the following acknowledgement: \ + this product includes software developed by + """ +private let zlibPattern = + """ + The origin of this software must not be misrepresented; you must not claim that you wrote the original software. \ + If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.(.*) \ + Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.(.*) \ + This notice may not be removed or altered from any source distribution. + """ + + +extension Package { + /// Generates the `LicenseType` from a license document of `String` + func getLicenseType(license: String?) -> LicenseType? { + if let license = license { + let licenseType = LicenseType(license: license) + return licenseType + } + return nil + } +} diff --git a/StrokeCog/Contributions/PackageCell.swift b/StrokeCog/Contributions/PackageCell.swift new file mode 100644 index 0000000..9bb6406 --- /dev/null +++ b/StrokeCog/Contributions/PackageCell.swift @@ -0,0 +1,73 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SwiftPackageList +import SwiftUI + + +struct PackageCell: View { + let package: Package + + var body: some View { + HStack { + VStack(alignment: .leading, spacing: 4) { + Text(package.name).font(.headline) + HStack { + Text(getPackageDetails(package: package)) + .font(.caption) + if let licenseType = package.getLicenseType(license: package.license) { + Text(licenseType.spdxIdentifier) + .font(.caption) + .fontWeight(.semibold) + .padding(2) + .background(Color(.systemGray5)) + .cornerRadius(4) + } + } + } + Spacer() + Button(action: { + UIApplication.shared.open(package.repositoryURL) + }) { + Image(systemName: "safari.fill") + .imageScale(.large) + }.buttonStyle(PlainButtonStyle()) + .foregroundColor(.blue) + .accessibilityLabel(Text("Repository Link")) + } + } + + func getPackageDetails(package: Package) -> String { + if let branch = package.branch { + return "Branch: \(branch)" + } else if let version = package.version { + return "Version: \(version)" + } else { + return "Revision: \(package.revision)" + } + } +} + + +#if DEBUG +#Preview(traits: .sizeThatFitsLayout) { + let mockPackage = Package( + name: "MockPackage", + version: "1.0", + branch: nil, + revision: "0", + // We use a force unwrap in the preview as we can not recover from an error here + // and the code will never end up in a production environment. + // swiftlint:disable:next force_unwrapping + repositoryURL: URL(string: "github.com")!, + license: "MIT License" + ) + + return PackageCell(package: mockPackage) +} +#endif diff --git a/StrokeCog/Contributions/PackageHelper.swift b/StrokeCog/Contributions/PackageHelper.swift new file mode 100644 index 0000000..65a7dd6 --- /dev/null +++ b/StrokeCog/Contributions/PackageHelper.swift @@ -0,0 +1,26 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Foundation +import SwiftPackageList + + +enum PackageHelper { + /// Helper function that calls the corresponding API of `SwiftPackageList`to fetch the list of packages + static func getPackageList() -> [Package] { + do { + let packages = try packageList() + return packages + } catch PackageListError.noPackageList { + print("There is no package-list file") + } catch { + print(error) + } + return [] + } +} diff --git a/StrokeCog/Helper/Binding+Negate.swift b/StrokeCog/Helper/Binding+Negate.swift new file mode 100644 index 0000000..db30f37 --- /dev/null +++ b/StrokeCog/Helper/Binding+Negate.swift @@ -0,0 +1,20 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SwiftUI + + +extension Binding where Value == Bool { + /// Negates a `Binding`. + prefix static func ! (value: Binding) -> Binding { + Binding( + get: { !value.wrappedValue }, + set: { value.wrappedValue = !$0 } + ) + } +} diff --git a/StrokeCog/Helper/Bundle+Image.swift b/StrokeCog/Helper/Bundle+Image.swift new file mode 100644 index 0000000..87587d2 --- /dev/null +++ b/StrokeCog/Helper/Bundle+Image.swift @@ -0,0 +1,30 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SwiftUI + + +extension Foundation.Bundle { + /// Loads an image from the `Bundle` instance. + /// - Parameters: + /// - name: The name of the image. + /// - fileExtension: The file extension of the image. + /// - Returns: Returns the `UIImage` loaded from the `Bundle` instance. + func image(withName name: String, fileExtension: String) -> UIImage { + guard let resourceURL = self.url(forResource: name, withExtension: fileExtension) else { + fatalError("Could not find the file \"\(name).\(fileExtension)\" in the bundle.") + } + + guard let resourceData = try? Data(contentsOf: resourceURL), + let image = UIImage(data: resourceData) else { + fatalError("Decode the image named \"\(name).\(fileExtension)\"") + } + + return image + } +} diff --git a/StrokeCog/Helper/CodableArray+RawRepresentable.swift b/StrokeCog/Helper/CodableArray+RawRepresentable.swift new file mode 100644 index 0000000..61da25b --- /dev/null +++ b/StrokeCog/Helper/CodableArray+RawRepresentable.swift @@ -0,0 +1,28 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Foundation + + +extension Array: RawRepresentable where Element: Codable { + public var rawValue: String { + guard let data = try? JSONEncoder().encode(self), + let rawValue = String(data: data, encoding: .utf8) else { + return "[]" + } + return rawValue + } + + public init?(rawValue: String) { + guard let data = rawValue.data(using: .utf8), + let result = try? JSONDecoder().decode([Element].self, from: data) else { + return nil + } + self = result + } +} diff --git a/StrokeCog/Home.swift b/StrokeCog/Home.swift new file mode 100644 index 0000000..1058049 --- /dev/null +++ b/StrokeCog/Home.swift @@ -0,0 +1,86 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziAccount +import SpeziMockWebService +import SwiftUI + + +struct HomeView: View { + enum Tabs: String { + case schedule + case contact + case mockUpload + } + + static var accountEnabled: Bool { + !FeatureFlags.disableFirebase && !FeatureFlags.skipOnboarding + } + + + @AppStorage(StorageKeys.homeTabSelection) private var selectedTab = Tabs.schedule + @State private var presentingAccount = false + + + var body: some View { + TabView(selection: $selectedTab) { + ScheduleView(presentingAccount: $presentingAccount) + .tag(Tabs.schedule) + .tabItem { + Label("SCHEDULE_TAB_TITLE", systemImage: "list.clipboard") + } + Contacts(presentingAccount: $presentingAccount) + .tag(Tabs.contact) + .tabItem { + Label("CONTACTS_TAB_TITLE", systemImage: "person.fill") + } + if FeatureFlags.disableFirebase { + MockUpload(presentingAccount: $presentingAccount) + .tag(Tabs.mockUpload) + .tabItem { + Label("MOCK_WEB_SERVICE_TAB_TITLE", systemImage: "server.rack") + } + } + } + .sheet(isPresented: $presentingAccount) { + AccountSheet() + } + .accountRequired(Self.accountEnabled) { + AccountSheet() + } + .verifyRequiredAccountDetails(Self.accountEnabled) + } +} + + +#if DEBUG +#Preview { + let details = AccountDetails.Builder() + .set(\.userId, value: "lelandstanford@stanford.edu") + .set(\.name, value: PersonNameComponents(givenName: "Leland", familyName: "Stanford")) + + return HomeView() + .previewWith(standard: StrokeCogStandard()) { + StrokeCogScheduler() + MockWebService() + AccountConfiguration(building: details, active: MockUserIdPasswordAccountService()) + } +} + +#Preview { + CommandLine.arguments.append("--disableFirebase") // make sure the MockWebService is displayed + return HomeView() + .previewWith(standard: StrokeCogStandard()) { + StrokeCogScheduler() + MockWebService() + AccountConfiguration { + MockUserIdPasswordAccountService() + } + } +} +#endif diff --git a/StrokeCog/MockUpload/MockUpload.swift b/StrokeCog/MockUpload/MockUpload.swift new file mode 100644 index 0000000..30bd871 --- /dev/null +++ b/StrokeCog/MockUpload/MockUpload.swift @@ -0,0 +1,41 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziMockWebService +import SwiftUI + + +struct MockUpload: View { + @Binding var presentingAccount: Bool + + var body: some View { + NavigationStack { + RequestList() + .toolbar { + if AccountButton.shouldDisplay { + AccountButton(isPresented: $presentingAccount) + } + } + } + } + + + init(presentingAccount: Binding) { + self._presentingAccount = presentingAccount + } +} + + +#if DEBUG +#Preview { + MockUpload(presentingAccount: .constant(false)) + .previewWith { + MockWebService() + } +} +#endif diff --git a/StrokeCog/Onboarding/AccountOnboarding.swift b/StrokeCog/Onboarding/AccountOnboarding.swift new file mode 100644 index 0000000..a13283d --- /dev/null +++ b/StrokeCog/Onboarding/AccountOnboarding.swift @@ -0,0 +1,64 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziAccount +import SpeziOnboarding +import SwiftUI + + +struct AccountOnboarding: View { + @Environment(Account.self) private var account + @Environment(OnboardingNavigationPath.self) private var onboardingNavigationPath + + + var body: some View { + AccountSetup { _ in + Task { + // Placing the nextStep() call inside this task will ensure that the sheet dismiss animation is + // played till the end before we navigate to the next step. + onboardingNavigationPath.nextStep() + } + } header: { + AccountSetupHeader() + } continue: { + OnboardingActionsView( + "ACCOUNT_NEXT", + action: { + onboardingNavigationPath.nextStep() + } + ) + } + } +} + + +#if DEBUG +#Preview("Account Onboarding SignIn") { + OnboardingStack { + AccountOnboarding() + } + .previewWith { + AccountConfiguration { + MockUserIdPasswordAccountService() + } + } +} + +#Preview("Account Onboarding") { + let details = AccountDetails.Builder() + .set(\.userId, value: "lelandstanford@stanford.edu") + .set(\.name, value: PersonNameComponents(givenName: "Leland", familyName: "Stanford")) + + return OnboardingStack { + AccountOnboarding() + } + .previewWith { + AccountConfiguration(building: details, active: MockUserIdPasswordAccountService()) + } +} +#endif diff --git a/StrokeCog/Onboarding/Consent.swift b/StrokeCog/Onboarding/Consent.swift new file mode 100644 index 0000000..9caefe0 --- /dev/null +++ b/StrokeCog/Onboarding/Consent.swift @@ -0,0 +1,49 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziOnboarding +import SwiftUI + + +/// - Note: The `OnboardingConsentView` exports the signed consent form as PDF to the Spezi `Standard`, necessitating the conformance of the `Standard` to the `OnboardingConstraint`. +struct Consent: View { + @Environment(OnboardingNavigationPath.self) private var onboardingNavigationPath + + + private var consentDocument: Data { + guard let path = Bundle.main.url(forResource: "ConsentDocument", withExtension: "md"), + let data = try? Data(contentsOf: path) else { + return Data(String(localized: "CONSENT_LOADING_ERROR").utf8) + } + return data + } + + + var body: some View { + OnboardingConsentView( + markdown: { + consentDocument + }, + action: { + onboardingNavigationPath.nextStep() + } + ) + } +} + + +#if DEBUG +#Preview { + OnboardingStack { + Consent() + } + .previewWith(standard: StrokeCogStandard()) { + OnboardingDataSource() + } +} +#endif diff --git a/StrokeCog/Onboarding/HealthKitPermissions.swift b/StrokeCog/Onboarding/HealthKitPermissions.swift new file mode 100644 index 0000000..b446d8e --- /dev/null +++ b/StrokeCog/Onboarding/HealthKitPermissions.swift @@ -0,0 +1,77 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziHealthKit +import SpeziOnboarding +import SwiftUI + + +struct HealthKitPermissions: View { + @Environment(HealthKit.self) private var healthKitDataSource + @Environment(OnboardingNavigationPath.self) private var onboardingNavigationPath + + @State private var healthKitProcessing = false + + + var body: some View { + OnboardingView( + contentView: { + VStack { + OnboardingTitleView( + title: "HEALTHKIT_PERMISSIONS_TITLE", + subtitle: "HEALTHKIT_PERMISSIONS_SUBTITLE" + ) + Spacer() + Image(systemName: "heart.text.square.fill") + .font(.system(size: 150)) + .foregroundColor(.accentColor) + .accessibilityHidden(true) + Text("HEALTHKIT_PERMISSIONS_DESCRIPTION") + .multilineTextAlignment(.center) + .padding(.vertical, 16) + Spacer() + } + }, actionView: { + OnboardingActionsView( + "HEALTHKIT_PERMISSIONS_BUTTON", + action: { + do { + healthKitProcessing = true + // HealthKit is not available in the preview simulator. + if ProcessInfo.processInfo.isPreviewSimulator { + try await _Concurrency.Task.sleep(for: .seconds(5)) + } else { + try await healthKitDataSource.askForAuthorization() + } + } catch { + print("Could not request HealthKit permissions.") + } + healthKitProcessing = false + + onboardingNavigationPath.nextStep() + } + ) + } + ) + .navigationBarBackButtonHidden(healthKitProcessing) + // Small fix as otherwise "Login" or "Sign up" is still shown in the nav bar + .navigationTitle(Text(verbatim: "")) + } +} + + +#if DEBUG +#Preview { + OnboardingStack { + HealthKitPermissions() + } + .previewWith(standard: StrokeCogStandard()) { + HealthKit() + } +} +#endif diff --git a/StrokeCog/Onboarding/InterestingModules.swift b/StrokeCog/Onboarding/InterestingModules.swift new file mode 100644 index 0000000..e458620 --- /dev/null +++ b/StrokeCog/Onboarding/InterestingModules.swift @@ -0,0 +1,54 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziOnboarding +import SwiftUI + + +struct InterestingModules: View { + @Environment(OnboardingNavigationPath.self) private var onboardingNavigationPath + + + var body: some View { + SequentialOnboardingView( + title: "INTERESTING_MODULES_TITLE", + subtitle: "INTERESTING_MODULES_SUBTITLE", + content: [ + SequentialOnboardingView.Content( + title: "INTERESTING_MODULES_AREA1_TITLE", + description: "INTERESTING_MODULES_AREA1_DESCRIPTION" + ), + SequentialOnboardingView.Content( + title: "INTERESTING_MODULES_AREA2_TITLE", + description: "INTERESTING_MODULES_AREA2_DESCRIPTION" + ), + SequentialOnboardingView.Content( + title: "INTERESTING_MODULES_AREA3_TITLE", + description: "INTERESTING_MODULES_AREA3_DESCRIPTION" + ), + SequentialOnboardingView.Content( + title: "INTERESTING_MODULES_AREA4_TITLE", + description: "INTERESTING_MODULES_AREA4_DESCRIPTION" + ) + ], + actionText: "INTERESTING_MODULES_BUTTON", + action: { + onboardingNavigationPath.nextStep() + } + ) + } +} + + +#if DEBUG +#Preview { + OnboardingStack { + InterestingModules() + } +} +#endif diff --git a/StrokeCog/Onboarding/NotificationPermissions.swift b/StrokeCog/Onboarding/NotificationPermissions.swift new file mode 100644 index 0000000..46eafc3 --- /dev/null +++ b/StrokeCog/Onboarding/NotificationPermissions.swift @@ -0,0 +1,77 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziOnboarding +import SpeziScheduler +import SwiftUI + + +struct NotificationPermissions: View { + @Environment(StrokeCogScheduler.self) private var scheduler + @Environment(OnboardingNavigationPath.self) private var onboardingNavigationPath + + @State private var notificationProcessing = false + + + var body: some View { + OnboardingView( + contentView: { + VStack { + OnboardingTitleView( + title: "NOTIFICATION_PERMISSIONS_TITLE", + subtitle: "NOTIFICATION_PERMISSIONS_SUBTITLE" + ) + Spacer() + Image(systemName: "bell.square.fill") + .font(.system(size: 150)) + .foregroundColor(.accentColor) + .accessibilityHidden(true) + Text("NOTIFICATION_PERMISSIONS_DESCRIPTION") + .multilineTextAlignment(.center) + .padding(.vertical, 16) + Spacer() + } + }, actionView: { + OnboardingActionsView( + "NOTIFICATION_PERMISSIONS_BUTTON", + action: { + do { + notificationProcessing = true + // Notification Authorization is not available in the preview simulator. + if ProcessInfo.processInfo.isPreviewSimulator { + try await _Concurrency.Task.sleep(for: .seconds(5)) + } else { + try await scheduler.requestLocalNotificationAuthorization() + } + } catch { + print("Could not request notification permissions.") + } + notificationProcessing = false + + onboardingNavigationPath.nextStep() + } + ) + } + ) + .navigationBarBackButtonHidden(notificationProcessing) + // Small fix as otherwise "Login" or "Sign up" is still shown in the nav bar + .navigationTitle(Text(verbatim: "")) + } +} + + +#if DEBUG +#Preview { + OnboardingStack { + NotificationPermissions() + } + .previewWith { + StrokeCogScheduler() + } +} +#endif diff --git a/StrokeCog/Onboarding/OnboardingFlow.swift b/StrokeCog/Onboarding/OnboardingFlow.swift new file mode 100644 index 0000000..4c45195 --- /dev/null +++ b/StrokeCog/Onboarding/OnboardingFlow.swift @@ -0,0 +1,79 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziAccount +import SpeziFirebaseAccount +import SpeziHealthKit +import SpeziOnboarding +import SwiftUI + + +/// Displays an multi-step onboarding flow for the StrokeCog. +struct OnboardingFlow: View { + @Environment(HealthKit.self) private var healthKitDataSource + @Environment(StrokeCogScheduler.self) private var scheduler + + @AppStorage(StorageKeys.onboardingFlowComplete) private var completedOnboardingFlow = false + + @State private var localNotificationAuthorization = false + + + private var healthKitAuthorization: Bool { + // As HealthKit not available in preview simulator + if ProcessInfo.processInfo.isPreviewSimulator { + return false + } + + return healthKitDataSource.authorized + } + + + var body: some View { + OnboardingStack(onboardingFlowComplete: $completedOnboardingFlow) { + Welcome() + InterestingModules() + + if !FeatureFlags.disableFirebase { + AccountOnboarding() + } + + #if !(targetEnvironment(simulator) && (arch(i386) || arch(x86_64))) + Consent() + #endif + + if HKHealthStore.isHealthDataAvailable() && !healthKitAuthorization { + HealthKitPermissions() + } + + if !localNotificationAuthorization { + NotificationPermissions() + } + } + .task { + localNotificationAuthorization = await scheduler.localNotificationAuthorization + } + .interactiveDismissDisabled(!completedOnboardingFlow) + } +} + + +#if DEBUG +#Preview { + OnboardingFlow() + .environment(Account(MockUserIdPasswordAccountService())) + .previewWith(standard: StrokeCogStandard()) { + OnboardingDataSource() + HealthKit() + AccountConfiguration { + MockUserIdPasswordAccountService() + } + + StrokeCogScheduler() + } +} +#endif diff --git a/StrokeCog/Onboarding/Welcome.swift b/StrokeCog/Onboarding/Welcome.swift new file mode 100644 index 0000000..a8012d3 --- /dev/null +++ b/StrokeCog/Onboarding/Welcome.swift @@ -0,0 +1,63 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziOnboarding +import SwiftUI + + +struct Welcome: View { + @Environment(OnboardingNavigationPath.self) private var onboardingNavigationPath + + + var body: some View { + OnboardingView( + title: "WELCOME_TITLE", + subtitle: "WELCOME_SUBTITLE", + areas: [ + OnboardingInformationView.Content( + icon: { + Image(systemName: "apps.iphone") + .accessibilityHidden(true) + }, + title: "WELCOME_AREA1_TITLE", + description: "WELCOME_AREA1_DESCRIPTION" + ), + OnboardingInformationView.Content( + icon: { + Image(systemName: "shippingbox.fill") + .accessibilityHidden(true) + }, + title: "WELCOME_AREA2_TITLE", + description: "WELCOME_AREA2_DESCRIPTION" + ), + OnboardingInformationView.Content( + icon: { + Image(systemName: "list.bullet.clipboard.fill") + .accessibilityHidden(true) + }, + title: "WELCOME_AREA3_TITLE", + description: "WELCOME_AREA3_DESCRIPTION" + ) + ], + actionText: "WELCOME_BUTTON", + action: { + onboardingNavigationPath.nextStep() + } + ) + .padding(.top, 24) + } +} + + +#if DEBUG +#Preview { + OnboardingStack { + Welcome() + } +} +#endif diff --git a/StrokeCog/Resources/AppIcon.png b/StrokeCog/Resources/AppIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..7414dd9b7987a5b34717ff72e2566c85dd45de76 GIT binary patch literal 94218 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 z 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 z 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 Questionnaire { + guard let resourceURL = self.url(forResource: name, withExtension: "json") else { + fatalError("Could not find the questionnaire \"\(name).json\" in the bundle.") + } + + do { + let resourceData = try Data(contentsOf: resourceURL) + return try JSONDecoder().decode(Questionnaire.self, from: resourceData) + } catch { + fatalError("Could not decode the FHIR questionnaire named \"\(name).json\": \(error)") + } + } +} diff --git a/StrokeCog/Schedule/EventContext.swift b/StrokeCog/Schedule/EventContext.swift new file mode 100644 index 0000000..ea88c24 --- /dev/null +++ b/StrokeCog/Schedule/EventContext.swift @@ -0,0 +1,25 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziScheduler + + +struct EventContext: Comparable, Identifiable { + let event: Event + let task: Task + + + var id: Event.ID { + event.id + } + + + static func < (lhs: EventContext, rhs: EventContext) -> Bool { + lhs.event.scheduledAt < rhs.event.scheduledAt + } +} diff --git a/StrokeCog/Schedule/EventContextView.swift b/StrokeCog/Schedule/EventContextView.swift new file mode 100644 index 0000000..42b7d09 --- /dev/null +++ b/StrokeCog/Schedule/EventContextView.swift @@ -0,0 +1,81 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziScheduler +import SwiftUI + + +struct EventContextView: View { + let eventContext: EventContext + + + var body: some View { + HStack { + VStack(alignment: .leading) { + HStack { + if eventContext.event.complete { + Image(systemName: "checkmark.circle.fill") + .foregroundColor(.accentColor) + .font(.system(size: 30)) + .accessibilityHidden(true) + } + VStack(alignment: .leading, spacing: 8) { + Text(verbatim: eventContext.task.title) + .font(.headline) + .accessibilityLabel( + eventContext.event.complete + ? "COMPLETED_TASK_LABEL \(eventContext.task.title)" + : "TASK_LABEL \(eventContext.task.title)" + ) + Text(verbatim: format(eventDate: eventContext.event.scheduledAt)) + .font(.subheadline) + } + } + Divider() + Text(eventContext.task.description) + .font(.callout) + if !eventContext.event.complete { + Text(eventContext.task.context.actionType) + .frame(maxWidth: .infinity, minHeight: 50) + .foregroundColor(.white) + .background(Color.accentColor) + .clipShape(RoundedRectangle(cornerRadius: 8)) + .padding(.top, 8) + } + } + } + .disabled(eventContext.event.complete) + .contentShape(Rectangle()) + } + + + private func format(eventDate: Date) -> String { + let dateFormatter = DateFormatter() + dateFormatter.dateStyle = .none + dateFormatter.timeStyle = .short + return dateFormatter.string(from: eventDate) + } +} + + +#if DEBUG +#Preview(traits: .sizeThatFitsLayout) { + let task = StrokeCogScheduler.socialSupportTask + + return EventContextView( + eventContext: EventContext( + // We use a force unwrap in the preview as we can not recover from an error here + // and the code will never end up in a production environment. + // swiftlint:disable:next force_unwrapping + event: task.events(from: .now.addingTimeInterval(-60 * 60 * 24)).first!, + task: task + ) + ) + .padding() +} +#endif diff --git a/StrokeCog/Schedule/ModalView.swift b/StrokeCog/Schedule/ModalView.swift new file mode 100644 index 0000000..09ed583 --- /dev/null +++ b/StrokeCog/Schedule/ModalView.swift @@ -0,0 +1,47 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SpeziViews +import SwiftUI + + +struct ModalView: View { + @Environment(\.dismiss) private var dismiss + + let text: String + let buttonText: String + let onClose: () async -> Void + + + var body: some View { + VStack { + Spacer() + Text(text) + .padding() + Spacer() + AsyncButton { + self.dismiss() + await self.onClose() + } label: { + Text(buttonText) + .frame(maxWidth: .infinity, minHeight: 38) + } + .padding() + .buttonStyle(.borderedProminent) + } + } +} + + +#if DEBUG +#Preview { + ModalView(text: "Preview Modal", buttonText: "Close") { + print("Preview Modal closed.") + } +} +#endif diff --git a/StrokeCog/Schedule/ScheduleView.swift b/StrokeCog/Schedule/ScheduleView.swift new file mode 100644 index 0000000..6b9805f --- /dev/null +++ b/StrokeCog/Schedule/ScheduleView.swift @@ -0,0 +1,119 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import OrderedCollections +import SpeziAccount +import SpeziQuestionnaire +import SpeziScheduler +import SwiftUI + + +struct ScheduleView: View { + @Environment(StrokeCogStandard.self) private var standard + @Environment(StrokeCogScheduler.self) private var scheduler + + @State private var presentedContext: EventContext? + @Binding private var presentingAccount: Bool + + + private var eventContextsByDate: OrderedDictionary { + let eventContexts = scheduler.tasks.flatMap { task in + task + .events( + from: Calendar.current.startOfDay(for: .now), + to: .numberOfEventsOrEndDate(100, .now) + ) + .map { event in + EventContext(event: event, task: task) + } + } + .sorted() + + return OrderedDictionary(grouping: eventContexts) { eventContext in + Calendar.current.startOfDay(for: eventContext.event.scheduledAt) + } + } + + + var body: some View { + NavigationStack { + let eventContextsByDate = eventContextsByDate + List(eventContextsByDate.keys, id: \.timeIntervalSinceNow) { startOfDay in + Section(format(startOfDay: startOfDay)) { + ForEach(eventContextsByDate[startOfDay] ?? [], id: \.event) { eventContext in + EventContextView(eventContext: eventContext) + .onTapGesture { + if !eventContext.event.complete { + presentedContext = eventContext + } + } + } + } + } + .sheet(item: $presentedContext) { presentedContext in + destination(withContext: presentedContext) + } + .toolbar { + if AccountButton.shouldDisplay { + AccountButton(isPresented: $presentingAccount) + } + } + .navigationTitle("SCHEDULE_LIST_TITLE") + } + } + + + init(presentingAccount: Binding) { + self._presentingAccount = presentingAccount + } + + + private func destination(withContext eventContext: EventContext) -> some View { + @ViewBuilder var destination: some View { + switch eventContext.task.context { + case let .questionnaire(questionnaire): + QuestionnaireView(questionnaire: questionnaire) { result in + presentedContext = nil + + guard case let .completed(response) = result else { + return // user cancelled the task + } + + eventContext.event.complete(true) + await standard.add(response: response) + } + case let .test(string): + ModalView(text: string, buttonText: String(localized: "CLOSE")) { + await eventContext.event.complete(true) + } + } + } + return destination + } + + + private func format(startOfDay: Date) -> String { + let dateFormatter = DateFormatter() + dateFormatter.dateStyle = .long + dateFormatter.timeStyle = .none + return dateFormatter.string(from: startOfDay) + } +} + + +#if DEBUG +#Preview("ScheduleView") { + ScheduleView(presentingAccount: .constant(false)) + .previewWith(standard: StrokeCogStandard()) { + StrokeCogScheduler() + AccountConfiguration { + MockUserIdPasswordAccountService() + } + } +} +#endif diff --git a/StrokeCog/Schedule/StrokeCogScheduler.swift b/StrokeCog/Schedule/StrokeCogScheduler.swift new file mode 100644 index 0000000..273f588 --- /dev/null +++ b/StrokeCog/Schedule/StrokeCogScheduler.swift @@ -0,0 +1,49 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Foundation +import SpeziScheduler + + +/// A `Scheduler` using the ``StrokeCogTaskContext`` to schedule and manage tasks and events in the +/// StrokeCog. +typealias StrokeCogScheduler = Scheduler + + +extension StrokeCogScheduler { + static var socialSupportTask: SpeziScheduler.Task { + let dateComponents: DateComponents + if FeatureFlags.testSchedule { + // Adds a task at the current time for UI testing if the `--testSchedule` feature flag is set + dateComponents = DateComponents( + hour: Calendar.current.component(.hour, from: .now), + minute: Calendar.current.component(.minute, from: .now) + ) + } else { + // For the normal app usage, we schedule the task for every day at 8:00 AM + dateComponents = DateComponents(hour: 8, minute: 0) + } + + return Task( + title: String(localized: "TASK_SOCIAL_SUPPORT_QUESTIONNAIRE_TITLE"), + description: String(localized: "TASK_SOCIAL_SUPPORT_QUESTIONNAIRE_DESCRIPTION"), + schedule: Schedule( + start: Calendar.current.startOfDay(for: Date()), + repetition: .matching(dateComponents), + end: .numberOfEvents(365) + ), + notifications: true, + context: StrokeCogTaskContext.questionnaire(Bundle.main.questionnaire(withName: "SocialSupportQuestionnaire")) + ) + } + + /// Creates a default instance of the ``StrokeCogScheduler`` by scheduling the tasks listed below. + convenience init() { + self.init(tasks: [Self.socialSupportTask]) + } +} diff --git a/StrokeCog/Schedule/StrokeCogTaskContext.swift b/StrokeCog/Schedule/StrokeCogTaskContext.swift new file mode 100644 index 0000000..9c71759 --- /dev/null +++ b/StrokeCog/Schedule/StrokeCogTaskContext.swift @@ -0,0 +1,40 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Foundation +import ModelsR4 + + +/// The context attached to each task in the StrokeCog. +/// +/// We currently only support `Questionnaire`s, more cases can be added in the future. +enum StrokeCogTaskContext: Codable, Identifiable { + /// The task should display a `Questionnaire`. + case questionnaire(Questionnaire) + /// The task is used for UI testing. + case test(String) + + + var id: FHIRPrimitive? { + switch self { + case let .questionnaire(questionnaire): + return questionnaire.id + case .test: + return FHIRPrimitive(FHIRString(UUID().uuidString)) + } + } + + var actionType: LocalizedStringResource { + switch self { + case .questionnaire: + return LocalizedStringResource("TASK_CONTEXT_ACTION_QUESTIONNAIRE") + case .test: + return LocalizedStringResource("TASK_CONTEXT_ACTION_TEST") + } + } +} diff --git a/StrokeCog/SharedContext/FeatureFlags.swift b/StrokeCog/SharedContext/FeatureFlags.swift new file mode 100644 index 0000000..f18f9d5 --- /dev/null +++ b/StrokeCog/SharedContext/FeatureFlags.swift @@ -0,0 +1,26 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +/// A collection of feature flags for the StrokeCog. +enum FeatureFlags { + /// Skips the onboarding flow to enable easier development of features in the application and to allow UI tests to skip the onboarding flow. + static let skipOnboarding = CommandLine.arguments.contains("--skipOnboarding") + /// Always show the onboarding when the application is launched. Makes it easy to modify and test the onboarding flow without the need to manually remove the application or reset the simulator. + static let showOnboarding = CommandLine.arguments.contains("--showOnboarding") + /// Disables the Firebase interactions, including the login/sign-up step and the Firebase Firestore upload. + static let disableFirebase = CommandLine.arguments.contains("--disableFirebase") + #if targetEnvironment(simulator) + /// Defines if the application should connect to the local firebase emulator. Always set to true when using the iOS simulator. + static let useFirebaseEmulator = true + #else + /// Defines if the application should connect to the local firebase emulator. Always set to true when using the iOS simulator. + static let useFirebaseEmulator = CommandLine.arguments.contains("--useFirebaseEmulator") + #endif + /// Adds a test task to the schedule at the current time + static let testSchedule = CommandLine.arguments.contains("--testSchedule") +} diff --git a/StrokeCog/SharedContext/StorageKeys.swift b/StrokeCog/SharedContext/StorageKeys.swift new file mode 100644 index 0000000..2cc5925 --- /dev/null +++ b/StrokeCog/SharedContext/StorageKeys.swift @@ -0,0 +1,21 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +/// Constants shared across the Spezi Teamplate Application to access storage information including the `AppStorage` and `SceneStorage` +enum StorageKeys { + // MARK: - Onboarding + /// A `Bool` flag indicating of the onboarding was completed. + static let onboardingFlowComplete = "onboardingFlow.complete" + /// A `Step` flag indicating the current step in the onboarding process. + static let onboardingFlowStep = "onboardingFlow.step" + + + // MARK: - Home + /// The currently selected home tab. + static let homeTabSelection = "home.tabselection" +} diff --git a/StrokeCog/StrokeCog.swift b/StrokeCog/StrokeCog.swift new file mode 100644 index 0000000..46c3a14 --- /dev/null +++ b/StrokeCog/StrokeCog.swift @@ -0,0 +1,36 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Spezi +import SpeziFirebaseAccount +import SwiftUI + + +@main +struct StrokeCog: App { + @UIApplicationDelegateAdaptor(StrokeCogDelegate.self) var appDelegate + @AppStorage(StorageKeys.onboardingFlowComplete) var completedOnboardingFlow = false + + + var body: some Scene { + WindowGroup { + ZStack { + if completedOnboardingFlow { + HomeView() + } else { + EmptyView() + } + } + .sheet(isPresented: !$completedOnboardingFlow) { + OnboardingFlow() + } + .testingSetup() + .spezi(appDelegate) + } + } +} diff --git a/StrokeCog/StrokeCogDelegate.swift b/StrokeCog/StrokeCogDelegate.swift new file mode 100644 index 0000000..b1715a4 --- /dev/null +++ b/StrokeCog/StrokeCogDelegate.swift @@ -0,0 +1,84 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import Spezi +import SpeziAccount +import SpeziFirebaseAccount +import SpeziFirebaseStorage +import SpeziFirestore +import SpeziHealthKit +import SpeziMockWebService +import SpeziOnboarding +import SpeziScheduler +import SwiftUI + + +class StrokeCogDelegate: SpeziAppDelegate { + override var configuration: Configuration { + Configuration(standard: StrokeCogStandard()) { + if !FeatureFlags.disableFirebase { + AccountConfiguration(configuration: [ + .requires(\.userId), + .requires(\.name), + + // additional values stored using the `FirestoreAccountStorage` within our Standard implementation + .collects(\.genderIdentity), + .collects(\.dateOfBirth) + ]) + + if FeatureFlags.useFirebaseEmulator { + FirebaseAccountConfiguration( + authenticationMethods: [.emailAndPassword, .signInWithApple], + emulatorSettings: (host: "localhost", port: 9099) + ) + } else { + FirebaseAccountConfiguration(authenticationMethods: [.emailAndPassword, .signInWithApple]) + } + firestore + if FeatureFlags.useFirebaseEmulator { + FirebaseStorageConfiguration(emulatorSettings: (host: "localhost", port: 9199)) + } else { + FirebaseStorageConfiguration() + } + } else { + MockWebService() + } + + if HKHealthStore.isHealthDataAvailable() { + healthKit + } + + StrokeCogScheduler() + OnboardingDataSource() + } + } + + + private var firestore: Firestore { + let settings = FirestoreSettings() + if FeatureFlags.useFirebaseEmulator { + settings.host = "localhost:8080" + settings.cacheSettings = MemoryCacheSettings() + settings.isSSLEnabled = false + } + + return Firestore( + settings: settings + ) + } + + + private var healthKit: HealthKit { + HealthKit { + CollectSample( + HKQuantityType(.stepCount), + deliverySetting: .anchorQuery(.afterAuthorizationAndApplicationWillLaunch) + ) + } + } +} diff --git a/StrokeCog/StrokeCogStandard.swift b/StrokeCog/StrokeCogStandard.swift new file mode 100644 index 0000000..12f4e7c --- /dev/null +++ b/StrokeCog/StrokeCogStandard.swift @@ -0,0 +1,203 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import FirebaseFirestore +import FirebaseStorage +import HealthKitOnFHIR +import OSLog +import PDFKit +import Spezi +import SpeziAccount +import SpeziFirebaseAccountStorage +import SpeziFirestore +import SpeziHealthKit +import SpeziMockWebService +import SpeziOnboarding +import SpeziQuestionnaire +import SwiftUI + + +actor StrokeCogStandard: Standard, EnvironmentAccessible, HealthKitConstraint, OnboardingConstraint, AccountStorageConstraint { + enum StrokeCogStandardError: Error { + case userNotAuthenticatedYet + } + + private static var userCollection: CollectionReference { + Firestore.firestore().collection("users") + } + + @Dependency var mockWebService: MockWebService? + @Dependency var accountStorage: FirestoreAccountStorage? + + @AccountReference var account: Account + + private let logger = Logger(subsystem: "StrokeCog", category: "Standard") + + + private var userDocumentReference: DocumentReference { + get async throws { + guard let details = await account.details else { + throw StrokeCogStandardError.userNotAuthenticatedYet + } + + return Self.userCollection.document(details.accountId) + } + } + + private var userBucketReference: StorageReference { + get async throws { + guard let details = await account.details else { + throw StrokeCogStandardError.userNotAuthenticatedYet + } + + return Storage.storage().reference().child("users/\(details.accountId)") + } + } + + + init() { + if !FeatureFlags.disableFirebase { + _accountStorage = Dependency(wrappedValue: FirestoreAccountStorage(storeIn: StrokeCogStandard.userCollection)) + } + } + + + func add(sample: HKSample) async { + if let mockWebService { + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted, .sortedKeys, .withoutEscapingSlashes] + let jsonRepresentation = (try? String(data: encoder.encode(sample.resource), encoding: .utf8)) ?? "" + try? await mockWebService.upload(path: "healthkit/\(sample.uuid.uuidString)", body: jsonRepresentation) + return + } + + do { + try await healthKitDocument(id: sample.id).setData(from: sample.resource) + } catch { + logger.error("Could not store HealthKit sample: \(error)") + } + } + + func remove(sample: HKDeletedObject) async { + if let mockWebService { + try? await mockWebService.remove(path: "healthkit/\(sample.uuid.uuidString)") + return + } + + do { + try await healthKitDocument(id: sample.uuid).delete() + } catch { + logger.error("Could not remove HealthKit sample: \(error)") + } + } + + func add(response: ModelsR4.QuestionnaireResponse) async { + let id = response.identifier?.value?.value?.string ?? UUID().uuidString + + if let mockWebService { + let jsonRepresentation = (try? String(data: JSONEncoder().encode(response), encoding: .utf8)) ?? "" + try? await mockWebService.upload(path: "questionnaireResponse/\(id)", body: jsonRepresentation) + return + } + + do { + try await userDocumentReference + .collection("QuestionnaireResponse") // Add all HealthKit sources in a /QuestionnaireResponse collection. + .document(id) // Set the document identifier to the id of the response. + .setData(from: response) + } catch { + logger.error("Could not store questionnaire response: \(error)") + } + } + + + private func healthKitDocument(id uuid: UUID) async throws -> DocumentReference { + try await userDocumentReference + .collection("HealthKit") // Add all HealthKit sources in a /HealthKit collection. + .document(uuid.uuidString) // Set the document identifier to the UUID of the document. + } + + func deletedAccount() async throws { + // delete all user associated data + do { + try await userDocumentReference.delete() + } catch { + logger.error("Could not delete user document: \(error)") + } + } + + /// Stores the given consent form in the user's document directory with a unique timestamped filename. + /// + /// - Parameter consent: The consent form's data to be stored as a `PDFDocument`. + func store(consent: PDFDocument) async { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd_HHmmss" + let dateString = formatter.string(from: Date()) + + guard !FeatureFlags.disableFirebase else { + guard let basePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { + logger.error("Could not create path for writing consent form to user document directory.") + return + } + + let filePath = basePath.appending(path: "consentForm_\(dateString).pdf") + consent.write(to: filePath) + + return + } + + do { + guard let consentData = consent.dataRepresentation() else { + logger.error("Could not store consent form.") + return + } + + let metadata = StorageMetadata() + metadata.contentType = "application/pdf" + _ = try await userBucketReference.child("consent/\(dateString).pdf").putDataAsync(consentData, metadata: metadata) + } catch { + logger.error("Could not store consent form: \(error)") + } + } + + + func create(_ identifier: AdditionalRecordId, _ details: SignupDetails) async throws { + guard let accountStorage else { + preconditionFailure("Account Storage was requested although not enabled in current configuration.") + } + try await accountStorage.create(identifier, details) + } + + func load(_ identifier: AdditionalRecordId, _ keys: [any AccountKey.Type]) async throws -> PartialAccountDetails { + guard let accountStorage else { + preconditionFailure("Account Storage was requested although not enabled in current configuration.") + } + return try await accountStorage.load(identifier, keys) + } + + func modify(_ identifier: AdditionalRecordId, _ modifications: AccountModifications) async throws { + guard let accountStorage else { + preconditionFailure("Account Storage was requested although not enabled in current configuration.") + } + try await accountStorage.modify(identifier, modifications) + } + + func clear(_ identifier: AdditionalRecordId) async { + guard let accountStorage else { + preconditionFailure("Account Storage was requested although not enabled in current configuration.") + } + await accountStorage.clear(identifier) + } + + func delete(_ identifier: AdditionalRecordId) async throws { + guard let accountStorage else { + preconditionFailure("Account Storage was requested although not enabled in current configuration.") + } + try await accountStorage.delete(identifier) + } +} diff --git a/StrokeCog/StrokeCogTestingSetup.swift b/StrokeCog/StrokeCogTestingSetup.swift new file mode 100644 index 0000000..3a881a6 --- /dev/null +++ b/StrokeCog/StrokeCogTestingSetup.swift @@ -0,0 +1,34 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import SwiftUI + + +private struct StrokeCogAppTestingSetup: ViewModifier { + @AppStorage(StorageKeys.onboardingFlowComplete) var completedOnboardingFlow = false + + + func body(content: Content) -> some View { + content + .task { + if FeatureFlags.skipOnboarding { + completedOnboardingFlow = true + } + if FeatureFlags.showOnboarding { + completedOnboardingFlow = false + } + } + } +} + + +extension View { + func testingSetup() -> some View { + self.modifier(StrokeCogAppTestingSetup()) + } +} diff --git a/StrokeCog/Supporting Files/GoogleService-Info.plist b/StrokeCog/Supporting Files/GoogleService-Info.plist new file mode 100644 index 0000000..54db832 --- /dev/null +++ b/StrokeCog/Supporting Files/GoogleService-Info.plist @@ -0,0 +1,34 @@ + + + + + CLIENT_ID + CLIENT_ID + REVERSED_CLIENT_ID + REVERSED_CLIENT_ID + API_KEY + API_KEY + GCM_SENDER_ID + GCM_SENDER_ID + PLIST_VERSION + 1 + BUNDLE_ID + com.odden.strokecog + PROJECT_ID + strokecog + STORAGE_BUCKET + STORAGE_BUCKET + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:123456789012:ios:1234567890123456789012 + + diff --git a/StrokeCog/Supporting Files/GoogleService-Info.plist.license b/StrokeCog/Supporting Files/GoogleService-Info.plist.license new file mode 100644 index 0000000..c376e26 --- /dev/null +++ b/StrokeCog/Supporting Files/GoogleService-Info.plist.license @@ -0,0 +1,5 @@ +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2022 Stanford University and the project authors (see CONTRIBUTORS.md) + +SPDX-License-Identifier: MIT diff --git a/StrokeCog/Supporting Files/Info.plist b/StrokeCog/Supporting Files/Info.plist new file mode 100644 index 0000000..5dc3321 --- /dev/null +++ b/StrokeCog/Supporting Files/Info.plist @@ -0,0 +1,17 @@ + + + + + ITSAppUsesNonExemptEncryption + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + + CFBundleAllowMixedLocalizations + + + diff --git a/StrokeCog/Supporting Files/Info.plist.license b/StrokeCog/Supporting Files/Info.plist.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog/Supporting Files/Info.plist.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCog/Supporting Files/StrokeCog.entitlements b/StrokeCog/Supporting Files/StrokeCog.entitlements new file mode 100644 index 0000000..c541ce6 --- /dev/null +++ b/StrokeCog/Supporting Files/StrokeCog.entitlements @@ -0,0 +1,16 @@ + + + + + com.apple.developer.applesignin + + Default + + com.apple.developer.healthkit + + com.apple.developer.healthkit.access + + com.apple.developer.healthkit.background-delivery + + + diff --git a/StrokeCog/Supporting Files/StrokeCog.entitlements.license b/StrokeCog/Supporting Files/StrokeCog.entitlements.license new file mode 100644 index 0000000..5989983 --- /dev/null +++ b/StrokeCog/Supporting Files/StrokeCog.entitlements.license @@ -0,0 +1,6 @@ + +This source file is part of the StrokeCog based on the Stanford Spezi Template Application project + +SPDX-FileCopyrightText: 2023 Stanford University + +SPDX-License-Identifier: MIT diff --git a/StrokeCogTests/StrokeCogTests.swift b/StrokeCogTests/StrokeCogTests.swift new file mode 100644 index 0000000..4683ea5 --- /dev/null +++ b/StrokeCogTests/StrokeCogTests.swift @@ -0,0 +1,17 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +@testable import StrokeCog +import XCTest + + +class StrokeCogTests: XCTestCase { + func testExample() throws { + XCTAssertTrue(true) + } +} diff --git a/StrokeCogUITests/ContactsTests.swift b/StrokeCogUITests/ContactsTests.swift new file mode 100644 index 0000000..ee63845 --- /dev/null +++ b/StrokeCogUITests/ContactsTests.swift @@ -0,0 +1,39 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import XCTest + + +class ContactsTests: XCTestCase { + override func setUpWithError() throws { + try super.setUpWithError() + + continueAfterFailure = false + + let app = XCUIApplication() + app.launchArguments = ["--skipOnboarding"] + app.launch() + } + + + func testContacts() throws { + let app = XCUIApplication() + + XCTAssertTrue(app.tabBars["Tab Bar"].buttons["Contacts"].waitForExistence(timeout: 2)) + app.tabBars["Tab Bar"].buttons["Contacts"].tap() + + XCTAssertTrue(app.staticTexts["Contact: Leland Stanford"].waitForExistence(timeout: 2)) + + XCTAssertTrue(app.buttons["Call"].waitForExistence(timeout: 2)) + XCTAssertTrue(app.buttons["Text"].waitForExistence(timeout: 2)) + XCTAssertTrue(app.buttons["Email"].waitForExistence(timeout: 2)) + XCTAssertTrue(app.buttons["Website"].waitForExistence(timeout: 2)) + + XCTAssertTrue(app.buttons["Address: 450 Serra Mall\nStanford CA 94305\nUSA"].waitForExistence(timeout: 2)) + } +} diff --git a/StrokeCogUITests/ContributionsTest.swift b/StrokeCogUITests/ContributionsTest.swift new file mode 100644 index 0000000..58649db --- /dev/null +++ b/StrokeCogUITests/ContributionsTest.swift @@ -0,0 +1,39 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import XCTest + + +final class ContributionsTest: XCTestCase { + override func setUpWithError() throws { + try super.setUpWithError() + + continueAfterFailure = false + + let app = XCUIApplication() + app.launchArguments = ["--showOnboarding"] + app.deleteAndLaunch(withSpringboardAppName: "StrokeCog") + } + + func testLicenseInformationPage() throws { + let app = XCUIApplication() + + // complete onboarding so user is logged in + try app.conductOnboardingIfNeeded(email: "leland@contributions.stanford.edu") + + + XCTAssertTrue(app.buttons["Your Account"].waitForExistence(timeout: 6.0)) + app.buttons["Your Account"].tap() + + XCTAssertTrue(app.buttons["License Information"].waitForExistence(timeout: 2)) + app.buttons["License Information"].tap() + // Test if the sheet opens by checking if the title of the sheet is present + XCTAssertTrue(app.staticTexts["This project is licensed under the MIT License."].waitForExistence(timeout: 2)) + XCTAssertTrue(app.buttons["Repository Link"].waitForExistence(timeout: 2)) + } +} diff --git a/StrokeCogUITests/MockUploadTests.swift b/StrokeCogUITests/MockUploadTests.swift new file mode 100644 index 0000000..6bde2c3 --- /dev/null +++ b/StrokeCogUITests/MockUploadTests.swift @@ -0,0 +1,32 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import XCTest + + +class MockUploadTestsTests: XCTestCase { + override func setUpWithError() throws { + try super.setUpWithError() + + continueAfterFailure = false + + let app = XCUIApplication() + app.launchArguments = ["--skipOnboarding", "--disableFirebase"] + app.launch() + } + + + func testMockUpload() throws { + let app = XCUIApplication() + + XCTAssertTrue(app.tabBars["Tab Bar"].buttons["Mock Web Service"].waitForExistence(timeout: 2)) + app.tabBars["Tab Bar"].buttons["Mock Web Service"].tap() + + XCTAssertTrue(app.staticTexts["Mock Requests"].waitForExistence(timeout: 2)) + } +} diff --git a/StrokeCogUITests/OnboardingTests.swift b/StrokeCogUITests/OnboardingTests.swift new file mode 100644 index 0000000..47299ef --- /dev/null +++ b/StrokeCogUITests/OnboardingTests.swift @@ -0,0 +1,224 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import XCTest +import XCTestExtensions +import XCTHealthKit + + +class OnboardingTests: XCTestCase { + override func setUpWithError() throws { + try super.setUpWithError() + + continueAfterFailure = false + + let app = XCUIApplication() + app.launchArguments = ["--showOnboarding"] + app.deleteAndLaunch(withSpringboardAppName: "StrokeCog") + } + + + func testOnboardingFlow() throws { + let app = XCUIApplication() + let email = "leland@onboarding.stanford.edu" + + try app.navigateOnboardingFlow(email: email) + + app.assertOnboardingComplete() + try app.assertAccountInformation(email: email) + } + + func testOnboardingFlowRepeated() throws { + let app = XCUIApplication() + app.launchArguments = ["--showOnboarding", "--disableFirebase"] + app.terminate() + app.launch() + + try app.navigateOnboardingFlow() + app.assertOnboardingComplete() + + app.terminate() + + // Second onboarding round shouldn't display HealthKit and Notification authorizations anymore + app.activate() + + try app.navigateOnboardingFlow(repeated: true) + // Do not show HealthKit and Notification authorization view again + app.assertOnboardingComplete() + } +} + + +extension XCUIApplication { + func conductOnboardingIfNeeded(email: String = "leland@stanford.edu") throws { + let app = XCUIApplication() + + if app.staticTexts["Spezi\nStrokeCog"].waitForExistence(timeout: 5) { + try app.navigateOnboardingFlow(email: email) + } + } + + fileprivate func navigateOnboardingFlow( + email: String = "leland@stanford.edu", + repeated skippedIfRepeated: Bool = false + ) throws { + try navigateOnboardingFlowWelcome() + try navigateOnboardingFlowInterestingModules() + if staticTexts["Your Account"].waitForExistence(timeout: 5) { + try navigateOnboardingAccount(email: email) + } + if staticTexts["Consent"].waitForExistence(timeout: 5) { + try navigateOnboardingFlowConsent() + } + if !skippedIfRepeated { + try navigateOnboardingFlowHealthKitAccess() + try navigateOnboardingFlowNotification() + } + } + + private func navigateOnboardingFlowWelcome() throws { + XCTAssertTrue(staticTexts["Spezi\nStrokeCog"].waitForExistence(timeout: 5)) + + XCTAssertTrue(buttons["Learn More"].waitForExistence(timeout: 2)) + buttons["Learn More"].tap() + } + + private func navigateOnboardingFlowInterestingModules() throws { + XCTAssertTrue(staticTexts["Interesting Modules"].waitForExistence(timeout: 5)) + + for _ in 1..<4 { + XCTAssertTrue(buttons["Next"].waitForExistence(timeout: 2)) + buttons["Next"].tap() + } + + XCTAssertTrue(buttons["Next"].waitForExistence(timeout: 2)) + buttons["Next"].tap() + } + + private func navigateOnboardingAccount(email: String) throws { + if buttons["Logout"].waitForExistence(timeout: 2.0) { + buttons["Logout"].tap() + } + + XCTAssertTrue(buttons["Signup"].waitForExistence(timeout: 2)) + buttons["Signup"].tap() + + XCTAssertTrue(staticTexts["Create a new Account"].waitForExistence(timeout: 2)) + + try collectionViews.textFields["E-Mail Address"].enter(value: email) + try collectionViews.secureTextFields["Password"].enter(value: "StanfordRocks") + try textFields["enter first name"].enter(value: "Leland") + try textFields["enter last name"].enter(value: "Stanford") + + XCTAssertTrue(collectionViews.buttons["Signup"].waitForExistence(timeout: 2)) + collectionViews.buttons["Signup"].tap() + + sleep(3) + + if staticTexts["HealthKit Access"].waitForExistence(timeout: 5) && navigationBars.buttons["Back"].waitForExistence(timeout: 5) { + navigationBars.buttons["Back"].tap() + + XCTAssertTrue(staticTexts["Leland Stanford"].waitForExistence(timeout: 2)) + XCTAssertTrue(staticTexts[email].waitForExistence(timeout: 2)) + + XCTAssertTrue(buttons["Next"].waitForExistence(timeout: 2)) + buttons["Next"].tap() + } + } + + private func navigateOnboardingFlowConsent() throws { + XCTAssertTrue(staticTexts["Consent"].waitForExistence(timeout: 5)) + + XCTAssertTrue(staticTexts["First Name"].waitForExistence(timeout: 2)) + try textFields["Enter your first name ..."].enter(value: "Leland") + + XCTAssertTrue(staticTexts["Last Name"].waitForExistence(timeout: 2)) + try textFields["Enter your last name ..."].enter(value: "Stanford") + + XCTAssertTrue(scrollViews["Signature Field"].waitForExistence(timeout: 2)) + scrollViews["Signature Field"].swipeRight() + + XCTAssertTrue(buttons["I Consent"].waitForExistence(timeout: 2)) + buttons["I Consent"].tap() + } + + private func navigateOnboardingFlowHealthKitAccess() throws { + XCTAssertTrue(staticTexts["HealthKit Access"].waitForExistence(timeout: 5)) + + XCTAssertTrue(buttons["Grant Access"].waitForExistence(timeout: 2)) + buttons["Grant Access"].tap() + + try handleHealthKitAuthorization() + } + + private func navigateOnboardingFlowNotification() throws { + XCTAssertTrue(staticTexts["Notifications"].waitForExistence(timeout: 5)) + + XCTAssertTrue(buttons["Allow Notifications"].waitForExistence(timeout: 2)) + buttons["Allow Notifications"].tap() + + let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") + let alertAllowButton = springboard.buttons["Allow"] + if alertAllowButton.waitForExistence(timeout: 5) { + alertAllowButton.tap() + } + } + + fileprivate func assertOnboardingComplete() { + let tabBar = tabBars["Tab Bar"] + XCTAssertTrue(tabBar.buttons["Schedule"].waitForExistence(timeout: 2)) + XCTAssertTrue(tabBar.buttons["Contacts"].waitForExistence(timeout: 2)) + } + + fileprivate func assertAccountInformation(email: String) throws { + XCTAssertTrue(navigationBars.buttons["Your Account"].waitForExistence(timeout: 2)) + navigationBars.buttons["Your Account"].tap() + + XCTAssertTrue(staticTexts["Account Overview"].waitForExistence(timeout: 5.0)) + XCTAssertTrue(staticTexts["Leland Stanford"].exists) + XCTAssertTrue(staticTexts[email].exists) + XCTAssertTrue(staticTexts["Gender Identity, Choose not to answer"].exists) + + + XCTAssertTrue(navigationBars.buttons["Close"].waitForExistence(timeout: 0.5)) + navigationBars.buttons["Close"].tap() + + XCTAssertTrue(navigationBars.buttons["Your Account"].waitForExistence(timeout: 2)) + navigationBars.buttons["Your Account"].tap() + + XCTAssertTrue(navigationBars.buttons["Edit"].waitForExistence(timeout: 2)) + navigationBars.buttons["Edit"].tap() + + usleep(500_00) + XCTAssertFalse(navigationBars.buttons["Close"].exists) + + XCTAssertTrue(buttons["Delete Account"].waitForExistence(timeout: 2)) + buttons["Delete Account"].tap() + + let alert = "Are you sure you want to delete your account?" + XCTAssertTrue(alerts[alert].waitForExistence(timeout: 6.0)) + alerts[alert].buttons["Delete"].tap() + + XCTAssertTrue(alerts["Authentication Required"].waitForExistence(timeout: 2.0)) + XCTAssertTrue(alerts["Authentication Required"].secureTextFields["Password"].waitForExistence(timeout: 0.5)) + typeText("StanfordRocks") // the password field has focus already + XCTAssertTrue(alerts["Authentication Required"].buttons["Login"].waitForExistence(timeout: 0.5)) + alerts["Authentication Required"].buttons["Login"].tap() + + sleep(2) + + // Login + try textFields["E-Mail Address"].enter(value: email) + try secureTextFields["Password"].enter(value: "StanfordRocks") + + XCTAssertTrue(buttons["Login"].waitForExistence(timeout: 0.5)) + buttons["Login"].tap() + + XCTAssertTrue(alerts["Invalid Credentials"].waitForExistence(timeout: 2.0)) + } +} diff --git a/StrokeCogUITests/SchedulerTests.swift b/StrokeCogUITests/SchedulerTests.swift new file mode 100644 index 0000000..8ca64e3 --- /dev/null +++ b/StrokeCogUITests/SchedulerTests.swift @@ -0,0 +1,36 @@ +// +// This source file is part of the StrokeCog based on the Stanford Spezi Template Application project +// +// SPDX-FileCopyrightText: 2023 Stanford University +// +// SPDX-License-Identifier: MIT +// + +import XCTest +import XCTestExtensions + + +class SchedulerTests: XCTestCase { + override func setUpWithError() throws { + try super.setUpWithError() + + continueAfterFailure = false + + let app = XCUIApplication() + app.launchArguments = ["--skipOnboarding", "--testSchedule"] + app.deleteAndLaunch(withSpringboardAppName: "StrokeCog") + } + + + func testScheduler() throws { + let app = XCUIApplication() + + XCTAssertTrue(app.tabBars["Tab Bar"].buttons["Schedule"].waitForExistence(timeout: 2)) + app.tabBars["Tab Bar"].buttons["Schedule"].tap() + + XCTAssertTrue(app.staticTexts["Start Questionnaire"].waitForExistence(timeout: 2)) + app.staticTexts["Start Questionnaire"].tap() + + XCTAssertTrue(app.staticTexts["Social Support"].waitForExistence(timeout: 2)) + } +}