diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5a3d0de Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 330d167..a98640d 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,4 @@ fastlane/test_output # https://github.com/johnno1962/injectionforxcode iOSInjectionProject/ +Assignment\ Two/GoogleService-Info.plist diff --git a/Assignment Two.xcodeproj/project.pbxproj b/Assignment Two.xcodeproj/project.pbxproj index 90fa3e5..97bb72b 100644 --- a/Assignment Two.xcodeproj/project.pbxproj +++ b/Assignment Two.xcodeproj/project.pbxproj @@ -20,6 +20,10 @@ 8EF8F77D2597C7DE000850BF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EF8F77C2597C7DE000850BF /* ContentView.swift */; }; 8EF8F77F2597C7E1000850BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8EF8F77E2597C7E1000850BF /* Assets.xcassets */; }; 8EF8F7822597C7E1000850BF /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8EF8F7812597C7E1000850BF /* Preview Assets.xcassets */; }; + BCC44AF625C9358E00384FC6 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BCC44AF525C9358E00384FC6 /* GoogleService-Info.plist */; }; + BCC44AFA25C935A100384FC6 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BCC44AF925C935A100384FC6 /* GoogleService-Info.plist */; }; + BCC44AFE25C93E3900384FC6 /* CardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC44AFD25C93E3900384FC6 /* CardView.swift */; }; + BCC44B0125C9F5D700384FC6 /* CardStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC44B0025C9F5D700384FC6 /* CardStackView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -41,6 +45,10 @@ 8EF8F77E2597C7E1000850BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 8EF8F7812597C7E1000850BF /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 8EF8F7832597C7E1000850BF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BCC44AF525C9358E00384FC6 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + BCC44AF925C935A100384FC6 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + BCC44AFD25C93E3900384FC6 /* CardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardView.swift; sourceTree = ""; }; + BCC44B0025C9F5D700384FC6 /* CardStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardStackView.swift; sourceTree = ""; }; E7DE9A4430C3A45320910A5E /* Pods_Assignment_Two.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Assignment_Two.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -72,9 +80,11 @@ isa = PBXGroup; children = ( 8EF8F77C2597C7DE000850BF /* ContentView.swift */, + BCC44B0025C9F5D700384FC6 /* CardStackView.swift */, 8E8775DC25B8F8B800AB350A /* HeaderView.swift */, 8E35408825B8FE3A007B7029 /* SurveyView.swift */, 8E35408C25B8FFC9007B7029 /* RoundedTextView.swift */, + BCC44AFD25C93E3900384FC6 /* CardView.swift */, ); path = Views; sourceTree = ""; @@ -124,6 +134,8 @@ 8EF8F77A2597C7DE000850BF /* Assignment_TwoApp.swift */, 8E35409825B90F1B007B7029 /* RKTaskDelegate.swift */, 8E0A956825B677950025461E /* RKTaskSamples.swift */, + BCC44AF925C935A100384FC6 /* GoogleService-Info.plist */, + BCC44AF525C9358E00384FC6 /* GoogleService-Info.plist */, ); path = "Assignment Two"; sourceTree = ""; @@ -214,6 +226,8 @@ buildActionMask = 2147483647; files = ( 8EF8F7822597C7E1000850BF /* Preview Assets.xcassets in Resources */, + BCC44AFA25C935A100384FC6 /* GoogleService-Info.plist in Resources */, + BCC44AF625C9358E00384FC6 /* GoogleService-Info.plist in Resources */, 8EF8F77F2597C7E1000850BF /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -276,6 +290,8 @@ 8E35409625B90E80007B7029 /* ORKESerialization.m in Sources */, 8E0A956625B6767B0025461E /* CKTaskViewController.swift in Sources */, 8EF8F77B2597C7DE000850BF /* Assignment_TwoApp.swift in Sources */, + BCC44B0125C9F5D700384FC6 /* CardStackView.swift in Sources */, + BCC44AFE25C93E3900384FC6 /* CardView.swift in Sources */, 8E35409925B90F1B007B7029 /* RKTaskDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -416,7 +432,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "edu.stanford.cs342.Assignment-Two"; + PRODUCT_BUNDLE_IDENTIFIER = com.stanfordhcilab.hpdslongitudinal; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Assignment Two/Supporting Files/Assignment Two-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -442,7 +458,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "edu.stanford.cs342.Assignment-Two"; + PRODUCT_BUNDLE_IDENTIFIER = com.stanfordhcilab.hpdslongitudinal; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Assignment Two/Supporting Files/Assignment Two-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/Assignment Two/RKTaskSamples.swift b/Assignment Two/RKTaskSamples.swift index c1a92f1..1e13af2 100644 --- a/Assignment Two/RKTaskSamples.swift +++ b/Assignment Two/RKTaskSamples.swift @@ -5,7 +5,6 @@ // Copyright © 2019 Stanford University. // All rights reserved. // - import ResearchKit /** @@ -25,6 +24,64 @@ struct RKTaskSamples { Add steps to the array above to create a survey! */ - return ORKOrderedTask(identifier: "SurveyTask-Assessment", steps: steps) + // OUTCOME 1: Belonging. + + // Question 1.1 - Sliding Scale of Belonging + let belongingAnswer = ORKScaleAnswerFormat(maximumValue: 7, minimumValue: 1, defaultValue: 4, step: 1) + let belongingStep = ORKQuestionStep(identifier: "belongingQuestion", title: "Experience Sampling", question: "I feel like I belong in this space.", answer: belongingAnswer) + + steps += [belongingStep] + + // Question 1.2 - Sliding Scale of Connection to Coworkers + let coworkerConnectionAnswer = ORKScaleAnswerFormat(maximumValue: 7, minimumValue: 1, defaultValue: 4, step: 1) + let coworkerConnectionStep = ORKQuestionStep(identifier: "corowkerConnectionQuestion", title: "Experience Sampling", question: "I feel connected to my co-workers.", answer: coworkerConnectionAnswer) + + steps += [coworkerConnectionStep] + + // OUTCOME 2: Stress + + // Question 2.1 - Sliding Scale of Stress + let stressAnswer = ORKScaleAnswerFormat(maximumValue: 7, minimumValue: 1, defaultValue: 4, step: 1) + let stressStep = ORKQuestionStep(identifier: "stressQuestion", title: "Experience Sampling", question: "I currently feel stressed.", answer: stressAnswer) + + steps += [stressStep] + + // Question 2.2 - Sliding Scale of Overwhelmed + let overwhelmedAnswer = ORKScaleAnswerFormat(maximumValue: 7, minimumValue: 1, defaultValue: 4, step: 1) + let overwhelmedStep = ORKQuestionStep(identifier: "overwhelmedQuestion", title: "Experience Sampling", question: "I currently feel overwhelmed.", answer: overwhelmedAnswer) + + steps += [overwhelmedStep] + + // OUTCOME 3: Environmental Sttitudes + + // Question 3.1 - Sliding Scale of Caring about Environment + let environmentalAttitudesAnswer = ORKScaleAnswerFormat(maximumValue: 7, minimumValue: 1, defaultValue: 4, step: 1) + let environmentalAttitudesStep = ORKQuestionStep(identifier: "environmentalAttitudesQuestion", title: "Experience Sampling", question: "I care about the wellbeing of the environment I occupy.", answer: environmentalAttitudesAnswer) + + steps += [environmentalAttitudesStep] + + // Questoin 3.2 - Sliding Scale of Environmental Attunement + let environmentalAttunementAnswer = ORKScaleAnswerFormat(maximumValue: 7, minimumValue: 1, defaultValue: 4, step: 1) + let environmentalAttunementStep = ORKQuestionStep(identifier: "environmentalAttunementQuestion", title: "Experience Sampling", question: "I feel attuned to my environment.", answer: environmentalAttunementAnswer) + + steps += [environmentalAttunementStep] + + // OUTCOME 4: Creativity + + // Question 4.1 - Text Box for Creativity (will be evaluated by coders after the study) + let creativityAnswer = ORKTextAnswerFormat() + let creativityStep = ORKQuestionStep(identifier: "creativityQuestion", title: "Experience Sampling", question: "If you have seen a problem in a new way since your last experience sampling survey, explain in the box below.", answer: creativityAnswer) + + steps += [creativityStep] + + let task = ORKNavigableOrderedTask(identifier: "SurveyTask-Assessment", steps: steps) + +// let resultBooleanSelector = ORKResultSelector(resultIdentifier: booleanStep.identifier) +// let predicate = ORKResultPredicate.predicateForBooleanQuestionResult(with: resultBooleanSelector, expectedAnswer: false) +// let navigableRule = ORKPredicateStepNavigationRule(resultPredicatesAndDestinationStepIdentifiers: [(predicate, summaryStep.identifier)]) +// task.setNavigationRule(navigableRule, forTriggerStepIdentifier: booleanStep.identifier) + + return task }() + } diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/Contents.json b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/Contents.json new file mode 100644 index 0000000..b4c22a0 --- /dev/null +++ b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/Contents.json @@ -0,0 +1,198 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-40.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-58.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-80.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-152.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-167.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-40.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-60.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-58.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-87.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-80.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-120.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-120.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-180.png", + "scale" : "3x" + }, + { + "size" : "24x24", + "idiom" : "watch", + "filename" : "icon-48.png", + "subtype" : "38mm", + "role" : "notificationCenter", + "scale" : "2x" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "filename" : "icon-55.png", + "subtype" : "42mm", + "role" : "notificationCenter", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "icon-58.png", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "icon-87.png", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "filename" : "icon-80.png", + "subtype" : "38mm", + "role" : "appLauncher", + "scale" : "2x" + }, + { + "size" : "44x44", + "idiom" : "watch", + "filename" : "icon-88.png", + "subtype" : "40mm", + "role" : "appLauncher", + "scale" : "2x" + }, + { + "size" : "50x50", + "idiom" : "watch", + "filename" : "icon-100.png", + "subtype" : "44mm", + "role" : "appLauncher", + "scale" : "2x" + }, + { + "size" : "86x86", + "idiom" : "watch", + "filename" : "icon-172.png", + "subtype" : "38mm", + "role" : "quickLook", + "scale" : "2x" + }, + { + "size" : "98x98", + "idiom" : "watch", + "filename" : "icon-196.png", + "subtype" : "42mm", + "role" : "quickLook", + "scale" : "2x" + }, + { + "size" : "108x108", + "idiom" : "watch", + "filename" : "icon-216.png", + "subtype" : "44mm", + "role" : "quickLook", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "watch-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" + } + ], + "author" : "Iconizer", + "version" : "2020.11.0" +} \ No newline at end of file diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-100.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-100.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-100.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-100.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-1024.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-1024.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-1024.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-120.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-120.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-120.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-120.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-152.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-152.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-152.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-152.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-167.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-167.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-167.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-167.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-172.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-172.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-172.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-172.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-180.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-180.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-180.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-180.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-196.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-196.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-196.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-196.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-20.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-20.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-20.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-20.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-216.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-216.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-216.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-216.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-29.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-29.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-29.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-29.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-40.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-40.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-40.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-40.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-48.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-48.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-48.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-48.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-55.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-55.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-55.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-55.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-58.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-58.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-58.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-58.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-60.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-60.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-60.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-60.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-76.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-76.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-76.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-76.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-80.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-80.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-80.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-80.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-87.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-87.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-87.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-87.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-88.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-88.png similarity index 100% rename from Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/icon-88.png rename to Assignment Two/Supporting Files/Assets.xcassets/AppIcon-Orig.appiconset/icon-88.png diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json index b4c22a0..299371c 100644 --- a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,198 +1,116 @@ { "images" : [ { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "icon-20.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "icon-40.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "icon-29.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "icon-58.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "icon-40.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "icon-80.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "icon-76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "icon-152.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "icon-167.png", - "scale" : "2x" - }, - { - "size" : "20x20", + "filename" : "HPDSAppIcon-20@2x.png", "idiom" : "iphone", - "filename" : "icon-40.png", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { - "size" : "20x20", + "filename" : "HPDSAppIcon-20@3x.png", "idiom" : "iphone", - "filename" : "icon-60.png", - "scale" : "3x" + "scale" : "3x", + "size" : "20x20" }, { - "size" : "29x29", + "filename" : "HPDSAppIcon-29@2x.png", "idiom" : "iphone", - "filename" : "icon-58.png", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { - "size" : "29x29", + "filename" : "HPDSAppIcon-29@3x.png", "idiom" : "iphone", - "filename" : "icon-87.png", - "scale" : "3x" + "scale" : "3x", + "size" : "29x29" }, { - "size" : "40x40", + "filename" : "HPDSAppIcon-40@2x.png", "idiom" : "iphone", - "filename" : "icon-80.png", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { - "size" : "40x40", + "filename" : "HPDSAppIcon-40@3x.png", "idiom" : "iphone", - "filename" : "icon-120.png", - "scale" : "3x" + "scale" : "3x", + "size" : "40x40" }, { - "size" : "60x60", + "filename" : "HPDSAppIcon-60@2x.png", "idiom" : "iphone", - "filename" : "icon-120.png", - "scale" : "2x" + "scale" : "2x", + "size" : "60x60" }, { - "size" : "60x60", + "filename" : "HPDSAppIcon-60@3x.png", "idiom" : "iphone", - "filename" : "icon-180.png", - "scale" : "3x" - }, - { - "size" : "24x24", - "idiom" : "watch", - "filename" : "icon-48.png", - "subtype" : "38mm", - "role" : "notificationCenter", - "scale" : "2x" - }, - { - "size" : "27.5x27.5", - "idiom" : "watch", - "filename" : "icon-55.png", - "subtype" : "42mm", - "role" : "notificationCenter", - "scale" : "2x" + "scale" : "3x", + "size" : "60x60" }, { - "size" : "29x29", - "idiom" : "watch", - "filename" : "icon-58.png", - "role" : "companionSettings", - "scale" : "2x" + "filename" : "HPDSAppIcon-20.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" }, { - "size" : "29x29", - "idiom" : "watch", - "filename" : "icon-87.png", - "role" : "companionSettings", - "scale" : "3x" + "filename" : "HPDSAppIcon-20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" }, { - "size" : "40x40", - "idiom" : "watch", - "filename" : "icon-80.png", - "subtype" : "38mm", - "role" : "appLauncher", - "scale" : "2x" + "filename" : "HPDSAppIcon-29.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" }, { - "size" : "44x44", - "idiom" : "watch", - "filename" : "icon-88.png", - "subtype" : "40mm", - "role" : "appLauncher", - "scale" : "2x" + "filename" : "HPDSAppIcon-29@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" }, { - "size" : "50x50", - "idiom" : "watch", - "filename" : "icon-100.png", - "subtype" : "44mm", - "role" : "appLauncher", - "scale" : "2x" + "filename" : "HPDSAppIcon-40.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" }, { - "size" : "86x86", - "idiom" : "watch", - "filename" : "icon-172.png", - "subtype" : "38mm", - "role" : "quickLook", - "scale" : "2x" + "filename" : "HPDSAppIcon-40@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" }, { - "size" : "98x98", - "idiom" : "watch", - "filename" : "icon-196.png", - "subtype" : "42mm", - "role" : "quickLook", - "scale" : "2x" + "filename" : "HPDSAppIcon-76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" }, { - "size" : "108x108", - "idiom" : "watch", - "filename" : "icon-216.png", - "subtype" : "44mm", - "role" : "quickLook", - "scale" : "2x" + "filename" : "HPDSAppIcon-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" }, { - "size" : "1024x1024", - "idiom" : "watch-marketing", - "filename" : "icon-1024.png", - "scale" : "1x" + "filename" : "HPDSAppIcon-83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" }, { - "size" : "1024x1024", + "filename" : "HPDSAppIcon-1024.png", "idiom" : "ios-marketing", - "filename" : "icon-1024.png", - "scale" : "1x" + "scale" : "1x", + "size" : "1024x1024" } ], - "author" : "Iconizer", - "version" : "2020.11.0" -} \ No newline at end of file + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-1024.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-1024.png new file mode 100644 index 0000000..d5da090 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-1024.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20.png new file mode 100644 index 0000000..360d52a Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20@2x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20@2x.png new file mode 100644 index 0000000..0af57c4 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20@2x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20@3x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20@3x.png new file mode 100644 index 0000000..db33734 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-20@3x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29.png new file mode 100644 index 0000000..66a7295 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29@2x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29@2x.png new file mode 100644 index 0000000..5d6ae2c Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29@2x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29@3x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29@3x.png new file mode 100644 index 0000000..5c037a9 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-29@3x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40.png new file mode 100644 index 0000000..0af57c4 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40@2x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40@2x.png new file mode 100644 index 0000000..3c645a2 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40@2x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40@3x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40@3x.png new file mode 100644 index 0000000..c3f10d8 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-40@3x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-60@2x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-60@2x.png new file mode 100644 index 0000000..c3f10d8 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-60@2x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-60@3x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-60@3x.png new file mode 100644 index 0000000..092e8d3 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-60@3x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-76.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-76.png new file mode 100644 index 0000000..c97a065 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-76.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-76@2x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-76@2x.png new file mode 100644 index 0000000..8081a90 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-76@2x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-83.5@2x.png b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-83.5@2x.png new file mode 100644 index 0000000..9307bf3 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/AppIcon.appiconset/HPDSAppIcon-83.5@2x.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/HPDS-cover-image.imageset/Contents.json b/Assignment Two/Supporting Files/Assets.xcassets/HPDS-cover-image.imageset/Contents.json new file mode 100644 index 0000000..15d76d1 --- /dev/null +++ b/Assignment Two/Supporting Files/Assets.xcassets/HPDS-cover-image.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "HPDS-cover-image.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assignment Two/Supporting Files/Assets.xcassets/HPDS-cover-image.imageset/HPDS-cover-image.jpg b/Assignment Two/Supporting Files/Assets.xcassets/HPDS-cover-image.imageset/HPDS-cover-image.jpg new file mode 100644 index 0000000..c6d0f11 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/HPDS-cover-image.imageset/HPDS-cover-image.jpg differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/card_1.imageset/577820-200.png b/Assignment Two/Supporting Files/Assets.xcassets/card_1.imageset/577820-200.png new file mode 100644 index 0000000..fe496ec Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/card_1.imageset/577820-200.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/doctor.imageset/Contents.json b/Assignment Two/Supporting Files/Assets.xcassets/card_1.imageset/Contents.json similarity index 87% rename from Assignment Two/Supporting Files/Assets.xcassets/doctor.imageset/Contents.json rename to Assignment Two/Supporting Files/Assets.xcassets/card_1.imageset/Contents.json index d9a61f2..7bca861 100644 --- a/Assignment Two/Supporting Files/Assets.xcassets/doctor.imageset/Contents.json +++ b/Assignment Two/Supporting Files/Assets.xcassets/card_1.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "doctor.png", + "filename" : "577820-200.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/Assignment Two/Supporting Files/Assets.xcassets/card_2.imageset/2528368-200.png b/Assignment Two/Supporting Files/Assets.xcassets/card_2.imageset/2528368-200.png new file mode 100644 index 0000000..d91319c Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/card_2.imageset/2528368-200.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/card_2.imageset/Contents.json b/Assignment Two/Supporting Files/Assets.xcassets/card_2.imageset/Contents.json new file mode 100644 index 0000000..f8ae5ec --- /dev/null +++ b/Assignment Two/Supporting Files/Assets.xcassets/card_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "2528368-200.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assignment Two/Supporting Files/Assets.xcassets/card_3.imageset/1252467-200.png b/Assignment Two/Supporting Files/Assets.xcassets/card_3.imageset/1252467-200.png new file mode 100644 index 0000000..a097f8a Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/card_3.imageset/1252467-200.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/card_3.imageset/Contents.json b/Assignment Two/Supporting Files/Assets.xcassets/card_3.imageset/Contents.json new file mode 100644 index 0000000..fe869a4 --- /dev/null +++ b/Assignment Two/Supporting Files/Assets.xcassets/card_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "1252467-200.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assignment Two/Supporting Files/Assets.xcassets/card_4.imageset/2258552-200.png b/Assignment Two/Supporting Files/Assets.xcassets/card_4.imageset/2258552-200.png new file mode 100644 index 0000000..92c63f5 Binary files /dev/null and b/Assignment Two/Supporting Files/Assets.xcassets/card_4.imageset/2258552-200.png differ diff --git a/Assignment Two/Supporting Files/Assets.xcassets/card_4.imageset/Contents.json b/Assignment Two/Supporting Files/Assets.xcassets/card_4.imageset/Contents.json new file mode 100644 index 0000000..08474cc --- /dev/null +++ b/Assignment Two/Supporting Files/Assets.xcassets/card_4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "2258552-200.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assignment Two/Supporting Files/Assets.xcassets/doctor.imageset/doctor.png b/Assignment Two/Supporting Files/Assets.xcassets/doctor.imageset/doctor.png deleted file mode 100644 index fb7009b..0000000 Binary files a/Assignment Two/Supporting Files/Assets.xcassets/doctor.imageset/doctor.png and /dev/null differ diff --git a/Assignment Two/Supporting Files/Firebase/CKStudyUser.swift b/Assignment Two/Supporting Files/Firebase/CKStudyUser.swift index 1756896..94fcc9a 100644 --- a/Assignment Two/Supporting Files/Firebase/CKStudyUser.swift +++ b/Assignment Two/Supporting Files/Firebase/CKStudyUser.swift @@ -8,6 +8,8 @@ import Foundation import Firebase +import FirebaseFirestore +import FirebaseAuth class CKStudyUser { diff --git a/Assignment Two/Supporting Files/Firebase/CKTaskViewController.swift b/Assignment Two/Supporting Files/Firebase/CKTaskViewController.swift index 7eb3228..9477bea 100644 --- a/Assignment Two/Supporting Files/Firebase/CKTaskViewController.swift +++ b/Assignment Two/Supporting Files/Firebase/CKTaskViewController.swift @@ -10,6 +10,8 @@ import UIKit import SwiftUI import ResearchKit import Firebase +import FirebaseFirestore +import FirebaseStorage struct CKTaskViewController: UIViewControllerRepresentable, Identifiable { diff --git a/Assignment Two/Supporting Files/Info.plist b/Assignment Two/Supporting Files/Info.plist index efc211a..9a215aa 100644 --- a/Assignment Two/Supporting Files/Info.plist +++ b/Assignment Two/Supporting Files/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + HPDS CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/Assignment Two/Views/CardStackView.swift b/Assignment Two/Views/CardStackView.swift new file mode 100644 index 0000000..252a4e9 --- /dev/null +++ b/Assignment Two/Views/CardStackView.swift @@ -0,0 +1,84 @@ +// +// CardStackView.swift +// Assignment Two +// +// Created by Michael Cooper on 2021-02-02. +// + +import SwiftUI + +struct CardContent: Hashable, CustomStringConvertible { + var id: Int + let title: String + let imageName: String + + var description: String { + return "\(title), id: \(id)" + } +} + +struct CardStackView: View { + + // List the cards to display + @State var cards: [CardContent] = [ + CardContent(id: 0, title: "Welcome to Your Day.", imageName: "card_1"), + CardContent(id: 1, title: "Observe Your Environment.", imageName: "card_2"), + CardContent(id: 2, title: "Complete Occasional Surveys.", imageName: "card_3"), + CardContent(id: 3, title: "And Have a Wonderful Day!", imageName: "card_4"), + ] + + /// Return the CardViews width for the given offset in the array + /// - Parameters: + /// - geometry: The geometry proxy of the parent + /// - id: The ID of the current user + private func getCardWidth(_ geometry: GeometryProxy, id: Int) -> CGFloat { + let offset: CGFloat = CGFloat(cards.count - 1 - id) * 10 + return geometry.size.width - offset + } + /// Return the CardViews frame offset for the given offset in the array + /// - Parameters: + /// - geometry: The geometry proxy of the parent + /// - id: The ID of the current user + private func getCardOffset(_ geometry: GeometryProxy, id: Int) -> CGFloat { + return CGFloat(cards.count - 1 - id) * 5 + } + + var body: some View { + let cards_restack:[CardContent] = Array(cards) + + VStack { + + GeometryReader { geometry in + HStack { + ZStack { + + VStack { + Spacer() + Text("You're all caught up! 🚀").frame(maxWidth: .infinity, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/).padding() + Button(action: { + // TODO restacking the cards doesn't work + self.cards = cards_restack + + }) { + Image(systemName: "arrow.clockwise.icloud") + } + Spacer() + } + + ForEach(self.cards.reversed(), id: \.self) { curr_card in + CardView(card: curr_card, onRemove: { removedCard in + self.cards.removeAll { $0.id == removedCard.id } + }) + .offset(x: 0, y: self.getCardOffset(geometry, id: curr_card.id)) + } + + + } + + + + } + } + } + } +} diff --git a/Assignment Two/Views/CardView.swift b/Assignment Two/Views/CardView.swift new file mode 100644 index 0000000..577ed6a --- /dev/null +++ b/Assignment Two/Views/CardView.swift @@ -0,0 +1,86 @@ +// +// CardView.swift +// Assignment Two +// +// Created by Michael Cooper on 2021-02-02. +// Credit to Brandon Baars for the tutorial on this card UX. + +import SwiftUI + +extension UIScreen{ + static let screenWidth = UIScreen.main.bounds.size.width + static let screenHeight = UIScreen.main.bounds.size.height + static let screenSize = UIScreen.main.bounds.size +} + +struct CardView: View { + + @State private var translation: CGSize = .zero + private var card: CardContent + private var onRemove: (_ card: CardContent) -> Void + + private var thresholdPercentage: CGFloat = 0.5 // when the user has draged 50% the width of the screen in either direction + + init(card: CardContent, onRemove: @escaping (_ user: CardContent) -> Void) { + self.card = card + self.onRemove = onRemove + } + + private func getGesturePercentage(_ geometry: GeometryProxy, from gesture: DragGesture.Value) -> CGFloat { + gesture.translation.width / geometry.size.width + } + + var body: some View { + GeometryReader() { geometry in + // The ZStack is a hack to get it to center the cards + ZStack { + + VStack { + Image(self.card.imageName) + .resizable() + .frame(width: UIScreen.screenWidth*0.32, height: UIScreen.screenWidth*0.28) + .padding() + + HStack { + VStack { + Text("\(self.card.title)") + .font(.system(size: 25)) + .bold() + .multilineTextAlignment(.center) + + } + }.frame(width: UIScreen.screenWidth*0.8, height: UIScreen.screenHeight*0.07) + } + // Add padding, corner radius and shadow with blur radius + .background(Color.white) + .cornerRadius(10) + .shadow(radius: 5) + .animation(.interactiveSpring()) + .rotationEffect(.degrees(Double(self.translation.width / geometry.size.width) * 25), anchor: .bottom) + .offset(x: self.translation.width, y: 0) + .gesture( + DragGesture() + .onChanged { value in + self.translation = value.translation + }.onEnded { value in + // determine snap distance > 0.5 aka half the width of the screen + if abs(self.getGesturePercentage(geometry, from: value)) > self.thresholdPercentage { + self.onRemove(self.card) + } else { + self.translation = .zero + } + } + ) + }.frame(width: geometry.size.width, height: geometry.size.height) + } + } +} + +struct CardView_Previews: PreviewProvider { + static var previews: some View { + CardView(card: CardContent(id: 1, title: "Welcome to Your Day", imageName: "card_1"), + onRemove: { _ in + // do nothing + }).frame(height: 400).padding() + } +} diff --git a/Assignment Two/Views/ContentView.swift b/Assignment Two/Views/ContentView.swift index 5906eab..3620713 100644 --- a/Assignment Two/Views/ContentView.swift +++ b/Assignment Two/Views/ContentView.swift @@ -9,11 +9,14 @@ import SwiftUI + + struct ContentView: View { - var body: some View { VStack { HeaderView() + + CardStackView() SurveyView(backgroundColor: Color.gray.opacity(0.2)) diff --git a/Assignment Two/Views/HeaderView.swift b/Assignment Two/Views/HeaderView.swift index 7edd89f..b8940ef 100644 --- a/Assignment Two/Views/HeaderView.swift +++ b/Assignment Two/Views/HeaderView.swift @@ -20,14 +20,14 @@ struct HeaderView: View { var body: some View { VStack { HStack { + Spacer() Image("logo") .resizable() .scaledToFit() .frame(width: 100, alignment: .leading) - Spacer() }.padding(.horizontal, 20.0) HStack { - Text("Survey Tool") + Text("Experience Sampling") .font(.system(.largeTitle)) .bold() .multilineTextAlignment(.leading) @@ -36,13 +36,11 @@ struct HeaderView: View { } HStack { VStack(alignment: .leading, spacing: 10) { - Text("This tool lets us create awesome ResearchKit surveys!") - .minimumScaleFactor(0.5) - Text("Let's all look out for each other by wearing a mask, avoiding crowds, and by knowing our status.") + Text("Please take a moment to fill out this quick survey!") .minimumScaleFactor(0.5) } Spacer() - Image("doctor").resizable().scaledToFit().frame(width: 150) + Image("HPDS-cover-image").resizable().scaledToFit().frame(width: 150) }.padding(.horizontal, 20.0) }.background(color) diff --git a/Assignment Two/Views/SurveyView.swift b/Assignment Two/Views/SurveyView.swift index bdbc6b2..68853c4 100644 --- a/Assignment Two/Views/SurveyView.swift +++ b/Assignment Two/Views/SurveyView.swift @@ -36,7 +36,7 @@ struct SurveyView: View { The task must conform to the ORKOrderedTask class. */ - // surveyOptional = /* my ORKOrderedTask */ + surveyOptional = RKTaskSamples.sampleSurveyTask }) { RoundedTextView("Start Survey", backgroundColor: .red) }