COVIDSafe code from version 1.6 (#6)

This commit is contained in:
COVIDSafe Support 2020-06-19 17:43:33 +10:00 committed by GitHub
parent 149daee2e9
commit 2063cea613
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
38 changed files with 1963 additions and 1664 deletions

View file

@ -20,8 +20,6 @@
0BA617CE242E09B200E6C631 /* FeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BA617CD242E09B200E6C631 /* FeedbackViewController.swift */; }; 0BA617CE242E09B200E6C631 /* FeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BA617CD242E09B200E6C631 /* FeedbackViewController.swift */; };
0BC141AC24305D9C00399FA8 /* NSMutableString + Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC141AB24305D9C00399FA8 /* NSMutableString + Extensions.swift */; }; 0BC141AC24305D9C00399FA8 /* NSMutableString + Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC141AB24305D9C00399FA8 /* NSMutableString + Extensions.swift */; };
0BC141AE2430685800399FA8 /* UIColor + Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC141AD2430685800399FA8 /* UIColor + Extensions.swift */; }; 0BC141AE2430685800399FA8 /* UIColor + Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC141AD2430685800399FA8 /* UIColor + Extensions.swift */; };
0BDE12302431DCE6003BC44C /* Questions.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B86118D24303E7D00EA4B6B /* Questions.storyboard */; };
1B86118E24303E7D00EA4B6B /* Questions.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B86118D24303E7D00EA4B6B /* Questions.storyboard */; };
1B86119124303EF200EA4B6B /* Question1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B86119024303EF200EA4B6B /* Question1ViewController.swift */; }; 1B86119124303EF200EA4B6B /* Question1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B86119024303EF200EA4B6B /* Question1ViewController.swift */; };
1B86119324303F4A00EA4B6B /* Question2ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B86119224303F4A00EA4B6B /* Question2ViewController.swift */; }; 1B86119324303F4A00EA4B6B /* Question2ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B86119224303F4A00EA4B6B /* Question2ViewController.swift */; };
1B86119524303F5E00EA4B6B /* Question3ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B86119424303F5E00EA4B6B /* Question3ViewController.swift */; }; 1B86119524303F5E00EA4B6B /* Question3ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B86119424303F5E00EA4B6B /* Question3ViewController.swift */; };
@ -98,17 +96,27 @@
59F25D69245B917A002A7ED8 /* Spinner_home.json in Resources */ = {isa = PBXBuildFile; fileRef = 59F25D68245B917A002A7ED8 /* Spinner_home.json */; }; 59F25D69245B917A002A7ED8 /* Spinner_home.json in Resources */ = {isa = PBXBuildFile; fileRef = 59F25D68245B917A002A7ED8 /* Spinner_home.json */; };
59F25D6A245B917A002A7ED8 /* Spinner_home.json in Resources */ = {isa = PBXBuildFile; fileRef = 59F25D68245B917A002A7ED8 /* Spinner_home.json */; }; 59F25D6A245B917A002A7ED8 /* Spinner_home.json in Resources */ = {isa = PBXBuildFile; fileRef = 59F25D68245B917A002A7ED8 /* Spinner_home.json */; };
59F25D6F245BED80002A7ED8 /* Debug.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 59F25D6E245BED80002A7ED8 /* Debug.storyboard */; }; 59F25D6F245BED80002A7ED8 /* Debug.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 59F25D6E245BED80002A7ED8 /* Debug.storyboard */; };
5B110C10248F275B00B68291 /* SelectCountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B110C0F248F275A00B68291 /* SelectCountryViewController.swift */; };
5B110C11248F275B00B68291 /* SelectCountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B110C0F248F275A00B68291 /* SelectCountryViewController.swift */; };
5B337AAB245A9BBC00537620 /* UploadDataErrorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B337AAA245A9BBC00537620 /* UploadDataErrorViewController.swift */; }; 5B337AAB245A9BBC00537620 /* UploadDataErrorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B337AAA245A9BBC00537620 /* UploadDataErrorViewController.swift */; };
5B337AAC245A9EEC00537620 /* UploadDataPrefaceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B577814245A584C0088F111 /* UploadDataPrefaceViewController.swift */; }; 5B337AAC245A9EEC00537620 /* UploadDataPrefaceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B577814245A584C0088F111 /* UploadDataPrefaceViewController.swift */; };
5B337AAD245A9EF800537620 /* UploadDataErrorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B337AAA245A9BBC00537620 /* UploadDataErrorViewController.swift */; }; 5B337AAD245A9EF800537620 /* UploadDataErrorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B337AAA245A9BBC00537620 /* UploadDataErrorViewController.swift */; };
5B337AAF245AA26300537620 /* Spinner_upload.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B337AAE245AA26300537620 /* Spinner_upload.json */; }; 5B337AAF245AA26300537620 /* Spinner_upload.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B337AAE245AA26300537620 /* Spinner_upload.json */; };
5B337AB0245AA26300537620 /* Spinner_upload.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B337AAE245AA26300537620 /* Spinner_upload.json */; }; 5B337AB0245AA26300537620 /* Spinner_upload.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B337AAE245AA26300537620 /* Spinner_upload.json */; };
5B51ED502485D658008CE722 /* UILocalization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B51ED4F2485D658008CE722 /* UILocalization.swift */; };
5B51ED512485DF9C008CE722 /* UILocalization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B51ED4F2485D658008CE722 /* UILocalization.swift */; };
5B51ED55248627A8008CE722 /* UploadData.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5B51ED58248627A8008CE722 /* UploadData.storyboard */; };
5B51ED56248627A8008CE722 /* UploadData.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5B51ED58248627A8008CE722 /* UploadData.storyboard */; };
5B51ED61248715DE008CE722 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B51ED64248715DE008CE722 /* InfoPlist.strings */; };
5B51ED62248715DE008CE722 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B51ED64248715DE008CE722 /* InfoPlist.strings */; };
5B577815245A584C0088F111 /* UploadDataPrefaceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B577814245A584C0088F111 /* UploadDataPrefaceViewController.swift */; }; 5B577815245A584C0088F111 /* UploadDataPrefaceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B577814245A584C0088F111 /* UploadDataPrefaceViewController.swift */; };
5B7ABF25244D3BC600BB249B /* IsolationSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7ABF24244D3BC600BB249B /* IsolationSuccessViewController.swift */; }; 5B7ABF25244D3BC600BB249B /* IsolationSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7ABF24244D3BC600BB249B /* IsolationSuccessViewController.swift */; };
5B7ABF26244D3BC600BB249B /* IsolationSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7ABF24244D3BC600BB249B /* IsolationSuccessViewController.swift */; }; 5B7ABF26244D3BC600BB249B /* IsolationSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7ABF24244D3BC600BB249B /* IsolationSuccessViewController.swift */; };
5B7ABF28244D6BE100BB249B /* UnderSixteenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7ABF27244D6BE100BB249B /* UnderSixteenViewController.swift */; }; 5B7ABF28244D6BE100BB249B /* UnderSixteenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7ABF27244D6BE100BB249B /* UnderSixteenViewController.swift */; };
5B82435E2480DC2100705CB1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B8243612480DC2100705CB1 /* Localizable.strings */; }; 5B82435E2480DC2100705CB1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B8243612480DC2100705CB1 /* Localizable.strings */; };
5B82435F2480DC2100705CB1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B8243612480DC2100705CB1 /* Localizable.strings */; }; 5B82435F2480DC2100705CB1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B8243612480DC2100705CB1 /* Localizable.strings */; };
5B900FC12485C4EE00CAA419 /* String+Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B900FC02485C4EE00CAA419 /* String+Localization.swift */; };
5B900FC22485C4EE00CAA419 /* String+Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B900FC02485C4EE00CAA419 /* String+Localization.swift */; };
5B92D663243011B40049877B /* CovidSafe-config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B92D662243011B30049877B /* CovidSafe-config.plist */; }; 5B92D663243011B40049877B /* CovidSafe-config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B92D662243011B30049877B /* CovidSafe-config.plist */; };
5B92D66B243018040049877B /* UIProgressView + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B615C5A623F8EB1700345969 /* UIProgressView + Extension.swift */; }; 5B92D66B243018040049877B /* UIProgressView + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B615C5A623F8EB1700345969 /* UIProgressView + Extension.swift */; };
5B92D66D243018040049877B /* tracer.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 5DD41D7723DE141700FD4AB0 /* tracer.xcdatamodeld */; }; 5B92D66D243018040049877B /* tracer.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 5DD41D7723DE141700FD4AB0 /* tracer.xcdatamodeld */; };
@ -179,14 +187,11 @@
5B92D6B5243018040049877B /* Encounter+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D8DD06023E319B300E097EF /* Encounter+CoreDataProperties.swift */; }; 5B92D6B5243018040049877B /* Encounter+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D8DD06023E319B300E097EF /* Encounter+CoreDataProperties.swift */; };
5B92D6B6243018040049877B /* Issue.swift in Sources */ = {isa = PBXBuildFile; fileRef = A767D2FF242DF1B000DC9E2A /* Issue.swift */; }; 5B92D6B6243018040049877B /* Issue.swift in Sources */ = {isa = PBXBuildFile; fileRef = A767D2FF242DF1B000DC9E2A /* Issue.swift */; };
5B92D6BA243018040049877B /* help_center_article_style.css in Resources */ = {isa = PBXBuildFile; fileRef = D8EB201C23FBE216001C60EC /* help_center_article_style.css */; }; 5B92D6BA243018040049877B /* help_center_article_style.css in Resources */ = {isa = PBXBuildFile; fileRef = D8EB201C23FBE216001C60EC /* help_center_article_style.css */; };
5B92D6BB243018040049877B /* UploadData.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B6932CE624260E2B003D1810 /* UploadData.storyboard */; };
5B92D6BD243018040049877B /* JMCTarget.json in Resources */ = {isa = PBXBuildFile; fileRef = A767D2DA242DF1B000DC9E2A /* JMCTarget.json */; }; 5B92D6BD243018040049877B /* JMCTarget.json in Resources */ = {isa = PBXBuildFile; fileRef = A767D2DA242DF1B000DC9E2A /* JMCTarget.json */; };
5B92D6BF243018040049877B /* NewFeedbackFlow.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */; }; 5B92D6BF243018040049877B /* NewFeedbackFlow.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */; };
5B92D6C7243018040049877B /* CovidSafe-config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B92D666243012330049877B /* CovidSafe-config.plist */; }; 5B92D6C7243018040049877B /* CovidSafe-config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B92D666243012330049877B /* CovidSafe-config.plist */; };
5B92D6C8243018040049877B /* NewFeedbackFlow.strings in Resources */ = {isa = PBXBuildFile; fileRef = A767D2B2242DF1B000DC9E2A /* NewFeedbackFlow.strings */; };
5B92D6C9243018040049877B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5DD41D4523DCB03D00FD4AB0 /* LaunchScreen.storyboard */; }; 5B92D6C9243018040049877B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5DD41D4523DCB03D00FD4AB0 /* LaunchScreen.storyboard */; };
5B92D6CB243018040049877B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5DD41D4323DCB03D00FD4AB0 /* Assets.xcassets */; }; 5B92D6CB243018040049877B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5DD41D4323DCB03D00FD4AB0 /* Assets.xcassets */; };
5B92D6CC243018040049877B /* Feedback.strings in Resources */ = {isa = PBXBuildFile; fileRef = A767D2B0242DF1B000DC9E2A /* Feedback.strings */; };
5B92D6CF243018040049877B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5DD41D4023DCB03B00FD4AB0 /* Main.storyboard */; }; 5B92D6CF243018040049877B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5DD41D4023DCB03B00FD4AB0 /* Main.storyboard */; };
5B92D74F243022EF0049877B /* DataUploadS3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59ACB575242F404500E63E3C /* DataUploadS3.swift */; }; 5B92D74F243022EF0049877B /* DataUploadS3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59ACB575242F404500E63E3C /* DataUploadS3.swift */; };
5B92D750243022F20049877B /* InitiateUploadAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59ACB573242F195A00E63E3C /* InitiateUploadAPI.swift */; }; 5B92D750243022F20049877B /* InitiateUploadAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59ACB573242F195A00E63E3C /* InitiateUploadAPI.swift */; };
@ -215,8 +220,6 @@
7FACD53A23F25A9A0042A33A /* InitialScreenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FACD53923F25A9A0042A33A /* InitialScreenViewController.swift */; }; 7FACD53A23F25A9A0042A33A /* InitialScreenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FACD53923F25A9A0042A33A /* InitialScreenViewController.swift */; };
7FEC361523F16A1E00127AFB /* UIViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEC361423F16A1E00127AFB /* UIViewExtension.swift */; }; 7FEC361523F16A1E00127AFB /* UIViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEC361423F16A1E00127AFB /* UIViewExtension.swift */; };
7FF75C222429FEE800C11FEA /* CountriesData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF75C212429FEE800C11FEA /* CountriesData.swift */; }; 7FF75C222429FEE800C11FEA /* CountriesData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF75C212429FEE800C11FEA /* CountriesData.swift */; };
A767D30E242DF1B000DC9E2A /* Feedback.strings in Resources */ = {isa = PBXBuildFile; fileRef = A767D2B0242DF1B000DC9E2A /* Feedback.strings */; };
A767D30F242DF1B000DC9E2A /* NewFeedbackFlow.strings in Resources */ = {isa = PBXBuildFile; fileRef = A767D2B2242DF1B000DC9E2A /* NewFeedbackFlow.strings */; };
A767D312242DF1B000DC9E2A /* NewFeedbackFlow.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */; }; A767D312242DF1B000DC9E2A /* NewFeedbackFlow.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */; };
A767D313242DF1B000DC9E2A /* JMCTarget.json in Resources */ = {isa = PBXBuildFile; fileRef = A767D2DA242DF1B000DC9E2A /* JMCTarget.json */; }; A767D313242DF1B000DC9E2A /* JMCTarget.json in Resources */ = {isa = PBXBuildFile; fileRef = A767D2DA242DF1B000DC9E2A /* JMCTarget.json */; };
A767D316242DF1B000DC9E2A /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = A767D2EB242DF1B000DC9E2A /* Logging.swift */; }; A767D316242DF1B000DC9E2A /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = A767D2EB242DF1B000DC9E2A /* Logging.swift */; };
@ -247,7 +250,6 @@
B60F8BE4242659810007A641 /* UILabelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60F8BE3242659810007A641 /* UILabelExtension.swift */; }; B60F8BE4242659810007A641 /* UILabelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60F8BE3242659810007A641 /* UILabelExtension.swift */; };
B615C5A723F8EB1700345969 /* UIProgressView + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B615C5A623F8EB1700345969 /* UIProgressView + Extension.swift */; }; B615C5A723F8EB1700345969 /* UIProgressView + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B615C5A623F8EB1700345969 /* UIProgressView + Extension.swift */; };
B615C5A923FA403500345969 /* UIViewController + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B615C5A823FA403400345969 /* UIViewController + Extension.swift */; }; B615C5A923FA403500345969 /* UIViewController + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B615C5A823FA403400345969 /* UIViewController + Extension.swift */; };
B6932CE724260E2B003D1810 /* UploadData.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B6932CE624260E2B003D1810 /* UploadData.storyboard */; };
C5046D5C23EF18600046E96D /* OnboardingStep1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5046D5B23EF18600046E96D /* OnboardingStep1ViewController.swift */; }; C5046D5C23EF18600046E96D /* OnboardingStep1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5046D5B23EF18600046E96D /* OnboardingStep1ViewController.swift */; };
C56CF43F23F18A15006B05B0 /* OnboardingStep4ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56CF43E23F18A15006B05B0 /* OnboardingStep4ViewController.swift */; }; C56CF43F23F18A15006B05B0 /* OnboardingStep4ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56CF43E23F18A15006B05B0 /* OnboardingStep4ViewController.swift */; };
C585C83B23EEB99B0061B7C6 /* GradientButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C585C83A23EEB99B0061B7C6 /* GradientButton.swift */; }; C585C83B23EEB99B0061B7C6 /* GradientButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C585C83A23EEB99B0061B7C6 /* GradientButton.swift */; };
@ -276,7 +278,6 @@
0BC141AD2430685800399FA8 /* UIColor + Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor + Extensions.swift"; sourceTree = "<group>"; }; 0BC141AD2430685800399FA8 /* UIColor + Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor + Extensions.swift"; sourceTree = "<group>"; };
122AF4E79D17C983066C1CEB /* Pods-CovidSafe-staging.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CovidSafe-staging.release.xcconfig"; path = "Target Support Files/Pods-CovidSafe-staging/Pods-CovidSafe-staging.release.xcconfig"; sourceTree = "<group>"; }; 122AF4E79D17C983066C1CEB /* Pods-CovidSafe-staging.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CovidSafe-staging.release.xcconfig"; path = "Target Support Files/Pods-CovidSafe-staging/Pods-CovidSafe-staging.release.xcconfig"; sourceTree = "<group>"; };
1925EA5F4413AD52AC198894 /* Pods-CovidSafe.covid-production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CovidSafe.covid-production.xcconfig"; path = "Target Support Files/Pods-CovidSafe/Pods-CovidSafe.covid-production.xcconfig"; sourceTree = "<group>"; }; 1925EA5F4413AD52AC198894 /* Pods-CovidSafe.covid-production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CovidSafe.covid-production.xcconfig"; path = "Target Support Files/Pods-CovidSafe/Pods-CovidSafe.covid-production.xcconfig"; sourceTree = "<group>"; };
1B86118D24303E7D00EA4B6B /* Questions.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Questions.storyboard; sourceTree = "<group>"; };
1B86119024303EF200EA4B6B /* Question1ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Question1ViewController.swift; sourceTree = "<group>"; }; 1B86119024303EF200EA4B6B /* Question1ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Question1ViewController.swift; sourceTree = "<group>"; };
1B86119224303F4A00EA4B6B /* Question2ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Question2ViewController.swift; sourceTree = "<group>"; }; 1B86119224303F4A00EA4B6B /* Question2ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Question2ViewController.swift; sourceTree = "<group>"; };
1B86119424303F5E00EA4B6B /* Question3ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Question3ViewController.swift; sourceTree = "<group>"; }; 1B86119424303F5E00EA4B6B /* Question3ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Question3ViewController.swift; sourceTree = "<group>"; };
@ -327,12 +328,20 @@
59B7416F24514126006E1EEA /* RegistrationConsentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationConsentViewController.swift; sourceTree = "<group>"; }; 59B7416F24514126006E1EEA /* RegistrationConsentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationConsentViewController.swift; sourceTree = "<group>"; };
59F25D68245B917A002A7ED8 /* Spinner_home.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Spinner_home.json; sourceTree = "<group>"; }; 59F25D68245B917A002A7ED8 /* Spinner_home.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Spinner_home.json; sourceTree = "<group>"; };
59F25D6E245BED80002A7ED8 /* Debug.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Debug.storyboard; sourceTree = "<group>"; }; 59F25D6E245BED80002A7ED8 /* Debug.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Debug.storyboard; sourceTree = "<group>"; };
5B110C0F248F275A00B68291 /* SelectCountryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectCountryViewController.swift; sourceTree = "<group>"; };
5B337AAA245A9BBC00537620 /* UploadDataErrorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadDataErrorViewController.swift; sourceTree = "<group>"; }; 5B337AAA245A9BBC00537620 /* UploadDataErrorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadDataErrorViewController.swift; sourceTree = "<group>"; };
5B337AAE245AA26300537620 /* Spinner_upload.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Spinner_upload.json; sourceTree = "<group>"; }; 5B337AAE245AA26300537620 /* Spinner_upload.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Spinner_upload.json; sourceTree = "<group>"; };
5B51ED4F2485D658008CE722 /* UILocalization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILocalization.swift; sourceTree = "<group>"; };
5B51ED63248715DE008CE722 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
5B51ED6D248776CA008CE722 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/NewFeedbackFlow.storyboard; sourceTree = "<group>"; };
5B51ED6E248776CA008CE722 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/UploadData.storyboard; sourceTree = "<group>"; };
5B51ED6F248776CB008CE722 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
5B577814245A584C0088F111 /* UploadDataPrefaceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadDataPrefaceViewController.swift; sourceTree = "<group>"; }; 5B577814245A584C0088F111 /* UploadDataPrefaceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadDataPrefaceViewController.swift; sourceTree = "<group>"; };
5B7ABF24244D3BC600BB249B /* IsolationSuccessViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsolationSuccessViewController.swift; sourceTree = "<group>"; }; 5B7ABF24244D3BC600BB249B /* IsolationSuccessViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsolationSuccessViewController.swift; sourceTree = "<group>"; };
5B7ABF27244D6BE100BB249B /* UnderSixteenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnderSixteenViewController.swift; sourceTree = "<group>"; }; 5B7ABF27244D6BE100BB249B /* UnderSixteenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnderSixteenViewController.swift; sourceTree = "<group>"; };
5B7B031D2490703500296DE0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
5B8243602480DC2100705CB1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; 5B8243602480DC2100705CB1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
5B900FC02485C4EE00CAA419 /* String+Localization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Localization.swift"; sourceTree = "<group>"; };
5B92D662243011B30049877B /* CovidSafe-config.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CovidSafe-config.plist"; path = "Resources/PROD/CovidSafe-config.plist"; sourceTree = "<group>"; }; 5B92D662243011B30049877B /* CovidSafe-config.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CovidSafe-config.plist"; path = "Resources/PROD/CovidSafe-config.plist"; sourceTree = "<group>"; };
5B92D666243012330049877B /* CovidSafe-config.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "CovidSafe-config.plist"; path = "Resources/STG/CovidSafe-config.plist"; sourceTree = "<group>"; }; 5B92D666243012330049877B /* CovidSafe-config.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "CovidSafe-config.plist"; path = "Resources/STG/CovidSafe-config.plist"; sourceTree = "<group>"; };
5B92D6D9243018040049877B /* COVIDSafe-staging.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "COVIDSafe-staging.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 5B92D6D9243018040049877B /* COVIDSafe-staging.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "COVIDSafe-staging.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@ -352,9 +361,7 @@
5DC7B8D2242B8D87008E1715 /* BluetraceUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetraceUtils.swift; sourceTree = "<group>"; }; 5DC7B8D2242B8D87008E1715 /* BluetraceUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetraceUtils.swift; sourceTree = "<group>"; };
5DD41D3723DCB03B00FD4AB0 /* COVIDSafe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = COVIDSafe.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5DD41D3723DCB03B00FD4AB0 /* COVIDSafe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = COVIDSafe.app; sourceTree = BUILT_PRODUCTS_DIR; };
5DD41D3A23DCB03B00FD4AB0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 5DD41D3A23DCB03B00FD4AB0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
5DD41D4123DCB03B00FD4AB0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
5DD41D4323DCB03D00FD4AB0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 5DD41D4323DCB03D00FD4AB0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
5DD41D4623DCB03D00FD4AB0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
5DD41D4823DCB03D00FD4AB0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 5DD41D4823DCB03D00FD4AB0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5DD41D4E23DCB05600FD4AB0 /* CentralController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CentralController.swift; sourceTree = "<group>"; }; 5DD41D4E23DCB05600FD4AB0 /* CentralController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CentralController.swift; sourceTree = "<group>"; };
5DD41D5223DD4CA400FD4AB0 /* PeripheralController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeripheralController.swift; sourceTree = "<group>"; }; 5DD41D5223DD4CA400FD4AB0 /* PeripheralController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeripheralController.swift; sourceTree = "<group>"; };
@ -369,9 +376,6 @@
7FEC361423F16A1E00127AFB /* UIViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewExtension.swift; sourceTree = "<group>"; }; 7FEC361423F16A1E00127AFB /* UIViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewExtension.swift; sourceTree = "<group>"; };
7FF75C212429FEE800C11FEA /* CountriesData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountriesData.swift; sourceTree = "<group>"; }; 7FF75C212429FEE800C11FEA /* CountriesData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountriesData.swift; sourceTree = "<group>"; };
81B28CDCE1F29BA0F1D30CCE /* Pods-CovidSafe-staging.covid-production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CovidSafe-staging.covid-production.xcconfig"; path = "Target Support Files/Pods-CovidSafe-staging/Pods-CovidSafe-staging.covid-production.xcconfig"; sourceTree = "<group>"; }; 81B28CDCE1F29BA0F1D30CCE /* Pods-CovidSafe-staging.covid-production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CovidSafe-staging.covid-production.xcconfig"; path = "Target Support Files/Pods-CovidSafe-staging/Pods-CovidSafe-staging.covid-production.xcconfig"; sourceTree = "<group>"; };
A767D2B6242DF1B000DC9E2A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Feedback.strings; sourceTree = "<group>"; };
A767D2B7242DF1B000DC9E2A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/NewFeedbackFlow.strings; sourceTree = "<group>"; };
A767D2D1242DF1B000DC9E2A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/NewFeedbackFlow.storyboard; sourceTree = "<group>"; };
A767D2DA242DF1B000DC9E2A /* JMCTarget.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = JMCTarget.json; sourceTree = "<group>"; }; A767D2DA242DF1B000DC9E2A /* JMCTarget.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = JMCTarget.json; sourceTree = "<group>"; };
A767D2E8242DF1B000DC9E2A /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; }; A767D2E8242DF1B000DC9E2A /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
A767D2EB242DF1B000DC9E2A /* Logging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = "<group>"; }; A767D2EB242DF1B000DC9E2A /* Logging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = "<group>"; };
@ -402,7 +406,6 @@
B60F8BE3242659810007A641 /* UILabelExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILabelExtension.swift; sourceTree = "<group>"; }; B60F8BE3242659810007A641 /* UILabelExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILabelExtension.swift; sourceTree = "<group>"; };
B615C5A623F8EB1700345969 /* UIProgressView + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIProgressView + Extension.swift"; sourceTree = "<group>"; }; B615C5A623F8EB1700345969 /* UIProgressView + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIProgressView + Extension.swift"; sourceTree = "<group>"; };
B615C5A823FA403400345969 /* UIViewController + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController + Extension.swift"; sourceTree = "<group>"; }; B615C5A823FA403400345969 /* UIViewController + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController + Extension.swift"; sourceTree = "<group>"; };
B6932CE624260E2B003D1810 /* UploadData.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = UploadData.storyboard; sourceTree = "<group>"; };
C5046D5B23EF18600046E96D /* OnboardingStep1ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingStep1ViewController.swift; sourceTree = "<group>"; }; C5046D5B23EF18600046E96D /* OnboardingStep1ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingStep1ViewController.swift; sourceTree = "<group>"; };
C56CF43E23F18A15006B05B0 /* OnboardingStep4ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingStep4ViewController.swift; sourceTree = "<group>"; }; C56CF43E23F18A15006B05B0 /* OnboardingStep4ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingStep4ViewController.swift; sourceTree = "<group>"; };
C585C83A23EEB99B0061B7C6 /* GradientButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientButton.swift; sourceTree = "<group>"; }; C585C83A23EEB99B0061B7C6 /* GradientButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientButton.swift; sourceTree = "<group>"; };
@ -487,6 +490,7 @@
7F2F0BA123EFFF75006D7404 /* OnboardingStep2ViewController.swift */, 7F2F0BA123EFFF75006D7404 /* OnboardingStep2ViewController.swift */,
C58D817623F169DB00345771 /* OnboardingStep2bViewController.swift */, C58D817623F169DB00345771 /* OnboardingStep2bViewController.swift */,
C56CF43E23F18A15006B05B0 /* OnboardingStep4ViewController.swift */, C56CF43E23F18A15006B05B0 /* OnboardingStep4ViewController.swift */,
5B110C0F248F275A00B68291 /* SelectCountryViewController.swift */,
5D8DD05923E2F08400E097EF /* ContactViewController.swift */, 5D8DD05923E2F08400E097EF /* ContactViewController.swift */,
5D8DD05B23E2F0A700E097EF /* LogViewController.swift */, 5D8DD05B23E2F0A700E097EF /* LogViewController.swift */,
5D8DD05D23E2F0BA00E097EF /* InfoViewController.swift */, 5D8DD05D23E2F0BA00E097EF /* InfoViewController.swift */,
@ -535,10 +539,12 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B605A7B02427429D008BA819 /* PlistHelper.swift */, B605A7B02427429D008BA819 /* PlistHelper.swift */,
5B900FC02485C4EE00CAA419 /* String+Localization.swift */,
0B1810112431EE610005D11F /* PhoneNumberParser.swift */, 0B1810112431EE610005D11F /* PhoneNumberParser.swift */,
596B189B24499591003E190F /* UploadHelper.swift */, 596B189B24499591003E190F /* UploadHelper.swift */,
59898602245173C200966E61 /* URLHelper.swift */, 59898602245173C200966E61 /* URLHelper.swift */,
59F25D6E245BED80002A7ED8 /* Debug.storyboard */, 59F25D6E245BED80002A7ED8 /* Debug.storyboard */,
5B51ED4F2485D658008CE722 /* UILocalization.swift */,
); );
name = Utils; name = Utils;
sourceTree = "<group>"; sourceTree = "<group>";
@ -606,6 +612,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5B8243612480DC2100705CB1 /* Localizable.strings */, 5B8243612480DC2100705CB1 /* Localizable.strings */,
5B51ED64248715DE008CE722 /* InfoPlist.strings */,
); );
name = Internationalization; name = Internationalization;
sourceTree = "<group>"; sourceTree = "<group>";
@ -693,7 +700,6 @@
30FADD6C23F520F5006C125F /* Utils */, 30FADD6C23F520F5006C125F /* Utils */,
5DD41D7723DE141700FD4AB0 /* tracer.xcdatamodeld */, 5DD41D7723DE141700FD4AB0 /* tracer.xcdatamodeld */,
5DD41D4023DCB03B00FD4AB0 /* Main.storyboard */, 5DD41D4023DCB03B00FD4AB0 /* Main.storyboard */,
1B86118D24303E7D00EA4B6B /* Questions.storyboard */,
D8EB201C23FBE216001C60EC /* help_center_article_style.css */, D8EB201C23FBE216001C60EC /* help_center_article_style.css */,
5DD41D4323DCB03D00FD4AB0 /* Assets.xcassets */, 5DD41D4323DCB03D00FD4AB0 /* Assets.xcassets */,
5DD41D4523DCB03D00FD4AB0 /* LaunchScreen.storyboard */, 5DD41D4523DCB03D00FD4AB0 /* LaunchScreen.storyboard */,
@ -726,8 +732,6 @@
A767D2AF242DF1B000DC9E2A /* Resources */ = { A767D2AF242DF1B000DC9E2A /* Resources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
A767D2B0242DF1B000DC9E2A /* Feedback.strings */,
A767D2B2242DF1B000DC9E2A /* NewFeedbackFlow.strings */,
A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */, A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */,
A767D2DA242DF1B000DC9E2A /* JMCTarget.json */, A767D2DA242DF1B000DC9E2A /* JMCTarget.json */,
); );
@ -780,7 +784,7 @@
B6932CE8242627A9003D1810 /* Upload Data */ = { B6932CE8242627A9003D1810 /* Upload Data */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B6932CE624260E2B003D1810 /* UploadData.storyboard */, 5B51ED58248627A8008CE722 /* UploadData.storyboard */,
30E91BE823EFE514002D592A /* UploadDataVC.swift */, 30E91BE823EFE514002D592A /* UploadDataVC.swift */,
5BD3EE8224330E1A0004A007 /* UploadDataStep2VC.swift */, 5BD3EE8224330E1A0004A007 /* UploadDataStep2VC.swift */,
0B69E7E82430C22E00561DD9 /* UploadDataHomeViewController.swift */, 0B69E7E82430C22E00561DD9 /* UploadDataHomeViewController.swift */,
@ -897,30 +901,6 @@
knownRegions = ( knownRegions = (
en, en,
Base, Base,
de,
ja,
nb,
"en-GB",
is,
da,
et,
it,
sk,
sv,
cs,
ko,
hu,
pl,
"pt-BR",
ru,
fr,
fi,
nl,
pt,
"pt-PT",
ro,
zh,
es,
); );
mainGroup = 5DD41D2E23DCB03B00FD4AB0; mainGroup = 5DD41D2E23DCB03B00FD4AB0;
productRefGroup = 5DD41D3823DCB03B00FD4AB0 /* Products */; productRefGroup = 5DD41D3823DCB03B00FD4AB0 /* Products */;
@ -939,23 +919,21 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
5B92D6BA243018040049877B /* help_center_article_style.css in Resources */, 5B92D6BA243018040049877B /* help_center_article_style.css in Resources */,
5B92D6BB243018040049877B /* UploadData.storyboard in Resources */, 5B51ED62248715DE008CE722 /* InfoPlist.strings in Resources */,
5B51ED56248627A8008CE722 /* UploadData.storyboard in Resources */,
5B92D6BD243018040049877B /* JMCTarget.json in Resources */, 5B92D6BD243018040049877B /* JMCTarget.json in Resources */,
5B92D6BF243018040049877B /* NewFeedbackFlow.storyboard in Resources */, 5B92D6BF243018040049877B /* NewFeedbackFlow.storyboard in Resources */,
59AF2EA92435801400ACCAF2 /* SFSRootCAG2.cer in Resources */, 59AF2EA92435801400ACCAF2 /* SFSRootCAG2.cer in Resources */,
0BDE12302431DCE6003BC44C /* Questions.storyboard in Resources */,
59F25D6A245B917A002A7ED8 /* Spinner_home.json in Resources */, 59F25D6A245B917A002A7ED8 /* Spinner_home.json in Resources */,
5B82435F2480DC2100705CB1 /* Localizable.strings in Resources */, 5B82435F2480DC2100705CB1 /* Localizable.strings in Resources */,
5B92D6C7243018040049877B /* CovidSafe-config.plist in Resources */, 5B92D6C7243018040049877B /* CovidSafe-config.plist in Resources */,
59AF2EA0243560FD00ACCAF2 /* AmazonRootCA1.cer in Resources */, 59AF2EA0243560FD00ACCAF2 /* AmazonRootCA1.cer in Resources */,
5B92D6C8243018040049877B /* NewFeedbackFlow.strings in Resources */,
5961ABEE2474E464004040DF /* spinner_migrating_db.json in Resources */, 5961ABEE2474E464004040DF /* spinner_migrating_db.json in Resources */,
59AF2EAD2435801400ACCAF2 /* AmazonRootCA4.cer in Resources */, 59AF2EAD2435801400ACCAF2 /* AmazonRootCA4.cer in Resources */,
59F25D6F245BED80002A7ED8 /* Debug.storyboard in Resources */, 59F25D6F245BED80002A7ED8 /* Debug.storyboard in Resources */,
5B92D6C9243018040049877B /* LaunchScreen.storyboard in Resources */, 5B92D6C9243018040049877B /* LaunchScreen.storyboard in Resources */,
59AF2EAF2435801400ACCAF2 /* AmazonRootCA2.cer in Resources */, 59AF2EAF2435801400ACCAF2 /* AmazonRootCA2.cer in Resources */,
5B92D6CB243018040049877B /* Assets.xcassets in Resources */, 5B92D6CB243018040049877B /* Assets.xcassets in Resources */,
5B92D6CC243018040049877B /* Feedback.strings in Resources */,
5B337AB0245AA26300537620 /* Spinner_upload.json in Resources */, 5B337AB0245AA26300537620 /* Spinner_upload.json in Resources */,
59AF2EAB2435801400ACCAF2 /* AmazonRootCA3.cer in Resources */, 59AF2EAB2435801400ACCAF2 /* AmazonRootCA3.cer in Resources */,
5B92D6CF243018040049877B /* Main.storyboard in Resources */, 5B92D6CF243018040049877B /* Main.storyboard in Resources */,
@ -967,21 +945,19 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D8EB201D23FBE216001C60EC /* help_center_article_style.css in Resources */, D8EB201D23FBE216001C60EC /* help_center_article_style.css in Resources */,
B6932CE724260E2B003D1810 /* UploadData.storyboard in Resources */, 5B51ED55248627A8008CE722 /* UploadData.storyboard in Resources */,
A767D313242DF1B000DC9E2A /* JMCTarget.json in Resources */, A767D313242DF1B000DC9E2A /* JMCTarget.json in Resources */,
1B86118E24303E7D00EA4B6B /* Questions.storyboard in Resources */,
59AF2EA82435801400ACCAF2 /* SFSRootCAG2.cer in Resources */, 59AF2EA82435801400ACCAF2 /* SFSRootCAG2.cer in Resources */,
A767D312242DF1B000DC9E2A /* NewFeedbackFlow.storyboard in Resources */, A767D312242DF1B000DC9E2A /* NewFeedbackFlow.storyboard in Resources */,
59F25D69245B917A002A7ED8 /* Spinner_home.json in Resources */, 59F25D69245B917A002A7ED8 /* Spinner_home.json in Resources */,
5B82435E2480DC2100705CB1 /* Localizable.strings in Resources */, 5B82435E2480DC2100705CB1 /* Localizable.strings in Resources */,
5B92D663243011B40049877B /* CovidSafe-config.plist in Resources */, 5B92D663243011B40049877B /* CovidSafe-config.plist in Resources */,
59AF2E9F243560FD00ACCAF2 /* AmazonRootCA1.cer in Resources */, 59AF2E9F243560FD00ACCAF2 /* AmazonRootCA1.cer in Resources */,
A767D30F242DF1B000DC9E2A /* NewFeedbackFlow.strings in Resources */, 5B51ED61248715DE008CE722 /* InfoPlist.strings in Resources */,
59AF2EAC2435801400ACCAF2 /* AmazonRootCA4.cer in Resources */, 59AF2EAC2435801400ACCAF2 /* AmazonRootCA4.cer in Resources */,
5DD41D4723DCB03D00FD4AB0 /* LaunchScreen.storyboard in Resources */, 5DD41D4723DCB03D00FD4AB0 /* LaunchScreen.storyboard in Resources */,
59AF2EAE2435801400ACCAF2 /* AmazonRootCA2.cer in Resources */, 59AF2EAE2435801400ACCAF2 /* AmazonRootCA2.cer in Resources */,
5DD41D4423DCB03D00FD4AB0 /* Assets.xcassets in Resources */, 5DD41D4423DCB03D00FD4AB0 /* Assets.xcassets in Resources */,
A767D30E242DF1B000DC9E2A /* Feedback.strings in Resources */,
5B337AAF245AA26300537620 /* Spinner_upload.json in Resources */, 5B337AAF245AA26300537620 /* Spinner_upload.json in Resources */,
59AF2EAA2435801400ACCAF2 /* AmazonRootCA3.cer in Resources */, 59AF2EAA2435801400ACCAF2 /* AmazonRootCA3.cer in Resources */,
5961ABED2474E464004040DF /* spinner_migrating_db.json in Resources */, 5961ABED2474E464004040DF /* spinner_migrating_db.json in Resources */,
@ -1096,6 +1072,7 @@
5B92D67E243018040049877B /* InfoViewController.swift in Sources */, 5B92D67E243018040049877B /* InfoViewController.swift in Sources */,
5B92D67F243018040049877B /* PogoInstructionsViewController.swift in Sources */, 5B92D67F243018040049877B /* PogoInstructionsViewController.swift in Sources */,
FBBBFCE82430A933002B174D /* OnboardingStep1aViewController.swift in Sources */, FBBBFCE82430A933002B174D /* OnboardingStep1aViewController.swift in Sources */,
5B51ED512485DF9C008CE722 /* UILocalization.swift in Sources */,
594E77C3247387B1009B8B34 /* EncounterDB+migration.swift in Sources */, 594E77C3247387B1009B8B34 /* EncounterDB+migration.swift in Sources */,
590C99332432C1C400A5EC71 /* UploadDataHomeViewController.swift in Sources */, 590C99332432C1C400A5EC71 /* UploadDataHomeViewController.swift in Sources */,
59B7417124514126006E1EEA /* RegistrationConsentViewController.swift in Sources */, 59B7417124514126006E1EEA /* RegistrationConsentViewController.swift in Sources */,
@ -1110,6 +1087,7 @@
5B92D686243018040049877B /* AppDelegate.swift in Sources */, 5B92D686243018040049877B /* AppDelegate.swift in Sources */,
5B92D687243018040049877B /* PhoneNumberViewController.swift in Sources */, 5B92D687243018040049877B /* PhoneNumberViewController.swift in Sources */,
5961ABEB2474E358004040DF /* MigrationViewController.swift in Sources */, 5961ABEB2474E358004040DF /* MigrationViewController.swift in Sources */,
5B110C11248F275B00B68291 /* SelectCountryViewController.swift in Sources */,
5B92D688243018040049877B /* BluetraceUtils.swift in Sources */, 5B92D688243018040049877B /* BluetraceUtils.swift in Sources */,
5B92D689243018040049877B /* NewFeedbackFlowController.swift in Sources */, 5B92D689243018040049877B /* NewFeedbackFlowController.swift in Sources */,
5B92D68A243018040049877B /* Outcome.swift in Sources */, 5B92D68A243018040049877B /* Outcome.swift in Sources */,
@ -1177,6 +1155,7 @@
59898604245173C200966E61 /* URLHelper.swift in Sources */, 59898604245173C200966E61 /* URLHelper.swift in Sources */,
590888B32431B9F2008C9B9F /* Question1ViewController.swift in Sources */, 590888B32431B9F2008C9B9F /* Question1ViewController.swift in Sources */,
590888B62431BA7C008C9B9F /* Question3ErrorViewController.swift in Sources */, 590888B62431BA7C008C9B9F /* Question3ErrorViewController.swift in Sources */,
5B900FC22485C4EE00CAA419 /* String+Localization.swift in Sources */,
59AF2E9D2435581600ACCAF2 /* CovidNetworking.swift in Sources */, 59AF2E9D2435581600ACCAF2 /* CovidNetworking.swift in Sources */,
596B189D24499591003E190F /* UploadHelper.swift in Sources */, 596B189D24499591003E190F /* UploadHelper.swift in Sources */,
590888AF2431B9E3008C9B9F /* UITextView + Extensions.swift in Sources */, 590888AF2431B9E3008C9B9F /* UITextView + Extensions.swift in Sources */,
@ -1234,6 +1213,7 @@
596B189924496D32003E190F /* Encounter+Util.swift in Sources */, 596B189924496D32003E190F /* Encounter+Util.swift in Sources */,
5961ABEA2474E358004040DF /* MigrationViewController.swift in Sources */, 5961ABEA2474E358004040DF /* MigrationViewController.swift in Sources */,
30BE1CB523F15D47005DCE4F /* OTPViewController.swift in Sources */, 30BE1CB523F15D47005DCE4F /* OTPViewController.swift in Sources */,
5B900FC12485C4EE00CAA419 /* String+Localization.swift in Sources */,
5D8DD06123E319B300E097EF /* Encounter+CoreDataClass.swift in Sources */, 5D8DD06123E319B300E097EF /* Encounter+CoreDataClass.swift in Sources */,
594E77BF24736B77009B8B34 /* EncounterDB.swift in Sources */, 594E77BF24736B77009B8B34 /* EncounterDB.swift in Sources */,
FB12C4C1242F0480007E893B /* RespondToAuthChallengeAPI.swift in Sources */, FB12C4C1242F0480007E893B /* RespondToAuthChallengeAPI.swift in Sources */,
@ -1260,6 +1240,7 @@
5D5F83AD23F023F600770DEF /* EncounterMessageManager.swift in Sources */, 5D5F83AD23F023F600770DEF /* EncounterMessageManager.swift in Sources */,
7FF75C222429FEE800C11FEA /* CountriesData.swift in Sources */, 7FF75C222429FEE800C11FEA /* CountriesData.swift in Sources */,
0B55E1922430760600C9E798 /* UITextView + Extensions.swift in Sources */, 0B55E1922430760600C9E798 /* UITextView + Extensions.swift in Sources */,
5B110C10248F275B00B68291 /* SelectCountryViewController.swift in Sources */,
A767D321242DF1B100DC9E2A /* AlertController.swift in Sources */, A767D321242DF1B100DC9E2A /* AlertController.swift in Sources */,
5D5F83AD23F023F600770DEF /* EncounterMessageManager.swift in Sources */, 5D5F83AD23F023F600770DEF /* EncounterMessageManager.swift in Sources */,
FB12C4C3242F0FE9007E893B /* GetTempIdAPI.swift in Sources */, FB12C4C3242F0FE9007E893B /* GetTempIdAPI.swift in Sources */,
@ -1289,6 +1270,7 @@
7F36305F23F7F81400CC6E1D /* PushNotificationConstants.swift in Sources */, 7F36305F23F7F81400CC6E1D /* PushNotificationConstants.swift in Sources */,
59AF2E9C2435581600ACCAF2 /* CovidNetworking.swift in Sources */, 59AF2E9C2435581600ACCAF2 /* CovidNetworking.swift in Sources */,
596B189C24499591003E190F /* UploadHelper.swift in Sources */, 596B189C24499591003E190F /* UploadHelper.swift in Sources */,
5B51ED502485D658008CE722 /* UILocalization.swift in Sources */,
1B86119724303F8500EA4B6B /* Question1ErrorViewController.swift in Sources */, 1B86119724303F8500EA4B6B /* Question1ErrorViewController.swift in Sources */,
B615C5A923FA403500345969 /* UIViewController + Extension.swift in Sources */, B615C5A923FA403500345969 /* UIViewController + Extension.swift in Sources */,
1B86119324303F4A00EA4B6B /* Question2ViewController.swift in Sources */, 1B86119324303F4A00EA4B6B /* Question2ViewController.swift in Sources */,
@ -1301,6 +1283,22 @@
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */ /* Begin PBXVariantGroup section */
5B51ED58248627A8008CE722 /* UploadData.storyboard */ = {
isa = PBXVariantGroup;
children = (
5B51ED6E248776CA008CE722 /* Base */,
);
name = UploadData.storyboard;
sourceTree = "<group>";
};
5B51ED64248715DE008CE722 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
5B51ED63248715DE008CE722 /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
5B8243612480DC2100705CB1 /* Localizable.strings */ = { 5B8243612480DC2100705CB1 /* Localizable.strings */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
@ -1312,7 +1310,7 @@
5DD41D4023DCB03B00FD4AB0 /* Main.storyboard */ = { 5DD41D4023DCB03B00FD4AB0 /* Main.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
5DD41D4123DCB03B00FD4AB0 /* Base */, 5B51ED6F248776CB008CE722 /* Base */,
); );
name = Main.storyboard; name = Main.storyboard;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1320,31 +1318,15 @@
5DD41D4523DCB03D00FD4AB0 /* LaunchScreen.storyboard */ = { 5DD41D4523DCB03D00FD4AB0 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
5DD41D4623DCB03D00FD4AB0 /* Base */, 5B7B031D2490703500296DE0 /* Base */,
); );
name = LaunchScreen.storyboard; name = LaunchScreen.storyboard;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
A767D2B0242DF1B000DC9E2A /* Feedback.strings */ = {
isa = PBXVariantGroup;
children = (
A767D2B6242DF1B000DC9E2A /* en */,
);
name = Feedback.strings;
sourceTree = "<group>";
};
A767D2B2242DF1B000DC9E2A /* NewFeedbackFlow.strings */ = {
isa = PBXVariantGroup;
children = (
A767D2B7242DF1B000DC9E2A /* en */,
);
name = NewFeedbackFlow.strings;
sourceTree = "<group>";
};
A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */ = { A767D2D0242DF1B000DC9E2A /* NewFeedbackFlow.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
A767D2D1242DF1B000DC9E2A /* Base */, 5B51ED6D248776CA008CE722 /* Base */,
); );
name = NewFeedbackFlow.storyboard; name = NewFeedbackFlow.storyboard;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1356,6 +1338,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@ -1421,7 +1404,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1429,7 +1412,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
PRODUCT_NAME = COVIDSafe; PRODUCT_NAME = COVIDSafe;
@ -1445,6 +1428,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@ -1504,7 +1488,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1512,7 +1496,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
PRODUCT_NAME = COVIDSafe; PRODUCT_NAME = COVIDSafe;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -1532,7 +1516,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1540,7 +1524,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG"; OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
@ -1562,7 +1546,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1570,7 +1554,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG"; OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
@ -1592,7 +1576,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1600,7 +1584,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG"; OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
PRODUCT_MODULE_NAME = COVIDSafe; PRODUCT_MODULE_NAME = COVIDSafe;
@ -1622,7 +1606,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1630,7 +1614,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG"; OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -D DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
PRODUCT_MODULE_NAME = COVIDSafe; PRODUCT_MODULE_NAME = COVIDSafe;
@ -1648,6 +1632,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@ -1709,6 +1694,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@ -1768,7 +1754,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1776,7 +1762,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
PRODUCT_NAME = COVIDSafe; PRODUCT_NAME = COVIDSafe;
@ -1796,7 +1782,7 @@
CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements"; CODE_SIGN_ENTITLEMENTS = "CovidSafe/Project Bluetrace.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 45792XH5L8; DEVELOPMENT_TEAM = 45792XH5L8;
INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/CovidSafe/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0; IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@ -1804,7 +1790,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.6;
PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe; PRODUCT_BUNDLE_IDENTIFIER = au.gov.health.covidsafe;
PRODUCT_NAME = COVIDSafe; PRODUCT_NAME = COVIDSafe;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";

View file

@ -16,7 +16,9 @@ class PhoneValidationAPI {
guard let apiHost = PlistHelper.getvalueFromInfoPlist(withKey: "API_Host", plistName: "CovidSafe-config") else { guard let apiHost = PlistHelper.getvalueFromInfoPlist(withKey: "API_Host", plistName: "CovidSafe-config") else {
return return
} }
let params = [ let params = [
"country_code": "+\(regInfo.countryPhoneCode ?? "61")",
"phone_number": regInfo.phoneNumber, "phone_number": regInfo.phoneNumber,
"age": String(regInfo.age), "age": String(regInfo.age),
"postcode": regInfo.postcode, "postcode": regInfo.postcode,
@ -45,6 +47,7 @@ struct RegistrationRequest {
var age: Int var age: Int
var isMinor: Bool var isMinor: Bool
var phoneNumber: String var phoneNumber: String
var countryPhoneCode: String?
} }
struct AuthResponse: Decodable { struct AuthResponse: Decodable {

View file

@ -26,6 +26,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
UserDefaults.standard.set(true, forKey: "HasBeenLaunched") UserDefaults.standard.set(true, forKey: "HasBeenLaunched")
} }
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.covidSafeColor], for: .normal)
UINavigationBar.appearance().tintColor = UIColor.covidSafeColor
let hasUserConsent = true let hasUserConsent = true
let hasUserCompletedOnboarding = UserDefaults.standard.bool(forKey: "turnedOnBluetooth") let hasUserCompletedOnboarding = UserDefaults.standard.bool(forKey: "turnedOnBluetooth")
let bluetoothAuthorised = BluetraceManager.shared.isBluetoothAuthorized() let bluetoothAuthorised = BluetraceManager.shared.isBluetoothAuthorized()
@ -98,13 +101,33 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
if !UserDefaults.standard.bool(forKey: "sentBluetoothStatusNotif") { if !UserDefaults.standard.bool(forKey: "sentBluetoothStatusNotif") {
UserDefaults.standard.set(true, forKey: "sentBluetoothStatusNotif") UserDefaults.standard.set(true, forKey: "sentBluetoothStatusNotif")
self.triggerIntervalLocalPushNotifications(pnContent: PushNotificationConstants.btStatusPushNotifContents[btStatusMagicNumber], identifier: "bluetoothStatusNotifId") self.triggerIntervalLocalPushNotifications(pnContent: PushNotificationConstants.btStatusPushNotifContents[btStatusMagicNumber], identifier: "bluetoothStatusNotifId")
return
} }
} }
switch state {
case .poweredOff, .unauthorized:
DLog("*** Setup reminders - BL OFF, UNAUTH check/set reminders")
self.checkAndScheduleReminderNotifications()
default:
// leave reminder notifications as they are, when an encounter occurs the notifications will be deferred
// or removed when app becomes active
DLog("*** Setup reminders - Default leave reminders")
}
} }
} }
fileprivate func cancelPreviouslyScheduledNotifications() { fileprivate func getReminderNotificationsIdentifiers() -> [String] {
UNUserNotificationCenter.current().removeAllPendingNotificationRequests() var identifiers: [String] = []
for interval in intervals {
identifiers.append(getReminderNotificationIdentifier(interval: interval))
}
return identifiers
}
fileprivate func cancelScheduledReminderNotifications() {
DLog("*** Cancel reminders")
let identifiers = getReminderNotificationsIdentifiers()
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers)
} }
fileprivate func triggerIntervalLocalPushNotifications(pnContent: [String : String], identifier: String) { fileprivate func triggerIntervalLocalPushNotifications(pnContent: [String : String], identifier: String) {
@ -128,8 +151,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
let intervals: [TimeInterval] = [TimeInterval(60 * 60 * 48)] let intervals: [TimeInterval] = [TimeInterval(60 * 60 * 48)]
#endif #endif
fileprivate func scheduleReminderNotifications() { fileprivate func getReminderNotificationIdentifier(interval: TimeInterval) -> String {
return "reminder-\(interval)"
}
fileprivate func checkAndScheduleReminderNotifications() {
let identifiers = getReminderNotificationsIdentifiers()
DLog("*** Setup reminders - checking pending reminders")
// check all reminders are scheduled and pending
UNUserNotificationCenter.current().getPendingNotificationRequests { (notificationsRequest) in
var scheduledRemindersCount = 0
for notification in notificationsRequest {
if identifiers.firstIndex(of: notification.identifier) != nil {
scheduledRemindersCount += 1
}
}
// re-schedule reminders unless they are all pending
if scheduledRemindersCount != identifiers.count {
self.scheduleReminderNotifications()
}
}
}
fileprivate func scheduleReminderNotifications() {
DLog("*** Set reminders")
let reminderContent = PushNotificationConstants.reminderPushNotifContents let reminderContent = PushNotificationConstants.reminderPushNotifContents
guard guard
let title = reminderContent["contentTitle"], let title = reminderContent["contentTitle"],
@ -141,7 +186,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
for interval in intervals { for interval in intervals {
let content = UNMutableNotificationContent() let content = UNMutableNotificationContent()
let identifier = getReminderNotificationIdentifier(interval: interval)
#if DEBUG #if DEBUG
content.title = "\(title) \(interval / 60) min" content.title = "\(title) \(interval / 60) min"
#else #else
@ -152,14 +197,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: interval, repeats: false) let trigger = UNTimeIntervalNotificationTrigger(timeInterval: interval, repeats: false)
let request = UNNotificationRequest(identifier: "reminder-\(interval)", content: content, trigger: trigger) let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
notificationCenter.add(request) notificationCenter.add(request)
} }
} }
@objc @objc
func deferReminderNotifications(_ notification: Notification) { func deferReminderNotifications(_ notification: Notification) {
cancelPreviouslyScheduledNotifications() // no need to cancel, if same ID used the notification is updated
scheduleReminderNotifications() scheduleReminderNotifications()
} }
@ -168,13 +213,20 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
startAccelerometerUpdates() startAccelerometerUpdates()
clearOldDataInContext() clearOldDataInContext()
// if Bluetooth is ON, remove reminders, leave otherwise.
if BluetraceManager.shared.isBluetoothOn() {
cancelScheduledReminderNotifications()
}
} }
func applicationWillResignActive(_ application: UIApplication) { func applicationWillResignActive(_ application: UIApplication) {
DLog("applicationWillResignActive") DLog("applicationWillResignActive")
// Retry in case it failed on become active // Retry in case it failed on become active
clearOldDataInContext() clearOldDataInContext()
scheduleReminderNotifications()
// check if reminders pending and set if needed
checkAndScheduleReminderNotifications()
} }
func applicationDidEnterBackground(_ application: UIApplication) { func applicationDidEnterBackground(_ application: UIApplication) {
@ -187,8 +239,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func applicationWillEnterForeground(_ application: UIApplication) { func applicationWillEnterForeground(_ application: UIApplication) {
DLog("applicationWillEnterForeground") DLog("applicationWillEnterForeground")
self.dismissBlackscreen() self.dismissBlackscreen()
cancelPreviouslyScheduledNotifications()
} }
func applicationWillTerminate(_ application: UIApplication) { func applicationWillTerminate(_ application: UIApplication) {

File diff suppressed because it is too large Load diff

View file

@ -15,24 +15,11 @@
<navigationBar key="navigationBar" hidden="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="qRv-Xf-UaQ"> <navigationBar key="navigationBar" hidden="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="qRv-Xf-UaQ">
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</navigationBar> </navigationBar>
<connections>
<segue destination="Elx-xe-4zu" kind="relationship" relationship="rootViewController" id="CP0-Er-dpJ"/>
</connections>
</navigationController> </navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="NBS-3a-gxj" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="NBS-3a-gxj" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="-674" y="-1872"/> <point key="canvasLocation" x="-674" y="-1872"/>
</scene> </scene>
<!--Questions-->
<scene sceneID="pBE-qy-Y8H">
<objects>
<viewControllerPlaceholder storyboardName="Questions" id="Elx-xe-4zu" sceneMemberID="viewController">
<navigationItem key="navigationItem" id="mWG-RM-ehP"/>
</viewControllerPlaceholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="hfk-Su-78X" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="526" y="-1873"/>
</scene>
<!--Upload Data Step2VC--> <!--Upload Data Step2VC-->
<scene sceneID="MLs-LJ-G0a"> <scene sceneID="MLs-LJ-G0a">
<objects> <objects>
@ -67,6 +54,9 @@
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/> <fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UD2_Title"/>
</userDefinedRuntimeAttributes>
</label> </label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ft1-PF-Epb"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ft1-PF-Epb">
<rect key="frame" x="32" y="105.5" width="301" height="86.5"/> <rect key="frame" x="32" y="105.5" width="301" height="86.5"/>
@ -74,6 +64,9 @@
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UD2_Intro"/>
</userDefinedRuntimeAttributes>
</label> </label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mKA-1q-WgQ" customClass="CodeInputView" customModule="COVIDSafe" customModuleProvider="target"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mKA-1q-WgQ" customClass="CodeInputView" customModule="COVIDSafe" customModuleProvider="target">
<rect key="frame" x="26" y="208" width="317" height="54"/> <rect key="frame" x="26" y="208" width="317" height="54"/>
@ -128,6 +121,9 @@
<state key="normal" title="Upload my information"> <state key="normal" title="Upload my information">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state> </state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UD2_Button"/>
</userDefinedRuntimeAttributes>
<connections> <connections>
<action selector="uploadDataBtnTapped:" destination="a6e-KY-ZKO" eventType="touchUpInside" id="njp-EI-wJ9"/> <action selector="uploadDataBtnTapped:" destination="a6e-KY-ZKO" eventType="touchUpInside" id="njp-EI-wJ9"/>
</connections> </connections>
@ -146,6 +142,9 @@ Please do not close the app.</string>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UploadingInfo"/>
</userDefinedRuntimeAttributes>
</label> </label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XWM-sx-BWy"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XWM-sx-BWy">
<rect key="frame" x="40" y="0.0" width="231" height="231"/> <rect key="frame" x="40" y="0.0" width="231" height="231"/>
@ -255,6 +254,9 @@ Please do not close the app.</string>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDE_Message"/>
</userDefinedRuntimeAttributes>
</label> </label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sEL-Fh-3RO" customClass="GradientButton" customModule="COVIDSafe" customModuleProvider="target"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sEL-Fh-3RO" customClass="GradientButton" customModule="COVIDSafe" customModuleProvider="target">
<rect key="frame" x="0.0" y="357.5" width="311" height="48"/> <rect key="frame" x="0.0" y="357.5" width="311" height="48"/>
@ -267,6 +269,9 @@ Please do not close the app.</string>
<state key="normal" title="Try again"> <state key="normal" title="Try again">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state> </state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDE_TryAgain"/>
</userDefinedRuntimeAttributes>
<connections> <connections>
<action selector="onBackTapped:" destination="Bpf-Xp-F3m" eventType="touchUpInside" id="WS1-R8-wUd"/> <action selector="onBackTapped:" destination="Bpf-Xp-F3m" eventType="touchUpInside" id="WS1-R8-wUd"/>
<action selector="uploadDataBtnTapped:" destination="a6e-KY-ZKO" eventType="touchUpInside" id="WRe-bP-cIQ"/> <action selector="uploadDataBtnTapped:" destination="a6e-KY-ZKO" eventType="touchUpInside" id="WRe-bP-cIQ"/>
@ -283,6 +288,9 @@ Please do not close the app.</string>
<state key="normal" title="Cancel"> <state key="normal" title="Cancel">
<color key="titleColor" red="0.0" green="0.54117647059999996" blue="0.13725490200000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="titleColor" red="0.0" green="0.54117647059999996" blue="0.13725490200000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state> </state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDE_Cancel"/>
</userDefinedRuntimeAttributes>
<connections> <connections>
<action selector="onBackTapped:" destination="Bpf-Xp-F3m" eventType="touchUpInside" id="zlB-kb-MRy"/> <action selector="onBackTapped:" destination="Bpf-Xp-F3m" eventType="touchUpInside" id="zlB-kb-MRy"/>
<action selector="uploadDataBtnTapped:" destination="a6e-KY-ZKO" eventType="touchUpInside" id="uoS-ai-Rn8"/> <action selector="uploadDataBtnTapped:" destination="a6e-KY-ZKO" eventType="touchUpInside" id="uoS-ai-Rn8"/>
@ -364,6 +372,9 @@ Please do not close the app.</string>
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/> <fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDP_Title"/>
</userDefinedRuntimeAttributes>
</label> </label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" delaysContentTouches="NO" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tqv-D9-PS3"> <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" delaysContentTouches="NO" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tqv-D9-PS3">
<rect key="frame" x="32" y="385.5" width="311" height="192"/> <rect key="frame" x="32" y="385.5" width="311" height="192"/>
@ -374,6 +385,9 @@ Once you press Yes youll need to provide consent to upload your informa
<color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/> <color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/> <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDP_Content"/>
</userDefinedRuntimeAttributes>
</textView> </textView>
</subviews> </subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
@ -416,6 +430,7 @@ Once you press Yes youll need to provide consent to upload your informa
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="0.0"/> <real key="value" value="0.0"/>
</userDefinedRuntimeAttribute> </userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDP_NoButton"/>
</userDefinedRuntimeAttributes> </userDefinedRuntimeAttributes>
<connections> <connections>
<action selector="onBackTapped:" destination="HPs-l8-CC5" eventType="touchUpInside" id="nta-yE-3yq"/> <action selector="onBackTapped:" destination="HPs-l8-CC5" eventType="touchUpInside" id="nta-yE-3yq"/>
@ -436,6 +451,7 @@ Once you press Yes youll need to provide consent to upload your informa
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="0.0"/> <real key="value" value="0.0"/>
</userDefinedRuntimeAttribute> </userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDP_YesButton"/>
</userDefinedRuntimeAttributes> </userDefinedRuntimeAttributes>
<connections> <connections>
<segue destination="GKP-u6-wgj" kind="show" id="Qa7-iF-RFi"/> <segue destination="GKP-u6-wgj" kind="show" id="Qa7-iF-RFi"/>
@ -485,6 +501,9 @@ Once you press Yes youll need to provide consent to upload your informa
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/> <fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDC_Title"/>
</userDefinedRuntimeAttributes>
</label> </label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" delaysContentTouches="NO" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ryL-BN-XeS"> <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" delaysContentTouches="NO" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ryL-BN-XeS">
<rect key="frame" x="32" y="105.5" width="311" height="280"/> <rect key="frame" x="32" y="105.5" width="311" height="280"/>
@ -497,6 +516,9 @@ Read the COVIDSafe *privacy policy* for further details.Select 'I agree' t
<color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/> <color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/> <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDC_Content"/>
</userDefinedRuntimeAttributes>
</textView> </textView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="c1v-Px-kY5"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="c1v-Px-kY5">
<rect key="frame" x="16" y="16" width="44" height="44"/> <rect key="frame" x="16" y="16" width="44" height="44"/>
@ -550,6 +572,7 @@ Read the COVIDSafe *privacy policy* for further details.Select 'I agree' t
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius"> <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="0.0"/> <real key="value" value="0.0"/>
</userDefinedRuntimeAttribute> </userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDC_Button"/>
</userDefinedRuntimeAttributes> </userDefinedRuntimeAttributes>
<connections> <connections>
<segue destination="a6e-KY-ZKO" kind="show" id="lxD-W9-vGv"/> <segue destination="a6e-KY-ZKO" kind="show" id="lxD-W9-vGv"/>
@ -578,16 +601,6 @@ Read the COVIDSafe *privacy policy* for further details.Select 'I agree' t
</objects> </objects>
<point key="canvasLocation" x="-2168.1159420289855" y="-3626.0869565217395"/> <point key="canvasLocation" x="-2168.1159420289855" y="-3626.0869565217395"/>
</scene> </scene>
<!--Questions-->
<scene sceneID="Yjc-4h-Yma">
<objects>
<viewControllerPlaceholder storyboardName="Questions" id="Kzd-qE-07a" sceneMemberID="viewController">
<navigationItem key="navigationItem" id="BDJ-wD-Fwl"/>
</viewControllerPlaceholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="iD5-lB-pPC" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-881" y="-3763"/>
</scene>
<!--Upload Data Thank You Home View Controller--> <!--Upload Data Thank You Home View Controller-->
<scene sceneID="mXp-nc-2a6"> <scene sceneID="mXp-nc-2a6">
<objects> <objects>
@ -616,6 +629,9 @@ Read the COVIDSafe *privacy policy* for further details.Select 'I agree' t
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/> <fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDTY_Title"/>
</userDefinedRuntimeAttributes>
</label> </label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" delaysContentTouches="NO" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bP5-GQ-GQk"> <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" delaysContentTouches="NO" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bP5-GQ-GQk">
<rect key="frame" x="32" y="309.5" width="311" height="214"/> <rect key="frame" x="32" y="309.5" width="311" height="214"/>
@ -626,6 +642,9 @@ State or territory health officials will notify other COVIDSafe users that have
<color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/> <color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/> <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDTY_Content"/>
</userDefinedRuntimeAttributes>
</textView> </textView>
</subviews> </subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
@ -662,6 +681,9 @@ State or territory health officials will notify other COVIDSafe users that have
<state key="normal" title="Continue"> <state key="normal" title="Continue">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state> </state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="UDTY_Button"/>
</userDefinedRuntimeAttributes>
<connections> <connections>
<action selector="doneBtnTapped:" destination="Vno-TX-yIM" eventType="touchUpInside" id="3xk-nY-dMS"/> <action selector="doneBtnTapped:" destination="Vno-TX-yIM" eventType="touchUpInside" id="3xk-nY-dMS"/>
</connections> </connections>

View file

@ -2,16 +2,226 @@
// Countries.swift // Countries.swift
// CovidSafe // CovidSafe
// //
// Copyright © 2020 Joel Kek. All rights reserved. // Copyright © 2020 All rights reserved.
// //
import FlagKit
struct CountriesData { struct CountriesData {
static let countryArray = ["Australia"] static let countryArray = ["Australia"]
static let countryCodes = static let countries =
[ [
"Australia": "+61" // Country(name: "Country_AF".localizedString(), isoCode:"AF",phoneCode:"93", flag:Flag(countryCode: "AF")),
Country(name: "Country_AL".localizedString(), isoCode:"AL",phoneCode:"355", flag:Flag(countryCode: "AL")),
Country(name: "Country_DZ".localizedString(), isoCode:"DZ",phoneCode:"213", flag:Flag(countryCode: "DZ")),
// Country(name: "Country_AD".localizedString(), isoCode:"AD",phoneCode:"376", flag:Flag(countryCode: "AD")),
Country(name: "Country_AO".localizedString(), isoCode:"AO",phoneCode:"244", flag:Flag(countryCode: "AO")),
Country(name: "Country_AI".localizedString(), isoCode:"AI",phoneCode:"1", flag:Flag(countryCode: "AI")),
Country(name: "Country_AG".localizedString(), isoCode:"AG",phoneCode:"1", flag:Flag(countryCode: "AG")),
Country(name: "Country_AR".localizedString(), isoCode:"AR",phoneCode:"54", flag:Flag(countryCode: "AR")),
Country(name: "Country_AM".localizedString(), isoCode:"AM",phoneCode:"374", flag:Flag(countryCode: "AM")),
Country(name: "Country_AW".localizedString(), isoCode:"AW",phoneCode:"297", flag:Flag(countryCode: "AW")),
// Country(name: "Country_AU".localizedString(), isoCode:"AU",phoneCode:"61", flag:Flag(countryCode: "AU")),
Country(name: "Country_AT".localizedString(), isoCode:"AT",phoneCode:"43", flag:Flag(countryCode: "AT")),
Country(name: "Country_AZ".localizedString(), isoCode:"AZ",phoneCode:"994", flag:Flag(countryCode: "AZ")),
Country(name: "Country_BS".localizedString(), isoCode:"BS",phoneCode:"1", flag:Flag(countryCode: "BS")),
Country(name: "Country_BH".localizedString(), isoCode:"BH",phoneCode:"973", flag:Flag(countryCode: "BH")),
Country(name: "Country_BD".localizedString(), isoCode:"BD",phoneCode:"880", flag:Flag(countryCode: "BD")),
Country(name: "Country_BB".localizedString(), isoCode:"BB",phoneCode:"1", flag:Flag(countryCode: "BB")),
Country(name: "Country_BY".localizedString(), isoCode:"BY",phoneCode:"375", flag:Flag(countryCode: "BY")),
Country(name: "Country_BE".localizedString(), isoCode:"BE",phoneCode:"32", flag:Flag(countryCode: "BE")),
Country(name: "Country_BZ".localizedString(), isoCode:"BZ",phoneCode:"501", flag:Flag(countryCode: "BZ")),
Country(name: "Country_BJ".localizedString(), isoCode:"BJ",phoneCode:"229", flag:Flag(countryCode: "BJ")),
Country(name: "Country_BM".localizedString(), isoCode:"BM",phoneCode:"1", flag:Flag(countryCode: "BM")),
// Country(name: "Country_BT".localizedString(), isoCode:"BT",phoneCode:"975", flag:Flag(countryCode: "BT")),
Country(name: "Country_BO".localizedString(), isoCode:"BO",phoneCode:"591", flag:Flag(countryCode: "BO")),
Country(name: "Country_BA".localizedString(), isoCode:"BA",phoneCode:"387", flag:Flag(countryCode: "BA")),
Country(name: "Country_BW".localizedString(), isoCode:"BW",phoneCode:"267", flag:Flag(countryCode: "BW")),
Country(name: "Country_BR".localizedString(), isoCode:"BR",phoneCode:"55", flag:Flag(countryCode: "BR")),
// Country(name: "Country_BN".localizedString(), isoCode:"BN",phoneCode:"673", flag:Flag(countryCode: "BN")),
Country(name: "Country_BG".localizedString(), isoCode:"BG",phoneCode:"359", flag:Flag(countryCode: "BG")),
Country(name: "Country_BF".localizedString(), isoCode:"BF",phoneCode:"226", flag:Flag(countryCode: "BF")),
// Country(name: "Country_BI".localizedString(), isoCode:"BI",phoneCode:"257", flag:Flag(countryCode: "BI")),
Country(name: "Country_KH".localizedString(), isoCode:"KH",phoneCode:"855", flag:Flag(countryCode: "KH")),
Country(name: "Country_CM".localizedString(), isoCode:"CM",phoneCode:"237", flag:Flag(countryCode: "CM")),
Country(name: "Country_CA".localizedString(), isoCode:"CA",phoneCode:"1", flag:Flag(countryCode: "CA")),
Country(name: "Country_CV".localizedString(), isoCode:"CV",phoneCode:"238", flag:Flag(countryCode: "CV")),
Country(name: "Country_KY".localizedString(), isoCode:"KY",phoneCode:"1", flag:Flag(countryCode: "KY")),
// Country(name: "Country_CF".localizedString(), isoCode:"CF",phoneCode:"236", flag:Flag(countryCode: "CF")),
// Country(name: "Country_TD".localizedString(), isoCode:"TD",phoneCode:"235", flag:Flag(countryCode: "TD")),
Country(name: "Country_CL".localizedString(), isoCode:"CL",phoneCode:"56", flag:Flag(countryCode: "CL")),
Country(name: "Country_CN".localizedString(), isoCode:"CN",phoneCode:"86", flag:Flag(countryCode: "CN")),
Country(name: "Country_CO".localizedString(), isoCode:"CO",phoneCode:"57", flag:Flag(countryCode: "CO")),
// Country(name: "Country_KM".localizedString(), isoCode:"KM",phoneCode:"269", flag:Flag(countryCode: "KM")),
// Country(name: "Country_CK".localizedString(), isoCode:"CK",phoneCode:"682", flag:Flag(countryCode: "CK")),
Country(name: "Country_CR".localizedString(), isoCode:"CR",phoneCode:"506", flag:Flag(countryCode: "CR")),
Country(name: "Country_HR".localizedString(), isoCode:"HR",phoneCode:"385", flag:Flag(countryCode: "HR")),
Country(name: "Country_CU".localizedString(), isoCode:"CU",phoneCode:"53", flag:Flag(countryCode: "CU")),
Country(name: "Country_CW".localizedString(), isoCode:"CW",phoneCode:"599", flag:Flag(countryCode: "CW")),
Country(name: "Country_CY".localizedString(), isoCode:"CY",phoneCode:"357", flag:Flag(countryCode: "CY")),
Country(name: "Country_CZ".localizedString(), isoCode:"CZ",phoneCode:"420", flag:Flag(countryCode: "CZ")),
// Country(name: "Country_CD".localizedString(), isoCode:"CD",phoneCode:"243", flag:Flag(countryCode: "CD")),
Country(name: "Country_DK".localizedString(), isoCode:"DK",phoneCode:"45", flag:Flag(countryCode: "DK")),
// Country(name: "Country_DJ".localizedString(), isoCode:"DJ",phoneCode:"253", flag:Flag(countryCode: "DJ")),
Country(name: "Country_DM".localizedString(), isoCode:"DM",phoneCode:"1", flag:Flag(countryCode: "DM")),
Country(name: "Country_DO".localizedString(), isoCode:"DO",phoneCode:"1", flag:Flag(countryCode: "DO")),
// Country(name: "Country_TL".localizedString(), isoCode:"TL",phoneCode:"670", flag:Flag(countryCode: "TL")),
Country(name: "Country_EC".localizedString(), isoCode:"EC",phoneCode:"593", flag:Flag(countryCode: "EC")),
// Country(name: "Country_EG".localizedString(), isoCode:"EG",phoneCode:"20", flag:Flag(countryCode: "EG")),
Country(name: "Country_SV".localizedString(), isoCode:"SV",phoneCode:"503", flag:Flag(countryCode: "SV")),
// Country(name: "Country_GQ".localizedString(), isoCode:"GQ",phoneCode:"240", flag:Flag(countryCode: "GQ")),
Country(name: "Country_EE".localizedString(), isoCode:"EE",phoneCode:"372", flag:Flag(countryCode: "EE")),
// Country(name: "Country_ET".localizedString(), isoCode:"ET",phoneCode:"251", flag:Flag(countryCode: "ET")),
// Country(name: "Country_FO".localizedString(), isoCode:"FO",phoneCode:"298", flag:Flag(countryCode: "FO")),
Country(name: "Country_FJ".localizedString(), isoCode:"FJ",phoneCode:"679", flag:Flag(countryCode: "FJ")),
Country(name: "Country_FI".localizedString(), isoCode:"FI",phoneCode:"358", flag:Flag(countryCode: "FI")),
Country(name: "Country_FR".localizedString(), isoCode:"FR",phoneCode:"33", flag:Flag(countryCode: "FR")),
// Country(name: "Country_GF".localizedString(), isoCode:"GF",phoneCode:"995", flag:Flag(countryCode: "GF")),
Country(name: "Country_GA".localizedString(), isoCode:"GA",phoneCode:"241", flag:Flag(countryCode: "GA")),
// Country(name: "Country_GM".localizedString(), isoCode:"GM",phoneCode:"220", flag:Flag(countryCode: "GM")),
Country(name: "Country_GE".localizedString(), isoCode:"GE",phoneCode:"995", flag:Flag(countryCode: "GE")),
Country(name: "Country_DE".localizedString(), isoCode:"DE",phoneCode:"49", flag:Flag(countryCode: "DE")),
Country(name: "Country_GH".localizedString(), isoCode:"GH",phoneCode:"233", flag:Flag(countryCode: "GH")),
// Country(name: "Country_GI".localizedString(), isoCode:"GI",phoneCode:"350", flag:Flag(countryCode: "GI")),
Country(name: "Country_GR".localizedString(), isoCode:"GR",phoneCode:"30", flag:Flag(countryCode: "GR")),
// Country(name: "Country_GL".localizedString(), isoCode:"GL",phoneCode:"299", flag:Flag(countryCode: "GL")),
Country(name: "Country_GD".localizedString(), isoCode:"GD",phoneCode:"1", flag:Flag(countryCode: "GD")),
// Country(name: "Country_GP".localizedString(), isoCode:"GP",phoneCode:"224", flag:Flag(countryCode: "GP")),
Country(name: "Country_GU".localizedString(), isoCode:"GU",phoneCode:"1", flag:Flag(countryCode: "GU")),
Country(name: "Country_GT".localizedString(), isoCode:"GT",phoneCode:"502", flag:Flag(countryCode: "GT")),
// Country(name: "Country_GN".localizedString(), isoCode:"GN",phoneCode:"224", flag:Flag(countryCode: "GN")),
Country(name: "Country_GW".localizedString(), isoCode:"GW",phoneCode:"245", flag:Flag(countryCode: "GW")),
// Country(name: "Country_GY".localizedString(), isoCode:"GY",phoneCode:"592", flag:Flag(countryCode: "GY")),
Country(name: "Country_HT".localizedString(), isoCode:"HT",phoneCode:"509", flag:Flag(countryCode: "HT")),
Country(name: "Country_HN".localizedString(), isoCode:"HN",phoneCode:"504", flag:Flag(countryCode: "HN")),
Country(name: "Country_HK".localizedString(), isoCode:"HK",phoneCode:"852", flag:Flag(countryCode: "HK")),
Country(name: "Country_HU".localizedString(), isoCode:"HU",phoneCode:"36", flag:Flag(countryCode: "HU")),
Country(name: "Country_IS".localizedString(), isoCode:"IS",phoneCode:"354", flag:Flag(countryCode: "IS")),
Country(name: "Country_IN".localizedString(), isoCode:"IN",phoneCode:"91", flag:Flag(countryCode: "IN")),
Country(name: "Country_ID".localizedString(), isoCode:"ID",phoneCode:"62", flag:Flag(countryCode: "ID")),
Country(name: "Country_IQ".localizedString(), isoCode:"IQ",phoneCode:"964", flag:Flag(countryCode: "IQ")),
Country(name: "Country_IE".localizedString(), isoCode:"IE",phoneCode:"353", flag:Flag(countryCode: "IE")),
Country(name: "Country_IL".localizedString(), isoCode:"IL",phoneCode:"972", flag:Flag(countryCode: "IL")),
Country(name: "Country_IR".localizedString(), isoCode:"IR",phoneCode:"98", flag:Flag(countryCode: "IR")),
// Country(name: "Country_IT".localizedString(), isoCode:"IT",phoneCode:"39", flag:Flag(countryCode: "IT")),
Country(name: "Country_CI".localizedString(), isoCode:"CI",phoneCode:"225", flag:Flag(countryCode: "CI")),
Country(name: "Country_JM".localizedString(), isoCode:"JM",phoneCode:"1", flag:Flag(countryCode: "JM")),
Country(name: "Country_JP".localizedString(), isoCode:"JP",phoneCode:"81", flag:Flag(countryCode: "JP")),
Country(name: "Country_JO".localizedString(), isoCode:"JO",phoneCode:"962", flag:Flag(countryCode: "JO")),
Country(name: "Country_KZ".localizedString(), isoCode:"KZ",phoneCode:"7", flag:Flag(countryCode: "KZ")),
Country(name: "Country_KE".localizedString(), isoCode:"KE",phoneCode:"254", flag:Flag(countryCode: "KE")),
// Country(name: "Country_KI".localizedString(), isoCode:"KI",phoneCode:"686", flag:Flag(countryCode: "KI")),
Country(name: "Country_KW".localizedString(), isoCode:"KW",phoneCode:"965", flag:Flag(countryCode: "KW")),
Country(name: "Country_KG".localizedString(), isoCode:"KG",phoneCode:"996", flag:Flag(countryCode: "KG")),
Country(name: "Country_LA".localizedString(), isoCode:"LA",phoneCode:"856", flag:Flag(countryCode: "LA")),
Country(name: "Country_LV".localizedString(), isoCode:"LV",phoneCode:"371", flag:Flag(countryCode: "LV")),
Country(name: "Country_LB".localizedString(), isoCode:"LB",phoneCode:"961", flag:Flag(countryCode: "LB")),
// Country(name: "Country_LS".localizedString(), isoCode:"LS",phoneCode:"266", flag:Flag(countryCode: "LS")),
// Country(name: "Country_LR".localizedString(), isoCode:"LR",phoneCode:"231", flag:Flag(countryCode: "LR")),
// Country(name: "Country_LY".localizedString(), isoCode:"LY",phoneCode:"218", flag:Flag(countryCode: "LY")),
Country(name: "Country_LI".localizedString(), isoCode:"LI",phoneCode:"423", flag:Flag(countryCode: "LI")),
Country(name: "Country_LT".localizedString(), isoCode:"LT",phoneCode:"370", flag:Flag(countryCode: "LT")),
Country(name: "Country_LU".localizedString(), isoCode:"LU",phoneCode:"352", flag:Flag(countryCode: "LU")),
Country(name: "Country_MO".localizedString(), isoCode:"MO",phoneCode:"853", flag:Flag(countryCode: "MO")),
Country(name: "Country_MK".localizedString(), isoCode:"MK",phoneCode:"389", flag:Flag(countryCode: "MK")),
// Country(name: "Country_MG".localizedString(), isoCode:"MG",phoneCode:"261", flag:Flag(countryCode: "MG")),
// Country(name: "Country_MW".localizedString(), isoCode:"MW",phoneCode:"265", flag:Flag(countryCode: "MW")),
Country(name: "Country_MY".localizedString(), isoCode:"MY",phoneCode:"60", flag:Flag(countryCode: "MY")),
// Country(name: "Country_MV".localizedString(), isoCode:"MV",phoneCode:"960", flag:Flag(countryCode: "MV")),
Country(name: "Country_ML".localizedString(), isoCode:"ML",phoneCode:"223", flag:Flag(countryCode: "ML")),
Country(name: "Country_MT".localizedString(), isoCode:"MT",phoneCode:"356", flag:Flag(countryCode: "MT")),
Country(name: "Country_MQ".localizedString(), isoCode:"MQ",phoneCode:"1", flag:Flag(countryCode: "MQ")),
// Country(name: "Country_MR".localizedString(), isoCode:"MR",phoneCode:"222", flag:Flag(countryCode: "MR")),
Country(name: "Country_MU".localizedString(), isoCode:"MU",phoneCode:"230", flag:Flag(countryCode: "MU")),
Country(name: "Country_MX".localizedString(), isoCode:"MX",phoneCode:"52", flag:Flag(countryCode: "MX")),
Country(name: "Country_MD".localizedString(), isoCode:"MD",phoneCode:"373", flag:Flag(countryCode: "MD")),
// Country(name: "Country_MC".localizedString(), isoCode:"MC",phoneCode:"377", flag:Flag(countryCode: "MC")),
// Country(name: "Country_MO".localizedString(), isoCode:"MO",phoneCode:"853", flag:Flag(countryCode: "MO")),
// Country(name: "Country_ME".localizedString(), isoCode:"ME",phoneCode:"382", flag:Flag(countryCode: "ME")),
Country(name: "Country_MS".localizedString(), isoCode:"MS",phoneCode:"1", flag:Flag(countryCode: "MS")),
Country(name: "Country_MA".localizedString(), isoCode:"MA",phoneCode:"212", flag:Flag(countryCode: "MA")),
Country(name: "Country_MZ".localizedString(), isoCode:"MZ",phoneCode:"258", flag:Flag(countryCode: "MZ")),
Country(name: "Country_MM".localizedString(), isoCode:"MM",phoneCode:"95", flag:Flag(countryCode: "MM")),
Country(name: "Country_NA".localizedString(), isoCode:"NA",phoneCode:"264", flag:Flag(countryCode: "NA")),
Country(name: "Country_NP".localizedString(), isoCode:"NP",phoneCode:"977", flag:Flag(countryCode: "NP")),
Country(name: "Country_NL".localizedString(), isoCode:"NL",phoneCode:"31", flag:Flag(countryCode: "NL")),
// Country(name: "Country_AN".localizedString(), isoCode:"AN",phoneCode:"599", flag:Flag(countryCode: "AN")),
// Country(name: "Country_NC".localizedString(), isoCode:"NC",phoneCode:"687", flag:Flag(countryCode: "NC")),
Country(name: "Country_NZ".localizedString(), isoCode:"NZ",phoneCode:"64", flag:Flag(countryCode: "NZ")),
Country(name: "Country_NI".localizedString(), isoCode:"NI",phoneCode:"505", flag:Flag(countryCode: "NI")),
Country(name: "Country_NE".localizedString(), isoCode:"NE",phoneCode:"227", flag:Flag(countryCode: "NE")),
Country(name: "Country_NG".localizedString(), isoCode:"NG",phoneCode:"234", flag:Flag(countryCode: "NG")),
Country(name: "Country_NO".localizedString(), isoCode:"NO",phoneCode:"47", flag:Flag(countryCode: "NO")),
Country(name: "Country_OM".localizedString(), isoCode:"OM",phoneCode:"968", flag:Flag(countryCode: "OM")),
Country(name: "Country_PK".localizedString(), isoCode:"PK",phoneCode:"92", flag:Flag(countryCode: "PK")),
// Country(name: "Country_PW".localizedString(), isoCode:"PW",phoneCode:"680", flag:Flag(countryCode: "PW")),
// Country(name: "Country_PS".localizedString(), isoCode:"PS",phoneCode:"970", flag:Flag(countryCode: "PS")),
Country(name: "Country_PA".localizedString(), isoCode:"PA",phoneCode:"507", flag:Flag(countryCode: "PA")),
Country(name: "Country_PG".localizedString(), isoCode:"PG",phoneCode:"675", flag:Flag(countryCode: "PG")),
Country(name: "Country_PY".localizedString(), isoCode:"PY",phoneCode:"595", flag:Flag(countryCode: "PY")),
Country(name: "Country_PE".localizedString(), isoCode:"PE",phoneCode:"51", flag:Flag(countryCode: "PE")),
Country(name: "Country_PH".localizedString(), isoCode:"PH",phoneCode:"63", flag:Flag(countryCode: "PH")),
Country(name: "Country_PL".localizedString(), isoCode:"PL",phoneCode:"48", flag:Flag(countryCode: "PL")),
Country(name: "Country_PT".localizedString(), isoCode:"PT",phoneCode:"351", flag:Flag(countryCode: "PT")),
Country(name: "Country_PR".localizedString(), isoCode:"PR",phoneCode:"1", flag:Flag(countryCode: "PR")),
Country(name: "Country_QA".localizedString(), isoCode:"QA",phoneCode:"974", flag:Flag(countryCode: "QA")),
// Country(name: "Country_CG".localizedString(), isoCode:"CG",phoneCode:"242", flag:Flag(countryCode: "CG")),
// Country(name: "Country_RE".localizedString(), isoCode:"RE",phoneCode:"262", flag:Flag(countryCode: "RE")),
// Country(name: "Country_RO".localizedString(), isoCode:"RO",phoneCode:"40", flag:Flag(countryCode: "RO")),
Country(name: "Country_RU".localizedString(), isoCode:"RU",phoneCode:"7", flag:Flag(countryCode: "RU")),
Country(name: "Country_RW".localizedString(), isoCode:"RW",phoneCode:"250", flag:Flag(countryCode: "RW")),
Country(name: "Country_KN".localizedString(), isoCode:"KN",phoneCode:"1", flag:Flag(countryCode: "KN")),
Country(name: "Country_LC".localizedString(), isoCode:"LC",phoneCode:"1", flag:Flag(countryCode: "LC")),
Country(name: "Country_VC".localizedString(), isoCode:"VC",phoneCode:"1", flag:Flag(countryCode: "VC")),
// Country(name: "Country_WS".localizedString(), isoCode:"WS",phoneCode:"685", flag:Flag(countryCode: "WS")),
// Country(name: "Country_ST".localizedString(), isoCode:"ST",phoneCode:"239", flag:Flag(countryCode: "ST")),
// Country(name: "Country_SA".localizedString(), isoCode:"SA",phoneCode:"966", flag:Flag(countryCode: "SA")),
Country(name: "Country_SN".localizedString(), isoCode:"SN",phoneCode:"221", flag:Flag(countryCode: "SN")),
Country(name: "Country_RS".localizedString(), isoCode:"RS",phoneCode:"381", flag:Flag(countryCode: "RS")),
// Country(name: "Country_SC".localizedString(), isoCode:"SC",phoneCode:"248", flag:Flag(countryCode: "SC")),
Country(name: "Country_SD".localizedString(), isoCode:"SD",phoneCode:"249", flag:Flag(countryCode: "SD")),
// Country(name: "Country_SL".localizedString(), isoCode:"SL",phoneCode:"232", flag:Flag(countryCode: "SL")),
Country(name: "Country_SG".localizedString(), isoCode:"SG",phoneCode:"65", flag:Flag(countryCode: "SG")),
Country(name: "Country_SK".localizedString(), isoCode:"SK",phoneCode:"421", flag:Flag(countryCode: "SK")),
Country(name: "Country_SI".localizedString(), isoCode:"SI",phoneCode:"386", flag:Flag(countryCode: "SI")),
Country(name: "Country_SB".localizedString(), isoCode:"SB",phoneCode:"677", flag:Flag(countryCode: "SB")),
// Country(name: "Country_SO".localizedString(), isoCode:"SO",phoneCode:"252", flag:Flag(countryCode: "SO")),
Country(name: "Country_ZA".localizedString(), isoCode:"ZA",phoneCode:"27", flag:Flag(countryCode: "ZA")),
Country(name: "Country_KR".localizedString(), isoCode:"KR",phoneCode:"82", flag:Flag(countryCode: "KR")),
// Country(name: "Country_SS".localizedString(), isoCode:"SS",phoneCode:"211", flag:Flag(countryCode: "SS")),
Country(name: "Country_ES".localizedString(), isoCode:"ES",phoneCode:"34", flag:Flag(countryCode: "ES")),
Country(name: "Country_LK".localizedString(), isoCode:"LK",phoneCode:"94", flag:Flag(countryCode: "LK")),
// Country(name: "Country_SR".localizedString(), isoCode:"SR",phoneCode:"597", flag:Flag(countryCode: "SR")),
// Country(name: "Country_SZ".localizedString(), isoCode:"SZ",phoneCode:"268", flag:Flag(countryCode: "SZ")),
Country(name: "Country_SE".localizedString(), isoCode:"SE",phoneCode:"46", flag:Flag(countryCode: "SE")),
Country(name: "Country_CH".localizedString(), isoCode:"CH",phoneCode:"41", flag:Flag(countryCode: "CH")),
Country(name: "Country_TW".localizedString(), isoCode:"TW",phoneCode:"886", flag:Flag(countryCode: "TW")),
Country(name: "Country_TJ".localizedString(), isoCode:"TJ",phoneCode:"992", flag:Flag(countryCode: "TJ")),
Country(name: "Country_TZ".localizedString(), isoCode:"TZ",phoneCode:"255", flag:Flag(countryCode: "TZ")),
Country(name: "Country_TH".localizedString(), isoCode:"TH",phoneCode:"66", flag:Flag(countryCode: "TH")),
Country(name: "Country_TG".localizedString(), isoCode:"TG",phoneCode:"228", flag:Flag(countryCode: "TG")),
// Country(name: "Country_TO".localizedString(), isoCode:"TO",phoneCode:"676", flag:Flag(countryCode: "TO")),
Country(name: "Country_TT".localizedString(), isoCode:"TT",phoneCode:"1", flag:Flag(countryCode: "TT")),
Country(name: "Country_TN".localizedString(), isoCode:"TN",phoneCode:"216", flag:Flag(countryCode: "TN")),
Country(name: "Country_TR".localizedString(), isoCode:"TR",phoneCode:"90", flag:Flag(countryCode: "TR")),
Country(name: "Country_TM".localizedString(), isoCode:"TM",phoneCode:"993", flag:Flag(countryCode: "TM")),
Country(name: "Country_TC".localizedString(), isoCode:"TC",phoneCode:"1", flag:Flag(countryCode: "TC")),
Country(name: "Country_UG".localizedString(), isoCode:"UG",phoneCode:"256", flag:Flag(countryCode: "UG")),
Country(name: "Country_UA".localizedString(), isoCode:"UA",phoneCode:"380", flag:Flag(countryCode: "UA")),
Country(name: "Country_AE".localizedString(), isoCode:"AE",phoneCode:"971", flag:Flag(countryCode: "AE")),
Country(name: "Country_GB".localizedString(), isoCode:"GB",phoneCode:"44", flag:Flag(countryCode: "GB")),
Country(name: "Country_US".localizedString(), isoCode:"US",phoneCode:"1", flag:Flag(countryCode: "US")),
Country(name: "Country_UY".localizedString(), isoCode:"UY",phoneCode:"598", flag:Flag(countryCode: "UY")),
Country(name: "Country_UZ".localizedString(), isoCode:"UZ",phoneCode:"998", flag:Flag(countryCode: "UZ")),
// Country(name: "Country_VU".localizedString(), isoCode:"VU",phoneCode:"678", flag:Flag(countryCode: "VU")),
Country(name: "Country_VE".localizedString(), isoCode:"VE",phoneCode:"58", flag:Flag(countryCode: "VE")),
Country(name: "Country_VN".localizedString(), isoCode:"VN",phoneCode:"84", flag:Flag(countryCode: "VN")),
Country(name: "Country_VG".localizedString(), isoCode:"VG",phoneCode:"1", flag:Flag(countryCode: "VG")),
Country(name: "Country_VI".localizedString(), isoCode:"VI",phoneCode:"1", flag:Flag(countryCode: "VI")),
Country(name: "Country_YE".localizedString(), isoCode:"YE",phoneCode:"967", flag:Flag(countryCode: "YE")),
Country(name: "Country_ZM".localizedString(), isoCode:"ZM",phoneCode:"260", flag:Flag(countryCode: "ZM")),
Country(name: "Country_ZW".localizedString(), isoCode:"ZW",phoneCode:"263", flag:Flag(countryCode: "ZW")),
] ]
} }

View file

@ -88,6 +88,7 @@ class EncounterMessageManager {
if let newPayload = self.advertisedPayload { if let newPayload = self.advertisedPayload {
onComplete(newPayload) onComplete(newPayload)
return
} }
onComplete(nil) onComplete(nil)
} }

View file

@ -30,6 +30,9 @@
<fontDescription key="fontDescription" type="system" pointSize="18"/> <fontDescription key="fontDescription" type="system" pointSize="18"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="FoundIssueWithApp"/>
</userDefinedRuntimeAttributes>
</label> </label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a6i-hw-Hlf" userLabel="Compose Issue View"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a6i-hw-Hlf" userLabel="Compose Issue View">
<rect key="frame" x="0.0" y="53.5" width="359" height="50"/> <rect key="frame" x="0.0" y="53.5" width="359" height="50"/>
@ -46,6 +49,9 @@
<fontDescription key="fontDescription" type="system" pointSize="16"/> <fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" systemColor="placeholderTextColor" red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.29999999999999999" colorSpace="custom" customColorSpace="sRGB"/> <color key="textColor" systemColor="placeholderTextColor" red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.29999999999999999" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="IssueDescPlaceholder"/>
</userDefinedRuntimeAttributes>
</label> </label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZsZ-Vk-6gd" userLabel="Separator View"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZsZ-Vk-6gd" userLabel="Separator View">
<rect key="frame" x="0.0" y="49" width="359" height="1"/> <rect key="frame" x="0.0" y="49" width="359" height="1"/>
@ -77,6 +83,9 @@
<rect key="frame" x="0.0" y="0.0" width="359" height="96.5"/> <rect key="frame" x="0.0" y="0.0" width="359" height="96.5"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/> <fontDescription key="fontDescription" type="system" pointSize="16"/>
<textInputTraits key="textInputTraits" textContentType="email"/> <textInputTraits key="textInputTraits" textContentType="email"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="EmailPlaceholder"/>
</userDefinedRuntimeAttributes>
</textField> </textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Hzk-03-ymA" userLabel="Separator View"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Hzk-03-ymA" userLabel="Separator View">
<rect key="frame" x="0.0" y="98.5" width="359" height="1"/> <rect key="frame" x="0.0" y="98.5" width="359" height="1"/>
@ -90,6 +99,9 @@
<fontDescription key="fontDescription" type="system" pointSize="11"/> <fontDescription key="fontDescription" type="system" pointSize="11"/>
<color key="textColor" systemColor="secondaryLabelColor" red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> <color key="textColor" systemColor="secondaryLabelColor" red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="IssueFooter"/>
</userDefinedRuntimeAttributes>
</label> </label>
</subviews> </subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
@ -135,6 +147,9 @@
<fontDescription key="fontDescription" type="system" pointSize="17"/> <fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="IssueThankYou"/>
</userDefinedRuntimeAttributes>
</label> </label>
</subviews> </subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>

View file

@ -1,12 +0,0 @@
/* Class = "UILabel"; text = "Share your feedback…"; ObjectID = "OZa-NP-7UE"; */
"OZa-NP-7UE.text" = "Share your feedback about COVIDSafe";
/* Class = "UITextView"; text = "."; ObjectID = "f9d-gY-osK"; */
"f9d-gY-osK.text" = ".";
/* Class = "UILabel"; text = "Screenshot"; ObjectID = "gny-Yi-vdL"; */
"gny-Yi-vdL.text" = "Screenshot";
/* Class = "UILabel"; text = "Sending"; ObjectID = "jxY-0S-cFE"; */
"jxY-0S-cFE.text" = "Sending";

View file

@ -29,16 +29,16 @@ final class FeedbackViewController: UIViewController {
} }
private lazy var sendBarButtonItem: UIBarButtonItem = { private lazy var sendBarButtonItem: UIBarButtonItem = {
let item = UIBarButtonItem(title: NSLocalizedString("global_send_button_title", let item = UIBarButtonItem(title: "global_send_button_title".localizedString(comment: "Send Button"),
tableName: "Feedback", style: .done,
bundle: Bundle.main, target: self,
comment: "Send"), style: .done, target: self, action: #selector(sendButtonTapped)) action: #selector(sendButtonTapped))
item.tintColor = .covidCareColor item.tintColor = .covidSafeColor
return item return item
}() }()
private lazy var doneButtonItem: UIBarButtonItem = { private lazy var doneButtonItem: UIBarButtonItem = {
let item = UIBarButtonItem(title: NSLocalizedString("Done", comment: "Done"), style: .done, target: self, action: #selector(doneButtonTapped)) let item = UIBarButtonItem(title: "Done".localizedString(), style: .done, target: self, action: #selector(doneButtonTapped))
item.tintColor = .covidSafeColor item.tintColor = .covidSafeColor
return item return item
}() }()
@ -110,11 +110,7 @@ final class FeedbackViewController: UIViewController {
} }
private func setup() { private func setup() {
self.title = NSLocalizedString("newFeedbackFlow_navigationTitle", self.title = "newFeedbackFlow_navigationTitle".localizedString(comment: "Title for feedback flow navigation")
tableName: "Feedback",
bundle: Bundle.main,
comment: "Title for feedback flow navigation"
)
issueTextView.textContainer.lineFragmentPadding = 0.0 issueTextView.textContainer.lineFragmentPadding = 0.0
setupDelegates() setupDelegates()
@ -148,8 +144,7 @@ final class FeedbackViewController: UIViewController {
@objc private func sendButtonTapped(_ sender: Any) { @objc private func sendButtonTapped(_ sender: Any) {
guard emailTextField.isValid else { guard emailTextField.isValid else {
let errorMessage = NSLocalizedString("newFeedback_invalidEmail_errorMessage",tableName: "Feedback", let errorMessage = "newFeedback_invalidEmail_errorMessage".localizedString(comment: "Please enter a valid email address!")
bundle: Bundle.main, comment: "Please enter a valid email address!")
showErrorMessage(errorMessage) showErrorMessage(errorMessage)
return return
} }
@ -211,11 +206,7 @@ final class FeedbackViewController: UIViewController {
case.error: case.error:
self.state = .idle self.state = .idle
let errorMessage = NSLocalizedString("newFeedback_send_errorMessage", let errorMessage = "newFeedback_send_errorMessage".localizedString(comment: "Generic error message shown when feedback could not be sent")
tableName: "Feedback",
bundle: Bundle.main,
comment: "Generic error message shown when feedback could not be sent"
)
self.showErrorMessage(errorMessage) self.showErrorMessage(errorMessage)
@ -229,10 +220,7 @@ final class FeedbackViewController: UIViewController {
private func showErrorMessage(_ message: String) { private func showErrorMessage(_ message: String) {
let alert = AlertController(title: "COVIDSafe", message: message, preferredStyle: .alert) let alert = AlertController(title: "COVIDSafe", message: message, preferredStyle: .alert)
let okActionTitle = NSLocalizedString("global_ok_button_title", let okActionTitle = "OK".localizedString()
tableName: "Feedback",
bundle: Bundle.main,
comment: "Title for ok button")
let okAction = UIAlertAction(title: okActionTitle, style: .default) let okAction = UIAlertAction(title: okActionTitle, style: .default)
alert.addAction(okAction) alert.addAction(okAction)
present(alert, animated: true) present(alert, animated: true)

View file

@ -115,11 +115,7 @@ extension NewFeedbackFlowController {
// MARK: Factories // MARK: Factories
func createCancelBarButtonItem() -> UIBarButtonItem { func createCancelBarButtonItem() -> UIBarButtonItem {
let buttonTitle = NSLocalizedString("global_cancel_button_title", let buttonTitle = "global_cancel_button_title".localizedString()
tableName: "Feedback",
bundle: Bundle.main,
comment: "Cancel button title"
)
let item = UIBarButtonItem( let item = UIBarButtonItem(
title: buttonTitle, title: buttonTitle,

View file

@ -116,9 +116,7 @@ extension UIViewController {
extension AlertController { extension AlertController {
func addNewFeedbackFlowAction() { func addNewFeedbackFlowAction() {
let title = NSLocalizedString("entryPrompt_newFeedback_button_title", let title = "entryPrompt_newFeedback_button_title".localizedString(
tableName: "Feedback",
bundle: Bundle.main,
comment: "Button title for button that launches new feedback flow" comment: "Button title for button that launches new feedback flow"
) )
self.addDefaultAction(localizedTitle: title) { [weak self] _ in self.addDefaultAction(localizedTitle: title) { [weak self] _ in

View file

@ -22,9 +22,7 @@ extension UIAlertAction {
// MARK: UIAlertController cancel extension // MARK: UIAlertController cancel extension
extension UIAlertController { extension UIAlertController {
func addCancelAction() { func addCancelAction() {
let cancelActionTitle = NSLocalizedString("global_cancel_button_title", let cancelActionTitle = "global_cancel_button_title".localizedString(
tableName: "Feedback",
bundle: Bundle.main,
comment: "Cancel button title" comment: "Cancel button title"
) )
let cancelAction = UIAlertAction(title: cancelActionTitle, style: .cancel, handler: nil) let cancelAction = UIAlertAction(title: cancelActionTitle, style: .cancel, handler: nil)

View file

@ -5,15 +5,11 @@ import UIKit
class ViewControllerFactory { class ViewControllerFactory {
func createPropmtController(_ useCustomTransition: Bool, settings: FeedbackSettings? = nil) -> UIViewController { func createPropmtController(_ useCustomTransition: Bool, settings: FeedbackSettings? = nil) -> UIViewController {
let title = NSLocalizedString("entryPrompt_alert_title", let title = "entryPrompt_alert_title".localizedString(
tableName: "Feedback",
bundle: Bundle.main,
comment: "Title for initial alert when feedback is launched" comment: "Title for initial alert when feedback is launched"
) )
let message = NSLocalizedString("entryPrompt_alert_message", let message = "entryPrompt_alert_message".localizedString(
tableName: "Feedback",
bundle: Bundle.main,
comment: "Prompt message for initial alert when feedback is launched" comment: "Prompt message for initial alert when feedback is launched"
) )

View file

@ -32,7 +32,7 @@ class HelpNavController: UINavigationController {
let feedbackButton = UIButton(type: .system) let feedbackButton = UIButton(type: .system)
feedbackButton.translatesAutoresizingMaskIntoConstraints = false feedbackButton.translatesAutoresizingMaskIntoConstraints = false
feedbackButton.addTarget(self, action: #selector(feedbackButtonPressed(_:)), for: .touchUpInside) feedbackButton.addTarget(self, action: #selector(feedbackButtonPressed(_:)), for: .touchUpInside)
feedbackButton.setTitle(NSLocalizedString("ReportAnIssue", comment: "Report an issue"), feedbackButton.setTitle("ReportAnIssue".localizedString(),
for: .normal) for: .normal)
feedbackButton.titleLabel?.font = .systemFont(ofSize: 18) feedbackButton.titleLabel?.font = .systemFont(ofSize: 18)
feedbackButton.tintColor = .covidSafeColor feedbackButton.tintColor = .covidSafeColor

View file

@ -1,5 +1,6 @@
import UIKit import UIKit
import Lottie import Lottie
import KeychainSwift
import SafariServices import SafariServices
class HomeViewController: UIViewController { class HomeViewController: UIViewController {
@ -47,7 +48,7 @@ class HomeViewController: UIViewController {
let formattedDate = dateFormatterPrint.string(from: lastUpload) let formattedDate = dateFormatterPrint.string(from: lastUpload)
let newAttributedString = NSMutableAttributedString( let newAttributedString = NSMutableAttributedString(
string: String.localizedStringWithFormat( string: String.localizedStringWithFormat(
NSLocalizedString("InformationUploaded", comment: "Information uploaded template"), "InformationUploaded".localizedString(comment: "Information uploaded template"),
formattedDate) formattedDate)
) )
@ -78,6 +79,11 @@ class HomeViewController: UIViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
// this is to show the settings prompt initially if bluetooth is off
if !BluetraceManager.shared.isBluetoothOn() {
BluetraceManager.shared.turnOn()
}
observer = NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [unowned self] notification in observer = NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [unowned self] notification in
self.toggleViews() self.toggleViews()
} }
@ -93,7 +99,7 @@ class HomeViewController: UIViewController {
if let versionNumber = Bundle.main.versionShort, let buildNumber = Bundle.main.version { if let versionNumber = Bundle.main.versionShort, let buildNumber = Bundle.main.version {
self.versionNumberLabel.text = String.localizedStringWithFormat( self.versionNumberLabel.text = String.localizedStringWithFormat(
NSLocalizedString("VersionNumber", comment: "Version number template"), "VersionNumber".localizedString(comment: "Version number template"),
versionNumber,buildNumber versionNumber,buildNumber
) )
} else { } else {
@ -124,6 +130,7 @@ class HomeViewController: UIViewController {
super.viewDidAppear(animated) super.viewDidAppear(animated)
self.lottieBluetoothView?.play() self.lottieBluetoothView?.play()
self.becomeFirstResponder() self.becomeFirstResponder()
self.updateJWTKeychainAccess()
} }
override func viewWillDisappear(_ animated: Bool) { override func viewWillDisappear(_ animated: Bool) {
@ -151,9 +158,20 @@ class HomeViewController: UIViewController {
#endif #endif
} }
func updateJWTKeychainAccess() {
let hasUpdatedKeychainAccess = UserDefaults.standard.bool(forKey: "HasUpdatedKeychainAccess")
if (!hasUpdatedKeychainAccess) {
let keychain = KeychainSwift()
if let jwt = keychain.get("JWT_TOKEN") {
if (keychain.set(jwt, forKey: "JWT_TOKEN", withAccess: .accessibleAfterFirstUnlock)) {
DLog("Updated access class on JWT")
UserDefaults.standard.set(true, forKey: "HasUpdatedKeychainAccess")
}
}
}
}
fileprivate func toggleViews() { fileprivate func toggleViews() {
DispatchQueue.main.async { DispatchQueue.main.async {
UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { [weak self] settings in UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { [weak self] settings in
DispatchQueue.main.async { DispatchQueue.main.async {
@ -216,10 +234,10 @@ class HomeViewController: UIViewController {
self.helpButton.setImage(UIImage(named: "ic-help-selected"), for: .normal) self.helpButton.setImage(UIImage(named: "ic-help-selected"), for: .normal)
self.helpButton.setTitleColor(UIColor.black, for: .normal) self.helpButton.setTitleColor(UIColor.black, for: .normal)
self.homeHeaderInfoText.text = NSLocalizedString("HomeHeaderNoAction", comment: "Header with no action req") self.homeHeaderInfoText.text = "HomeHeaderNoAction".localizedString(comment: "Header with no action req")
if (!self.allPermissionOn) { if (!self.allPermissionOn) {
self.homeHeaderInfoText.text = NSLocalizedString("HomeHeaderPermissions", comment: "Header with check permisisons text") self.homeHeaderInfoText.text = "HomeHeaderPermissions".localizedString(comment: "Header with check permisisons text")
self.homeHeaderView.backgroundColor = UIColor.covidHomePermissionErrorColor self.homeHeaderView.backgroundColor = UIColor.covidHomePermissionErrorColor
} else { } else {
self.homeHeaderView.backgroundColor = UIColor.covidHomeActiveColor self.homeHeaderView.backgroundColor = UIColor.covidHomeActiveColor
@ -229,8 +247,8 @@ class HomeViewController: UIViewController {
} }
fileprivate func toggleBluetoothStatusView() { fileprivate func toggleBluetoothStatusView() {
toggleViewVisibility(view: bluetoothStatusOnView, isVisible: !self.allPermissionOn && self.bluetoothStatusOn) toggleViewVisibility(view: bluetoothStatusOnView, isVisible: !self.bluetoothPermissionOn && self.bluetoothStatusOn)
toggleViewVisibility(view: bluetoothStatusOffView, isVisible: !self.allPermissionOn && !self.bluetoothStatusOn) toggleViewVisibility(view: bluetoothStatusOffView, isVisible: self.bluetoothPermissionOn && !self.bluetoothStatusOn)
} }
fileprivate func toggleBluetoothPermissionStatusView() { fileprivate func toggleBluetoothPermissionStatusView() {
@ -246,10 +264,10 @@ class HomeViewController: UIViewController {
case true: case true:
pushNotificationStatusIcon.isHighlighted = false pushNotificationStatusIcon.isHighlighted = false
pushNotificationStatusTitle.text = NSLocalizedString("NotificationsEnabled", comment: "Notifications Enabled") pushNotificationStatusTitle.text = NSLocalizedString("NotificationsEnabled", comment: "Notifications Enabled")
let newAttributedLabel = NSMutableAttributedString(string: NSLocalizedString("NotificationsEnabledBlurb", comment: "Notifications Enabled content blurb"), attributes: [.font: UIFont.preferredFont(forTextStyle: .caption1)]) let newAttributedLabel = NSMutableAttributedString(string: NSLocalizedString("NotificationsEnabledBlurb", comment: "Notifications Enabled content blurb"), attributes: [.font: UIFont.preferredFont(forTextStyle: .callout)])
//set some attributes //set some attributes
guard let linkRange = newAttributedLabel.string.range(of: NSLocalizedString("NotificationsBlurbLink", comment: "Notifications blurb link")) else { return } guard let linkRange = newAttributedLabel.string.range(of: "NotificationsBlurbLink".localizedString( comment: "Notifications blurb link")) else { return }
let nsRange = NSRange(linkRange, in: newAttributedLabel.string) let nsRange = NSRange(linkRange, in: newAttributedLabel.string)
newAttributedLabel.addAttribute(.foregroundColor, newAttributedLabel.addAttribute(.foregroundColor,
value: UIColor.covidSafeColor, value: UIColor.covidSafeColor,
@ -259,13 +277,12 @@ class HomeViewController: UIViewController {
default: default:
pushNotificationStatusIcon.isHighlighted = true pushNotificationStatusIcon.isHighlighted = true
pushNotificationStatusTitle.text = NSLocalizedString("NotificationsDisabled", comment: "Notifications Enabled") pushNotificationStatusTitle.text = "NotificationsDisabled".localizedString(comment: "Notifications Enabled")
let newAttributedLabel = NSMutableAttributedString(string: let newAttributedLabel = NSMutableAttributedString(string:
NSLocalizedString("NotificationsDisabledBlurb", comment: "Notifications Enabled content blurb"), attributes: [.font: UIFont.preferredFont(forTextStyle: .caption1)]) NSLocalizedString("NotificationsDisabledBlurb", comment: "Notifications Enabled content blurb"), attributes: [.font: UIFont.preferredFont(forTextStyle: .callout)])
//set some attributes //set some attributes
guard let linkRange = newAttributedLabel.string.range(of: guard let linkRange = newAttributedLabel.string.range(of: "NotificationsBlurbLink".localizedString()) else { return }
NSLocalizedString("NotificationsBlurbLink", comment: "Notifications blurb link")) else { return }
let nsRange = NSRange(linkRange, in: newAttributedLabel.string) let nsRange = NSRange(linkRange, in: newAttributedLabel.string)
newAttributedLabel.addAttribute(.foregroundColor, newAttributedLabel.addAttribute(.foregroundColor,
value: UIColor.covidSafeColor, value: UIColor.covidSafeColor,
@ -275,13 +292,24 @@ class HomeViewController: UIViewController {
} }
} }
@IBAction func onSettingsTapped(_ sender: UITapGestureRecognizer) { func attemptTurnOnBluetooth() {
BluetraceManager.shared.toggleScanning(false)
BluetraceManager.shared.turnOn()
}
// MARK: IBActions
@IBAction func onAppSettingsTapped(_ sender: UITapGestureRecognizer) {
guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else {
return return
} }
UIApplication.shared.open(settingsURL) UIApplication.shared.open(settingsURL)
} }
@IBAction func onBluetoothPhoneSettingsTapped(_ sender: Any) {
attemptTurnOnBluetooth()
}
@IBAction func onShareTapped(_ sender: UITapGestureRecognizer) { @IBAction func onShareTapped(_ sender: UITapGestureRecognizer) {
let shareText = TracerRemoteConfig.defaultShareText let shareText = TracerRemoteConfig.defaultShareText
let activity = UIActivityViewController(activityItems: [shareText], applicationActivities: nil) let activity = UIActivityViewController(activityItems: [shareText], applicationActivities: nil)
@ -335,10 +363,6 @@ class HomeViewController: UIViewController {
present(nav, animated: true, completion: nil) present(nav, animated: true, completion: nil)
} }
@IBAction func onPowerSaverButtonTapped(_ sender: Any) {
}
@objc @objc
func appWillResignActive(_ notification: Notification) { func appWillResignActive(_ notification: Notification) {
self.lottieBluetoothView?.stop() self.lottieBluetoothView?.stop()
@ -380,7 +404,7 @@ class HomeViewController: UIViewController {
struct TracerRemoteConfig { struct TracerRemoteConfig {
static let defaultShareText = """ static let defaultShareText = """
\(NSLocalizedString("ShareText", comment: "Share app with friends text")) #COVID19 \("ShareText".localizedString(comment: "Share app with friends text")) #COVID19
#coronavirusaustralia #stayhomesavelives https://covidsafe.gov.au #coronavirusaustralia #stayhomesavelives https://covidsafe.gov.au
""" """
} }

View file

@ -23,14 +23,4 @@ class IsolationSuccessViewController: UIViewController {
@IBAction func doneOntap(_ sender: Any) { @IBAction func doneOntap(_ sender: Any) {
dismiss(animated: true, completion: nil) dismiss(animated: true, completion: nil)
} }
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
} }

View file

@ -87,10 +87,10 @@ class OTPViewController: UIViewController, RegistrationHandler {
var numberWithCountryCode = "Unknown" var numberWithCountryCode = "Unknown"
if let regInfo = registrationInfo { if let regInfo = registrationInfo {
numberWithCountryCode = "+61 \(regInfo.phoneNumber)" numberWithCountryCode = "+\(regInfo.countryPhoneCode ?? "61") \(regInfo.phoneNumber)"
} }
self.titleLabel.text = String.localizedStringWithFormat( self.titleLabel.text = String.localizedStringWithFormat(
NSLocalizedString("EnterPINSent", comment: "Enter the PIN sent template"), numberWithCountryCode "EnterPINSent".localizedString(comment: "Enter the PIN sent template"), numberWithCountryCode
) )
startTimer() startTimer()
} }
@ -130,7 +130,7 @@ class OTPViewController: UIViewController, RegistrationHandler {
countdownFormatted = String(countdown.suffix(from: countdown.index(after: countdown.startIndex))) countdownFormatted = String(countdown.suffix(from: countdown.index(after: countdown.startIndex)))
} }
expiredMessageLabel?.text = String.localizedStringWithFormat( expiredMessageLabel?.text = String.localizedStringWithFormat(
NSLocalizedString("PINWillExpire", comment: "PIN will expire template"), countdownFormatted "PINWillExpire".localizedString(comment: "PIN will expire template"), countdownFormatted
) )
expiredMessageLabel?.isHidden = false expiredMessageLabel?.isHidden = false
if let OTP = codeInputView?.text { if let OTP = codeInputView?.text {
@ -139,7 +139,7 @@ class OTPViewController: UIViewController, RegistrationHandler {
} }
} else { } else {
timer?.invalidate() timer?.invalidate()
expiredMessageLabel?.text = NSLocalizedString("CodeHasExpired", comment: "Your code has expired.") expiredMessageLabel?.text = "CodeHasExpired".localizedString()
expiredMessageLabel?.textColor = UIColor(0xA31919) expiredMessageLabel?.textColor = UIColor(0xA31919)
verifyButton?.isEnabled = false verifyButton?.isEnabled = false
@ -147,26 +147,16 @@ class OTPViewController: UIViewController, RegistrationHandler {
} }
} }
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
private func verifyPhoneNumber(_ phoneNumber: String) { private func verifyPhoneNumber(_ phoneNumber: String) {
guard self.registrationInfo != nil else { guard self.registrationInfo != nil else {
return return
} }
PhoneValidationAPI.verifyPhoneNumber(regInfo: self.registrationInfo!) {[weak self] (session, error) in PhoneValidationAPI.verifyPhoneNumber(regInfo: self.registrationInfo!) {[weak self] (session, error) in
if let error = error { if let error = error {
let errorAlert = UIAlertController(title: NSLocalizedString("PhoneVerificationErrorTitle", comment: "Phone verification error title"), let errorAlert = UIAlertController(title: "PhoneVerificationErrorTitle".localizedString(),
message: NSLocalizedString("PhoneVerificationErrorMessage", comment: "Phone verification error message"), message: "PhoneVerificationErrorMessage".localizedString(),
preferredStyle: .alert) preferredStyle: .alert)
errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "Default action"), style: .default, handler: { _ in errorAlert.addAction(UIAlertAction(title: "OK".localizedString(), style: .default, handler: { _ in
NSLog("Unable to verify phone number") NSLog("Unable to verify phone number")
})) }))
self?.present(errorAlert, animated: true) self?.present(errorAlert, animated: true)
@ -193,19 +183,18 @@ class OTPViewController: UIViewController, RegistrationHandler {
self.navigationController?.popViewController(animated: true) self.navigationController?.popViewController(animated: true)
return return
} }
let numberWithCountryCode = "+61 \(regInfo.phoneNumber)"
let result = PhoneNumberParser.parse(numberWithCountryCode) let result = PhoneNumberParser.parse(regInfo.phoneNumber, countryCode: regInfo.countryPhoneCode ?? "61")
switch result { switch result {
case .success(let parsedNumber): case .success(let parsedNumber):
verifyPhoneNumber(parsedNumber) verifyPhoneNumber(parsedNumber)
case .failure(let error): case .failure(let error):
let errorAlert = UIAlertController(title: NSLocalizedString("PhoneNumberFormatErrorTitle", comment: "Wrong phone format error title"), let errorAlert = UIAlertController(title: "PhoneNumberFormatErrorTitle".localizedString(),
message: NSLocalizedString("PhoneNumberFormatErrorMessage", comment: "Wrong phone format error message"), message: "PhoneNumberFormatErrorMessage".localizedString(),
preferredStyle: .alert) preferredStyle: .alert)
errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "Default action"), style: .default, handler: { _ in errorAlert.addAction(UIAlertAction(title: "OK".localizedString(), style: .default, handler: { _ in
self.navigationController?.popViewController(animated: true) self.navigationController?.popViewController(animated: true)
NSLog("Unable to verify phone number") NSLog("Unable to verify phone number")
})) }))
@ -241,7 +230,8 @@ class OTPViewController: UIViewController, RegistrationHandler {
return return
} }
let keychain = KeychainSwift() let keychain = KeychainSwift()
keychain.set(tokenToStore, forKey: "JWT_TOKEN") keychain.set(tokenToStore, forKey: "JWT_TOKEN", withAccess: .accessibleAfterFirstUnlock)
UserDefaults.standard.set(true, forKey: "HasUpdatedKeychainAccess")
result(.Success) result(.Success)
} }
} }
@ -253,11 +243,11 @@ class OTPViewController: UIViewController, RegistrationHandler {
self.activityIndicator.stopAnimating() self.activityIndicator.stopAnimating()
switch status { switch status {
case .InvalidOTP: case .InvalidOTP:
viewController.errorMessageLabel?.text = NSLocalizedString("InvalidOTP", comment: "Must be a 6-digit code") viewController.errorMessageLabel?.text = "InvalidOTP".localizedString(comment: "Must be a 6-digit code")
self.errorMessageLabel?.isHidden = false self.errorMessageLabel?.isHidden = false
self.codeInputView?.invalidCode = true self.codeInputView?.invalidCode = true
case .WrongOTP: case .WrongOTP:
viewController.errorMessageLabel?.text = NSLocalizedString("WrongOTP", comment: "Wrong PIN entered") viewController.errorMessageLabel?.text = "WrongOTP".localizedString(comment: "Wrong PIN entered")
self.errorMessageLabel?.isHidden = false self.errorMessageLabel?.isHidden = false
self.codeInputView?.invalidCode = true self.codeInputView?.invalidCode = true
case .Success: case .Success:

View file

@ -9,14 +9,5 @@ import UIKit
import SafariServices import SafariServices
class OnboardingStep1ViewController: UIViewController { class OnboardingStep1ViewController: UIViewController {
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
} }

View file

@ -56,14 +56,4 @@ class OnboardingStep1aViewController: UIViewController, UITextViewDelegate {
privacyText.addLink("https://www.health.gov.au/using-our-websites/privacy/privacy-notice-for-covidsafe-app", enclosedIn: "*") privacyText.addLink("https://www.health.gov.au/using-our-websites/privacy/privacy-notice-for-covidsafe-app", enclosedIn: "*")
} }
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
} }

View file

@ -19,15 +19,4 @@ class OnboardingStep1bViewController: UIViewController {
textView.textContainer.lineFragmentPadding = 0.0 textView.textContainer.lineFragmentPadding = 0.0
textView.addLink(URLHelper.getHelpURL(), enclosedIn: "*") textView.addLink(URLHelper.getHelpURL(), enclosedIn: "*")
} }
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
} }

View file

@ -21,17 +21,17 @@ class OnboardingStep2bViewController: UIViewController {
.paragraphStyle: paragraphStyle, .paragraphStyle: paragraphStyle,
.font: UIFont.preferredFont(forTextStyle: .body) .font: UIFont.preferredFont(forTextStyle: .body)
] ]
let pointOneText = NSAttributedString(string: NSLocalizedString("PointOne", comment: "Keep phone on you when you leave home"), let pointOneText = NSAttributedString(string: NSLocalizedString("OS2b_Item1", comment: "Keep phone on you when you leave home"),
attributes: labelAtt) attributes: labelAtt)
pointOneLabel.attributedText = pointOneText pointOneLabel.attributedText = pointOneText
let pointTwoText = NSAttributedString(string: NSLocalizedString("PointTwo", comment: "Keep bluetooth turned on"), let pointTwoText = NSAttributedString(string: NSLocalizedString("OS2b_Item2", comment: "Keep bluetooth turned on"),
attributes: labelAtt) attributes: labelAtt)
pointTwoLabel.attributedText = pointTwoText pointTwoLabel.attributedText = pointTwoText
let pointThreeText = NSMutableAttributedString(string: NSLocalizedString("PointThree", comment: "COVIDSafe does NOT send pairing requests"), let pointThreeText = NSMutableAttributedString(string: NSLocalizedString("OS2b_Item3", comment: "COVIDSafe does NOT send pairing requests"),
attributes: labelAtt) attributes: labelAtt)
let learnMoreRange = pointThreeText.string.range(of: NSLocalizedString("PointThreeUnderline", comment: "Text that should be underlined from PointThree"))! let learnMoreRange = pointThreeText.string.range(of: NSLocalizedString("OS2b_Item3Underline", comment: "Text that should be underlined from PointThree"))!
let nsRange = NSRange(learnMoreRange, in: pointThreeText.string) let nsRange = NSRange(learnMoreRange, in: pointThreeText.string)
pointThreeText.addAttributes([.underlineStyle: NSUnderlineStyle.single.rawValue, .foregroundColor: UIColor.covidSafeColor], range: nsRange) pointThreeText.addAttributes([.underlineStyle: NSUnderlineStyle.single.rawValue, .foregroundColor: UIColor.covidSafeColor], range: nsRange)
pointThreeLabel.attributedText = pointThreeText pointThreeLabel.attributedText = pointThreeText

View file

@ -83,7 +83,13 @@ extension PeripheralController: CBPeripheralManagerDelegate {
DLog("\(["request": request] as AnyObject)") DLog("\(["request": request] as AnyObject)")
EncounterMessageManager.shared.getAdvertisementPayload { (payloadToAdvertise) in EncounterMessageManager.shared.getAdvertisementPayload { (payloadToAdvertise) in
if let payload = payloadToAdvertise { if let payload = payloadToAdvertise {
request.value = payload // check offset
if request.offset > payload.count {
peripheral.respond(to: request, withResult: .invalidOffset)
return;
}
request.value = payload.advanced(by: request.offset)
peripheral.respond(to: request, withResult: .success) peripheral.respond(to: request, withResult: .success)
} else { } else {
DLog("Error getting payload to advertise") DLog("Error getting payload to advertise")

View file

@ -46,7 +46,7 @@ class PersonalDetailsViewController: UIViewController, UITextFieldDelegate, UIPi
let toolBar = UIToolbar() let toolBar = UIToolbar()
toolBar.sizeToFit() toolBar.sizeToFit()
self.nextBarButtonItem = UIBarButtonItem(title: NSLocalizedString("Done", comment: "Done"), self.nextBarButtonItem = UIBarButtonItem(title: "Done".localizedString(),
style: .plain, style: .plain,
target: self, target: self,
action: #selector(self.nextButtonTapped)) action: #selector(self.nextButtonTapped))
@ -202,7 +202,7 @@ class PersonalDetailsViewController: UIViewController, UITextFieldDelegate, UIPi
func textFieldDidBeginEditing(_ textField: UITextField) { func textFieldDidBeginEditing(_ textField: UITextField) {
if (textField == firstnameTextField || textField == postcodeTextField) { if (textField == firstnameTextField || textField == postcodeTextField) {
nextBarButtonItem?.title = NSLocalizedString("Done", comment: "Done") nextBarButtonItem?.title = "Done".localizedString()
if(UIAccessibility.isVoiceOverRunning) { if(UIAccessibility.isVoiceOverRunning) {
firstnameTextField.isAccessibilityElement = true firstnameTextField.isAccessibilityElement = true
postcodeTextField.isAccessibilityElement = true postcodeTextField.isAccessibilityElement = true
@ -232,7 +232,7 @@ class PersonalDetailsViewController: UIViewController, UITextFieldDelegate, UIPi
ageTextField.isAccessibilityElement = false ageTextField.isAccessibilityElement = false
UIAccessibility.post(notification: .screenChanged, argument: agePicker) UIAccessibility.post(notification: .screenChanged, argument: agePicker)
} }
nextBarButtonItem?.title = NSLocalizedString("Next", comment: "Next") nextBarButtonItem?.title = "Next".localizedString()
} }
} }
@ -270,10 +270,10 @@ class PersonalDetailsViewController: UIViewController, UITextFieldDelegate, UIPi
} }
func presentValidationError(error: String, fieldToFocus: UITextField) { func presentValidationError(error: String, fieldToFocus: UITextField) {
let errorAlert = UIAlertController(title: NSLocalizedString("ValidationError", comment: "Validation error"), let errorAlert = UIAlertController(title: "ValidationError".localizedString(comment: "Validation error"),
message: error, message: error,
preferredStyle: .alert) preferredStyle: .alert)
errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "OK"), errorAlert.addAction(UIAlertAction(title: "OK".localizedString(),
style: .default, style: .default,
handler: { _ in handler: { _ in
fieldToFocus.becomeFirstResponder() fieldToFocus.becomeFirstResponder()
@ -303,7 +303,7 @@ class PersonalDetailsViewController: UIViewController, UITextFieldDelegate, UIPi
return return
} }
guard postCode.range(of: #"^(0[2|8|9]|[1-9][0-9])\d{2}$"#, options: .regularExpression) != nil else { guard postCode.range(of: #"^(0[2|8|9]|[1-9][0-9])\d{2}$"#, options: .regularExpression) != nil else {
presentValidationError(error: NSLocalizedString("PostcodeValidationErrorMessage", comment: "Please enter a valid postcode"), presentValidationError(error: "PostcodeValidationErrorMessage".localizedString(comment: "Please enter a valid postcode"),
fieldToFocus: postcodeTextField) fieldToFocus: postcodeTextField)
return return
} }

View file

@ -5,8 +5,11 @@ import Foundation
final class PhoneNumberParser { final class PhoneNumberParser {
// e.g. 412 345 678 // e.g. 412 345 678
static let numberOfDigits = 9 static let numberOfDigitsAu = 9
static let mobilePhoneNumberPrefix = "4" static let minNumberOfDigitsNorfolkIsland = 5
static let maxNumberOfDigitsNorfolkIsland = 6
static let mobilePhoneNumberNorfolkIslandPrefix = "3"
static let mobilePhoneNumberAuPrefix = "4"
enum Error: Swift.Error { enum Error: Swift.Error {
case notDigits case notDigits
@ -14,10 +17,11 @@ final class PhoneNumberParser {
case incorrectMobilePhoneNumberPrefix case incorrectMobilePhoneNumberPrefix
} }
static func parse(_ string: String) -> Result<String, Error> { static func parse(_ string: String, countryCode: String) -> Result<String, Error> {
// Remove all spaces // Remove all spaces
var string = string.replacingOccurrences(of: " ", with: "") var string = string.replacingOccurrences(of: " ", with: "")
if countryCode == "61" {
// Remove leading "+61" // Remove leading "+61"
if string.hasPrefix("+61") { if string.hasPrefix("+61") {
string.removeFirst(3) string.removeFirst(3)
@ -33,15 +37,47 @@ final class PhoneNumberParser {
string.removeFirst() string.removeFirst()
} }
guard string.hasPrefix(mobilePhoneNumberPrefix) else { guard string.hasPrefix(mobilePhoneNumberAuPrefix) else {
return .failure(.incorrectMobilePhoneNumberPrefix) return .failure(.incorrectMobilePhoneNumberPrefix)
} }
// Check number of digits // Check number of digits
guard string.count == Self.numberOfDigits else { guard string.count == Self.numberOfDigitsAu else {
return .failure(.incorrectDigitCount) return .failure(.incorrectDigitCount)
} }
return .success(string)
}
if countryCode == "672" {
// Remove leading "+672"
if string.hasPrefix("+672") {
string.removeFirst(4)
}
// Check for digit only
guard string.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil else {
return .failure(.notDigits)
}
// Check number of digits
guard string.count >= self.minNumberOfDigitsNorfolkIsland && string.count <= self.maxNumberOfDigitsNorfolkIsland else {
return .failure(.incorrectDigitCount)
}
if string.count == self.maxNumberOfDigitsNorfolkIsland && !string.hasPrefix(mobilePhoneNumberNorfolkIslandPrefix) {
return .failure(.incorrectMobilePhoneNumberPrefix)
}
return .success(string)
}
// remove country code if present in the phone number
if string.hasPrefix("+\(countryCode)") {
string.removeFirst(countryCode.count+1)
}
return .success(string) return .success(string)
} }
} }

View file

@ -1,20 +1,28 @@
// Copyright © 2020 Australian Government All rights reserved. // Copyright © 2020 Australian Government All rights reserved.
import SafariServices import SafariServices
import UIKit import UIKit
import FlagKit
class PhoneNumberViewController: UIViewController, UITextFieldDelegate, RegistrationHandler { class PhoneNumberViewController: UIViewController, UITextFieldDelegate, RegistrationHandler, CountrySelectionDelegate {
@IBOutlet weak var phoneNumberField: UITextField! @IBOutlet weak var phoneNumberField: UITextField!
@IBOutlet weak var countryCodeField: UITextField!
@IBOutlet weak var getOTPButton: UIButton! @IBOutlet weak var getOTPButton: UIButton!
@IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var phoneExample: UILabel!
@IBOutlet weak var phoneError: UILabel!
@IBOutlet weak var phoneLabel: UILabel!
var countryFlagContainerView: UIView!
var flagImageView: UIImageView!
let PHONE_NUMBER_LENGTH = 17 // e.g. "+61 4 12 345 678 " if text is auto-pasted from text message let PHONE_NUMBER_LENGTH = 17 // e.g. "+61 4 12 345 678 " if text is auto-pasted from text message
@IBOutlet weak var activityIndicator: UIActivityIndicatorView! @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
@IBOutlet weak var ausPhoneNumberButton: UIButton! var selectedCountry: Country?
var selectedCountry: String? = "Australia"
var countryList: [String] = CountriesData.countryArray var countryList: [String] = CountriesData.countryArray
// If this view is part of the reauthentiation flow of an expired JWT // If this view is part of the reauthentiation flow of an expired JWT
var reauthenticating: Bool = false var reauthenticating: Bool = false
var registrationInfo: RegistrationRequest? var registrationInfo: RegistrationRequest?
var initialLabelTextColour: UIColor?
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
@ -23,26 +31,31 @@ class PhoneNumberViewController: UIViewController, UITextFieldDelegate, Registra
phoneNumberField.delegate = self phoneNumberField.delegate = self
dismissKeyboardOnTap() dismissKeyboardOnTap()
if (reauthenticating) { if (reauthenticating) {
self.titleLabel.text = NSLocalizedString("EnterPhoneReVerify", comment: "Enter your mobile number to re-verify") self.titleLabel.text = "EnterPhoneReVerify".localizedString(comment: "Enter your mobile number to re-verify")
} }
let ausNumberAtt: [NSAttributedString.Key : Any] = [ countryCodeField.text = "(+61) " + "Country_AU".localizedString()
.font: UIFont.preferredFont(forTextStyle: .body), countryCodeField.accessibilityValue = "(+61) " + "Country_AU".localizedString() + " is selected"
.foregroundColor: UIColor.covidSafeColor,
.underlineStyle: NSUnderlineStyle.single.rawValue
]
let ausNumberButtonText = NSAttributedString(string: NSLocalizedString("AusPhoneNumberButton", comment: "Link to help page about using an australian phone number"),
attributes: ausNumberAtt)
self.ausPhoneNumberButton.setAttributedTitle(ausNumberButtonText, for: .normal)
} // Set initial Country img
countryFlagContainerView = UIView(frame: CGRect(x: 0, y: 0, width: 60, height: 24))
let flag = Flag(countryCode: "AU")!
let flagImage = flag.originalImage
flagImageView = UIImageView(frame: CGRect(x: 0, y: 2, width: 28, height: 20))
flagImageView.contentMode = .scaleAspectFit
flagImageView.image = flagImage
countryFlagContainerView.addSubview(flagImageView)
// Set View
let chevronImg = UIImage(named: "ChevronRight")
let chevronImgView = UIImageView(frame: CGRect(x: 32, y: 0, width: 24, height: 24))
chevronImgView.image = chevronImg
countryFlagContainerView.addSubview(chevronImgView)
override func viewWillAppear(_ animated: Bool) { countryCodeField.rightView = countryFlagContainerView
super.viewWillAppear(animated) countryCodeField.rightViewMode = .always
self.phoneNumberField.becomeFirstResponder() countryCodeField.delegate = self
}
override func viewDidAppear(_ animated: Bool) { initialLabelTextColour = phoneLabel.textColor
super.viewDidAppear(animated) navigationController?.view.backgroundColor = UIColor.white
} }
@IBAction func onBackTapped(_ sender: UIButton) { @IBAction func onBackTapped(_ sender: UIButton) {
@ -53,20 +66,11 @@ class PhoneNumberViewController: UIViewController, UITextFieldDelegate, Registra
parsePhoneNumberAndProceed(self.phoneNumberField.text ?? "") parsePhoneNumberAndProceed(self.phoneNumberField.text ?? "")
} }
@IBAction func onAustralianNumberPressed(_ sender: UIButton) {
guard let url = URL(string: URLHelper.getAustralianNumberURL()) else {
DLog("Failed to get Aus number URL")
return
}
let safariVC = SFSafariViewController(url: url)
present(safariVC, animated: true, completion: nil)
}
@objc @objc
func phoneNumberFieldDidChange() { func phoneNumberFieldDidChange() {
guard let phoneNumberString = self.phoneNumberField.text else { return } guard let phoneNumberString = self.phoneNumberField.text else { return }
if (selectedCountry == "Australia") { if (selectedCountry == nil || selectedCountry?.name == "Australia") {
let result = PhoneNumberParser.parse(phoneNumberString) let result = PhoneNumberParser.parse(phoneNumberString, countryCode: "61")
if case .success = result { if case .success = result {
self.phoneNumberField.resignFirstResponder() self.phoneNumberField.resignFirstResponder()
} }
@ -74,7 +78,7 @@ class PhoneNumberViewController: UIViewController, UITextFieldDelegate, Registra
} }
func parsePhoneNumberAndProceed(_ number: String) { func parsePhoneNumberAndProceed(_ number: String) {
let result = PhoneNumberParser.parse(number) let result = PhoneNumberParser.parse(number, countryCode: selectedCountry?.phoneCode ?? "61")
switch result { switch result {
case .success(let parsedNumber): case .success(let parsedNumber):
@ -83,10 +87,10 @@ class PhoneNumberViewController: UIViewController, UITextFieldDelegate, Registra
verifyPhoneNumber(parsedNumber) verifyPhoneNumber(parsedNumber)
case .failure(let error): case .failure(let error):
let errorAlert = UIAlertController(title: NSLocalizedString("PhoneNumberFormatErrorTitle", comment: "Wrong phone format error title"), let errorAlert = UIAlertController(title: "PhoneNumberFormatErrorTitle".localizedString(),
message: NSLocalizedString("PhoneNumberFormatErrorMessage", comment: "Wrong phone format error message"), message: "PhoneNumberFormatErrorMessage".localizedString(),
preferredStyle: .alert) preferredStyle: .alert)
errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "Default action"), style: .default, handler: { _ in errorAlert.addAction(UIAlertAction(title: "OK".localizedString(), style: .default, handler: { _ in
NSLog("Unable to verify phone number") NSLog("Unable to verify phone number")
})) }))
present(errorAlert, animated: true) present(errorAlert, animated: true)
@ -100,13 +104,15 @@ class PhoneNumberViewController: UIViewController, UITextFieldDelegate, Registra
return return
} }
self.registrationInfo?.phoneNumber = phoneNumber self.registrationInfo?.phoneNumber = phoneNumber
self.registrationInfo?.countryPhoneCode = selectedCountry?.phoneCode ?? "61"
PhoneValidationAPI.verifyPhoneNumber(regInfo: self.registrationInfo!) {[weak self] (session, error) in PhoneValidationAPI.verifyPhoneNumber(regInfo: self.registrationInfo!) {[weak self] (session, error) in
self?.activityIndicator.stopAnimating() self?.activityIndicator.stopAnimating()
self?.getOTPButton.isEnabled = true self?.getOTPButton.isEnabled = true
if let error = error { if let error = error {
let errorAlert = UIAlertController(title: NSLocalizedString("PhoneVerificationErrorTitle", comment: "Phone verification error title"), let errorAlert = UIAlertController(title: "PhoneVerificationErrorTitle".localizedString(),
message: NSLocalizedString("PhoneVerificationErrorMessage", comment: "Phone verification error message"), preferredStyle: .alert) message: "PhoneVerificationErrorMessage".localizedString(),
errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "Default action"), style: .default, handler: { _ in preferredStyle: .alert)
errorAlert.addAction(UIAlertAction(title: "OK".localizedString(), style: .default, handler: { _ in
DLog("Unable to verify phone number") DLog("Unable to verify phone number")
})) }))
self?.present(errorAlert, animated: true) self?.present(errorAlert, animated: true)
@ -123,6 +129,10 @@ class PhoneNumberViewController: UIViewController, UITextFieldDelegate, Registra
vc.reauthenticating = self.reauthenticating vc.reauthenticating = self.reauthenticating
vc.registrationInfo = self.registrationInfo vc.registrationInfo = self.registrationInfo
} }
if let vc = segue.destination as? SelectCountryViewController {
navigationController?.setNavigationBarHidden(false, animated: false)
vc.countrySelectionDelegate = self
}
} }
// limit text field input to 17 characters // limit text field input to 17 characters
@ -136,8 +146,74 @@ class PhoneNumberViewController: UIViewController, UITextFieldDelegate, Registra
return newString.length <= maxLength return newString.length <= maxLength
} }
func textFieldDidEndEditing(_ textField: UITextField) {
if textField == phoneNumberField {
validatePhoneNumber()
}
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == countryCodeField {
phoneNumberField.resignFirstResponder()
performSegue(withIdentifier: "selectCountrySegue", sender: self)
return false
}
return true
}
@objc func action() { @objc func action() {
view.endEditing(true) view.endEditing(true)
} }
func setCountry(country: Country) {
selectedCountry = country
flagImageView.image = selectedCountry?.flag?.originalImage
guard let countryName = country.name, let countryPhoneCode = country.phoneCode else {
return
}
countryCodeField.text = "(+\(countryPhoneCode)) \(countryName)"
countryCodeField.accessibilityValue = "(+\(countryPhoneCode)) \(countryName) is selected"
if selectedCountry?.isoCode == "AU2" {
phoneExample.isHidden = false
} else {
phoneExample.isHidden = true
}
validatePhoneNumber()
}
func validatePhoneNumber() {
phoneExample.textColor = initialLabelTextColour
phoneLabel.textColor = initialLabelTextColour
phoneNumberField.borderWidth = 0
phoneError.isHidden = true
let countryCode = selectedCountry?.phoneCode ?? "61"
guard let phoneText = phoneNumberField.text, phoneText.count > 0 else {
return
}
let parseResult = PhoneNumberParser.parse(phoneText, countryCode: countryCode)
switch parseResult {
case .failure( _):
phoneError.isHidden = false
phoneExample.textColor = UIColor.covidSafeErrorColor
phoneLabel.textColor = UIColor.covidSafeErrorColor
phoneNumberField.borderWidth = 1
if selectedCountry == nil || selectedCountry?.isoCode == "AU" {
phoneError.text = "AustralianPhoneValidationError".localizedString()
} else if selectedCountry?.isoCode == "AU2" {
phoneError.text = "NorfolkPhoneValidationError".localizedString()
}
break
default:
break
}
}
}
protocol CountrySelectionDelegate {
func setCountry(country: Country)
} }

View file

@ -9,13 +9,13 @@ struct PushNotificationConstants {
// Bluetooth Status // Bluetooth Status
static let btStatusPushNotifContents = [ static let btStatusPushNotifContents = [
[ [
"contentTitle": "COVIDSafe is currently inactive", "contentTitle": "PN_BluetoothStatusTitle".localizedString(),
"contentBody": "Make sure it's active before you leave home and when in public places by enabling Bluetooth®" "contentBody": "PN_BluetoothStatusBody".localizedString()
] ]
] ]
static let reminderPushNotifContents = [ static let reminderPushNotifContents = [
"contentTitle": "Reminder: COVIDSafe app has not been active in the past 48 hours", "contentTitle": "PN_ReminderTitle".localizedString(),
"contentBody": "Tap to open the app and keep Bluetooth enabled." "contentBody": "PN_ReminderBody".localizedString()
] ]
} }

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,213 @@
//
// SelectCountryViewController.swift
// CovidSafe
//
// Copyright © 2020 Australian Government. All rights reserved.
//
import UIKit
import FlagKit
import SafariServices
struct Country {
var name: String!
var isoCode: String!
var phoneCode: String!
var flag: Flag?
}
class SelectCountryViewController: UITableViewController, UISearchResultsUpdating {
let searchController = UISearchController(searchResultsController: nil)
let AU_OPTIONS_KEY = "OptionsForAustralia"
var countriesTableData: Dictionary<String, [Country]> = [:]
let countriesSortedByName = CountriesData.countries.sorted(by: { (country1, country2) -> Bool in
country1.name < country2.name
})
var filteredCountriesTableData: [Country] = []
var countrySelectionDelegate: CountrySelectionDelegate?
var countriesSectionTitles: [String] = []
var isSearchBarEmpty = true
var isFiltering: Bool {
return searchController.isActive && !isSearchBarEmpty
}
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel()
label.text = "SelectCountryTitle".localizedString()
label.font = UIFont.preferredFont(forTextStyle: .headline)
self.navigationItem.titleView = label
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
definesPresentationContext = true
navigationController?.navigationBar.isTranslucent = false
navigationController?.navigationBar.barTintColor = UIColor.white
//Set search bar
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
automaticallyAdjustsScrollViewInsets = false
}
// Create the data source of the countries table
let norfolkIslandCountry = Country(name: "Country_AU2".localizedString(), isoCode: "AU2", phoneCode: "672", flag: Flag(countryCode: "AU"))
let australiaCountry = Country(name: "Country_AU".localizedString(), isoCode: "AU", phoneCode: "61", flag: Flag(countryCode: "AU"))
countriesTableData.updateValue([australiaCountry, norfolkIslandCountry], forKey: AU_OPTIONS_KEY)
countriesSectionTitles.append(" ")
for country in countriesSortedByName {
let initial = String(country.name[country.name.startIndex])
var sectionCountries: [Country] = countriesTableData[initial] ?? []
if sectionCountries.count == 0 {
countriesSectionTitles.append(initial)
}
sectionCountries.append(country)
countriesTableData.updateValue(sectionCountries, forKey: initial)
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//this is to show the search bar initially
if #available(iOS 11.0, *) {
navigationItem.hidesSearchBarWhenScrolling = false
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if #available(iOS 11.0, *) {
if !UIAccessibility.isVoiceOverRunning {
navigationItem.hidesSearchBarWhenScrolling = true
}
}
if UIAccessibility.isVoiceOverRunning {
UIAccessibility.post(notification: .layoutChanged, argument: self.navigationItem.titleView )
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.setNavigationBarHidden(true, animated: false)
}
func updateSearchResults(for searchController: UISearchController) {
let searchBar = searchController.searchBar
let searchBarText = searchBar.text?.lowercased() ?? ""
if (searchBarText == "") {
isSearchBarEmpty = true
filteredCountriesTableData = []
tableView.reloadData()
return
}
isSearchBarEmpty = false
filteredCountriesTableData = countriesSortedByName.filter({ (country) -> Bool in
let countryName = country.name.lowercased()
let searchCriteria = searchBarText.lowercased()
if countryName.contains(searchCriteria) {
return true
}
return false
})
tableView.reloadData()
}
override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
if !isFiltering {
return countriesSectionTitles
}
return nil
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var country: Country
if !isFiltering {
var sectionIndex = AU_OPTIONS_KEY
if indexPath.section > 0 {
sectionIndex = countriesSectionTitles[indexPath.section]
}
guard let sectionCountries = countriesTableData[sectionIndex] else {
return
}
country = sectionCountries[indexPath.row]
} else {
country = filteredCountriesTableData[indexPath.row]
}
countrySelectionDelegate?.setCountry(country: country)
navigationController?.setNavigationBarHidden(true, animated: false)
self.navigationController?.popViewController(animated: true)
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if !isFiltering {
if section == 0 {
return "AustraliaSectionTitle".localizedString()
}
return countriesSectionTitles[section]
} else {
return nil
}
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if !isFiltering {
var sectionIndex = AU_OPTIONS_KEY
if section > 0 {
sectionIndex = countriesSectionTitles[section]
}
return countriesTableData[sectionIndex]?.count ?? 0
} else {
return filteredCountriesTableData.count
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
if !isFiltering {
return countriesSectionTitles.count
} else {
return 1
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CountryCell", for: indexPath) as! CountryCellViewCell
var country: Country
if !isFiltering {
var sectionIndex = AU_OPTIONS_KEY
if indexPath.section > 0 {
sectionIndex = countriesSectionTitles[indexPath.section]
}
guard let sectionCountries = countriesTableData[sectionIndex] else {
return cell
}
country = sectionCountries[indexPath.row]
} else {
country = filteredCountriesTableData[indexPath.row]
}
cell.countryTitleLabel.text = country.name
cell.countryPhoneLabel.text = "+\(country.phoneCode ?? "")"
cell.countryFlagImageView.image = country.flag?.originalImage
return cell
}
}
class CountryCellViewCell: UITableViewCell {
@IBOutlet weak var countryTitleLabel: UILabel!
@IBOutlet weak var countryPhoneLabel: UILabel!
@IBOutlet weak var countryFlagImageView: UIImageView!
}

View file

@ -0,0 +1,17 @@
//
// String+Localization.swift
// CovidSafe
//
// Copyright © 2020 Australian Government. All rights reserved.
//
import Foundation
extension String {
func localizedString( comment: String = "") -> String {
if self == "" {
return ""
}
return NSLocalizedString(self, comment: comment)
}
}

View file

@ -0,0 +1,93 @@
//
// UILocalization.swift
// CovidSafe
//
// Copyright © 2020 Australian Government. All rights reserved.
//
import UIKit
import Foundation
extension UILabel {
static var localizedKey:UInt8 = 0
@IBInspectable public var localizationKey: String? {
set {
objc_setAssociatedObject(self, &UILabel.localizedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
get {
return objc_getAssociatedObject(self, &UILabel.localizedKey) as? String
}
}
open override func awakeFromNib() {
super.awakeFromNib()
guard let localizationKey = self.localizationKey, localizationKey != localizationKey.localizedString() else {
return
}
self.text = localizationKey.localizedString()
}
}
extension UITextView {
static var localizedKey:UInt8 = 0
@IBInspectable public var localizationKey: String? {
set {
objc_setAssociatedObject(self, &UITextView.localizedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
get {
return objc_getAssociatedObject(self, &UITextView.localizedKey) as? String
}
}
open override func awakeFromNib() {
super.awakeFromNib()
guard let localizationKey = self.localizationKey, localizationKey != localizationKey.localizedString() else {
return
}
self.text = localizationKey.localizedString()
}
}
extension UITextField {
static var localizedKey:UInt8 = 0
@IBInspectable public var localizationKey: String? {
set {
objc_setAssociatedObject(self, &UITextView.localizedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
get {
return objc_getAssociatedObject(self, &UITextView.localizedKey) as? String
}
}
open override func awakeFromNib() {
super.awakeFromNib()
guard let localizationKey = self.localizationKey, localizationKey != localizationKey.localizedString() else {
return
}
self.placeholder = localizationKey.localizedString()
}
}
extension UIButton {
static var localizedKey:UInt8 = 0
@IBInspectable public var localizationKey: String? {
set {
objc_setAssociatedObject(self, &UITextView.localizedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
get {
return objc_getAssociatedObject(self, &UITextView.localizedKey) as? String
}
}
open override func awakeFromNib() {
super.awakeFromNib()
guard let localizationKey = self.localizationKey, localizationKey != localizationKey.localizedString() else {
return
}
self.setTitle(localizationKey.localizedString(), for: .normal)
}
}

View file

@ -32,8 +32,8 @@ class UploadDataStep2VC: UIViewController, CodeInputViewDelegate {
var currentKeyboardFrame: CGRect? var currentKeyboardFrame: CGRect?
var uploadAnimatedView: AnimationView? var uploadAnimatedView: AnimationView?
let uploadFailErrMsg = NSLocalizedString("UploadFailed", comment: "Upload failed. Please try again later.") let uploadFailErrMsg = "UploadFailed".localizedString(comment: "Upload failed. Please try again later.")
let invalidPinErrMsg = NSLocalizedString("InvalidPIN", comment: "Invalid PIN, please ask health official to send another PIN.") let invalidPinErrMsg = "InvalidPIN".localizedString(comment: "Invalid PIN, please ask health official to send another PIN.")
let verifyEnabledColor = UIColor.covidSafeButtonDarkerColor let verifyEnabledColor = UIColor.covidSafeButtonDarkerColor
let verifyDisabledColor = UIColor(red: 219/255.0, green: 221/255.0, blue: 221.0/255.0, alpha: 1.0) let verifyDisabledColor = UIColor(red: 219/255.0, green: 221/255.0, blue: 221.0/255.0, alpha: 1.0)
@ -165,10 +165,10 @@ class UploadDataStep2VC: UIViewController, CodeInputViewDelegate {
} }
func displayUploadDataError() { func displayUploadDataError() {
let errorAlert = UIAlertController(title: NSLocalizedString("UploadFailedErrorTitle", comment: "Upload Failed"), let errorAlert = UIAlertController(title: "UploadFailedErrorTitle".localizedString(),
message: NSLocalizedString("UploadFailedErrorMessage", comment: "Please try again later."), message: "UploadFailedErrorMessage".localizedString(),
preferredStyle: .alert) preferredStyle: .alert)
errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "OK"), style: .default, handler: nil)) errorAlert.addAction(UIAlertAction(title: "OK".localizedString(), style: .default, handler: nil))
self.present(errorAlert, animated: true) self.present(errorAlert, animated: true)
} }

View file

@ -0,0 +1,7 @@
/*
InfoPlist.strings
CovidSafe
Copyright © 2020 Australian Government. All rights reserved.
*/
"BluetoothUsageDesc" = "COVIDSafe exchanges Bluetooth® signals with nearby phones running the same app. These signals contain an anonymised ID, which is encrypted and changes continually to ensure your privacy.";

View file

@ -7,6 +7,100 @@
//Global //Global
"OK" = "OK"; "OK" = "OK";
// Initial Screen View Controller
"IntroLabel" = "Help stop the spread\nand save lives.";
//Migration View Controller
"MigrationLabel" = "COVIDSafe update is in progress.\n\nPlease make sure your phone is not switched off until the update is complete.";
// Onboarding Step 1 View Controller
"OS1_Title" = "Together we can stop the spread of COVID-19";
"OS1_Content1" = "COVIDSafe has been developed by the Australian Government to help keep the community safe from the spread of coronavirus.
COVIDSafe will securely note contact that you have with other users of the app. This will allow state or territory health officials to contact you, if you have been in close contact with someone who has tested positive to the virus.
Together we can help stop the spread and stay healthy.";
"OS1_Button" = "I want to help";
// Onboarding Step 1b View Controller
"OS1b_Title" = "How COVIDSafe works";
"OS1b_TopParagraph" = "Bluetooth® signals are used to determine when you're near another COVIDSafe user.";
"OS1b_Content" = "Every instance of close contact between you and other COVIDSafe users is noted to create close contact information. This information is encrypted and only stored in your phone.
If you test positive to COVID-19 as a COVIDSafe user, a state or territory health official will contact you. They will assist with voluntary upload of your close contact information to a highly secure information storage system.
State or territory health officials can also contact you if you came in close contact with another COVIDSafe user who tested positive.
For more information please refer to the *Help Topics* page.";
"OS1b_Button" = "Next";
// Onboarding Step 1a View Controller
"OS1a_Title" = "Registration and privacy";
"OS1a_Content" = "It is important that you read the COVIDSafe *privacy policy* before you register for COVIDSafe.
If you are under 16 years of age, your parent/guardian must also read the *privacy policy*.
Use of COVIDSafe is completely voluntary. You can install or delete the application at any time. If you delete COVIDsafe, *you may also ask for your information* to be deleted from the secure server.
To register for COVIDSafe, you will need to enter a name, mobile number, age range and postcode.
Information you submit when you register, and information about your use of COVIDSafe will be collected and stored on a highly secure server.
COVIDSafe will not collect your location information.\n\nCOVIDSafe will note the time of contact and an anonymous ID code of other COVIDSafe users you come into contact with.
Other COVIDSafe users you come into contact with will note an anonymous ID code and the time of contact with you on their device.
If another user tests positive to COVID-19, they may upload their contact information and a state or territory health official may contact you for contact tracing purposes.
Your registration details will only be used or disclosed for contact tracing and for the proper and lawful functioning of COVIDSafe.
More information is available at the *Australian Government Department of Health website*.
See the COVIDSafe *privacy policy* for further details about your rights about your information and how it will be handled and shared.";
"OS1a_Button" = "Next";
// Registration Consent View Controller
"RC_Title" = "Registration consent";
"RC_Intro" = "I consent to the Australian Department of Health collecting:";
"RC_Item1" = "My registration information to allow contact tracing by state or territory health officials.";
"RC_Item2" = "My contact information from other COVIDSafe users after they test positive for COVID-19.";
"RC_Closing" = "Select 'I agree' to confirm consent.";
"RC_Button" = "I agree";
// Personal Details Controller
"Done" = "Done";
"Next" = "Next";
"ValidationError" = "Validation error";
"PostcodeValidationErrorMessage" = "Please enter a valid postcode";
"PD_Title" = "Enter your details";
"PD_Fullname" = "Full name";
"PD_FullnameError" = "Please enter your full name.";
"PD_AgeRange" = "Age range (select)";
"PD_AgeRangeError" = "Please select your age range.";
"PD_Postcode" = "Postcode in Australia";
"PD_PostcodeError" = "Your Australian postcode number must contain 4 digits.";
"PD_Button" = "Continue";
// Under Sixteen View Controller
"US_Title" = "You need the consent of your parent/guardian to proceed";
"US_Intro" = "I confirm my parent or guardian consents to the Australian Department of Health collecting:";
"US_Item1" = "My registration information to allow contact tracing by state or territory health officials.";
"US_Item2" = "My contact information from other COVIDSafe users after they test positive for COVID-19.";
"US_Closing" = "Select 'I agree' to confirm consent.";
"US_Button" = "I agree";
// Phone Number View Controller
"EnterPhoneReVerify" = "Enter your mobile number to re-verify";
"AusPhoneNumberButton" = "Use an Australian phone number";
"EnterMobileNumber" = "Enter your mobile number";
"SelectCountryRegion" = "Select country or region";
"NorfolkExample" = "For Example: 351234";
"AustralianPhoneValidationError" = "Australian mobile numbers contain a maximum of 10 digits.";
"NorfolkPhoneValidationError" = "Mobile numbers in Norfolk Island contain 5 to 6 digits.";
"PN_WillSendPIN" = "We'll send you a 6-digit pin to verify your mobile number.";
"PN_WarningContent" = "Trying to register on behalf of a friend or relative?\n\nThey will need to register using their own device and phone number so that COVIDSafe can work for them. ";
"PN_Button" = "Get PIN";
// OTP View Controller // OTP View Controller
"EnterPINSent" = "Enter the PIN sent to %@"; "EnterPINSent" = "Enter the PIN sent to %@";
"PINWillExpire" = "Your PIN will expire in %@"; "PINWillExpire" = "Your PIN will expire in %@";
@ -21,47 +115,101 @@
"PhoneVerificationErrorMessage" = "Please check your details and try again."; "PhoneVerificationErrorMessage" = "Please check your details and try again.";
"PhoneNumberFormatErrorTitle" = "Wrong number format"; "PhoneNumberFormatErrorTitle" = "Wrong number format";
"PhoneNumberFormatErrorMessage" = "Please enter a mobile phone number."; "PhoneNumberFormatErrorMessage" = "Please enter a mobile phone number.";
"OTP_Button" = "Verify";
// Onboarding Step 2 View Controller (Permissions)
"OS2_Title" = "App settings";
"OS2_Intro" = "COVIDSafe needs Bluetooth® enabled to work. By enabling Notifications, you get updates to remind you when COVIDSafe is not active.\n\nSelect 'Proceed' to enable:\n";
"OS2_Item1" = "1. Bluetooth®";
"OS2_Item2" = "2. Notifications\n\nCOVIDSafe does not send pairing requests.";
"OS2_Button" = "Proceed";
//Phone Number View Controller // Onboarding Step 2b View Controller (Success)
"EnterPhoneReVerify" = "Enter your mobile number to re-verify"; "OS2b_Title" = "Youve successfully registered";
"AusPhoneNumberButton" = "Use an Australian phone number"; "OS2b_Item1" = "1. When you leave home, keep your phone with you and make sure COVIDSafe is active.";
"OS2b_Item2" = "2. Bluetooth® should be kept ON.";
"OS2b_Item3" = "3. COVIDSafe does not send pairing requests. Learn more.";
"OS2b_Item3Underline" = "Learn more";
"OS2b_Button" = "Continue";
// Home View Controller // Home View Controller
"HelpButton" = "Help";
"PairingRequestsInfo" = "COVIDSafe does not send pairing requests."; "PairingRequestsInfo" = "COVIDSafe does not send pairing requests.";
"PairingRequestsInfoUnderline" = "pairing requests"; "PairingRequestsInfoUnderline" = "pairing requests";
"InformationUploaded" = "Your information was uploaded on %@"; "InformationUploaded" = "Your information was uploaded on %@";
"VersionNumber" = "Version number: %@ Build: %@"; "VersionNumber" = "Version number: %@ Build: %@";
"HomeHeaderNoAction" = "COVIDSafe is active.\nNo further action is required."; "HomeHeaderNoAction" = "COVIDSafe is active.\nNo further action is required.";
"HomeHeaderPermissions" = "COVIDSafe is not active.\nCheck your permissions."; "HomeHeaderPermissions" = "COVIDSafe is not active.\nCheck your settings.";
"ShareText" = "Join me in stopping the spread of COVID-19! Download COVIDSafe, an app from the Australian Government.";
"CheckPermissions" = "Check your settings";
"CheckPermissionsMessage" = "COVIDSafe won't work without the right settings.";
"AllowBluetoothON" = "Access to Bluetooth®: ON";
"AllowBluetoothOFF" = "Access to Bluetooth®: OFF";
"AllowBluetoothOffDesc" = "Allow COVIDSafe to access Bluetooth®";
"BluetoothON" = "Bluetooth®: ON";
"BluetoothOFF" = "Bluetooth®: OFF";
"BluetoothOffDesc" = "Turn on your phone's Bluetooth®. Select 'Allow New Connections' if displayed.";
"ShareCovidSafe" = "Share COVIDSafe";
"ShareCovidSafeContent" = "Invite others to help. Together, we're stronger.";
"UploadData" = "Has a health official contacted you?";
"UploadDataContent" = "You can only upload your information if you have tested positive.";
"GetCoronaVirusApp" = "Get the Coronavirus app";
"GetCoronaVirusAppContent" = "Download the government app for the latest news and advice.";
"LatestNews" = "Latest news and updates";
"LatestNewsContent" = "Head to aus.gov.au for the latest Coronavirus news.";
"HelpTopics" = "Help topics";
"HelpTopicsContent" = "If you have issues or questions about the app.";
"NotificationsEnabled" = "Notifications are enabled"; "NotificationsEnabled" = "Notifications are enabled";
"NotificationsDisabled" = "Notifications are disabled"; "NotificationsDisabled" = "Notifications are disabled";
"NotificationsEnabledBlurb" = "You will receive a notification if COVIDSafe is not active. Change notification settings"; "NotificationsEnabledBlurb" = "You will receive a notification if COVIDSafe is not active.\n\nChange notification settings";
"NotificationsDisabledBlurb" = "You will not receive a notification if COVIDSafe is not active. Change notification settings"; "NotificationsDisabledBlurb" = "You will not receive a notification if COVIDSafe is not active.\n\nChange notification settings";
"NotificationsBlurbLink" = "Change notification settings"; "NotificationsBlurbLink" = "Change notification settings";
"ShareText" = "Join me in stopping the spread of COVID-19! Download COVIDSafe, an app from the Australian Government."; "ShareText" = "Join me in stopping the spread of COVID-19! Download COVIDSafe, an app from the Australian Government.";
//Successful registration (OnboardingStep2B)
"PointOne" = "1. When you leave home, keep your phone with you and make sure COVIDSafe is active.";
"PointTwo" = "2. Bluetooth® should be kept ON.";
"PointThree" = "3. COVIDSafe does not send pairing requests. Learn more.";
"PointThreeUnderline" = "Learn more";
// Help Nav Controller // Help Nav Controller
"ReportAnIssue" = "Report an issue"; "ReportAnIssue" = "Report an issue";
"FoundIssueWithApp" = "Found an issue in the COVIDSafe app?";
"IssueDescPlaceholder" = "Please describe the issue";
"IssueFooter" = "We may contact you for further details about your feedback. Your email address wont be used for any other purpose.";
"IssueThankYou" = "Thank you! We have received your feedback.";
// Personal Details View Controller // Upload Data Preface View Controller
"Done" = "Done"; "UDP_Title" = "Is a health official asking you to upload your information?";
"Next" = "Next"; "UDP_Content" = "Only if you test positive to COVID-19 will a state or territory health official contact you to assist with voluntary upload of your information.\n\nOnce you press 'Yes' you'll need to provide consent to upload your information. ";
"ValidationError" = "Validation error"; "UDP_NoButton" = "No";
"PostcodeValidationErrorMessage" = "Please enter a valid postcode"; "UDP_YesButton" = "Yes";
//Upload Data Step 2 View Controller // Upload Data Home View Controller (Consent)
"UDC_Title" = "Upload Consent";
"UDC_Content" = "Unless you consent, your close contact information will not be uploaded.\n\nIf you consent, your close contact information will be uploaded and shared with state or territory health officials for contact tracing purposes.\n\nRead the COVIDSafe *privacy policy* for further details.\n\nSelect 'I agree' to confirm consent.";
"UDC_Button" = "I agree";
// Upload Data Step 2 View Controller
"UD2_Title" = "Upload your information";
"UD2_Intro" = "A state or territory health official will send a PIN to your device via text message. Enter it below to upload your information.";
"UploadFailed" = "Upload failed. Please try again later."; "UploadFailed" = "Upload failed. Please try again later.";
"InvalidPIN" = "Invalid PIN, please ask the health official to send you another PIN."; "InvalidPIN" = "Invalid PIN, please ask the health official to send you another PIN.";
"UploadFailedErrorTitle" = "Upload Failed"; "UploadFailedErrorTitle" = "Upload Failed";
"UploadFailedErrorMessage" = "Please try again later."; "UploadFailedErrorMessage" = "Please try again later.";
"UploadingInfo" = "Your COVIDSafe information is currently being uploaded.\n\nPlease do not close the app.";
"UD2_Button" = "Upload my information";
// Upload Data Error View Controller
"UDE_Message" = "An error occurred while uploading your information, please try again.";
"UDE_TryAgain" = "Try again";
"UDE_Cancel" = "Cancel";
// Upload Data Thank You View Controller
"UDTY_Title" = "Thank you for helping to stop the spread of COVID-19!";
"UDTY_Content" = "You have successfully uploaded your information to the COVIDSafe highly secure storage system.\n\nState or territory health officials will notify other COVIDSafe users that have recorded instances of close contact with you. Your identity will remain anonymous to other users.";
"UDTY_Button" = "Continue";
// Feedback
"EmailPlaceholder" = "Localised Enter your email address (required)";
// Select Country View Controller
"SelectCountryTitle" = "Select country or region";
"AustraliaSectionTitle" = "Options for Australia";
// Unused // Unused
"WrongNumber" = "Wrong number?"; "WrongNumber" = "Wrong number?";
@ -69,3 +217,255 @@
"NotAValidCode" = "Not a valid code"; "NotAValidCode" = "Not a valid code";
"DataUploaded" = "Data uploaded"; "DataUploaded" = "Data uploaded";
"DataNotUploaded" = "Data not uploaded"; "DataNotUploaded" = "Data not uploaded";
// Notifications
"PN_BluetoothStatusTitle" = "COVIDSafe is not active";
"PN_BluetoothStatusBody" = "Make sure its active before you leave home and when in public places by enabling Bluetooth®.";
"PN_ReminderTitle" = "No encounters detected for 48 hours";
"PN_ReminderBody" = "Open COVIDSafe to ensure it is running.";
// *** Feedback localised strings ***
"global_cancel_button_title" = "Cancel";
"global_send_button_title" = "Send";
"global_sending_indication_title" = "Sending";
"global_success_indication_title" = "Success";
// Title for prompt that user sees when opening feeback. Prompt asks user if he/she would like to send new feedback.
"entryPrompt_alert_title" = "Feedback Box";
// Message for prompt that user sees when opening feeback. Prompt asks user if he/she would like to send new feedback.
"entryPrompt_alert_message" = "Hello mate, how would you like to proceed?";
// Title for button that launches new feedback flow.
"entryPrompt_newFeedback_button_title" = "New Feedback";
// Navigation Bar title shown during new feedback flow.
"newFeedbackFlow_navigationTitle" = "Report an issue";
// Messsage shown to user asking to confirm screenshot deletion.
"newFeedback_deleteScreenshotConfirmation_message" = "This screenshot will be deleted permanently.";
// Delete screenshot action sheet action button title.
"newFeedback_deleteScreenshot_actionTitle" = "Delete Screenshot";
// Error message displayed to users when feedback fails to send.
"newFeedback_send_errorMessage" = "Error Sending Feedback";
//Error message displayed to users when feedback has empty description
"newFeedback_noMessage_errorMessage" = "Tell us something before sending.";
"newFeedback_invalidEmail_errorMessage" = "Please enter a valid email address!";
// Countries
"Country_AU2" = "Norfolk Island";
"Country_AF" = "Afghanistan";
"Country_AL" = "Albania";
"Country_DZ" = "Algeria";
"Country_AD" = "Andorra";
"Country_AO" = "Angola";
"Country_AI" = "Anguilla";
"Country_AG" = "Antigua and Barbuda";
"Country_AR" = "Argentina";
"Country_AM" = "Armenia";
"Country_AW" = "Aruba";
"Country_AU" = "Australia";
"Country_AT" = "Austria";
"Country_AZ" = "Azerbaijan";
"Country_BS" = "Bahamas";
"Country_BH" = "Bahrain";
"Country_BD" = "Bangladesh";
"Country_BB" = "Barbados";
"Country_BY" = "Belarus";
"Country_BE" = "Belgium";
"Country_BZ" = "Belize";
"Country_BJ" = "Benin";
"Country_BM" = "Bermuda";
"Country_BT" = "Bhutan";
"Country_BO" = "Bolivia";
"Country_BA" = "Bosnia and Herzegovina";
"Country_BW" = "Botswana";
"Country_BR" = "Brazil";
"Country_BN" = "Brunei";
"Country_BG" = "Bulgaria";
"Country_BF" = "Burkina Faso";
"Country_BI" = "Burundi";
"Country_KH" = "Cambodia";
"Country_CM" = "Cameroon";
"Country_CA" = "Canada";
"Country_CV" = "Cape Verde";
"Country_KY" = "Cayman Islands";
"Country_CF" = "Central African Republic";
"Country_TD" = "Chad";
"Country_CL" = "Chile";
"Country_CN" = "China";
"Country_CO" = "Colombia";
"Country_KM" = "Comoros";
"Country_CK" = "Cook Islands";
"Country_CR" = "Costa Rica";
"Country_HR" = "Croatia";
"Country_CU" = "Cuba";
"Country_CW" = "Curaçao";
"Country_CY" = "Cyprus";
"Country_CZ" = "Czech Republic";
"Country_CD" = "Democratic Republic of the Congo";
"Country_DK" = "Denmark";
"Country_DJ" = "Djibouti";
"Country_DM" = "Dominica";
"Country_DO" = "Dominican Republic";
"Country_TL" = "Timor-Leste";
"Country_EC" = "Ecuador";
"Country_EG" = "Egypt";
"Country_SV" = "El Salvador";
"Country_GQ" = "Equatorial Guinea";
"Country_EE" = "Estonia";
"Country_ET" = "Ethiopia";
"Country_FO" = "Faroe Islands";
"Country_FJ" = "Fiji";
"Country_FI" = "Finland";
"Country_FR" = "France";
"Country_GF" = "French Guiana";
"Country_GA" = "Gabon";
"Country_GM" = "Gambia";
"Country_GE" = "Georgia";
"Country_DE" = "Germany";
"Country_GH" = "Ghana";
"Country_GI" = "Gibraltar";
"Country_GR" = "Greece";
"Country_GL" = "Greenland";
"Country_GD" = "Grenada";
"Country_GP" = "Guadeloupe";
"Country_GU" = "Guam";
"Country_GT" = "Guatemala";
"Country_GN" = "Guinea";
"Country_GW" = "Guinea-Bissau";
"Country_GY" = "Guyana";
"Country_HT" = "Haiti";
"Country_HN" = "Honduras";
"Country_HK" = "Hong Kong";
"Country_HU" = "Hungary";
"Country_IS" = "Iceland";
"Country_IN" = "India";
"Country_ID" = "Indonesia";
"Country_IQ" = "Iraq";
"Country_IE" = "Ireland";
"Country_IL" = "Israel";
"Country_IR" = "Iran";
"Country_IT" = "Italy";
"Country_CI" = "Ivory Coast";
"Country_JM" = "Jamaica";
"Country_JP" = "Japan";
"Country_JO" = "Jordan";
"Country_KZ" = "Kazakhstan";
"Country_KE" = "Kenya";
"Country_KI" = "Kiribati";
"Country_KW" = "Kuwait";
"Country_KG" = "Kyrgyzstan";
"Country_LA" = "Laos";
"Country_LV" = "Latvia";
"Country_LB" = "Lebanon";
"Country_LS" = "Lesotho";
"Country_LR" = "Liberia";
"Country_LY" = "Libya";
"Country_LI" = "Liechtenstein";
"Country_LT" = "Lithuania";
"Country_LU" = "Luxembourg";
"Country_MO" = "Macau";
"Country_MK" = "Former Yugoslav Republic of Macedonia";
"Country_MG" = "Madagascar";
"Country_MW" = "Malawi";
"Country_MY" = "Malaysia";
"Country_MV" = "Maldives";
"Country_ML" = "Mali";
"Country_MT" = "Malta";
"Country_MQ" = "Martinique";
"Country_MR" = "Mauritania";
"Country_MU" = "Mauritius";
"Country_MX" = "Mexico";
"Country_MD" = "Moldova";
"Country_MC" = "Monaco";
"Country_MO" = "Mongolia";
"Country_ME" = "Montenegro";
"Country_MS" = "Montserrat";
"Country_MA" = "Morocco";
"Country_MZ" = "Mozambique";
"Country_MM" = "Myanmar";
"Country_NA" = "Namibia";
"Country_NP" = "Nepal";
"Country_NL" = "Netherlands";
"Country_AN" = "Netherlands Antilles";
"Country_NC" = "New Caledonia";
"Country_NZ" = "New Zealand";
"Country_NI" = "Nicaragua";
"Country_NE" = "Niger";
"Country_NG" = "Nigeria";
"Country_NO" = "Norway";
"Country_OM" = "Oman";
"Country_PK" = "Pakistan";
"Country_PW" = "Palau";
"Country_PS" = "Palestinian Territories";
"Country_PA" = "Panama";
"Country_PG" = "Papua New Guinea";
"Country_PY" = "Paraguay";
"Country_PE" = "Peru";
"Country_PH" = "Philippines";
"Country_PL" = "Poland";
"Country_PT" = "Portugal";
"Country_PR" = "Puerto Rico";
"Country_QA" = "Qatar";
"Country_CG" = "Republic of the Congo";
"Country_RE" = "Reunion Island";
"Country_RO" = "Romania";
"Country_RU" = "Russia";
"Country_RW" = "Rwanda";
"Country_KN" = "Saint Kitts and Nevis";
"Country_LC" = "Saint Lucia";
"Country_VC" = "Saint Vincent and the Grenadines";
"Country_WS" = "Samoa";
"Country_ST" = "Sao Tome and Principe";
"Country_SA" = "Saudi Arabia";
"Country_SN" = "Senegal";
"Country_RS" = "Serbia";
"Country_SC" = "Seychelles";
"Country_SL" = "Sierra Leone";
"Country_SG" = "Singapore";
"Country_SK" = "Slovakia";
"Country_SI" = "Slovenia";
"Country_SB" = "Solomon Islands";
"Country_SO" = "Somalia";
"Country_ZA" = "South Africa";
"Country_KR" = "South Korea";
"Country_SS" = "South Sudan";
"Country_ES" = "Spain";
"Country_LK" = "Sri Lanka";
"Country_SR" = "Suriname";
"Country_SD" = "Sudan";
"Country_SZ" = "Swaziland";
"Country_SE" = "Sweden";
"Country_CH" = "Switzerland";
"Country_TW" = "Taiwan";
"Country_TJ" = "Tajikistan";
"Country_TZ" = "Tanzania";
"Country_TH" = "Thailand";
"Country_TG" = "Togo";
"Country_TO" = "Tonga";
"Country_TT" = "Trinidad and Tobago";
"Country_TN" = "Tunisia";
"Country_TR" = "Turkey";
"Country_TM" = "Turkmenistan";
"Country_TC" = "Turks and Caicos Islands";
"Country_UG" = "Uganda";
"Country_UA" = "Ukraine";
"Country_AE" = "United Arab Emirates";
"Country_GB" = "United Kingdom";
"Country_US" = "United States";
"Country_UY" = "Uruguay";
"Country_UZ" = "Uzbekistan";
"Country_VU" = "Vanuatu";
"Country_VE" = "Venezuela";
"Country_VN" = "Vietnam";
"Country_VG" = "Virgin Islands, British";
"Country_VI" = "Virgin Islands, US";
"Country_YE" = "Yemen";
"Country_ZM" = "Zambia";
"Country_ZW" = "Zimbabwe";

View file

@ -15,6 +15,7 @@ target 'CovidSafe' do
pod 'Alamofire' pod 'Alamofire'
pod 'KeychainSwift' pod 'KeychainSwift'
pod 'lottie-ios' pod 'lottie-ios'
pod 'FlagKit'
end end
@ -26,4 +27,5 @@ target 'CovidSafe-staging' do
pod 'Alamofire' pod 'Alamofire'
pod 'KeychainSwift' pod 'KeychainSwift'
pod 'lottie-ios' pod 'lottie-ios'
pod 'FlagKit'
end end

View file

@ -1,24 +1,28 @@
PODS: PODS:
- Alamofire (5.0.5) - Alamofire (5.0.5)
- FlagKit (2.2)
- KeychainSwift (19.0.0) - KeychainSwift (19.0.0)
- lottie-ios (3.1.6) - lottie-ios (3.1.6)
DEPENDENCIES: DEPENDENCIES:
- Alamofire - Alamofire
- FlagKit
- KeychainSwift - KeychainSwift
- lottie-ios - lottie-ios
SPEC REPOS: SPEC REPOS:
https://github.com/CocoaPods/Specs.git: https://github.com/CocoaPods/Specs.git:
- Alamofire - Alamofire
- FlagKit
- KeychainSwift - KeychainSwift
- lottie-ios - lottie-ios
SPEC CHECKSUMS: SPEC CHECKSUMS:
Alamofire: df2f8f826963b08b9a870791ad48e07a10090b2e Alamofire: df2f8f826963b08b9a870791ad48e07a10090b2e
FlagKit: eca7dc89064b0c986302ba9acefad1bf80a435b1
KeychainSwift: a06190cf933ad46b1e0abc3d77d29c06331715c7 KeychainSwift: a06190cf933ad46b1e0abc3d77d29c06331715c7
lottie-ios: 85ce835dd8c53e02509f20729fc7d6a4e6645a0a lottie-ios: 85ce835dd8c53e02509f20729fc7d6a4e6645a0a
PODFILE CHECKSUM: 267f7fcda5f8a86683b76b362dfc6c6703e3033f PODFILE CHECKSUM: 5da6b902184340eac7df8e3e031d4faa43a3a7d2
COCOAPODS: 1.9.1 COCOAPODS: 1.9.1

View file

@ -1,17 +1,20 @@
-----BEGIN PGP SIGNED MESSAGE----- -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256 Hash: SHA256
Contact: mailto:support@covidsafe.gov.au Contact: mailto:security@covidsafe.gov.au
Canonical: https://www.covidsafe.gov.au/.well-known/security.txt Canonical: https://www.covidsafe.gov.au/.well-known/security.txt
Encryption: https://www.covidsafe.gov.au/.well-known/pgp-key.txt Encryption: https://www.covidsafe.gov.au/.well-known/pgp-key.txt
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQFNBAEBCAA3FiEEbUgetBuPAas8w7zHDyQUNNekxBkFAl6xF6AZHHN1cHBvcnRA iQHOBAEBCAA4FiEEUWgkqhSOHRHwGue2IZjqt5flXH4FAl7Hkw0aHHNlY3VyaXR5
Y292aWRzYWZlLmdvdi5hdQAKCRAPJBQ016TEGd+bCACLrYjCbKRsTsQQyZVVtGxj QGNvdmlkc2FmZS5nb3YuYXUACgkQIZjqt5flXH4KfQv/ZagXzgn9HspSTupO7zQQ
wYKW2AWclnKZWX/sxnTexg6D1tlGbZbB0OJpw0gJ0NpMoOLFd0kRZXOzv8RocIdx t7lpZsNWKJsXddUD3+JQQ8b1uB9kmHhiydIXervEc1yGti6YYZxKybehLdvv7HjV
xd90Nwwl3NQ2ygGCDXR0Y7uRKX/P/Y1xO7XkyiYXAqVq3YWvI9M04pY/TCRvRZ/1 Cps9kn3cns9ex3s+KEMMFrU7MykvZ2x+fvCoGfgzWm1UJElxn/cSbOnt38VxmSjC
qBs/WDHv/6eRh2qNy/WGXD66CmTLHBcXilTeihcTZ/27Mny5SPthdfy8odQnhUja wkmh+DGa1z9OB6ZMuivO2XBx+Y0GV5tsoxWKRtXMruQ41bTHZvIJ9lJctYTv2xEK
NfFxDm+8gQuFKUUQmr9rd8FEMPSl6BWf/kQtn0YmTeZRzD01uT1ydeHkyPSgn+nq hYlHmrzkZjLM/sTwGKWj+ARCn1IA0Zp8uxkoBi3/++NonKAlQpSZ4Rk6B780H8GM
k9us35AlkI7aZNfNkFVWJ2v5ZVAdTHDh3pgBRZETwVg1of5DEXhc5XJV6mLsu9bM 5lCZVLIRfH1VJzPr7+eSSBF8p0coEapyO7bk/ioBIQB5v4xfvpJRBEc+eI7IZeDa
=tik2 TcO/TVZw7Vut89flR+34g9PCSFDCJgv5zR8vE5mB5m/vlfJ7XI99XMwvFNWgpcyL
72tFv74uH6tUPZOlbHGZTnBsQLkuj4fwUYaUPcR9TzeMlBHoe21bQ6OeDO02rIy4
09bWSTMGe33LvTz2UMuEkZcsNT8vc7J+597GSxgDWoR6
=6MOG
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----