From 8286794a6d7b5c3a67bd8e42f187117e2e1f0de9 Mon Sep 17 00:00:00 2001 From: Alessandro Boron Date: Thu, 27 Jun 2024 10:57:44 +1000 Subject: [PATCH] Onboarding Intro Main Screens (#2994) --- Core/URLOpener.swift | 33 +++ DuckDuckGo.xcodeproj/project.pbxproj | 72 +++++++ .../DDGDefaultBrowser.imageset/Contents.json | 12 ++ .../DDGDefaultBrowser.pdf | Bin 0 -> 27577 bytes .../Contents.json | 12 ++ .../DaxOnboardingBackground.pdf | Bin 0 -> 16075 bytes .../Hiker.imageset/Contents.json | 16 ++ .../Hiker.imageset/Hiker.pdf | Bin 0 -> 17622 bytes .../Hiker.imageset/HikerLarge.pdf | Bin 0 -> 17740 bytes .../HikerSmall.imageset/Contents.json | 12 ++ .../HikerSmall.imageset/HikerSmall.pdf | Bin 0 -> 17433 bytes DuckDuckGo/OnboardingButtonsView.swift | 12 +- .../MetricBuilder/MetricBuilder.swift | 69 +++++++ .../OnboardingBackground.swift | 95 +++++++++ .../OnboardingDefaultBrowserView.swift | 80 ++++++++ .../OnboardingIntroViewModel.swift | 56 +++++ .../OnboardingIntro/OnboardingView.swift | 194 ++++++++++++++++++ .../Styles/DaxDialogStyles.swift | 46 +++++ .../Styles/OnboardingTextStyles.swift | 51 +++++ DuckDuckGoTests/MockURLOpener.swift | 41 ++++ .../OnboardingIntroViewModelTests.swift | 119 +++++++++++ 21 files changed, 917 insertions(+), 3 deletions(-) create mode 100644 Core/URLOpener.swift create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/DDGDefaultBrowser.imageset/Contents.json create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/DDGDefaultBrowser.imageset/DDGDefaultBrowser.pdf create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/DaxOnboardingBackground.imageset/Contents.json create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/DaxOnboardingBackground.imageset/DaxOnboardingBackground.pdf create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/Hiker.imageset/Contents.json create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/Hiker.imageset/Hiker.pdf create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/Hiker.imageset/HikerLarge.pdf create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/HikerSmall.imageset/Contents.json create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/HikerSmall.imageset/HikerSmall.pdf create mode 100644 DuckDuckGo/OnboardingExperiment/MetricBuilder/MetricBuilder.swift create mode 100644 DuckDuckGo/OnboardingExperiment/OnboardingBackground.swift create mode 100644 DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingDefaultBrowserView.swift create mode 100644 DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift create mode 100644 DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift create mode 100644 DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift create mode 100644 DuckDuckGo/OnboardingExperiment/Styles/OnboardingTextStyles.swift create mode 100644 DuckDuckGoTests/MockURLOpener.swift create mode 100644 DuckDuckGoTests/OnboardingIntroViewModelTests.swift diff --git a/Core/URLOpener.swift b/Core/URLOpener.swift new file mode 100644 index 0000000000..d107c8a805 --- /dev/null +++ b/Core/URLOpener.swift @@ -0,0 +1,33 @@ +// +// URLOpener.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +public protocol URLOpener: AnyObject { + func canOpenURL(_ url: URL) -> Bool + func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey: Any], completionHandler completion: ((Bool) -> Void)?) +} + +public extension URLOpener { + func open(_ url: URL) { + open(url, options: [:], completionHandler: nil) + } +} + +extension UIApplication: URLOpener {} diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index c6959cb514..ecc121692d 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -601,6 +601,10 @@ 98F3A1D8217B37010011A0D4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F3A1D7217B37010011A0D4 /* Theme.swift */; }; 98F6EA472863124100720957 /* ContentBlockerRulesLists.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F6EA462863124100720957 /* ContentBlockerRulesLists.swift */; }; 98F78B8E22419093007CACF4 /* ThemableNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F78B8D22419093007CACF4 /* ThemableNavigationController.swift */; }; + 9F23B8012C2BC94400950875 /* OnboardingBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F23B8002C2BC94400950875 /* OnboardingBackground.swift */; }; + 9F23B8032C2BCD0000950875 /* DaxDialogStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F23B8022C2BCD0000950875 /* DaxDialogStyles.swift */; }; + 9F23B8062C2BE22700950875 /* OnboardingIntroViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F23B8052C2BE22700950875 /* OnboardingIntroViewModelTests.swift */; }; + 9F23B8092C2BE9B700950875 /* MockURLOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F23B8082C2BE9B700950875 /* MockURLOpener.swift */; }; 9F2510142BF5809E0096DB16 /* SubscriptionFlowViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2510132BF5809E0096DB16 /* SubscriptionFlowViewModelTests.swift */; }; 9F8FE9492BAE50E50071E372 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 9F8FE9482BAE50E50071E372 /* Lottie */; }; 9FA5E44B2BF1AF3400BDEF02 /* SubscriptionContainerViewFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA5E44A2BF1AF3400BDEF02 /* SubscriptionContainerViewFactory.swift */; }; @@ -608,6 +612,12 @@ 9FB027122C2526DD009EA190 /* DaxDialogIntroView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB027112C2526DD009EA190 /* DaxDialogIntroView.swift */; }; 9FB027142C252E0C009EA190 /* DaxDialogBrowsersComparisonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB027132C252E0C009EA190 /* DaxDialogBrowsersComparisonView.swift */; }; 9FB027192C26BC29009EA190 /* BrowsersComparisonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB027182C26BC29009EA190 /* BrowsersComparisonModel.swift */; }; + 9FB0271B2C2927D0009EA190 /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB0271A2C2927D0009EA190 /* OnboardingView.swift */; }; + 9FB0271D2C293619009EA190 /* OnboardingIntroViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB0271C2C293619009EA190 /* OnboardingIntroViewModel.swift */; }; + 9FB0271F2C294985009EA190 /* OnboardingDefaultBrowserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB0271E2C294985009EA190 /* OnboardingDefaultBrowserView.swift */; }; + 9FE08BD32C2A5B88001D5EBC /* OnboardingTextStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE08BD22C2A5B88001D5EBC /* OnboardingTextStyles.swift */; }; + 9FE08BD62C2A60CD001D5EBC /* MetricBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE08BD52C2A60CD001D5EBC /* MetricBuilder.swift */; }; + 9FE08BDA2C2A86D0001D5EBC /* URLOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE08BD92C2A86D0001D5EBC /* URLOpener.swift */; }; 9FF7E9822C22A1F100902BE5 /* DaxDialogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF7E9812C22A1F100902BE5 /* DaxDialogView.swift */; }; 9FF7E9862C23D10300902BE5 /* BrowsersComparisonChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF7E9852C23D10300902BE5 /* BrowsersComparisonChart.swift */; }; AA3D854523D9942200788410 /* AppIconSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3D854423D9942200788410 /* AppIconSettingsViewController.swift */; }; @@ -2239,12 +2249,22 @@ 98F3A1D7217B37010011A0D4 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; 98F6EA462863124100720957 /* ContentBlockerRulesLists.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentBlockerRulesLists.swift; sourceTree = ""; }; 98F78B8D22419093007CACF4 /* ThemableNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemableNavigationController.swift; sourceTree = ""; }; + 9F23B8002C2BC94400950875 /* OnboardingBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingBackground.swift; sourceTree = ""; }; + 9F23B8022C2BCD0000950875 /* DaxDialogStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogStyles.swift; sourceTree = ""; }; + 9F23B8052C2BE22700950875 /* OnboardingIntroViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingIntroViewModelTests.swift; sourceTree = ""; }; + 9F23B8082C2BE9B700950875 /* MockURLOpener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLOpener.swift; sourceTree = ""; }; 9F2510132BF5809E0096DB16 /* SubscriptionFlowViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionFlowViewModelTests.swift; sourceTree = ""; }; 9FA5E44A2BF1AF3400BDEF02 /* SubscriptionContainerViewFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionContainerViewFactory.swift; sourceTree = ""; }; 9FA5E44D2BF1B16400BDEF02 /* SubscriptionContainerViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionContainerViewModelTests.swift; sourceTree = ""; }; 9FB027112C2526DD009EA190 /* DaxDialogIntroView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogIntroView.swift; sourceTree = ""; }; 9FB027132C252E0C009EA190 /* DaxDialogBrowsersComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogBrowsersComparisonView.swift; sourceTree = ""; }; 9FB027182C26BC29009EA190 /* BrowsersComparisonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsersComparisonModel.swift; sourceTree = ""; }; + 9FB0271A2C2927D0009EA190 /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = ""; }; + 9FB0271C2C293619009EA190 /* OnboardingIntroViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingIntroViewModel.swift; sourceTree = ""; }; + 9FB0271E2C294985009EA190 /* OnboardingDefaultBrowserView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingDefaultBrowserView.swift; sourceTree = ""; }; + 9FE08BD22C2A5B88001D5EBC /* OnboardingTextStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingTextStyles.swift; sourceTree = ""; }; + 9FE08BD52C2A60CD001D5EBC /* MetricBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetricBuilder.swift; sourceTree = ""; }; + 9FE08BD92C2A86D0001D5EBC /* URLOpener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLOpener.swift; sourceTree = ""; }; 9FF7E9812C22A1F100902BE5 /* DaxDialogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogView.swift; sourceTree = ""; }; 9FF7E9852C23D10300902BE5 /* BrowsersComparisonChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsersComparisonChart.swift; sourceTree = ""; }; AA3D854423D9942200788410 /* AppIconSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconSettingsViewController.swift; sourceTree = ""; }; @@ -4189,6 +4209,24 @@ name = Themes; sourceTree = ""; }; + 9F23B7FF2C2BABE000950875 /* OnboardingIntro */ = { + isa = PBXGroup; + children = ( + 9FB0271C2C293619009EA190 /* OnboardingIntroViewModel.swift */, + 9FB0271A2C2927D0009EA190 /* OnboardingView.swift */, + 9FB0271E2C294985009EA190 /* OnboardingDefaultBrowserView.swift */, + ); + path = OnboardingIntro; + sourceTree = ""; + }; + 9F23B8042C2BE20500950875 /* Onboarding */ = { + isa = PBXGroup; + children = ( + 9F23B8052C2BE22700950875 /* OnboardingIntroViewModelTests.swift */, + ); + name = Onboarding; + sourceTree = ""; + }; 9FA5E44C2BF1B14100BDEF02 /* Subscription */ = { isa = PBXGroup; children = ( @@ -4217,11 +4255,32 @@ path = BrowsersComparison; sourceTree = ""; }; + 9FE08BD12C2A5B77001D5EBC /* Styles */ = { + isa = PBXGroup; + children = ( + 9FE08BD22C2A5B88001D5EBC /* OnboardingTextStyles.swift */, + 9F23B8022C2BCD0000950875 /* DaxDialogStyles.swift */, + ); + path = Styles; + sourceTree = ""; + }; + 9FE08BD42C2A60BD001D5EBC /* MetricBuilder */ = { + isa = PBXGroup; + children = ( + 9FE08BD52C2A60CD001D5EBC /* MetricBuilder.swift */, + ); + path = MetricBuilder; + sourceTree = ""; + }; 9FF7E9802C22A19800902BE5 /* OnboardingExperiment */ = { isa = PBXGroup; children = ( + 9FE08BD42C2A60BD001D5EBC /* MetricBuilder */, + 9FE08BD12C2A5B77001D5EBC /* Styles */, 9FB027172C26BC0F009EA190 /* BrowsersComparison */, 9FB027102C2526A8009EA190 /* DaxDialogs */, + 9F23B7FF2C2BABE000950875 /* OnboardingIntro */, + 9F23B8002C2BC94400950875 /* OnboardingBackground.swift */, ); path = OnboardingExperiment; sourceTree = ""; @@ -4963,6 +5022,7 @@ 851DFD88212C5ED600D95F20 /* Main */, EE56DE3A2A6038F500375C41 /* NetworkProtection */, F1D477C71F2139210031ED49 /* OmniBar */, + 9F23B8042C2BE20500950875 /* Onboarding */, 98EA2C3F218BB5140023E1DC /* Settings */, 9FA5E44C2BF1B14100BDEF02 /* Subscription */, F13B4BF71F18C9E800814661 /* Tabs */, @@ -5132,6 +5192,7 @@ 1EE411F22857C4A30003FE64 /* CollectionExtension.swift */, 1E6A4D682984208800A371D3 /* LocaleExtension.swift */, 56D855692BEA9169009F9698 /* CurrentDateProviding.swift */, + 9FE08BD92C2A86D0001D5EBC /* URLOpener.swift */, ); name = Utilities; sourceTree = ""; @@ -5208,6 +5269,7 @@ CBDD5DE029A6741300832877 /* MockBundle.swift */, C1B0F6412AB08BE9001EAF05 /* MockPrivacyConfiguration.swift */, C185ED652BD43A5500BAE9DC /* MockDDGSyncing.swift */, + 9F23B8082C2BE9B700950875 /* MockURLOpener.swift */, ); name = Mocks; sourceTree = ""; @@ -6547,6 +6609,7 @@ 6F8496412BC3D8EE00ADA54E /* OnboardingButtonsView.swift in Sources */, 1EA513782866039400493C6A /* TrackerAnimationLogic.swift in Sources */, 854A01332A558B3A00FCC628 /* UIView+Constraints.swift in Sources */, + 9FB0271B2C2927D0009EA190 /* OnboardingView.swift in Sources */, C12726EE2A5FF88C00215B02 /* EmailSignupPromptView.swift in Sources */, CB2283F32BD79FC20057DD0A /* BrokenSitePromptView.swift in Sources */, 83134D7D20E2D725006CE65D /* FeedbackSender.swift in Sources */, @@ -6596,6 +6659,8 @@ 6FBF0F8B2BD7C0A900136CF0 /* AllProtectedCell.swift in Sources */, 1E4F4A5A297193DE00625985 /* MainViewController+CookiesManaged.swift in Sources */, 8586A10D24CBA7070049720E /* FindInPageActivity.swift in Sources */, + 9FB0271D2C293619009EA190 /* OnboardingIntroViewModel.swift in Sources */, + 9FE08BD62C2A60CD001D5EBC /* MetricBuilder.swift in Sources */, 1E1626072968413B0004127F /* ViewExtension.swift in Sources */, 31A42566285A0A6300049386 /* FaviconViewModel.swift in Sources */, D65625952C22D382006EF297 /* TabViewController.swift in Sources */, @@ -6668,6 +6733,7 @@ 83BE9BC3215D69C1009844D9 /* AppConfigurationFetch.swift in Sources */, 37CF91622BB474AA00BADCAE /* CrashCollectionOnboardingView.swift in Sources */, 1EEC460627A9499600E75FCB /* DownloadsList.swift in Sources */, + 9F23B8032C2BCD0000950875 /* DaxDialogStyles.swift in Sources */, C1641EAF2BC2F5140012607A /* ImportPasswordsViewController.swift in Sources */, D63FF8982C1B6A45006DE24D /* DuckPlayer.swift in Sources */, 85B9CB8921AEBDD5009001F1 /* FavoriteHomeCell.swift in Sources */, @@ -6717,6 +6783,7 @@ 85DE681A2B6A8BB000DED4FE /* MainViewCoordinator.swift in Sources */, F1617C151E57336D00DEDCAF /* TabManager.swift in Sources */, 85449EF523FDA02800512AAF /* KeyboardSettingsViewController.swift in Sources */, + 9FB0271F2C294985009EA190 /* OnboardingDefaultBrowserView.swift in Sources */, 85C11E4C2090888C00BFFEB4 /* HomeRowReminder.swift in Sources */, 31B2F11F287846320040427A /* NoMicPermissionAlert.swift in Sources */, 310C4B45281B5A9A00BA79A9 /* AutofillLoginDetailsView.swift in Sources */, @@ -6958,8 +7025,10 @@ 1E865AF0272042DB001C74F3 /* TextSizeSettingsViewController.swift in Sources */, D6E0C1892B7A2E0D00D5E1E9 /* DesktopDownloadViewModel.swift in Sources */, 8524CC9A246DA81700E59D45 /* FullscreenDaxDialogViewController.swift in Sources */, + 9F23B8012C2BC94400950875 /* OnboardingBackground.swift in Sources */, CBBB9A192BED441400BEAC71 /* PixelExperimentForBrokenSites.swift in Sources */, 6FE018402C25CB3F001F680D /* FavoritesSectionHeader.swift in Sources */, + 9FE08BD32C2A5B88001D5EBC /* OnboardingTextStyles.swift in Sources */, F17669D71E43401C003D3222 /* MainViewController.swift in Sources */, 6FE127462C2054A900EB5724 /* NewTabPageViewController.swift in Sources */, 984D60B2222A1284003B9E3B /* FeedbackFormViewController.swift in Sources */, @@ -7063,6 +7132,7 @@ 314A3EFC293905EC00D3D4C8 /* BrokenSiteReportingTests.swift in Sources */, 851B1283221FE65E004781BC /* ImproveOnboardingExperiment1Tests.swift in Sources */, F194FAFB1F14E622009B4DF8 /* UIFontExtensionTests.swift in Sources */, + 9F23B8092C2BE9B700950875 /* MockURLOpener.swift in Sources */, F40F843728C939760081AE75 /* AutofillLoginListViewModelTests.swift in Sources */, C14882E827F20DAB00D59F0C /* TestDataLoader.swift in Sources */, C14882EA27F20DD000D59F0C /* MockBookmarksCoreDataStorage.swift in Sources */, @@ -7087,6 +7157,7 @@ C174CE602BD6A6CE00AED2EA /* MockDDGSyncing.swift in Sources */, 8521FDE6238D414B00A44CC3 /* FileStoreTests.swift in Sources */, F14E491F1E391CE900DC037C /* URLExtensionTests.swift in Sources */, + 9F23B8062C2BE22700950875 /* OnboardingIntroViewModelTests.swift in Sources */, 85D2187424BF25CD004373D2 /* FaviconsTests.swift in Sources */, 85AD49EE2B6149110085D2D1 /* CookieStorageTests.swift in Sources */, 569437242BDD405400C0881B /* SyncBookmarksAdapterTests.swift in Sources */, @@ -7265,6 +7336,7 @@ F1134EB01F40AC6300B73467 /* AtbParser.swift in Sources */, EE50052E29C369D300AE0773 /* FeatureFlag.swift in Sources */, BD15DB852B959CFD00821457 /* BundleExtension.swift in Sources */, + 9FE08BDA2C2A86D0001D5EBC /* URLOpener.swift in Sources */, 37DF000F29F9D635002B7D3E /* SyncBookmarksAdapter.swift in Sources */, B652DF10287C2C1600C12A9C /* ContentBlocking.swift in Sources */, 4BE2756827304F57006B20B0 /* URLRequestExtension.swift in Sources */, diff --git a/DuckDuckGo/DaxOnboarding.xcassets/DDGDefaultBrowser.imageset/Contents.json b/DuckDuckGo/DaxOnboarding.xcassets/DDGDefaultBrowser.imageset/Contents.json new file mode 100644 index 0000000000..75a35d08cb --- /dev/null +++ b/DuckDuckGo/DaxOnboarding.xcassets/DDGDefaultBrowser.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "DDGDefaultBrowser.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/DaxOnboarding.xcassets/DDGDefaultBrowser.imageset/DDGDefaultBrowser.pdf b/DuckDuckGo/DaxOnboarding.xcassets/DDGDefaultBrowser.imageset/DDGDefaultBrowser.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e1e9d83af58a1168a862f94f9d7c885fe4c5dcb GIT binary patch literal 27577 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/DaxOnboarding.xcassets/DaxOnboardingBackground.imageset/Contents.json b/DuckDuckGo/DaxOnboarding.xcassets/DaxOnboardingBackground.imageset/Contents.json new file mode 100644 index 0000000000..cab1647e9c --- /dev/null +++ b/DuckDuckGo/DaxOnboarding.xcassets/DaxOnboardingBackground.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "DaxOnboardingBackground.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/DaxOnboarding.xcassets/DaxOnboardingBackground.imageset/DaxOnboardingBackground.pdf b/DuckDuckGo/DaxOnboarding.xcassets/DaxOnboardingBackground.imageset/DaxOnboardingBackground.pdf new file mode 100644 index 0000000000000000000000000000000000000000..412cf26233b5582c18106714842116ff12188c88 GIT binary patch literal 16075 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/DaxOnboarding.xcassets/Hiker.imageset/HikerLarge.pdf b/DuckDuckGo/DaxOnboarding.xcassets/Hiker.imageset/HikerLarge.pdf new file mode 100644 index 0000000000000000000000000000000000000000..296e5696fbcfa01cfd8620e364ee47f4956d49d6 GIT binary patch literal 17740 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%0AQj!+g8M?FT1JpM#?Ae@H_aKX#e(K!v;~=A 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 Zt_L4Hl2}v%_Ku;ssi8TSs;aBM8vt>!gp~jQ literal 0 HcmV?d00001 diff --git a/DuckDuckGo/DaxOnboarding.xcassets/HikerSmall.imageset/Contents.json b/DuckDuckGo/DaxOnboarding.xcassets/HikerSmall.imageset/Contents.json new file mode 100644 index 0000000000..7509061caa --- /dev/null +++ b/DuckDuckGo/DaxOnboarding.xcassets/HikerSmall.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "HikerSmall.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/DaxOnboarding.xcassets/HikerSmall.imageset/HikerSmall.pdf b/DuckDuckGo/DaxOnboarding.xcassets/HikerSmall.imageset/HikerSmall.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca97f45b113b9d79aa5bc18956ef4d64009ecd1c GIT binary patch literal 17433 zcmZ^~Wl$VU&^3y~;_mM59^4mqhu{vu9fG^N2U*YyqZAYS5BdKw4q2}M2g&#Uixd<4AAf5XtN$TH=Kg;%%h@}5TDwzn$T|JT zE@N%^&C2?JnK+cKU2Hw=D0%*aYyP+NUjz?NcWZNJWMAm3&8Z|>19$S>ATilGc+Z3# z4kKX1avFJwWGq|{5+>};>+8pH5xAe*qlTH7a$;<>6bv5zHFMdy!_Lt1?@s*lcIV&g z^Y_2vpBDq-|G=L??^BPT!Jii!13w>sHHal&f9!QWJ&gHmycxgy>A!>j>}>bgigRpm zzXe~fSR0CZzAq=fA2bepPHpsvM!Wq0hx+Dsxcs2l*?v0ee%#``N;ZGGTmSQMklYy* z$nH3BIbyl`W9rl|_+jhm^4-MtZ*dV3+r zaqzGjeKLpfu`J(_+)6;cakp9Nrhfu%60Nj9b$k#Of45%EKI;{&?=Mun|0x=EmKz=H z$GYKh31;(1`sGaa6bBYFE|;BP z!If=vvIfT!iDb9HhAsZbwNx^#Rmlzh_LUaeT z#)KaaERBi!emIIte;Rk18)t!e)!%ZetG*j{W`@y+=sSmKPV*{n@QX8k-|6T#BFis5 z!K2Lrqx!y!5%FAy%wLWC&B^s9;#XT###2^8P~PH3FPle6S7*kYp7Jo3ENd-;AMNzI zj8e$9PX_8LQXEUzA{@D$Nm?E`1{7Rz8M$qP+03@yPArr*ZlIcH){UN5L+ofwJ&ka$kNx=;B;PD8!2WL8>emtdCLRN3P-4G-S>f9ys@fdyv^ zUyN`j2dW+j&YjG%A@tPxQ8DT3cOqh(s1)1`F%>OJ+0$(j<@P?hx)j=9Qx}W}Gw?#I ztERUtW}F1#YrJ$&vtQIpA_x*Z8Z+^t`Bm zj5;|{C&X9$uE43hfvv0_=(*;oI0R?eNy&AhJck8Sf~uCR%N!yYZi1dW9wx@4k8jp~ zVH>FGLCJ(Ii-}5J$J+v?iu1pcG==)Q^(sO!rz0}W+&3xvPoy`vy@Eix#?sIjV5sjj zS3MwBv3$!MUFNS`M<(b8IDf_>b8k{CF-BWMFMEEpDz~P)dESg8k?6~=n@fAzy5t%1 zi)9xM655X3jU<4hws}E?XMLD&=b}j{Nim*;DjM$xwBDku^E>}!00~FV4Llr83O%AH zLAJ!2wpMvLM85cwQR~ytafH4llSN_CUSaPF(P(1Sg?@zs``|KIS2^#?`I{vUTzm9} zpRnw#uGCFZhvoFqxs)~ml+Rv2gbCy3qMj1(b9^HM-OQw#K8WE$M@R2hH~KseS=c|! z0CokK;eNM+Rvb+zO}%BUz7f<54j7n!WKIj3Dk;@)Pp0pMS<3|;xB!MrFkFvZ&H+vs z9IcM@08A^lIM5FSE$qJSfRAaZl?kjI?Fe>_0*+g~x3sDjqs_^Gz?t_8B&b7~Yxb^CVbY(T_8P_?Rt3cnJI&l2Tg^ann;2OidP{&t zlXT%v>i{Z3hFlW0F;zKfh{VbAUfwc$URbkN$-smi1zJiZF8ugJ1hanKJnDF;67xE_ zqfbJ*iJ^Q3(r*i(5sG081;CD~$zvSeJR>7GYzOliyFT@nP)HAg3RxG)-m+Jm&W@OC zga}3B4Pl!<+{G>&z<}4nollflrLCnIU<_6p#&}*hDTcvk{4v+0Lev^jQgcw7BaSlZ zH>A2Pcmd~!lMx5VpzZt)yl^>QnK9rLBcmc+3vStxx_3sq93zi`we(%ms1$V#_JSmB z0#pG%Dm2gM?3@Kx70X#4gt)_k-;)+X2WuQFhk$}~nh?{7RF9w(h3J-7%F4n)-bFkC zV5j~b<@rEJ6}4d(-Z}Te%wryz22=T)X6v{pDqYuOR0B^6!S3#8!e3IY8ycF_xvkVV z6}Q$xLQ|Phb~+y)D~mcGj$l5$uG4B?M21=3>54Fsg3btJ#PK<}wwzT?t3d!N7RRQab=Q@1DMrzP>jhVjG^b2!B6G_}b}J9f?Sf#Gbbxq<+DWc=@o zK;|qX8E`Arj7H**Hk9au)+i65kCa3hS`MV3k2%aqDkD8804KIu)?&CB-ximsEI8A| z3P~9k&DcHmwTpX%uR{hPs~z9CtV5-I7Dvc%afFvu`>2Tj!kKP;-X0+n*2t+ zRd*FIr++v*p0bzKJ{#lv8U(@Sali}tYCmYF4b}P-3eroR+}`~fvTwqe!s`|NM=9#- zR7nqcXoeHfcp?G>w@$OeL-oN93~Kq%Mz^YMq2m+rNl=@|>-iC6Qr2DGc2CF#4^yQu zwxeKx(T;H=5tU-V&HYb1fR-fFpd1Z42D6yD@Eur1b#FGAc55cVp!6%GaKdJuFqN1M z4+mU~Dho4}6hYgu8`fODiVe?hDciHp6;|y>`f$o9gFFQezCvm}QVF#It~R0INQ&kz zg{;%yDC)lPPUO1*IPhBy3Hhx2SiDRm*#DAE8 z`g2M3xflgnw^O@x-jWJuQe~p6I5>BVGT<}(UM?9qf;zA8PsMf^^jj!Ha`ZZ$F5I`lI8KnIohP>h(=l;)tTPc;8aTxc77Yhyh4#dW z2UB4YspG%yDVDsaQ`^*;Lky?#Hqx_D0`D~o^&eJ8m#G57k;E~}m&Oqwo#@QwFeI?F z>NIG4&V_j$bIi^uRtDoQn;QmWx3c<^v8@al);O%8gAD0D{&~D4p z!)biC!sgA2Q6{0OrXt!QqU@5J62I{Vz83jSw4gll6V3isi&Ms@c9-Qx&ZW+oSCOC1 zS;|Rzc8z*5HOG2Yot1wEd2uICP%}%~VQmlx9^5^J4CaO%7R(W z)x@aYtB%z!>rZ)p@PH$pTRM00eCy>jlfo^!^O1_(Y7+;Vr^mdf72+sFmAGpD2Z+PA zPuTy3C;uZ+D-mW@$(tk5%Af>U=o@lf{^`U2_wF&Bb`>!See3Bazq1lJBkD4V%?$;E74{S1NU+n zEcg3-&V-#0G*nB~3uH22u3ub> z1U{j|2@`hZTrSVPTaT*Wka!Anu3&s0Isd%nG4W=^&`^OVIJmD^A~R+)A}r;aWoN4M z_M$%Gt(!XriO(Wo5;N$pIu8r-1U7o9S@AZuiC=0atcZ(*BuMl0SyA`fR0Ewo=AcK6 zU@XjhDqb3=bDgzy*lDIZH-hJOIDv*Zb%~~n;;5rcRm|b;wV6Xzv9{L`{g=^bBIeoq zXKVnlFNeeK8~7^r@MKvHPgTqR2bLnGHR`QY(k%Ss_Nfu?b4Gv6`i6OO4%s<4t|_9=YRNPxm#_9Ksb(FH!53vP#Fol>4@x78gH33s=Qb zX0UJOpgESJwykYP*GstwRN19n6aY#}(i>qTCe6pEp}*}ZosP`;dCVJP4Nkn6WHwp} zHF)rSipzb^_&KeRcjRlxpK{U0Xy`VTQ$l+p&Ip)uCr&eJumVC*8A@3*N|j}RD}Pl8 zY13cYjuxQ@#=o=mtKICUUK2!kQ6q?`E-4jFQ5-Ne+0}hY>Uou_=`kV*r}qreG7YPB z>k&q8AAUzl<2476jjI<(yn#|HqM&rwBvKbE<0)9r5_GlW@44#n*+YCKhCV`7qwq!@TYs6YP{)Y8MO|&_*5Mv9R|byG~Ni2yx9fIm$}fT(fcPz7Z2*^BeHn zDWJv>{Z4{3MA$EJOSDo_cm7y>)o|5|6S)0X6Y6YS0wy4f3VDw%j3b*b(%Xkm1nA>w zL;vXXh+=uo4~>^Xzh)~~syWo;43<;tkvS>w;Kb)OpS#@$_YFUc9~|gZ1_xhz zXnU@d+YJ|!1iDncOGB2JxA2_FDH;tHJ3L3i9X29aUqLY^sB+sF@NBJJV(1}c zHWK6FT!9=(o9gS_GoZqH%)wRO`YO){Qhp-aYp&CVfd=Wn#O ziTpSxbW7NgJtCa5pj!06iP6uQKgRcm)L7xyve(9~eZsyfl^^vqWYQ{Iqls5DFo6{n zIc=IG1L)Kbksx+X(iOikbN_uef=7(!hmNOx1)Xgved5pAN=eEtxmMR52aMvO82CDF71D4pRHPQ^Lq(Xsu#X^SC6soWx zOW6S!fJPaay%X%MF|3%8a8;y_$+j(P$7f)1!C+rgnNW4+ldH_K5(7>4EV2JQe#!pq z8WJ8{6CE#B+!BON8EPCyKBEztbS#ta@`y|Ypajd9P7|W$m{;39_^BU>8VLoTGX{1odXcSGZIEAbT#eIc>a(12UH_%U_IHdUj}| z_a-1tnu%4QTWg?RX{>U09qWq;F@5I%2hqQym;IRHKbZFcA!nE_@PuN+2MOahRm0&Z zU+qod34fM3xk_vOq>){DdC#J_zPZpLJ`C7W?dLUGAo3yMQ)t&GLBMubAcA#`z~zFW zZ{&< zI|zkoK2xH&M#gG5l9jLK@+!{6-N=H$msz0Jh(m^^ZI{)X?99m}xnL}_j5v&djm!wtZ)Lc?K~${I=f#r+L|OBd8tDC)kq zHzqUWG%MWaAN z+ncK55N`CvKus!nOL#hBj|oTJK%<+SsI?@z&GI44fYGCr?Yaz5r!RTVhgd)VPL**tT_o^ zy*0Fyn5chBbAGKM<6m04=q~CZ&7)nK84#oh<-(m_b3KWmVxvhW$^{wWdVj^cANW%O zv^x)KR2eT)&~b1J_=OPZKOu0&6_B3uuo_PI!tNL_V_aERST%E9d$8n;p>lU;BHKdQ zH>IDvBZ2WsN1j>TwXpLO_OtI{N5y*3uav*HF-faalov8pk@ll@H{#Ewa+wDGr;qgS zOBIU+ON`I%C{5&&RgmU@`8IU^h6XDg{Fpz&#$)B*&0-9e&n-=a0tScH_j5t74e9hg z7pAp1PZ{iMDH-~bWR?L&t?o>>FXnBBQZaXwj>)tYnrT%X)?6+0LN%M`8~I%v;W`_9 z21~U)_|84DfK|1F* z-9ppO;X|BA>P1tQqI{@Xllzsgda+|(MmsX2y$N6OUjm=H%XY{fh_7{>@fCrx4kcsYDhM>N6^y}d+#?j#7Yn1>)V8Jgizl(h9L!~MVJSS4KeAHDq%m6ql; z`Ayx?vB`LOqkUj8Q};UM9o22`dD_N&mhx;zNr2xvu|Ju*SI$MWNY&xOu#RY2kHcu; z&d=;u(xRgwhW_x3l}&!z-hTb?uN=HBf0hy)NXHnDd(G&f7iir=p4E+9znFDYBaqRv zu>|Q)c1(TyhD^oz8#~C(sHb^XA^Cx#JKa5DI?X#zJSgu`eko0nb;wjcVUmChjFpnP zU>GC3dM8r*;9~?nhIsZ7>EV5G@<2bM zAEpE7JN|4mjDM;S@$vgpDk&`+&N={JN{J@9Lgk`r)t1%nA;W7Y)|F-M4?DMv{FrZM zW*6*I-f5#{cuc4h=xSY7TTLek@;YUwE9BE-@mEqb+613#Z0RZZ5=C8$QH7OtacR7r zGoK3=aI!8Dsce8p60b%%i`Z#}MKI5PN|s!2h&gXl!o~Ld3ak6O%p^y!P2k+t0iaJ_ zv+EJIc-xG7zTfa9*H21nH}GxJ6_IW&=!j>5x|iegCpz;x?Hb80zk45T+92o+FyU!o zMhlkz^-WDgaITv0Yrqg@c5jUu27fsZ!B_fgM-^#Cb|Qjq zszcTFZ*S3W+wAwFZa9EmVLH11?k)XX43GBvgDxN(-tI@h$JtSNB>7oPX{76EbwW+b%O>o{4Cm%yesT$7`Q?)A?yT^n~=l0+9Otj#m zt?W-yQqUeDr0s3#lvAivP+e{*d~uV@aD-C~&Qd2l3#%Qho1j;D*Sv^&dx$gYrWoLf zD}c&Lx#<9*iQ&u`CtqLSLfAaSU>(LV&a?BqcZ{p68zWQ^_W9*fwBUS9b3IIoRp?M( zmf-N*4I7Ta9a@SjTOu5j8y(NfXeNOcSw<;<{&sk_Az2fna!_neR(EDI6V&$} z+ho*fDgK%<`d_uapfWB;kB2nfT?I%bTtJ~=K1^rb1i2V@Au`ZxESP35?fE{VFaoAc z=0Qoc2fr+U#}EC&i{&s(FECcc>|E%2X_2l+*;WmBShiO4BqB?88>93F8}lYdHuAjO zrzCk=y+f%9J{<*M(GVpVqZ2!!{6kF3W6?8{A}bjNJWIE0_%^E71R~=(E3%t$xzujy zsOn23_}DkA}mwEb~Y->=jE#@4ZEAhbkmxuaUxff)Y&brBOTM zk%GBy-PP#EQLmkRp3~pzQFvRXqJ~2Fe_6Xmgv|LlAL)q*iZ?xNY&)Vb_`~4Y_nh*? zo3V~9Xf%-|LqM_XHy)Es>Q=%{`eD-|#AgDzLhw#2XPm#lPOT#WBJt6CzNum)imsSb zZs_A?i+r)=%|C+Pj#5%Kj9$xrNyFx0@m)EyY+@b>B3}hcGPuW^aERwyW1Gn##lgy1 zGbV*%A1dTa$>A8Aj%S+4`xe^cLdMqEO=;f*WJ5Y~>`_OKu9&)QnO& z6p0e)q1F0sh%@7b!oxK;y(jNA%3vSM5QsfgMiK|kD!wlF{Y#g(d!X=8RIN%2Z>Lw7 zmJDwHWPQCdM`4u-2epNOjtwYO1>4b?{XkQ>4%a`W<(|@KEtf!^OaC9MZmo?FEq8q3 zsh%d!(z9_|nG-fAcSu^Y%}E&AQ?l|eT7D`XGxlKy6}o*?HwA+F=9bN^{`Tp}5y~Vs z!h=;~!XYG5c3bHgIa_Z5cAIG1!I|~_e37{HRG|OnpzIT1h(q4e)amPzC7<3*66svV zJCe2-QDUV&WQ47}^Z|0!AFd^gKbq*y+(7A(>J@+uq-9m6T8MQa!=~he>px~%%WNkk zy`(1+)d^4kQgcYe`U5vwm=tHr16dQ00yA8YVWk=>!V~-DsO70IS?i?(Vr;=YgsVVw z6)Zk*3s2-Y88=3)nSa>~I}y@VTWcAlV1^O1*rdO^lTpLlPXEsxfKbZCPIlNSZzFS& zcP65zp3CJMgQoxwJ`hvw%h1!JzMe&+&hNGi-&h^y>rq9YoDbVy=KH~-!{;6$wQHQ4 z_|ZL!igby=stjviC_2)ygjy8=i#7aK%7T428%M0U*sTM;94b&3G9n<3C``p>RGkw4 z1i_OiLEEWc({>Ua_09%D`$zZC42H)bm})qZ-5_x`^$|X2#*6dU#JZOa zcQq}331+lL7?gWRh=ID590|>g&T~qGA@Dfji%?0AFt=;c;t;DeUcw!lF@B{~3#LT5 zfl=OG0_iI|9@pc zrl03g!mBEbZdo^+7lD;}j@EjrZ3sT3I0|7;gx1zA1Jn67>aXeu#?W`j5Ag{eoe8gC|b@-URy&sq94zKc_xRi4{riSSg?N7mf&FDfVfCeY=UMDE+>!3hgaK=2j zoRujIq3e356FB*21)s5nI{+pB{#7t+sTdT>E*ZVTgZ{K34H3M(1Zs#PJDDLK<|j0}rE%-=_JORO{zZ7ZXvSbr5jVbVjnNQ;OuAVocRvh& z^-U(s^((obsu*&N#M&cm!8>V+$)!1mM)JW`7k(D{;~*B|V=-g6aP!a)pAu|E07iYu z;asHD?C~K)bE3)eM*LM$&~QTdm#{`P9I^89O1ero5(S{K-tmDfP20;GZiKt^?}!r^ zDCSVHkbi2Zt~9FV8<$~n-DSlN3Y-$wWz8i+ zuo8+7)=t`xR(B8H9eeKndO=$Fh8>$o7AI4pT^$uxA&Q3ullKlNuZT9s;p)wleHW6e zUi!eehW#0i>sS!Oh;SXdk!D>_^=Yncb{N%NFhCDng*pKp+PUHjiy6HLmf7jWS2snO~?^+vIU zU&U#;)`Si+imdpPO1T_Mmv4Xc9}YSpDCr^(W;pKgbTzEp6c=gIoBRAm4^RbFGUSgV zylvOQlj~~T%YjKL{}?$J9xy!Rr*qHgBD4U@GX43#)Z)FUAGZmrDdaIcC{V zfEfv=0I_MKc36qzEO$wuS&4#kqa)#%S)1z+Nf_S$oqDV6c`Q<(bbF?xY}}cdKrDyZ zmT5#u7`JGGq;ey4^+N_uAyP!j%|t?#g1tDKw@`{CUvf-F2yF+e@e1JtVTm*@)Gpg` zj#pgNo%z}-FNtB)wmtri;LBwda~@XB2hZJEVV)%6yklkTOSsKwv8fXTnmBd0T&QYu zko7Ggfja3_m@u>j;rVi2TnTtvhM`=Zl$sI8&@xFV^-wWjb+aFd;RuF6>YXZiQ5WAHxKnPTp=Z>fUoB1;R+ zco|Lr^6NZiqsAuUfhF&Uk5U2d{BogLj&Q+6PnhYtMw?=eiS1c)|R+I{+fGKct zd4AwUqU23KkI5qZ{Z~Y4vaO#zc6wwD!Y3b;zR)1t3bPiq8as~ znC60D>^mU4m%I3Ij1js?$9xGbMV*#sQAG~1MUgnxrcKu031?ybweyVDo7h3fR1;B~ zI!%`1&S}0;#STp^XA$2oIVS78DB;cIcTVaL`&o6J8hL#6xcsz8?UOTB*fa~ZAB-Mx zbI9AHCPs(U9kpZ`Y9M&`iG=G(KZS7u~jM4+ol;9XzWPkRY6YQ9LAeg=XPqueSFn(qaPLt{cFVZgTxGHEkUZZ{RZeBQ*EcOPdfxi=UCxqs zzFi)}W>DXA%6J4wlpc5Jh4@n<)PMh_2;irtD$%~*EKGkL#U^^8zmG^o)RbyLH}9r- zS~mWI+DlDy<&Ua#{6#kWUMBDQM?od2y(VoIE-6|&tg2Cs3=91skr3n9E#KZiFrEMv3qv2Ks6|Rx08bP zO##WCn_0)@ghSq7icGl5n3^@wUL7icmud=$mmMbZ+=IV4+|MBCYf-!@^^l3z$`tQ6 zsW0`voIB`y>esEDJ)9f7!#b?e`x-2&ixlBk;muzuJ_qH+^_u;8vTgQ-37I!WQi-g< zVgh??#y2B}k|h(4FWJNIH+mQued_qX&)qIH`CVwL{jA*Nv~> zoFVjnWIUR3XvnXbA2C;q@~t54zn0Sqs~NnnhNSWg+N?K_O2_a@)LJ^f;cpJq#=+@T zlrp=*4(aerfQ_7!0!Td?YS}`EX*wq=`bxV2doJ7ZNnSP3<$}*(Lnpubs;_>9*5`K| z`r~c==Uaxug(dsvBNpp#Y;1ipEjLaZy0zMLRL8i!BRs%=eUGCtpH4wr+q6h; z+fD&zsEiE0*o#IOhV>O^V})ulZe&nxEt~ypvdo<$&SPuP8Q#?TG?1BP*5nu62MPBU z(M&>q0@rINO~`+OrVA@;W_h^8xc&%I_7xbtOC6RI#ITMH3l6^65U){MF;=_N04om( zX*vd?;^zx@`~__#!(3XY3LQeWAob55O?{}E-xsi~B1petBl$M}#VABhYG>}N*@Gs! z8_L-(@-hs~_}5Ms;jUC8ug71Dt@O3ziDn+NRJso}J8;}F-JfkYyUph>fSMszMSrf? zv)vQi-dLVsx@@Qs+XC{2LzS!=+v?MBvL*_T_u7I+lVpjIyK5BBdwys81mryn0%PYv zs_hLpoD}D8R5OdwG6vNOxAF%DkI8j@#?<4z>QMVohB(S7&ei`oQY-rE;$0vw0`6*&Zyr*n(ZL`tmHiu-E|AbO zV&ybmUtqy|d+tqQ7WD9cX#$uU40Sp1hB!5gtthLw8#O}K8`hPbPn`SdyKA$4UK|*G zJ~I7Y1{?po7y)<%_~NxB_SPmH>oeB0ukO(ML)xAqW(e8swa$WQ;>D>%iuV%CCD*v= z!5%gQ2~GU$b9i$kht5`*C1~b5E4zzCT0dR){=7(+AD~ja9IUPtil-_0Ud>XhE3Rdv zkKd_oGtoOS{Y?c7Qz)7|mBP7==3(PRu%c)`#z4^#*zw0waT6A2?&lm5DmQ`y{Av6oZ^lvEOr;;Y+ z@$ern&zc{C8HwL4Q9DP7xvJ=}H0`kOve(GDBh$fg4ctwIPsN?x6Xs~~#};(BZ4%-O zRo8h@%;TLE+NgkT3GKI$h=+KrmlfN@J{MHB%)_w-t{F5F%1tKUk5VqPa<;7ms=U8( zTzyY#gav1y4K%YY~{3)hsd(WmBg_( z79X0|xPMKY)^>y-ZW!ahyoIBGHU&^)J8V#Ps0S5WD^6i-v_z< zp_%DgHH_DZ6{II4T7eo$+Lx{ft!({Qpa52Tl^I%OfEXlQQu>PLeo!zU#8epc)?ypNSb_$UwCjRV zF_(*>-vqyHPj*KpjA_R@NF~e)x=K^^SNpJMd#I=IE>EV=K(slqy|w7*HF}pTkrOO7 z3o0aK4xbV(Zsn?1=TAZRYq{8$%07Rs0pI725O7JFFmP&#gi>k*?~id9&*3JpRBGis z!8Y9bMu7wdO{fJ!KIyUFamK(H-eC4LjaPHrR=0Qb@R2@;ImI9KAHs9KKO;LBz2NpP zk(OY2jrJJjSmKy|h0BQwGZ(*#KXOTil5%s?^N*~uUm6Q{MJCS(Z%2KcG7Oxk;X-${ zQP@d@P?<9jg+Y=Grp)v5^Ojz74GG+4)kc*ukHhs7QQxgG%)(_bi1b9DEQ&I)`Nh?yQIwtI zmrST5)x*5^az}eb8aN;~^D>qG1 zjBqoDI?GlL^uXJ9$(x8fzl>R>{+^=ulM_lZr7oA+QxmJ__g$;Jw~qH}a`hYv1U&Ky zh!75SU^J!+)yl2RV(mxi7b7aP%-lYcwTs=>Xlr5=>%p;Q`C2=1Ws%;M=GIxoM2z6_ ztl4G&{k{rkQQV?6L}k#IGH|ES7Wvmbn7cV7GwI%O%bFVvuDT7nyr=5NFmJqr?hkcC zcPEk4FTt#6d~3sDFlw{vu+j-R7^j>8uNH4k5C@q;Cz{tNM7a=!OEb%yXWj%7VNsk7 z@Y6azpC04*$_WJLVO8{#@ay6)+r)mCx>#G~Ub}M*OJaE~JEC~<(2>)|7GVZl+a-pR z0>+SbM(g9ZKS*UzyOns7$_DfSt{M!1ICOA%#?flMQR6Yo5U#~K>me+^siuW8l3G5d z!yEwWB6Cq#*xZr}j1y%AfR4-;+Cj{wtQ7P1*Bu*|TG3}}*6z6$(Jc`wDtMRW` z{nRICIy>yz0u4m`I3hMX>@~E%pwJa2#hSseuE8?S86qp>@(+q0k?H zOs1}V;pW44U5uZD}xM$l+_$7=vvx;A->>Dc&#vImytx)Iq7qIF1%x; z#@E5a1M;fF`vMA*9`IhYtwzhkI*QTYY?+`%IN*vE zO2IymLLt%j0D4V+75nk&waE@s`n#Lu1H7^YL)ueG{v+WZc4s^(j$YdMCB)mL1VxQJ zpS8)o8uUbivM{+~O`XPr%>e);Efr_$k#Z+4A!rsPGk z1-*~KnDyy8C75*pedI8kWj6q=NW|1Y@pS z<8JceM^HTHWTDr!i!G5c|JN40kp}ONQKi;Svz_fF>eM^M%-_Ls?KpQ9zMR51GT@^QV=k zt&LQmV_GgEhDjbHB>Xi|OhYt$;wr}v&BEE-iPYuDq+_7Jt)_5WC|S&zA5RrdZTX5b zg*6+IGQ9e=oiSj~$^D_g(9X3$#o=o()BSQKdJ>rubkzD(eJO(|874& z-)brM4GfJFqVLHH5na!U6^eenCsz3I-?`RyL#v9ZO^V`rUT=p?kUTP}EfmZ-dNXrr z(?V4ay8a0Ydiq@eOeiIBxtU$ZO-~`9+p+>ET&~fcNS<;mOEJO|r^T$Qv!;t{V2ao{ z-Gy*?|8;k#jBF#wn8<5`KdrV?G_o6`3!QI3^#qEBIMdGK8>Zyb;7g?Sn<1>X2&k6x zQZFGYpy(RUuewW6qcIuFfbtXq>C>QvLSe%YceEz3dV(Mv&Sy)Bb<7D0vcvbWxZZJ% zF%BJqq(ApI`4w_>4z{}QQlw>RpSs=Xv2SrRm`%Sb#LO>mdN5nWQXR)|E2hqfZ%A$% zR6>V=LOs&4box2?yE{0d(yGF7 z4=)8m0!L%);rDh>ld<9D+RoOmmQ#dEpo4gC^lnn+qI&0Vpes9*dqXJ=lt^69R3<5w zCRnG`jFnPox|%t9p;>(!8P4X`TEP{(ZLJl`-r^Dp>ooeOEyS1Y*NX0Fx^u0I6|nl} zBNs0{C(1u5GeuI3XV*dv1{{~JfA7+j(ITWW2RCK-)gN;ya^7F(u(2o) z#t&Zf5b89MB~ZhAXjm+4JnE}NARUejMH3K>74`h4Pn=mPHj;QIdQa`iEV;i2*_K0- z6Wi=|pObaZzNm<}7R);<;S!PA>o%RYO8~}0N zEG4{6aj9&f0xGnSie0;O?WD zT+)Yzu)4T4n`LoKN1_gP&jPx*XnwJN#vd`@KfS3;gH70YYG0`hbzp!rc86(qE~Z_l zckPo=8UKDWXtAXk8W&Tpb5AtA_ch+?SlBKj) z!8D#1x1@1nRoaf8KN}I(2~HK8%S09TyDkY!jog`6{6L!#WeL~c4+%F5l(E2aT%^Rv z$`C8|98SEP3>j1p7fo5E1+qkZ7b7)BcF#+d`QMoXt5-&SdAhAwlPudm=54}!e=-Hh ze^soz4AbxcDn!*5GrmU_9)`$ySg-sgN+ebxe<*VWGIrWVCw2QeS)u=0T-E7ylp3*e zb|y^Wq^(HT)wS`&CV?|>f?Hnqen>o(ZbT!Vo}M*2cvkP3PbhL20y zmvW4SAPeqo2LQ<=2pa99fYa8|0=;;BUavEr8- zYz@KP4S_9ws{NxxbyP<8WZEe=T#98|;9hbW?Oz}Yc43Ytu9h&|nmdkOia9eN+gq@Y z8U~At4`;EGEUQ_rrrYwrC-tw}>H5eSSbHhP$PqfmNVmTd?Q`A<{Q;4Tk;guN+$Kk> zIAq#Tc}rPos+6qHEkql0H~E#eBED-FhRHYQOdFX_ss*w*jA^Ap*HUfd+E^+aoS2VA7>A{aPp93`3shMGOa9|7OQIj0S7@7@ct@uvx&Y0&;gP4H@GB38jSBY3P z2PM%QQc&*Pbz+oHDhT`{aZs=%&F+tOUSp`J*`hLMTa%U6>aW8EI{fr<@_(PN||)`HRy%C_vpR-JZQmemhkv6o2K40J^Ms#SM3Ukf319md@l?6=WKe__H6mzqG?P1ZShJy zB@&`^t<8b!rr(tKCQkm7OnfFa3>Reg02?R|r~l4<_3wdm$HPpW6&v`|McZoM^Ckml z{5P}TUOGKtMwn_4$3?r+JuJ=no=KwbGgB^3=6w{;$FSY?%`-3a9<3vKOA;GDl$}}V zXx!6Rd$L8sRwjL0pGcc+sGXJCwwo#;FC;SL5-+WmR^Qi<5HWjmv`0@t{Dei5FHCWcOj&*AXPy>ATb?w5QA@ON@k){euY9b@H`0cArA%!hOrS`%-GlzCJi$y zD784hv?w{XSOIk21n3wCAkcTt&nrpI1KJ5X3IZk=kXQs1Q!s@JAsrY25<(nR;hmWR zbgTl%4?zkrdz|x2fqD%wd{7J&K{Ck<#Uzjyi{Tc690u{ab7DziPJTM7){3IkG%f=L zb1p~#fJg;1Q&VG81)wk#7y`ou1QhaMLWagbFCq&Wnpv1zpbJ?VpsO-BFgHh2Wo~E+ z3`3|{B}IvuIjKclp!oB20S1Rgaei*9rh-OhiY6pb^n>#AOB6sJ1_!WyaAs91(DmR` WG!lzSz}_)5H!?KfQdM>JcLM+iEli34 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/OnboardingButtonsView.swift b/DuckDuckGo/OnboardingButtonsView.swift index 259e6c8dc8..d674397f5e 100644 --- a/DuckDuckGo/OnboardingButtonsView.swift +++ b/DuckDuckGo/OnboardingButtonsView.swift @@ -51,8 +51,14 @@ struct OnboardingActions: View { extension OnboardingActions { class Model: ObservableObject { - @Published var primaryButtonTitle = "" - @Published var secondaryButtonTitle = "" - @Published var isContinueEnabled = true + @Published var primaryButtonTitle: String + @Published var secondaryButtonTitle: String + @Published var isContinueEnabled: Bool + + init(primaryButtonTitle: String = "", secondaryButtonTitle: String = "", isContinueEnabled: Bool = true) { + self.primaryButtonTitle = primaryButtonTitle + self.secondaryButtonTitle = secondaryButtonTitle + self.isContinueEnabled = isContinueEnabled + } } } diff --git a/DuckDuckGo/OnboardingExperiment/MetricBuilder/MetricBuilder.swift b/DuckDuckGo/OnboardingExperiment/MetricBuilder/MetricBuilder.swift new file mode 100644 index 0000000000..32af0ab644 --- /dev/null +++ b/DuckDuckGo/OnboardingExperiment/MetricBuilder/MetricBuilder.swift @@ -0,0 +1,69 @@ +// +// MetricBuilder.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI +import class UIKit.UIScreen + +final class MetricBuilder { + private let iPhoneValue: T + private let iPadValue: T + private var iPhoneSmallScreen: T? + + init(iPhone: T, iPad: T) { + iPhoneValue = iPhone + iPadValue = iPad + } + + convenience init(value: T) { + self.init(iPhone: value, iPad: value) + } + + func smallIphone(_ value: T) -> Self { + iPhoneSmallScreen = value + return self + } + + func build(v: UserInterfaceSizeClass?, h: UserInterfaceSizeClass?) -> T { + if isIPad(v, h) { + iPadValue + } else { + if isIPhoneSmallScreen(UIScreen.main.bounds.size) { + iPhoneSmallScreen ?? iPhoneValue + } else { + iPhoneValue + } + } + } + + private func isIPhonePortrait(_ verticalSizeClass: UserInterfaceSizeClass?, _ horizontalSizeClass: UserInterfaceSizeClass?) -> Bool { + verticalSizeClass == .regular && horizontalSizeClass == .compact + } + + private func isIPhoneLandscape(_ verticalSizeClass: UserInterfaceSizeClass?) -> Bool { + verticalSizeClass == .compact + } + + private func isIPhoneSmallScreen(_ frame: CGSize) -> Bool { + frame.height > 0 && frame.height <= 667 // iPhone SE + } + + private func isIPad(_ verticalSizeClass: UserInterfaceSizeClass?, _ horizontalSizeClass: UserInterfaceSizeClass?) -> Bool { + verticalSizeClass == .regular && horizontalSizeClass == .regular + } +} diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingBackground.swift b/DuckDuckGo/OnboardingExperiment/OnboardingBackground.swift new file mode 100644 index 0000000000..ec2c3b2620 --- /dev/null +++ b/DuckDuckGo/OnboardingExperiment/OnboardingBackground.swift @@ -0,0 +1,95 @@ +// +// OnboardingBackground.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +struct OnboardingBackground: View { + + var body: some View { + ZStack { + Gradient() + + Image(.daxOnboardingBackground) + .resizable() + .aspectRatio(contentMode: .fill) + } + .ignoresSafeArea() + } +} + +// MARK: - Gradient + +private extension OnboardingBackground { + + struct Gradient: View { + @Environment(\.colorScheme) private var colorScheme + + var body: some View { + switch colorScheme { + case .light: + lightGradient + case .dark: + darkGradient + @unknown default: + lightGradient + } + } + + private var lightGradient: some View { + gradient(colorStops: [ + .init(color: Color(red: 1, green: 0.9, blue: 0.87), location: 0.00), + .init(color: Color(red: 0.99, green: 0.89, blue: 0.87), location: 0.28), + .init(color: Color(red: 0.99, green: 0.89, blue: 0.87), location: 0.46), + .init(color: Color(red: 0.96, green: 0.87, blue: 0.87), location: 0.72), + .init(color: Color(red: 0.9, green: 0.84, blue: 0.92), location: 1.00), + ]) + } + + private var darkGradient: some View { + gradient(colorStops: [ + .init(color: Color(red: 0.29, green: 0.19, blue: 0.25), location: 0.00), + .init(color: Color(red: 0.35, green: 0.23, blue: 0.32), location: 0.28), + .init(color: Color(red: 0.37, green: 0.25, blue: 0.38), location: 0.46), + .init(color: Color(red: 0.2, green: 0.15, blue: 0.32), location: 0.72), + .init(color: Color(red: 0.16, green: 0.15, blue: 0.34), location: 1.00), + ]) + } + + private func gradient(colorStops: [SwiftUI.Gradient.Stop]) -> some View { + LinearGradient( + stops: colorStops, + startPoint: UnitPoint(x: 0, y: 0.5), + endPoint: UnitPoint(x: 1, y: 0.5) + ) + .rotationEffect(Angle(degrees: 90)) + } + + } + +} + +#Preview("Light Mode") { + OnboardingBackground() + .preferredColorScheme(.light) +} + +#Preview("Dark Mode") { + OnboardingBackground() + .preferredColorScheme(.dark) +} diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingDefaultBrowserView.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingDefaultBrowserView.swift new file mode 100644 index 0000000000..50530d61f9 --- /dev/null +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingDefaultBrowserView.swift @@ -0,0 +1,80 @@ +// +// OnboardingDefaultBrowserView.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +struct OnboardingDefaultBrowserView: View { + @Environment(\.verticalSizeClass) private var verticalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass + + let setAsDefaultBrowserAction: () -> Void + let cancelAction: () -> Void + + var body: some View { + ZStack { + Color(designSystemColor: .surface) + .ignoresSafeArea() + + VStack(spacing: Metrics.verticalSpacing) { + Text(UserText.onboardingDefaultBrowserTitle) + .onboardingTitleStyle() + .padding([.top, .horizontal]) + + Text(UserText.DaxOnboardingExperiment.DefaultBrowser.message) + .font(.system(size: 16.0)) + .multilineTextAlignment(.center) + .foregroundColor(.secondary) + + Image(.ddgDefaultBrowser) + .resizable() + .aspectRatio(contentMode: .fit) + .padding(.top, 48) + + Spacer() + .frame(height: Metrics.spacerHeight.build(v: verticalSizeClass, h: horizontalSizeClass)) + + OnboardingActions( + viewModel: .init( + primaryButtonTitle: UserText.onboardingSetAsDefaultBrowser, + secondaryButtonTitle: UserText.onboardingDefaultBrowserMaybeLater + ), + primaryAction: setAsDefaultBrowserAction, + secondaryAction: cancelAction + ) + + } + .padding(.top) + .frame(maxWidth: Metrics.viewWidth, maxHeight: .infinity, alignment: .center) + } + } +} + +// MARK: - Metrics + +private enum Metrics { + static let verticalSpacing: CGFloat = 16.0 + static let spacerHeight = MetricBuilder(iPhone: 142, iPad: 142).smallIphone(10) + static let viewWidth: CGFloat = 325.0 +} + +// MARK: - Preview + +#Preview { + OnboardingDefaultBrowserView(setAsDefaultBrowserAction: {}, cancelAction: {}) +} diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift new file mode 100644 index 0000000000..d6e2d6f2cb --- /dev/null +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift @@ -0,0 +1,56 @@ +// +// OnboardingIntroViewModel.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import Core +import class UIKit.UIApplication + +final class OnboardingIntroViewModel: ObservableObject { + @Published private(set) var state: OnboardingView.ViewState = .landing + + var onCompletingOnboardingIntro: (() -> Void)? + private let urlOpener: URLOpener + + init(urlOpener: URLOpener = UIApplication.shared) { + self.urlOpener = urlOpener + } + + func onAppear() { + state = .onboarding(.startOnboardingDialog) + } + + func startOnboardingAction() { + state = .onboarding(.browsersComparisonDialog) + } + + func chooseBrowserAction() { + state = .chooseBrowser + } + + func setDefaultBrowserAction() { + if let url = URL(string: UIApplication.openSettingsURLString) { + urlOpener.open(url) + } + onCompletingOnboardingIntro?() + } + + func cancelSetDefaultBrowserAction() { + onCompletingOnboardingIntro?() + } +} diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift new file mode 100644 index 0000000000..a2049c29c8 --- /dev/null +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift @@ -0,0 +1,194 @@ +// +// OnboardingView.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +// MARK: - OnboardingView + +struct OnboardingView: View { + + @Environment(\.verticalSizeClass) private var verticalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass + @ObservedObject private var model: OnboardingIntroViewModel + + init(model: OnboardingIntroViewModel) { + self.model = model + } + + var body: some View { + Group { + switch model.state { + case .landing: + backgroundWrapped(view: landingView) + case let .onboarding(viewState): + backgroundWrapped(view: mainView(state: viewState)) + case .chooseBrowser: + chooseBrowserView + } + } + .transition(.opacity) + } + + private func backgroundWrapped(view: some View) -> some View { + GeometryReader { proxy in + ZStack { + OnboardingBackground() + .frame(width: proxy.size.width, height: proxy.size.height) + + view + } + } + } + + private func mainView(state: ViewState.Intro) -> some View { + GeometryReader { geometry in + VStack(alignment: .center) { + switch state { + case .startOnboardingDialog: + introView + .frame(width: geometry.size.width) + case .browsersComparisonDialog: + browsersComparisonView + .frame(width: geometry.size.width) + } + } + .offset(y: geometry.size.height * Metrics.dialogVerticalOffsetPercentage.build(v: verticalSizeClass, h: horizontalSizeClass)) + .transition(.opacity) + .animation(.easeInOut(duration: 0.5)) + } + } + + private var chooseBrowserView: some View { + OnboardingDefaultBrowserView( + setAsDefaultBrowserAction: { + model.setDefaultBrowserAction() + }, + cancelAction: { + model.cancelSetDefaultBrowserAction() + } + ) + } + + private var landingView: some View { + return LandingView() + .ignoresSafeArea(edges: .bottom) + .frame(maxHeight: .infinity, alignment: .bottom) + .onAppear { + DispatchQueue.main.asyncAfter(deadline: .now() + Metrics.daxDialogDelay) { + withAnimation { + model.onAppear() + } + } + } + } + + private var introView: some View { + DaxDialogIntroView { + withAnimation { + model.startOnboardingAction() + } + } + .onboardingDaxDialogStyle() + .padding() + } + + private var browsersComparisonView: some View { + DaxDialogBrowsersComparisonView { + withAnimation { + model.chooseBrowserAction() + } + } + .onboardingDaxDialogStyle() + .padding() + } +} + +// MARK: - View State + +extension OnboardingView { + + enum ViewState: Equatable { + case landing + case onboarding(Intro) + case chooseBrowser + } + +} + +extension OnboardingView.ViewState { + + enum Intro: Equatable { + case startOnboardingDialog + case browsersComparisonDialog + } + +} + +// MARK: - Landing View + +extension OnboardingView { + + struct LandingView: View { + @Environment(\.verticalSizeClass) private var verticalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass + + var body: some View { + GeometryReader { proxy in + VStack { + Spacer() + + Image(.daxIcon) + .resizable() + .frame(width: Metrics.iconSize.width, height: Metrics.iconSize.height) + + Text(UserText.onboardingWelcomeHeader) + .onboardingTitleStyle() + .frame(width: Metrics.titleWidth.build(v: verticalSizeClass, h: horizontalSizeClass), alignment: .top) + + Spacer() + + Image(Metrics.hikerImage.build(v: verticalSizeClass, h: horizontalSizeClass)) + } + .frame(width: proxy.size.width, height: proxy.size.height, alignment: .center) + } + } + } +} + +// MARK: - Metrics + +private enum Metrics { + static let iconSize = CGSize(width: 70, height: 70) + static let titleWidth = MetricBuilder(iPhone: 252, iPad: nil) + static let hikerImage = MetricBuilder(value: .hiker).smallIphone(.hikerSmall) + static let daxDialogDelay: TimeInterval = 2.0 + static let dialogVerticalOffsetPercentage = MetricBuilder(iPhone: 0.1, iPad: 0.2).smallIphone(0.05) +} + +// MARK: - Preview + +#Preview("Onboarding - Light") { + OnboardingView(model: .init()) + .preferredColorScheme(.light) +} + +#Preview("Onboarding - Dark") { + OnboardingView(model: .init()) + .preferredColorScheme(.dark) +} diff --git a/DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift b/DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift new file mode 100644 index 0000000000..147955a73a --- /dev/null +++ b/DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift @@ -0,0 +1,46 @@ +// +// DaxDialogStyles.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +extension OnboardingStyles { + + struct DaxDialogStyle: ViewModifier { + @Environment(\.verticalSizeClass) private var verticalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass + + func body(content: Content) -> some View { + content + .frame(maxWidth: Metrics.daxDialogMaxWidth.build(v: verticalSizeClass, h: horizontalSizeClass)) + } + + } + +} + +private enum Metrics { + static let daxDialogMaxWidth = MetricBuilder(iPhone: nil, iPad: 480) +} + +extension View { + + func onboardingDaxDialogStyle() -> some View { + modifier(OnboardingStyles.DaxDialogStyle()) + } +} diff --git a/DuckDuckGo/OnboardingExperiment/Styles/OnboardingTextStyles.swift b/DuckDuckGo/OnboardingExperiment/Styles/OnboardingTextStyles.swift new file mode 100644 index 0000000000..a0fe295316 --- /dev/null +++ b/DuckDuckGo/OnboardingExperiment/Styles/OnboardingTextStyles.swift @@ -0,0 +1,51 @@ +// +// OnboardingTextStyles.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +enum OnboardingStyles {} + +extension OnboardingStyles { + + struct TitleStyle: ViewModifier { + + func body(content: Content) -> some View { + let view = content + .font(.system(size: 28, weight: .bold)) + .foregroundColor(.primary) + .multilineTextAlignment(.center) + + if #available(iOS 16, *) { + return view.kerning(0.38) + } else { + return view + } + } + + } + +} + +extension View { + + func onboardingTitleStyle() -> some View { + modifier(OnboardingStyles.TitleStyle()) + } + +} diff --git a/DuckDuckGoTests/MockURLOpener.swift b/DuckDuckGoTests/MockURLOpener.swift new file mode 100644 index 0000000000..79a5b9fe6e --- /dev/null +++ b/DuckDuckGoTests/MockURLOpener.swift @@ -0,0 +1,41 @@ +// +// MockURLOpener.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +@testable import Core + +final class MockURLOpener: URLOpener { + private(set) var didCallCanOpenURL = false + private(set) var didCallOpenURL = false + private(set) var capturedURL: URL? + + var canOpenURL = false + + func canOpenURL(_ url: URL) -> Bool { + didCallCanOpenURL = true + capturedURL = url + return canOpenURL + } + + func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey: Any], completionHandler completion: ((Bool) -> Void)?) { + didCallOpenURL = true + capturedURL = url + } + +} diff --git a/DuckDuckGoTests/OnboardingIntroViewModelTests.swift b/DuckDuckGoTests/OnboardingIntroViewModelTests.swift new file mode 100644 index 0000000000..faa7b46c29 --- /dev/null +++ b/DuckDuckGoTests/OnboardingIntroViewModelTests.swift @@ -0,0 +1,119 @@ +// +// OnboardingIntroViewModelTests.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest +@testable import DuckDuckGo + +final class OnboardingIntroViewModelTests: XCTestCase { + + func testWhenSubscribeToViewStateThenShouldSendLanding() { + // GIVEN + let sut = OnboardingIntroViewModel() + + // WHEN + let result = sut.state + + // THEN + XCTAssertEqual(result, .landing) + } + + func testWhenOnAppearIsCalledIsCalledThenViewStateChangesToStartOnboardingDialog() { + // GIVEN + let sut = OnboardingIntroViewModel() + XCTAssertEqual(sut.state, .landing) + + // WHEN + sut.onAppear() + + // THEN + XCTAssertEqual(sut.state, .onboarding(.startOnboardingDialog)) + } + + func testWhenStartOnboardingActionIsCalledThenViewStateChangesToBrowsersComparisonDialog() { + // GIVEN + let sut = OnboardingIntroViewModel() + XCTAssertEqual(sut.state, .landing) + + // WHEN + sut.startOnboardingAction() + + // THEN + XCTAssertEqual(sut.state, .onboarding(.browsersComparisonDialog)) + } + + func testWhenChooseBrowserActionIsCalledThenViewStateChangesToChooseBrowser() { + // GIVEN + let sut = OnboardingIntroViewModel() + XCTAssertEqual(sut.state, .landing) + + // WHEN + sut.chooseBrowserAction() + + // THEN + XCTAssertEqual(sut.state, .chooseBrowser) + } + + func testWhenSetDefaultBrowserActionIsCalledThenURLOpenerOpensSettingsURL() { + // GIVEN + let urlOpenerMock = MockURLOpener() + let sut = OnboardingIntroViewModel(urlOpener: urlOpenerMock) + XCTAssertFalse(urlOpenerMock.didCallOpenURL) + XCTAssertNil(urlOpenerMock.capturedURL) + + // WHEN + sut.setDefaultBrowserAction() + + // THEN + XCTAssertTrue(urlOpenerMock.didCallOpenURL) + XCTAssertEqual(urlOpenerMock.capturedURL?.absoluteString, UIApplication.openSettingsURLString) + } + + func testWhenSetDefaultBrowserActionIsCalledThenOnCompletingOnboardingIntroIsCalled() { + // GIVEN + var didCallOnCompletingOnboardingIntro = false + let sut = OnboardingIntroViewModel(urlOpener: MockURLOpener()) + sut.onCompletingOnboardingIntro = { + didCallOnCompletingOnboardingIntro = true + } + XCTAssertFalse(didCallOnCompletingOnboardingIntro) + + // WHEN + sut.setDefaultBrowserAction() + + // THEN + XCTAssertTrue(didCallOnCompletingOnboardingIntro) + } + + func testWhenCancelSetDefaultBrowserActionIsCalledThenOnCompletingOnboardingIntroIsCalled() { + // GIVEN + var didCallOnCompletingOnboardingIntro = false + let sut = OnboardingIntroViewModel(urlOpener: MockURLOpener()) + sut.onCompletingOnboardingIntro = { + didCallOnCompletingOnboardingIntro = true + } + XCTAssertFalse(didCallOnCompletingOnboardingIntro) + + // WHEN + sut.cancelSetDefaultBrowserAction() + + // THEN + XCTAssertTrue(didCallOnCompletingOnboardingIntro) + } + +}