From a3bf844edb60fb0d90a98f6c8bde30aec23d4e4c Mon Sep 17 00:00:00 2001
From: Anh Do <18567+quanganhdo@users.noreply.github.com>
Date: Wed, 30 Oct 2024 16:35:05 -0400
Subject: [PATCH 01/29] Update tests to use new tagline (#3439)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Task/Issue URL:
https://app.asana.com/0/1205591970852438/1208504563612286/f
Tech Design URL:
CC:
**Description**:
Updates new tagline. No user facing strings, but we might as well update
the test data.
**Steps to test this PR**:
1.
2.
**Definition of Done (Internal Only)**:
* [ ] Does this PR satisfy our [Definition of
Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)?
**Copy Testing**:
* [ ] Use of correct apostrophes in new copy, ie `’` rather than `'`
**Orientation Testing**:
* [ ] Portrait
* [ ] Landscape
**Device Testing**:
* [ ] iPhone SE (1st Gen)
* [ ] iPhone 8
* [ ] iPhone X
* [ ] iPhone 14 Pro
* [ ] iPad
**OS Testing**:
* [ ] iOS 15
* [ ] iOS 16
* [ ] iOS 17
**Theme Testing**:
* [ ] Light theme
* [ ] Dark theme
---
###### Internal references:
[Software Engineering
Expectations](https://app.asana.com/0/59792373528535/199064865822552)
[Technical Design
Template](https://app.asana.com/0/59792373528535/184709971311943)
---
DuckDuckGoTests/BookmarksExporterTests.swift | 2 +-
DuckDuckGoTests/MockFiles/bookmarks_brave.html | 2 +-
DuckDuckGoTests/MockFiles/bookmarks_chrome.html | 2 +-
DuckDuckGoTests/MockFiles/bookmarks_ddg_android.html | 2 +-
DuckDuckGoTests/MockFiles/bookmarks_ddg_macos.html | 2 +-
DuckDuckGoTests/MockFiles/bookmarks_firefox.html | 2 +-
DuckDuckGoTests/MockFiles/bookmarks_safari.html | 2 +-
FingerprintingUITests/FingerprintUITest.swift | 12 ++++++------
8 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/DuckDuckGoTests/BookmarksExporterTests.swift b/DuckDuckGoTests/BookmarksExporterTests.swift
index 12d3fe02c2..a0af75f3a1 100644
--- a/DuckDuckGoTests/BookmarksExporterTests.swift
+++ b/DuckDuckGoTests/BookmarksExporterTests.swift
@@ -247,7 +247,7 @@ class BookmarksExporterTests: XCTestCase {
url: "https://www.wsj.com/?mod=wsjheader_logo"),
BookmarksExporter.Template.closeFolder(level: level),
BookmarksExporter.Template.bookmark(level: level,
- title: "DuckDuckGo — Privacy, simplified.",
+ title: "DuckDuckGo — Your protection, our priority.",
url: "https://duckduckgo.com/"),
BookmarksExporter.Template.openFolder(level: level, named: "DupeFolderNameContents"),
BookmarksExporter.Template.bookmark(level: level + 1,
diff --git a/DuckDuckGoTests/MockFiles/bookmarks_brave.html b/DuckDuckGoTests/MockFiles/bookmarks_brave.html
index 7ba22d7cdd..d6c224a11b 100644
--- a/DuckDuckGoTests/MockFiles/bookmarks_brave.html
+++ b/DuckDuckGoTests/MockFiles/bookmarks_brave.html
@@ -47,7 +47,7 @@
Bookmarks
- The Wall Street Journal - Breaking News, Business, Financial & Economic News, World News and Video
-
DuckDuckGo — Privacy, simplified.
+ DuckDuckGo — Your protection, our priority.
DupeFolderNameContents
- MacRumors: Apple News and Rumors
diff --git a/DuckDuckGoTests/MockFiles/bookmarks_chrome.html b/DuckDuckGoTests/MockFiles/bookmarks_chrome.html
index 08fca4e9b7..54f9bdb6ae 100644
--- a/DuckDuckGoTests/MockFiles/bookmarks_chrome.html
+++ b/DuckDuckGoTests/MockFiles/bookmarks_chrome.html
@@ -48,7 +48,7 @@
Bookmarks
- The Wall Street Journal - Breaking News, Business, Financial & Economic News, World News and Video
-
- DuckDuckGo — Privacy, simplified.
+
- DuckDuckGo — Your protection, our priority.
DupeFolderNameContents
- MacRumors: Apple News and Rumors
diff --git a/DuckDuckGoTests/MockFiles/bookmarks_ddg_android.html b/DuckDuckGoTests/MockFiles/bookmarks_ddg_android.html
index 8a87fa9f41..1e7cb6bf92 100644
--- a/DuckDuckGoTests/MockFiles/bookmarks_ddg_android.html
+++ b/DuckDuckGoTests/MockFiles/bookmarks_ddg_android.html
@@ -47,7 +47,7 @@
Bookmarks
- The Wall Street Journal - Breaking News, Business, Financial & Economic News, World News and Video
-
- DuckDuckGo — Privacy, simplified.
+
- DuckDuckGo — Your protection, our priority.
DupeFolderNameContents
- MacRumors: Apple News and Rumors
diff --git a/DuckDuckGoTests/MockFiles/bookmarks_ddg_macos.html b/DuckDuckGoTests/MockFiles/bookmarks_ddg_macos.html
index 9965f7d234..d3027ccc37 100644
--- a/DuckDuckGoTests/MockFiles/bookmarks_ddg_macos.html
+++ b/DuckDuckGoTests/MockFiles/bookmarks_ddg_macos.html
@@ -42,7 +42,7 @@
Bookmarks
- The Wall Street Journal - Breaking News, Business, Financial & Economic News, World News and Video
-
- DuckDuckGo — Privacy, simplified.
+
- DuckDuckGo — Your protection, our priority.
DupeFolderNameContents
- MacRumors: Apple News and Rumors
diff --git a/DuckDuckGoTests/MockFiles/bookmarks_firefox.html b/DuckDuckGoTests/MockFiles/bookmarks_firefox.html
index 92c60fcd13..24f2804799 100644
--- a/DuckDuckGoTests/MockFiles/bookmarks_firefox.html
+++ b/DuckDuckGoTests/MockFiles/bookmarks_firefox.html
@@ -55,7 +55,7 @@
Bookmarks Menu
- The Wall Street Journal - Breaking News, Business, Financial & Economic News, World News and Video
-
- DuckDuckGo — Privacy, simplified.
+
- DuckDuckGo — Your protection, our priority.
DupeFolderNameContents
- MacRumors: Apple News and Rumors
diff --git a/DuckDuckGoTests/MockFiles/bookmarks_safari.html b/DuckDuckGoTests/MockFiles/bookmarks_safari.html
index 560cbf6533..cf1e87b8be 100644
--- a/DuckDuckGoTests/MockFiles/bookmarks_safari.html
+++ b/DuckDuckGoTests/MockFiles/bookmarks_safari.html
@@ -53,7 +53,7 @@
Bookmarks
- The Wall Street Journal - Breaking News, Business, Financial & Economic News, World News and Video
-
- DuckDuckGo — Privacy, simplified.
+
- DuckDuckGo — Your protection, our priority.
DupeFolderNameContents
- MacRumors: Apple News and Rumors
diff --git a/FingerprintingUITests/FingerprintUITest.swift b/FingerprintingUITests/FingerprintUITest.swift
index bd5c5a869c..e67ce7e248 100644
--- a/FingerprintingUITests/FingerprintUITest.swift
+++ b/FingerprintingUITests/FingerprintUITest.swift
@@ -88,8 +88,8 @@ class FingerprintUITest: XCTestCase {
}
let tablesQuery = app.tables
- _ = tablesQuery.staticTexts["DuckDuckGo — Privacy, simplified."].waitForExistence(timeout: 25)
- tablesQuery.staticTexts["DuckDuckGo — Privacy, simplified."].swipeLeft()
+ _ = tablesQuery.staticTexts["DuckDuckGo — Your protection, our priority."].waitForExistence(timeout: 25)
+ tablesQuery.staticTexts["DuckDuckGo — Your protection, our priority."].swipeLeft()
tablesQuery.buttons["Delete"].tap()
app.navigationBars["Bookmarks"].buttons["Done"].tap()
}
@@ -110,8 +110,8 @@ class FingerprintUITest: XCTestCase {
let bookmarksToolbarButtons = app.toolbars.buttons
_ = bookmarksToolbarButtons["Edit"].waitForExistence(timeout: 25)
bookmarksToolbarButtons["Edit"].tap()
- if app.tables.staticTexts["DuckDuckGo — Privacy, simplified."].waitForExistence(timeout: 25) {
- app.staticTexts["DuckDuckGo — Privacy, simplified."].tap()
+ if app.tables.staticTexts["DuckDuckGo — Your protection, our priority."].waitForExistence(timeout: 25) {
+ app.staticTexts["DuckDuckGo — Your protection, our priority."].tap()
} else {
XCTFail("Could not find bookmark")
}
@@ -146,8 +146,8 @@ class FingerprintUITest: XCTestCase {
} else {
XCTFail("Bookmarks button missing")
}
- if app.tables.staticTexts["DuckDuckGo — Privacy, simplified."].waitForExistence(timeout: 25) {
- app.staticTexts["DuckDuckGo — Privacy, simplified."].tap()
+ if app.tables.staticTexts["DuckDuckGo — Your protection, our priority."].waitForExistence(timeout: 25) {
+ app.staticTexts["DuckDuckGo — Your protection, our priority."].tap()
} else {
XCTFail("Could not find bookmark")
}
From 5016b8a0dc6cb8280103e41b34ab88d741a85775 Mon Sep 17 00:00:00 2001
From: Dax Mobile <44842493+daxmobile@users.noreply.github.com>
Date: Thu, 31 Oct 2024 21:40:55 +1100
Subject: [PATCH 02/29] Update BSK with autofill 15.1.0 (#3507)
Task/Issue URL:
https://app.asana.com/0/1208660715919854/1208660715919854
Autofill Release:
https://github.com/duckduckgo/duckduckgo-autofill/releases/tag/15.1.0
BSK PR: https://github.com/duckduckgo/BrowserServicesKit/pull/1044
## Description
Updates Autofill to version
[15.1.0](https://github.com/duckduckgo/duckduckgo-autofill/releases/tag/15.1.0).
---
DuckDuckGo.xcodeproj/project.pbxproj | 2 +-
.../xcshareddata/swiftpm/Package.resolved | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 81ec1edbe5..26e97cd10a 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -10954,7 +10954,7 @@
repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
requirement = {
kind = exactVersion;
- version = 201.0.0;
+ version = 201.0.1;
};
};
9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 21aa8e0ac9..b048cebb73 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -32,8 +32,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/DuckDuckGo/BrowserServicesKit",
"state" : {
- "revision" : "e5946eee6af859690cc1cc5e51daef3c8368981b",
- "version" : "201.0.0"
+ "revision" : "884a5eac964eeeb6d38780a6b90feaf5a5b3cfcf",
+ "version" : "201.0.1"
}
},
{
@@ -59,8 +59,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/duckduckgo-autofill.git",
"state" : {
- "revision" : "945ac09a0189dc6736db617867fde193ea984b20",
- "version" : "15.0.0"
+ "revision" : "c992041d16ec10d790e6204dce9abf9966d1363c",
+ "version" : "15.1.0"
}
},
{
From aa4257c26a1596341dc4fd252934f2aa7800cf19 Mon Sep 17 00:00:00 2001
From: Alessandro Boron
Date: Thu, 31 Oct 2024 18:04:55 +0100
Subject: [PATCH 03/29] Onboarding Add to Dock Promo view (#3505)
Task/Issue URL:
https://app.asana.com/0/1206329551987282/1208577512136709
**Description**:
Add the Add to Dock Promo view to the final dialog of the onboarding flow.
---
DuckDuckGo.xcodeproj/project.pbxproj | 28 +-
.../xcshareddata/swiftpm/Package.resolved | 4 +-
.../Contents.json | 12 +
.../add-to-dock-gradient.png | Bin 0 -> 15176 bytes
DuckDuckGo/LottieView.swift | 24 +-
.../AddToDock/AddToDockPromoView.swift | 50 +
.../AddToDock/AddToDockPromoViewModel.swift | 66 +
.../{ => Resources}/add-to-dock-demo.mp4 | Bin
.../Resources/add-to-dock-promo.json | 12131 ++++++++++++++++
.../AppIconPickerViewModel.swift | 5 +-
.../ContextualOnboardingDialogs.swift | 123 +-
.../NewTabDaxDialogFactory.swift | 21 +-
.../ContextualDaxDialogsFactory.swift | 18 +-
.../AddToDockPromoViewModelTests.swift | 97 +
.../ContextualDaxDialogsFactoryTests.swift | 4 +-
...alOnboardingNewTabDialogFactoryTests.swift | 4 +-
16 files changed, 12528 insertions(+), 59 deletions(-)
create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/add-to-dock-gradient.imageset/Contents.json
create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/add-to-dock-gradient.imageset/add-to-dock-gradient.png
create mode 100644 DuckDuckGo/OnboardingExperiment/AddToDock/AddToDockPromoView.swift
create mode 100644 DuckDuckGo/OnboardingExperiment/AddToDock/AddToDockPromoViewModel.swift
rename DuckDuckGo/OnboardingExperiment/AddToDock/{ => Resources}/add-to-dock-demo.mp4 (100%)
create mode 100644 DuckDuckGo/OnboardingExperiment/AddToDock/Resources/add-to-dock-promo.json
create mode 100644 DuckDuckGoTests/AddToDockPromoViewModelTests.swift
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 26e97cd10a..790620a494 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -705,6 +705,7 @@
9F1061652C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1061642C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift */; };
9F1623092C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1623082C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift */; };
9F16230B2CA0F0190093C4FC /* DebouncerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F16230A2CA0F0190093C4FC /* DebouncerTests.swift */; };
+ 9F1798572CD2443F0073018B /* AddToDockPromoViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1798562CD2443F0073018B /* AddToDockPromoViewModelTests.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 */; };
@@ -725,6 +726,7 @@
9F69331D2C5A191400CD6A5D /* MockTutorialSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69331C2C5A191400CD6A5D /* MockTutorialSettings.swift */; };
9F69331F2C5B1D0C00CD6A5D /* OnFirstAppearViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69331E2C5B1D0C00CD6A5D /* OnFirstAppearViewModifier.swift */; };
9F6933212C5B9A5B00CD6A5D /* OnboardingHostingControllerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F6933202C5B9A5B00CD6A5D /* OnboardingHostingControllerMock.swift */; };
+ 9F72FE272CD223A000BA35F5 /* add-to-dock-promo.json in Resources */ = {isa = PBXBuildFile; fileRef = 9F72FE262CD223A000BA35F5 /* add-to-dock-promo.json */; };
9F7CFF762C86BB8F0012833E /* OnboardingView+AppIconPickerContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F7CFF752C86BB8F0012833E /* OnboardingView+AppIconPickerContent.swift */; };
9F7CFF782C86E3E10012833E /* OnboardingManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F7CFF772C86E3E10012833E /* OnboardingManagerTests.swift */; };
9F7CFF7D2C89B69A0012833E /* AppIconPickerViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F7CFF7C2C89B69A0012833E /* AppIconPickerViewModelTests.swift */; };
@@ -736,6 +738,8 @@
9F8E0F2F2CCA6202001EA7C5 /* VideoPlayerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8E0F2E2CCA6202001EA7C5 /* VideoPlayerViewModel.swift */; };
9F8E0F312CCA6390001EA7C5 /* AddToDockTutorialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8E0F302CCA6390001EA7C5 /* AddToDockTutorialView.swift */; };
9F8E0F332CCA642D001EA7C5 /* VideoPlayerViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8E0F322CCA642D001EA7C5 /* VideoPlayerViewModelTests.swift */; };
+ 9F8E0F382CCFAA8A001EA7C5 /* AddToDockPromoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8E0F372CCFAA8A001EA7C5 /* AddToDockPromoView.swift */; };
+ 9F8E0F3D2CCFD072001EA7C5 /* AddToDockPromoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8E0F3C2CCFD071001EA7C5 /* AddToDockPromoViewModel.swift */; };
9F8FE9492BAE50E50071E372 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 9F8FE9482BAE50E50071E372 /* Lottie */; };
9F96F73B2C9144D5009E45D5 /* Onboarding in Frameworks */ = {isa = PBXBuildFile; productRef = 9F96F73A2C9144D5009E45D5 /* Onboarding */; };
9F96F73F2C914C57009E45D5 /* OnboardingGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F96F73E2C914C57009E45D5 /* OnboardingGradient.swift */; };
@@ -2501,6 +2505,7 @@
9F1061642C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DefaultVariantManager+Onboarding.swift"; sourceTree = ""; };
9F1623082C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultVariantManagerOnboardingTests.swift; sourceTree = ""; };
9F16230A2CA0F0190093C4FC /* DebouncerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebouncerTests.swift; sourceTree = ""; };
+ 9F1798562CD2443F0073018B /* AddToDockPromoViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddToDockPromoViewModelTests.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 = ""; };
@@ -2521,6 +2526,7 @@
9F69331C2C5A191400CD6A5D /* MockTutorialSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTutorialSettings.swift; sourceTree = ""; };
9F69331E2C5B1D0C00CD6A5D /* OnFirstAppearViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnFirstAppearViewModifier.swift; sourceTree = ""; };
9F6933202C5B9A5B00CD6A5D /* OnboardingHostingControllerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingHostingControllerMock.swift; sourceTree = ""; };
+ 9F72FE262CD223A000BA35F5 /* add-to-dock-promo.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "add-to-dock-promo.json"; sourceTree = ""; };
9F7CFF752C86BB8F0012833E /* OnboardingView+AppIconPickerContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OnboardingView+AppIconPickerContent.swift"; sourceTree = ""; };
9F7CFF772C86E3E10012833E /* OnboardingManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingManagerTests.swift; sourceTree = ""; };
9F7CFF7C2C89B69A0012833E /* AppIconPickerViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconPickerViewModelTests.swift; sourceTree = ""; };
@@ -2532,6 +2538,8 @@
9F8E0F2E2CCA6202001EA7C5 /* VideoPlayerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerViewModel.swift; sourceTree = ""; };
9F8E0F302CCA6390001EA7C5 /* AddToDockTutorialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddToDockTutorialView.swift; sourceTree = ""; };
9F8E0F322CCA642D001EA7C5 /* VideoPlayerViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerViewModelTests.swift; sourceTree = ""; };
+ 9F8E0F372CCFAA8A001EA7C5 /* AddToDockPromoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddToDockPromoView.swift; sourceTree = ""; };
+ 9F8E0F3C2CCFD071001EA7C5 /* AddToDockPromoViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddToDockPromoViewModel.swift; sourceTree = ""; };
9F96F73E2C914C57009E45D5 /* OnboardingGradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingGradient.swift; sourceTree = ""; };
9F9A922D2C86A56B001D036D /* OnboardingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingManager.swift; sourceTree = ""; };
9F9A92302C86AAE9001D036D /* OnboardingDebugView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingDebugView.swift; sourceTree = ""; };
@@ -4770,6 +4778,7 @@
9FDEC7B92C9006E000C7A692 /* BrowserComparisonModelTests.swift */,
9F1623082C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift */,
9F8E0F322CCA642D001EA7C5 /* VideoPlayerViewModelTests.swift */,
+ 9F1798562CD2443F0073018B /* AddToDockPromoViewModelTests.swift */,
);
name = Onboarding;
sourceTree = "";
@@ -4794,9 +4803,11 @@
9F8E0F282CCA577E001EA7C5 /* AddToDock */ = {
isa = PBXGroup;
children = (
+ 9F8E0F3B2CCFD050001EA7C5 /* Resources */,
9F8E0F2B2CCA617C001EA7C5 /* VideoPlayer */,
- 9F8E0F292CCA5C9D001EA7C5 /* add-to-dock-demo.mp4 */,
9F8E0F302CCA6390001EA7C5 /* AddToDockTutorialView.swift */,
+ 9F8E0F372CCFAA8A001EA7C5 /* AddToDockPromoView.swift */,
+ 9F8E0F3C2CCFD071001EA7C5 /* AddToDockPromoViewModel.swift */,
);
path = AddToDock;
sourceTree = "";
@@ -4810,6 +4821,15 @@
path = VideoPlayer;
sourceTree = "";
};
+ 9F8E0F3B2CCFD050001EA7C5 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 9F72FE262CD223A000BA35F5 /* add-to-dock-promo.json */,
+ 9F8E0F292CCA5C9D001EA7C5 /* add-to-dock-demo.mp4 */,
+ );
+ path = Resources;
+ sourceTree = "";
+ };
9F96F73D2C914C3D009E45D5 /* Background */ = {
isa = PBXGroup;
children = (
@@ -7061,6 +7081,7 @@
AA4D6ABF23DE4D15007E8790 /* AppIconYellow40x40@3x.png in Resources */,
AA4D6A8F23DE49A5007E8790 /* AppIconBlack29x29@3x.png in Resources */,
AA4D6AA523DE4CC4007E8790 /* AppIconBlue29x29@3x.png in Resources */,
+ 9F72FE272CD223A000BA35F5 /* add-to-dock-promo.json in Resources */,
1EEF124C2850A93F003DDE57 /* Trackers.xcassets in Resources */,
AA4D6ACF23DE4D27007E8790 /* AppIconPurple76x76@2x.png in Resources */,
4B37E0502B928CA6009E81CA /* vpn-light-mode.json in Resources */,
@@ -7642,6 +7663,7 @@
BD862E0B2B30F9300073E2EE /* VPNFeedbackFormView.swift in Sources */,
850365F323DE087800D0F787 /* UIImageViewExtension.swift in Sources */,
56D060262C359D2E003BAEB5 /* ContextualOnboardingDialogs.swift in Sources */,
+ 9F8E0F382CCFAA8A001EA7C5 /* AddToDockPromoView.swift in Sources */,
373608922ABB430D00629E7F /* FavoritesDisplayMode+UserDefaults.swift in Sources */,
C160544129D6044D00B715A1 /* AutofillInterfaceUsernameTruncator.swift in Sources */,
31C70B5528045E3500FB6AD1 /* SecureVaultReporter.swift in Sources */,
@@ -7842,6 +7864,7 @@
6FD3F80F2C3EF4F000DA5797 /* DeviceOrientationEnvironmentValue.swift in Sources */,
85864FBC24D31EF300E756FF /* SuggestionTrayViewController.swift in Sources */,
D64648AF2B5993890033090B /* SubscriptionEmailViewModel.swift in Sources */,
+ 9F8E0F3D2CCFD072001EA7C5 /* AddToDockPromoViewModel.swift in Sources */,
1EF24235273BB9D200DE3D02 /* IntervalSlider.swift in Sources */,
F1D796EE1E7AF2EB0019D451 /* UIViewControllerExtension.swift in Sources */,
1EE411F12857C3640003FE64 /* TrackerAnimationImageProvider.swift in Sources */,
@@ -8024,6 +8047,7 @@
C1D21E2F293A599C006E5A05 /* AutofillLoginSessionTests.swift in Sources */,
85D2187924BF6B8B004373D2 /* FaviconSourcesProviderTests.swift in Sources */,
9F69331B2C5A16E200CD6A5D /* OnboardingDaxFavouritesTests.swift in Sources */,
+ 9F1798572CD2443F0073018B /* AddToDockPromoViewModelTests.swift in Sources */,
6F7FB8E52C66158D00867DA7 /* NewTabPageShortcutsSettingsModelTests.swift in Sources */,
983BD6B52B34760600AAC78E /* MockPrivacyConfiguration.swift in Sources */,
1E8146AD28C8ABF000D1AF63 /* TrackerAnimationLogicTests.swift in Sources */,
@@ -10954,7 +10978,7 @@
repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
requirement = {
kind = exactVersion;
- version = 201.0.1;
+ version = 202.0.0;
};
};
9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index b048cebb73..f92fe51779 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -32,8 +32,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/DuckDuckGo/BrowserServicesKit",
"state" : {
- "revision" : "884a5eac964eeeb6d38780a6b90feaf5a5b3cfcf",
- "version" : "201.0.1"
+ "revision" : "de77673bd4fa7b8012c8d1f16cbc73b064539a57",
+ "version" : "202.0.0"
}
},
{
diff --git a/DuckDuckGo/DaxOnboarding.xcassets/add-to-dock-gradient.imageset/Contents.json b/DuckDuckGo/DaxOnboarding.xcassets/add-to-dock-gradient.imageset/Contents.json
new file mode 100644
index 0000000000..24f4eca3a7
--- /dev/null
+++ b/DuckDuckGo/DaxOnboarding.xcassets/add-to-dock-gradient.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "add-to-dock-gradient.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/DuckDuckGo/DaxOnboarding.xcassets/add-to-dock-gradient.imageset/add-to-dock-gradient.png b/DuckDuckGo/DaxOnboarding.xcassets/add-to-dock-gradient.imageset/add-to-dock-gradient.png
new file mode 100644
index 0000000000000000000000000000000000000000..38ba5f9b49d116b8ec5a14e76de89026f00c64c9
GIT binary patch
literal 15176
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