Skip to content

Commit

Permalink
Onboarding Intro Main Screens (#2994)
Browse files Browse the repository at this point in the history
  • Loading branch information
alessandroboron committed Jul 2, 2024
1 parent d3c7393 commit 8286794
Show file tree
Hide file tree
Showing 21 changed files with 917 additions and 3 deletions.
33 changes: 33 additions & 0 deletions Core/URLOpener.swift
Original file line number Diff line number Diff line change
@@ -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 {}
72 changes: 72 additions & 0 deletions DuckDuckGo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -601,13 +601,23 @@
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 */; };
9FA5E44E2BF1B16400BDEF02 /* SubscriptionContainerViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA5E44D2BF1B16400BDEF02 /* SubscriptionContainerViewModelTests.swift */; };
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 */; };
Expand Down Expand Up @@ -2239,12 +2249,22 @@
98F3A1D7217B37010011A0D4 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; };
98F6EA462863124100720957 /* ContentBlockerRulesLists.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentBlockerRulesLists.swift; sourceTree = "<group>"; };
98F78B8D22419093007CACF4 /* ThemableNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemableNavigationController.swift; sourceTree = "<group>"; };
9F23B8002C2BC94400950875 /* OnboardingBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingBackground.swift; sourceTree = "<group>"; };
9F23B8022C2BCD0000950875 /* DaxDialogStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogStyles.swift; sourceTree = "<group>"; };
9F23B8052C2BE22700950875 /* OnboardingIntroViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingIntroViewModelTests.swift; sourceTree = "<group>"; };
9F23B8082C2BE9B700950875 /* MockURLOpener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLOpener.swift; sourceTree = "<group>"; };
9F2510132BF5809E0096DB16 /* SubscriptionFlowViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionFlowViewModelTests.swift; sourceTree = "<group>"; };
9FA5E44A2BF1AF3400BDEF02 /* SubscriptionContainerViewFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionContainerViewFactory.swift; sourceTree = "<group>"; };
9FA5E44D2BF1B16400BDEF02 /* SubscriptionContainerViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionContainerViewModelTests.swift; sourceTree = "<group>"; };
9FB027112C2526DD009EA190 /* DaxDialogIntroView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogIntroView.swift; sourceTree = "<group>"; };
9FB027132C252E0C009EA190 /* DaxDialogBrowsersComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogBrowsersComparisonView.swift; sourceTree = "<group>"; };
9FB027182C26BC29009EA190 /* BrowsersComparisonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsersComparisonModel.swift; sourceTree = "<group>"; };
9FB0271A2C2927D0009EA190 /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = "<group>"; };
9FB0271C2C293619009EA190 /* OnboardingIntroViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingIntroViewModel.swift; sourceTree = "<group>"; };
9FB0271E2C294985009EA190 /* OnboardingDefaultBrowserView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingDefaultBrowserView.swift; sourceTree = "<group>"; };
9FE08BD22C2A5B88001D5EBC /* OnboardingTextStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingTextStyles.swift; sourceTree = "<group>"; };
9FE08BD52C2A60CD001D5EBC /* MetricBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetricBuilder.swift; sourceTree = "<group>"; };
9FE08BD92C2A86D0001D5EBC /* URLOpener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLOpener.swift; sourceTree = "<group>"; };
9FF7E9812C22A1F100902BE5 /* DaxDialogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogView.swift; sourceTree = "<group>"; };
9FF7E9852C23D10300902BE5 /* BrowsersComparisonChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsersComparisonChart.swift; sourceTree = "<group>"; };
AA3D854423D9942200788410 /* AppIconSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconSettingsViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -4189,6 +4209,24 @@
name = Themes;
sourceTree = "<group>";
};
9F23B7FF2C2BABE000950875 /* OnboardingIntro */ = {
isa = PBXGroup;
children = (
9FB0271C2C293619009EA190 /* OnboardingIntroViewModel.swift */,
9FB0271A2C2927D0009EA190 /* OnboardingView.swift */,
9FB0271E2C294985009EA190 /* OnboardingDefaultBrowserView.swift */,
);
path = OnboardingIntro;
sourceTree = "<group>";
};
9F23B8042C2BE20500950875 /* Onboarding */ = {
isa = PBXGroup;
children = (
9F23B8052C2BE22700950875 /* OnboardingIntroViewModelTests.swift */,
);
name = Onboarding;
sourceTree = "<group>";
};
9FA5E44C2BF1B14100BDEF02 /* Subscription */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -4217,11 +4255,32 @@
path = BrowsersComparison;
sourceTree = "<group>";
};
9FE08BD12C2A5B77001D5EBC /* Styles */ = {
isa = PBXGroup;
children = (
9FE08BD22C2A5B88001D5EBC /* OnboardingTextStyles.swift */,
9F23B8022C2BCD0000950875 /* DaxDialogStyles.swift */,
);
path = Styles;
sourceTree = "<group>";
};
9FE08BD42C2A60BD001D5EBC /* MetricBuilder */ = {
isa = PBXGroup;
children = (
9FE08BD52C2A60CD001D5EBC /* MetricBuilder.swift */,
);
path = MetricBuilder;
sourceTree = "<group>";
};
9FF7E9802C22A19800902BE5 /* OnboardingExperiment */ = {
isa = PBXGroup;
children = (
9FE08BD42C2A60BD001D5EBC /* MetricBuilder */,
9FE08BD12C2A5B77001D5EBC /* Styles */,
9FB027172C26BC0F009EA190 /* BrowsersComparison */,
9FB027102C2526A8009EA190 /* DaxDialogs */,
9F23B7FF2C2BABE000950875 /* OnboardingIntro */,
9F23B8002C2BC94400950875 /* OnboardingBackground.swift */,
);
path = OnboardingExperiment;
sourceTree = "<group>";
Expand Down Expand Up @@ -4963,6 +5022,7 @@
851DFD88212C5ED600D95F20 /* Main */,
EE56DE3A2A6038F500375C41 /* NetworkProtection */,
F1D477C71F2139210031ED49 /* OmniBar */,
9F23B8042C2BE20500950875 /* Onboarding */,
98EA2C3F218BB5140023E1DC /* Settings */,
9FA5E44C2BF1B14100BDEF02 /* Subscription */,
F13B4BF71F18C9E800814661 /* Tabs */,
Expand Down Expand Up @@ -5132,6 +5192,7 @@
1EE411F22857C4A30003FE64 /* CollectionExtension.swift */,
1E6A4D682984208800A371D3 /* LocaleExtension.swift */,
56D855692BEA9169009F9698 /* CurrentDateProviding.swift */,
9FE08BD92C2A86D0001D5EBC /* URLOpener.swift */,
);
name = Utilities;
sourceTree = "<group>";
Expand Down Expand Up @@ -5208,6 +5269,7 @@
CBDD5DE029A6741300832877 /* MockBundle.swift */,
C1B0F6412AB08BE9001EAF05 /* MockPrivacyConfiguration.swift */,
C185ED652BD43A5500BAE9DC /* MockDDGSyncing.swift */,
9F23B8082C2BE9B700950875 /* MockURLOpener.swift */,
);
name = Mocks;
sourceTree = "<group>";
Expand Down Expand Up @@ -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 */,
Expand Down Expand Up @@ -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 */,
Expand Down Expand Up @@ -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 */,
Expand Down Expand Up @@ -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 */,
Expand Down Expand Up @@ -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 */,
Expand Down Expand Up @@ -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 */,
Expand All @@ -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 */,
Expand Down Expand Up @@ -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 */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "DDGDefaultBrowser.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "DaxOnboardingBackground.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
16 changes: 16 additions & 0 deletions DuckDuckGo/DaxOnboarding.xcassets/Hiker.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "Hiker.pdf",
"idiom" : "iphone"
},
{
"filename" : "HikerLarge.pdf",
"idiom" : "ipad"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "HikerSmall.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 9 additions & 3 deletions DuckDuckGo/OnboardingButtonsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}
Loading

0 comments on commit 8286794

Please sign in to comment.