From ba87b24a98547593091108fb17a2b395085ee696 Mon Sep 17 00:00:00 2001 From: Dax the Duck Date: Thu, 18 Jul 2024 05:53:12 +0000 Subject: [PATCH 01/13] Bump version to 1.97.0 (227) --- Configuration/BuildNumber.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/BuildNumber.xcconfig b/Configuration/BuildNumber.xcconfig index 397d63e825..26643b7e2b 100644 --- a/Configuration/BuildNumber.xcconfig +++ b/Configuration/BuildNumber.xcconfig @@ -1 +1 @@ -CURRENT_PROJECT_VERSION = 226 +CURRENT_PROJECT_VERSION = 227 From fb46349206730a48bff3ce0a5165e473df65760b Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Thu, 18 Jul 2024 18:33:38 +0200 Subject: [PATCH 02/13] VPN no longer binds to a fixed listening port (#2992) Task/Issue URL: https://app.asana.com/0/1207603085593419/1207825471514017/f iOS PR: Will integrate this to iOS main once released. iOS doesn't need this with urgency. BSK PR: https://github.com/duckduckgo/BrowserServicesKit/pull/901 ## Description We were specifying a listening port for WireGuard, which is not a good idea for a VPN client both for technical and security reasons. --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- LocalPackages/DataBrokerProtection/Package.swift | 2 +- LocalPackages/NetworkProtectionMac/Package.swift | 2 +- LocalPackages/SubscriptionUI/Package.swift | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index fdab0117a3..2de011225c 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -13310,7 +13310,7 @@ repositoryURL = "https://github.com/duckduckgo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 171.1.1; + version = "171.1.1-1"; }; }; 9FF521422BAA8FF300B9819B /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e1b0251749..8b52b614f6 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" : "298e20a06c5a60f5ccf85bce9f0930b36779ab74", - "version" : "171.1.1" + "revision" : "eea55b8903389f680c4f08667d8f1428e12aa053", + "version" : "171.1.1-1" } }, { diff --git a/LocalPackages/DataBrokerProtection/Package.swift b/LocalPackages/DataBrokerProtection/Package.swift index cddb1df077..a9f43476f3 100644 --- a/LocalPackages/DataBrokerProtection/Package.swift +++ b/LocalPackages/DataBrokerProtection/Package.swift @@ -29,7 +29,7 @@ let package = Package( targets: ["DataBrokerProtection"]) ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.1.1"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.1.1-1"), .package(path: "../SwiftUIExtensions"), .package(path: "../XPCHelper"), ], diff --git a/LocalPackages/NetworkProtectionMac/Package.swift b/LocalPackages/NetworkProtectionMac/Package.swift index c1b7c58502..d790bbeb77 100644 --- a/LocalPackages/NetworkProtectionMac/Package.swift +++ b/LocalPackages/NetworkProtectionMac/Package.swift @@ -32,7 +32,7 @@ let package = Package( .library(name: "VPNAppLauncher", targets: ["VPNAppLauncher"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.1.1"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.1.1-1"), .package(url: "https://github.com/airbnb/lottie-spm", exact: "4.4.3"), .package(path: "../AppLauncher"), .package(path: "../UDSHelper"), diff --git a/LocalPackages/SubscriptionUI/Package.swift b/LocalPackages/SubscriptionUI/Package.swift index 356d07f703..c607f3d9d8 100644 --- a/LocalPackages/SubscriptionUI/Package.swift +++ b/LocalPackages/SubscriptionUI/Package.swift @@ -12,7 +12,7 @@ let package = Package( targets: ["SubscriptionUI"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.1.1"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.1.1-1"), .package(path: "../SwiftUIExtensions") ], targets: [ From ee2d25f599efd9b71bc38300ec978e73e9f58119 Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Thu, 18 Jul 2024 18:37:16 +0200 Subject: [PATCH 03/13] Updates BSK 171.2.3 --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- LocalPackages/DataBrokerProtection/Package.swift | 2 +- LocalPackages/NetworkProtectionMac/Package.swift | 2 +- LocalPackages/SubscriptionUI/Package.swift | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 222e7d828b..2c12dbcf8a 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -13310,7 +13310,7 @@ repositoryURL = "https://github.com/duckduckgo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 171.2.2; + version = 171.2.3; }; }; 9FF521422BAA8FF300B9819B /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e5f94e91e6..264fd72568 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" : "0e7f13b24876a28934320ebf0ec14f644a211869", - "version" : "171.2.2" + "revision" : "278f486e71131ee8e36df4180518b0f74843d47e", + "version" : "171.2.3" } }, { diff --git a/LocalPackages/DataBrokerProtection/Package.swift b/LocalPackages/DataBrokerProtection/Package.swift index 706d04e8e8..59f51a8b3d 100644 --- a/LocalPackages/DataBrokerProtection/Package.swift +++ b/LocalPackages/DataBrokerProtection/Package.swift @@ -29,7 +29,7 @@ let package = Package( targets: ["DataBrokerProtection"]) ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.2"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.3"), .package(path: "../SwiftUIExtensions"), .package(path: "../XPCHelper"), ], diff --git a/LocalPackages/NetworkProtectionMac/Package.swift b/LocalPackages/NetworkProtectionMac/Package.swift index 3cb48b7a2c..518538e807 100644 --- a/LocalPackages/NetworkProtectionMac/Package.swift +++ b/LocalPackages/NetworkProtectionMac/Package.swift @@ -32,7 +32,7 @@ let package = Package( .library(name: "VPNAppLauncher", targets: ["VPNAppLauncher"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.2"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.3"), .package(url: "https://github.com/airbnb/lottie-spm", exact: "4.4.3"), .package(path: "../AppLauncher"), .package(path: "../UDSHelper"), diff --git a/LocalPackages/SubscriptionUI/Package.swift b/LocalPackages/SubscriptionUI/Package.swift index efd62b810e..76c722fc6b 100644 --- a/LocalPackages/SubscriptionUI/Package.swift +++ b/LocalPackages/SubscriptionUI/Package.swift @@ -12,7 +12,7 @@ let package = Package( targets: ["SubscriptionUI"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.2"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.3"), .package(path: "../SwiftUIExtensions") ], targets: [ From fee04046d98d2d7d91dc7d887e758322dfcece4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 21:44:42 +0200 Subject: [PATCH 04/13] Bump Submodules/privacy-reference-tests from `a603ff9` to `afb4f61` (#2984) Bumps [Submodules/privacy-reference-tests](https://github.com/duckduckgo/privacy-reference-tests) from `a603ff9` to `afb4f61`. --- Submodules/privacy-reference-tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Submodules/privacy-reference-tests b/Submodules/privacy-reference-tests index a603ff9af2..afb4f6128a 160000 --- a/Submodules/privacy-reference-tests +++ b/Submodules/privacy-reference-tests @@ -1 +1 @@ -Subproject commit a603ff9af22ca3ff7ce2e7ffbfe18c447d9f23e8 +Subproject commit afb4f6128a3b50d53ddcb1897ea1fb4df6858aa1 From a175d2fb80d0db090e331cab4b525c6fc3b28074 Mon Sep 17 00:00:00 2001 From: Dax the Duck Date: Fri, 19 Jul 2024 05:16:41 +0000 Subject: [PATCH 05/13] Bump version to 1.97.0 (228) --- Configuration/BuildNumber.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/BuildNumber.xcconfig b/Configuration/BuildNumber.xcconfig index 26643b7e2b..d13be864c0 100644 --- a/Configuration/BuildNumber.xcconfig +++ b/Configuration/BuildNumber.xcconfig @@ -1 +1 @@ -CURRENT_PROJECT_VERSION = 227 +CURRENT_PROJECT_VERSION = 228 From 1ea2b8cf43847bd9484202658bf364f46475e8d8 Mon Sep 17 00:00:00 2001 From: Dominik Kapusta Date: Fri, 19 Jul 2024 07:53:37 +0200 Subject: [PATCH 06/13] Update vertical spacing in New Tab Page (#2986) Task/Issue URL: https://app.asana.com/0/1142021229838617/1207827264532715/f Description: This change unifies vertical spacing in new tab page to 32 pixels, top padding to 64 pixels, and page width to 504 pixels. Additionally, it updates close button in remote message view to reuse Next Steps card's close button. --- DuckDuckGo.xcodeproj/project.pbxproj | 6 +++ .../xcshareddata/swiftpm/Package.resolved | 2 +- DuckDuckGo/HomePage/View/CloseButton.swift | 46 +++++++++++++++++++ .../HomePage/View/ContinueSetUpView.swift | 30 ++---------- DuckDuckGo/HomePage/View/FavoritesView.swift | 2 +- DuckDuckGo/HomePage/View/HomePageView.swift | 10 ++-- DuckDuckGo/HomePage/View/MoreOrLessView.swift | 2 +- .../HomePage/View/RecentlyVisitedView.swift | 7 ++- .../HomePage/View/RemoteMessageView.swift | 37 ++++++++++----- 9 files changed, 92 insertions(+), 50 deletions(-) create mode 100644 DuckDuckGo/HomePage/View/CloseButton.swift diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 2de011225c..64f343fdeb 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -924,6 +924,8 @@ 3707C72A294B5D2900682A9F /* URLExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA8EDF2324923E980071C2E8 /* URLExtension.swift */; }; 3707C72D294B5D4100682A9F /* EmptyAttributionRulesProver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AE39F029373AF200C37AA4 /* EmptyAttributionRulesProver.swift */; }; 3707C72F294B5D4F00682A9F /* WebViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3783F92229432E1800BCA897 /* WebViewTests.swift */; }; + 3707EC4A2C47E36A00B67CBE /* CloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3707EC492C47E36A00B67CBE /* CloseButton.swift */; }; + 3707EC4B2C47E36A00B67CBE /* CloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3707EC492C47E36A00B67CBE /* CloseButton.swift */; }; 370A34B12AB24E3700C77F7C /* SyncDebugMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370A34B02AB24E3700C77F7C /* SyncDebugMenu.swift */; }; 370A34B22AB24E3700C77F7C /* SyncDebugMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370A34B02AB24E3700C77F7C /* SyncDebugMenu.swift */; }; 371209212C232E3F003ADF3D /* RemoteMessagingClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371209202C232E3F003ADF3D /* RemoteMessagingClient.swift */; }; @@ -3045,6 +3047,7 @@ 3706FE99293F661700E42796 /* Unit Tests App Store.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Unit Tests App Store.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 3706FEB2293F662100E42796 /* Integration Tests App Store.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Integration Tests App Store.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 3706FEC7293F6F7500E42796 /* BWManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BWManagement.swift; sourceTree = ""; }; + 3707EC492C47E36A00B67CBE /* CloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseButton.swift; sourceTree = ""; }; 370A34B02AB24E3700C77F7C /* SyncDebugMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncDebugMenu.swift; sourceTree = ""; }; 371209202C232E3F003ADF3D /* RemoteMessagingClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteMessagingClient.swift; sourceTree = ""; }; 371209292C2333A0003ADF3D /* RemoteMessagingDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteMessagingDatabase.swift; sourceTree = ""; }; @@ -7748,6 +7751,7 @@ 85589E9F27BFE60E0038AD11 /* MoreOrLessView.swift */, 85F0FF1227CFAB04001C7C6E /* RecentlyVisitedView.swift */, 3768D8372C24BFF5004120AE /* RemoteMessageView.swift */, + 3707EC492C47E36A00B67CBE /* CloseButton.swift */, ); path = View; sourceTree = ""; @@ -10463,6 +10467,7 @@ 3706FC56293F65D500E42796 /* Permissions.swift in Sources */, 9F872D992B8DA9F800138637 /* Bookmarks+Tab.swift in Sources */, B6B4D1D02B0E0DD000C26286 /* DataImportNoDataView.swift in Sources */, + 3707EC4B2C47E36A00B67CBE /* CloseButton.swift in Sources */, 3706FC57293F65D500E42796 /* TabPreviewWindowController.swift in Sources */, 1D9A37682BD8EA8800EBC58D /* DockPositionProvider.swift in Sources */, 3706FC58293F65D500E42796 /* NSSizeExtension.swift in Sources */, @@ -11245,6 +11250,7 @@ 37CD54CE27F2FDD100F1F7B9 /* PreferencesSidebarModel.swift in Sources */, 3767190328E724D8003A2A15 /* DuckPlayerURLExtension.swift in Sources */, 1D43EB32292788C70065E5D6 /* BWEncryptionOutput.m in Sources */, + 3707EC4A2C47E36A00B67CBE /* CloseButton.swift in Sources */, B6106BAD26A7BF390013B453 /* PermissionState.swift in Sources */, 371C0A2927E33EDC0070591F /* FeedbackPresenter.swift in Sources */, B66260DD29AC5D4300E9E3EE /* NavigationProtectionTabExtension.swift in Sources */, diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8b52b614f6..4db6203c43 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -75,7 +75,7 @@ { "identity" : "lottie-spm", "kind" : "remoteSourceControl", - "location" : "https://github.com/airbnb/lottie-spm", + "location" : "https://github.com/airbnb/lottie-spm.git", "state" : { "revision" : "1d29eccc24cc8b75bff9f6804155112c0ffc9605", "version" : "4.4.3" diff --git a/DuckDuckGo/HomePage/View/CloseButton.swift b/DuckDuckGo/HomePage/View/CloseButton.swift new file mode 100644 index 0000000000..6fecaa092f --- /dev/null +++ b/DuckDuckGo/HomePage/View/CloseButton.swift @@ -0,0 +1,46 @@ +// +// CloseButton.swift +// +// 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 SwiftUIExtensions + +extension HomePage.Views { + + struct CloseButton: View { + let icon: NSImage + let action: () -> Void + let foreGroundColor: Color = .homeFavoritesBackground + let foregroundColorOnHover: Color = .homeFavoritesHover + + @State var isHovering = false + + var body: some View { + ZStack { + Circle() + .fill(isHovering ? foregroundColorOnHover : foreGroundColor) + .frame(width: 16, height: 16) + IconButton(icon: icon, action: action) + .foregroundColor(.gray) + } + .onHover { isHovering in + self.isHovering = isHovering + } + } + } + +} diff --git a/DuckDuckGo/HomePage/View/ContinueSetUpView.swift b/DuckDuckGo/HomePage/View/ContinueSetUpView.swift index e6d56fd18f..78950a46fb 100644 --- a/DuckDuckGo/HomePage/View/ContinueSetUpView.swift +++ b/DuckDuckGo/HomePage/View/ContinueSetUpView.swift @@ -35,8 +35,8 @@ extension HomePage.Views { } Spacer() } - .padding(.vertical, -25) - .padding(.leading, 1) + .padding(.top, -24) + .padding(.leading, 2) VStack(spacing: 20) { if #available(macOS 12.0, *) { LazyVStack(spacing: 4) { @@ -79,7 +79,7 @@ extension HomePage.Views { MoreOrLess(isExpanded: $model.shouldShowAllFeatures) .padding(.top, -3) - .visibility(model.isMoreOrLessButtonNeeded ? .visible : .invisible) + .visibility(model.isMoreOrLessButtonNeeded ? .visible : .gone) } } @@ -110,7 +110,7 @@ extension HomePage.Views { HStack { Spacer() VStack { - RemoveIemButton(icon: .close) { + CloseButton(icon: .close) { model.removeItem(for: featureType) } .visibility(isHovering ? .visible : .gone) @@ -259,28 +259,6 @@ extension HomePage.Views { } } - struct RemoveIemButton: View { - let icon: NSImage - let action: () -> Void - let foreGroundColor: Color = .homeFavoritesBackground - let foregroundColorOnHover: Color = .homeFavoritesHover - - @State var isHovering = false - - var body: some View { - ZStack { - Circle() - .fill(isHovering ? foregroundColorOnHover : foreGroundColor) - .frame(width: 16, height: 16) - IconButton(icon: icon, action: action) - .foregroundColor(.gray) - } - .onHover { isHovering in - self.isHovering = isHovering - } - } - } - struct NextStepsView: View { let text = UserText.newTabSetUpSectionTitle let textWidth: CGFloat diff --git a/DuckDuckGo/HomePage/View/FavoritesView.swift b/DuckDuckGo/HomePage/View/FavoritesView.swift index 39f74b58cf..8d1201b2c1 100644 --- a/DuckDuckGo/HomePage/View/FavoritesView.swift +++ b/DuckDuckGo/HomePage/View/FavoritesView.swift @@ -97,7 +97,7 @@ struct FavoritesGrid: View { static let itemWidth: CGFloat = 64 static let itemHeight: CGFloat = 101 static let verticalSpacing: CGFloat = 10 - static let horizontalSpacing: CGFloat = 20 + static let horizontalSpacing: CGFloat = 24 static let width: CGFloat = (itemWidth + horizontalSpacing) * CGFloat(HomePage.favoritesPerRow) - horizontalSpacing diff --git a/DuckDuckGo/HomePage/View/HomePageView.swift b/DuckDuckGo/HomePage/View/HomePageView.swift index 246d73fbf6..941cba1593 100644 --- a/DuckDuckGo/HomePage/View/HomePageView.swift +++ b/DuckDuckGo/HomePage/View/HomePageView.swift @@ -59,22 +59,22 @@ extension HomePage.Views { ZStack(alignment: .top) { ScrollView { - VStack(spacing: 0) { + VStack(spacing: 32) { + Spacer(minLength: 32) + Group { remoteMessage() - .padding(.top, 64) if includingContinueSetUpCards { ContinueSetUpView() - .padding(.top, activeRemoteMessageModel.shouldShowRemoteMessage ? 18 : 64) .visibility(model.isContinueSetUpVisible ? .visible : .gone) + .padding(.top, activeRemoteMessageModel.shouldShowRemoteMessage ? 24 : 0) } + Favorites() - .padding(.top, 24) .visibility(model.isFavoriteVisible ? .visible : .gone) RecentlyVisited() - .padding(.top, 24) .padding(.bottom, 16) .visibility(model.isRecentActivityVisible ? .visible : .gone) diff --git a/DuckDuckGo/HomePage/View/MoreOrLessView.swift b/DuckDuckGo/HomePage/View/MoreOrLessView.swift index 222c43c26d..1858f41bef 100644 --- a/DuckDuckGo/HomePage/View/MoreOrLessView.swift +++ b/DuckDuckGo/HomePage/View/MoreOrLessView.swift @@ -44,7 +44,7 @@ extension HomePage.Views { .foregroundColor((.homePageMoreOrLessText)) }.frame(maxWidth: .infinity) } - .frame(height: 32) + .padding(.top, 8) .font(.system(size: 11)) .link { isExpanded = !isExpanded diff --git a/DuckDuckGo/HomePage/View/RecentlyVisitedView.swift b/DuckDuckGo/HomePage/View/RecentlyVisitedView.swift index 8dd63310f7..10651f1f52 100644 --- a/DuckDuckGo/HomePage/View/RecentlyVisitedView.swift +++ b/DuckDuckGo/HomePage/View/RecentlyVisitedView.swift @@ -52,7 +52,8 @@ struct RecentlyVisited: View { } .visibility(model.showRecentlyVisited ? .visible : .gone) - }.padding(.bottom, 24) + } + .padding(.bottom, 24) } @@ -317,7 +318,6 @@ struct RecentlyVisitedTitle: View { model.showPagesOnHover.toggle() } .padding(.leading, isExpanded ? 5 : 0) - .padding(.top, 4) VStack(alignment: isExpanded ? .leading : .center, spacing: 6) { Text(UserText.homePageProtectionSummaryMessage(numberOfTrackersBlocked: model.numberOfTrackersBlocked)) @@ -330,7 +330,6 @@ struct RecentlyVisitedTitle: View { } .visibility(model.recentSites.count > 0 ? .visible : .gone) .padding(.leading, 4) - .padding(.top, 4) Text(UserText.homePageProtectionSummaryInfo) .font(.system(size: 17, weight: .bold, design: .default)) @@ -347,7 +346,7 @@ struct RecentlyVisitedTitle: View { }.rotationEffect(.degrees(isExpanded ? 0 : 180)) } - .padding([.leading, .trailing], 12) + .padding(.horizontal, 12) } } diff --git a/DuckDuckGo/HomePage/View/RemoteMessageView.swift b/DuckDuckGo/HomePage/View/RemoteMessageView.swift index ab9b7ef7a5..78920f3762 100644 --- a/DuckDuckGo/HomePage/View/RemoteMessageView.swift +++ b/DuckDuckGo/HomePage/View/RemoteMessageView.swift @@ -24,29 +24,31 @@ struct RemoteMessageView: View { let viewModel: RemoteMessageViewModel + @State var isHovering = false + var body: some View { ZStack { RoundedRectangle(cornerRadius: 12) .foregroundColor(Color.blackWhite3) .cornerRadius(8) VStack(spacing: 12) { - HStack(spacing: 12) { + HStack(spacing: 8) { image VStack(alignment: .leading, spacing: 8) { title subtitle } + .padding(.leading, viewModel.image == nil ? 8 : 0) - Spacer(minLength: 0) + Spacer(minLength: 4) // Display single button on the right if case .bigSingleAction = viewModel.modelType { button } - - closeButton } + .padding(.trailing, 16) // Display two buttons on the bottom if case .bigTwoAction = viewModel.modelType { @@ -58,20 +60,31 @@ struct RemoteMessageView: View { .padding(.leading, 60) } } - .padding(.horizontal, 16) - .padding(.vertical, 14) + .padding(.leading, 8) + .padding(.trailing, 16) + .padding(.vertical, 16) + + HStack { + Spacer() + VStack { + closeButton + Spacer() + } + } + } + .padding(.horizontal, 2) + .onHover { isHovering in + self.isHovering = isHovering } - .padding(.bottom, 32) + .onAppear(perform: viewModel.onDidAppear) } private var closeButton: some View { - Button { + HomePage.Views.CloseButton(icon: .close) { viewModel.onDidClose(.close) - } label: { - Image(.close) - .padding(12) } - .buttonStyle(.plain) + .visibility(isHovering ? .visible : .invisible) + .padding(6) } private var image: some View { From 582a62ee38889f4c55deb4ffa1a1f6f3203d96ef Mon Sep 17 00:00:00 2001 From: Dax the Duck Date: Fri, 19 Jul 2024 06:06:04 +0000 Subject: [PATCH 07/13] Bump version to 1.97.0 (229) --- Configuration/BuildNumber.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/BuildNumber.xcconfig b/Configuration/BuildNumber.xcconfig index d13be864c0..0a48194786 100644 --- a/Configuration/BuildNumber.xcconfig +++ b/Configuration/BuildNumber.xcconfig @@ -1 +1 @@ -CURRENT_PROJECT_VERSION = 228 +CURRENT_PROJECT_VERSION = 229 From 1b1cade94f7aa7c55b1a68abb39f26695be3fbb9 Mon Sep 17 00:00:00 2001 From: Dominik Kapusta Date: Fri, 19 Jul 2024 08:44:06 +0200 Subject: [PATCH 08/13] Add support for skipping sending usage pixels for remote messages (#2994) Task/Issue URL: https://app.asana.com/0/1201621708115095/1207841204698435/f Description: This change allows to skip sending usage pixels for a given remote message if that's stated in the RMF config. --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 ++-- .../RemoteMessaging/ActiveRemoteMessageModel.swift | 11 +++++++++-- LocalPackages/DataBrokerProtection/Package.swift | 2 +- LocalPackages/NetworkProtectionMac/Package.swift | 2 +- LocalPackages/SubscriptionUI/Package.swift | 2 +- .../ActiveRemoteMessageModelTests.swift | 2 +- 7 files changed, 16 insertions(+), 9 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index df74274b71..28cde689c0 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -13316,7 +13316,7 @@ repositoryURL = "https://github.com/duckduckgo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 171.2.3; + version = 172.0.0; }; }; 9FF521422BAA8FF300B9819B /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 264fd72568..982a947ab6 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" : "278f486e71131ee8e36df4180518b0f74843d47e", - "version" : "171.2.3" + "revision" : "f8e381771a33287e317da84d5676a5e2a271bca3", + "version" : "172.0.0" } }, { diff --git a/DuckDuckGo/RemoteMessaging/ActiveRemoteMessageModel.swift b/DuckDuckGo/RemoteMessaging/ActiveRemoteMessageModel.swift index d8eaa969c5..6085fe99bb 100644 --- a/DuckDuckGo/RemoteMessaging/ActiveRemoteMessageModel.swift +++ b/DuckDuckGo/RemoteMessaging/ActiveRemoteMessageModel.swift @@ -97,6 +97,9 @@ final class ActiveRemoteMessageModel: ObservableObject { self.remoteMessage = nil let pixel: GeneralPixel? = { + guard remoteMessage.isMetricsEnabled else { + return nil + } switch action { case .close: return GeneralPixel.remoteMessageDismissed @@ -121,10 +124,14 @@ final class ActiveRemoteMessageModel: ObservableObject { return } os_log("Remote message shown: %s", log: .remoteMessaging, type: .info, remoteMessage.id) - PixelKit.fire(GeneralPixel.remoteMessageShown, withAdditionalParameters: ["message": remoteMessage.id]) + if remoteMessage.isMetricsEnabled { + PixelKit.fire(GeneralPixel.remoteMessageShown, withAdditionalParameters: ["message": remoteMessage.id]) + } if !store.hasShownRemoteMessage(withID: remoteMessage.id) { os_log("Remote message shown for first time: %s", log: .remoteMessaging, type: .info, remoteMessage.id) - PixelKit.fire(GeneralPixel.remoteMessageShownUnique, withAdditionalParameters: ["mesage": remoteMessage.id]) + if remoteMessage.isMetricsEnabled { + PixelKit.fire(GeneralPixel.remoteMessageShownUnique, withAdditionalParameters: ["message": remoteMessage.id]) + } store.updateRemoteMessage(withID: remoteMessage.id, asShown: true) } } diff --git a/LocalPackages/DataBrokerProtection/Package.swift b/LocalPackages/DataBrokerProtection/Package.swift index 59f51a8b3d..b2c815e6bd 100644 --- a/LocalPackages/DataBrokerProtection/Package.swift +++ b/LocalPackages/DataBrokerProtection/Package.swift @@ -29,7 +29,7 @@ let package = Package( targets: ["DataBrokerProtection"]) ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.3"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "172.0.0"), .package(path: "../SwiftUIExtensions"), .package(path: "../XPCHelper"), ], diff --git a/LocalPackages/NetworkProtectionMac/Package.swift b/LocalPackages/NetworkProtectionMac/Package.swift index 518538e807..bebc489486 100644 --- a/LocalPackages/NetworkProtectionMac/Package.swift +++ b/LocalPackages/NetworkProtectionMac/Package.swift @@ -32,7 +32,7 @@ let package = Package( .library(name: "VPNAppLauncher", targets: ["VPNAppLauncher"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.3"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "172.0.0"), .package(url: "https://github.com/airbnb/lottie-spm", exact: "4.4.3"), .package(path: "../AppLauncher"), .package(path: "../UDSHelper"), diff --git a/LocalPackages/SubscriptionUI/Package.swift b/LocalPackages/SubscriptionUI/Package.swift index 76c722fc6b..5e2bfa90f9 100644 --- a/LocalPackages/SubscriptionUI/Package.swift +++ b/LocalPackages/SubscriptionUI/Package.swift @@ -12,7 +12,7 @@ let package = Package( targets: ["SubscriptionUI"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "171.2.3"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "172.0.0"), .package(path: "../SwiftUIExtensions") ], targets: [ diff --git a/UnitTests/RemoteMessaging/ActiveRemoteMessageModelTests.swift b/UnitTests/RemoteMessaging/ActiveRemoteMessageModelTests.swift index 22df43325a..05d7194545 100644 --- a/UnitTests/RemoteMessaging/ActiveRemoteMessageModelTests.swift +++ b/UnitTests/RemoteMessaging/ActiveRemoteMessageModelTests.swift @@ -31,7 +31,7 @@ final class ActiveRemoteMessageModelTests: XCTestCase { store = MockRemoteMessagingStore() message = RemoteMessageModel( id: "1", - content: .small(titleText: "test", descriptionText: "desc"), matchingRules: [], exclusionRules: [] + content: .small(titleText: "test", descriptionText: "desc"), matchingRules: [], exclusionRules: [], isMetricsEnabled: false ) } From d2ec106ba11e18a81e3ca774447f6c8599327521 Mon Sep 17 00:00:00 2001 From: Tom Strba <57389842+tomasstrba@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:04:29 +0200 Subject: [PATCH 09/13] Automatic updates (#2938) Task/Issue URL: https://app.asana.com/0/1148564399326804/1206217930719964/f **Description**: We have enhanced the update flow and added automatic updates. --- DuckDuckGo.xcodeproj/project.pbxproj | 102 +- .../xcshareddata/swiftpm/Package.resolved | 4 +- DuckDuckGo/Application/AppDelegate.swift | 4 + DuckDuckGo/Application/UpdateController.swift | 132 -- .../Contents.json | 20 + .../AboutPageLogo.imageset/AboutPageLogo.pdf | Bin 54406 -> 0 bytes .../AboutPageLogo.imageset/Contents.json | 2 +- .../AboutPageLogo.imageset/DuckDuckGo.pdf | Bin 0 -> 84197 bytes .../Contents.json | 12 + .../Icon 22.pdf | Bin 0 -> 1141 bytes .../HelpMenuItemIcon.imageset/Contents.json | 15 + .../HelpMenuItemIcon.imageset/Icon 23.pdf | Bin 0 -> 1447 bytes .../UpdateMenuItemIcon.imageset/Contents.json | 12 + .../UpdateMenuItemIcon.imageset/Icon 21.pdf | Bin 0 -> 1144 bytes .../Contents.json | 12 + .../Icon 19.pdf | Bin 0 -> 1140 bytes DuckDuckGo/Bridging.h | 1 + .../Common/Extensions/URLExtension.swift | 5 + DuckDuckGo/Common/Localizables/UserText.swift | 19 + DuckDuckGo/Common/Logging/Logging.swift | 2 + .../Utilities/UserDefaultsWrapper.swift | 7 + DuckDuckGo/Info.plist | 878 +++++----- DuckDuckGo/Localizable.xcstrings | 1415 ++++++++++++++++- DuckDuckGo/Menus/MainMenu.swift | 31 +- DuckDuckGo/Menus/MainMenuActions.swift | 26 +- .../PopoverMessageViewController.swift | 41 +- .../NavigationBar/View/MoreOptionsMenu.swift | 48 + .../View/MoreOptionsMenuButton.swift | 105 ++ .../View/NavigationBar.storyboard | 4 +- .../Preferences/Model/AboutPreferences.swift | 121 ++ .../View/PreferencesAboutView.swift | 262 ++- .../View/PreferencesRootView.swift | 2 +- .../Model/RecentlyClosedCoordinator.swift | 4 +- .../View/RecentlyClosedMenu.swift | 3 + .../StateRestoration/Tab+NSSecureCoding.swift | 4 + DuckDuckGo/Statistics/GeneralPixel.swift | 21 +- DuckDuckGo/Tab/Model/Tab+Navigation.swift | 3 + DuckDuckGo/Tab/Model/TabContent.swift | 20 +- .../SerpHeadersNavigationResponder.swift | 4 +- .../Tab/TabExtensions/TabExtensions.swift | 9 + .../TabExtensions/TabSnapshotExtension.swift | 3 +- DuckDuckGo/Tab/UserScripts/UserScripts.swift | 12 + .../Tab/View/BrowserTabViewController.swift | 7 +- DuckDuckGo/Tab/ViewModel/TabViewModel.swift | 13 +- .../TabPreview/TabPreviewViewController.swift | 2 +- DuckDuckGo/Updates/AppRestarter.swift | 83 + .../Updates/ApplicationUpdateDetector.swift | 97 ++ DuckDuckGo/Updates/ReleaseNotesParser.swift | 88 + .../Updates/ReleaseNotesTabExtension.swift | 167 ++ .../Updates/ReleaseNotesUserScript.swift | 128 ++ DuckDuckGo/Updates/Update.swift | 80 + DuckDuckGo/Updates/UpdateController.swift | 281 ++++ DuckDuckGo/Updates/UpdateDialogHelper.swift | 39 + .../UpdateMenuItemFactory.swift} | 27 +- .../Updates/UpdateNotificationPresenter.swift | 60 + .../YoutubePlayer/DuckURLSchemeHandler.swift | 32 +- .../Assets.xcassets/Images/Contents.json | 6 + .../Contents.json | 12 + .../Icon 20.pdf | Bin 0 -> 1446 bytes .../PopoverMessageView.swift | 95 +- UnitTests/Menus/MoreOptionsMenuTests.swift | 6 +- .../ApplicationUpdateDetectorTests.swift | 61 + .../Updates/ReleaseNotesParserTests.swift | 104 ++ 63 files changed, 3993 insertions(+), 760 deletions(-) delete mode 100644 DuckDuckGo/Application/UpdateController.swift create mode 100644 DuckDuckGo/Assets.xcassets/Colors/UpdateIndicatorColor.colorset/Contents.json delete mode 100644 DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/AboutPageLogo.pdf create mode 100644 DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/DuckDuckGo.pdf create mode 100644 DuckDuckGo/Assets.xcassets/Images/CriticalUpdateNotificationInfo.imageset/Contents.json create mode 100644 DuckDuckGo/Assets.xcassets/Images/CriticalUpdateNotificationInfo.imageset/Icon 22.pdf create mode 100644 DuckDuckGo/Assets.xcassets/Images/HelpMenuItemIcon.imageset/Contents.json create mode 100644 DuckDuckGo/Assets.xcassets/Images/HelpMenuItemIcon.imageset/Icon 23.pdf create mode 100644 DuckDuckGo/Assets.xcassets/Images/UpdateMenuItemIcon.imageset/Contents.json create mode 100644 DuckDuckGo/Assets.xcassets/Images/UpdateMenuItemIcon.imageset/Icon 21.pdf create mode 100644 DuckDuckGo/Assets.xcassets/Images/UpdateNotificationInfo.imageset/Contents.json create mode 100644 DuckDuckGo/Assets.xcassets/Images/UpdateNotificationInfo.imageset/Icon 19.pdf create mode 100644 DuckDuckGo/NavigationBar/View/MoreOptionsMenuButton.swift create mode 100644 DuckDuckGo/Preferences/Model/AboutPreferences.swift create mode 100644 DuckDuckGo/Updates/AppRestarter.swift create mode 100644 DuckDuckGo/Updates/ApplicationUpdateDetector.swift create mode 100644 DuckDuckGo/Updates/ReleaseNotesParser.swift create mode 100644 DuckDuckGo/Updates/ReleaseNotesTabExtension.swift create mode 100644 DuckDuckGo/Updates/ReleaseNotesUserScript.swift create mode 100644 DuckDuckGo/Updates/Update.swift create mode 100644 DuckDuckGo/Updates/UpdateController.swift create mode 100644 DuckDuckGo/Updates/UpdateDialogHelper.swift rename DuckDuckGo/{Preferences/Model/AboutModel.swift => Updates/UpdateMenuItemFactory.swift} (52%) create mode 100644 DuckDuckGo/Updates/UpdateNotificationPresenter.swift create mode 100644 LocalPackages/SwiftUIExtensions/Sources/SwiftUIExtensions/Assets.xcassets/Images/Contents.json create mode 100644 LocalPackages/SwiftUIExtensions/Sources/SwiftUIExtensions/Assets.xcassets/Images/UpdateNotificationClose.imageset/Contents.json create mode 100644 LocalPackages/SwiftUIExtensions/Sources/SwiftUIExtensions/Assets.xcassets/Images/UpdateNotificationClose.imageset/Icon 20.pdf create mode 100644 UnitTests/Updates/ApplicationUpdateDetectorTests.swift create mode 100644 UnitTests/Updates/ReleaseNotesParserTests.swift diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 28cde689c0..6fb4b4fbcd 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -29,6 +29,10 @@ 1D01A3D92B88DF8B00FE8150 /* PreferencesSyncView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D01A3D72B88DF8B00FE8150 /* PreferencesSyncView.swift */; }; 1D02633628D8A9A9005CBB41 /* BWEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D02633528D8A9A9005CBB41 /* BWEncryption.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated -Wno-strict-prototypes"; }; }; 1D074B272909A433006E4AC3 /* PasswordManagerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D074B262909A433006E4AC3 /* PasswordManagerCoordinator.swift */; }; + 1D0DE93E2C3BA9840037ABC2 /* AppRestarter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */; }; + 1D0DE93F2C3BA9840037ABC2 /* AppRestarter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */; }; + 1D0DE9412C3BB9CC0037ABC2 /* ReleaseNotesParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */; }; + 1D0DE9422C3BB9CC0037ABC2 /* ReleaseNotesParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */; }; 1D12F2E2298BC660009A65FD /* InternalUserDeciderStoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D12F2E1298BC660009A65FD /* InternalUserDeciderStoreMock.swift */; }; 1D1A33492A6FEB170080ACED /* BurnerMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D1A33482A6FEB170080ACED /* BurnerMode.swift */; }; 1D1A334A2A6FEB170080ACED /* BurnerMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D1A33482A6FEB170080ACED /* BurnerMode.swift */; }; @@ -55,6 +59,10 @@ 1D36E65C298ACD2900AA485D /* AppIconChanger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D36E65A298ACD2900AA485D /* AppIconChanger.swift */; }; 1D36F4242A3B85C50052B527 /* TabCleanupPreparer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D36F4232A3B85C50052B527 /* TabCleanupPreparer.swift */; }; 1D36F4252A3B85C50052B527 /* TabCleanupPreparer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D36F4232A3B85C50052B527 /* TabCleanupPreparer.swift */; }; + 1D39E5772C2BFD5700757339 /* ReleaseNotesTabExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D39E5762C2BFD5700757339 /* ReleaseNotesTabExtension.swift */; }; + 1D39E5782C2BFD5700757339 /* ReleaseNotesTabExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D39E5762C2BFD5700757339 /* ReleaseNotesTabExtension.swift */; }; + 1D39E57A2C2C0F3700757339 /* ReleaseNotesUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D39E5792C2C0F3700757339 /* ReleaseNotesUserScript.swift */; }; + 1D39E57B2C2C0F3700757339 /* ReleaseNotesUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D39E5792C2C0F3700757339 /* ReleaseNotesUserScript.swift */; }; 1D3B1AB92934062B006F4388 /* PasswordManagerCoordinatingMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D3B1AB82934062B006F4388 /* PasswordManagerCoordinatingMock.swift */; }; 1D3B1ABF29369FC8006F4388 /* BWEncryptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D3B1ABE29369FC8006F4388 /* BWEncryptionTests.swift */; }; 1D3B1AC22936B816006F4388 /* BWMessageIdGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D3B1AC12936B816006F4388 /* BWMessageIdGeneratorTests.swift */; }; @@ -69,15 +77,23 @@ 1D43EB3A292B63B00065E5D6 /* BWRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D43EB39292B63B00065E5D6 /* BWRequest.swift */; }; 1D43EB3C292B664A0065E5D6 /* BWMessageIdGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D43EB3B292B664A0065E5D6 /* BWMessageIdGenerator.swift */; }; 1D6216B229069BBF00386B2C /* BWKeyStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6216B129069BBF00386B2C /* BWKeyStorage.swift */; }; + 1D638D612C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D638D602C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift */; }; + 1D638D622C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D638D602C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift */; }; 1D69C553291302F200B75945 /* BWVault.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D69C552291302F200B75945 /* BWVault.swift */; }; 1D6A492029CF7A490011DF74 /* NSPopoverExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6A491F29CF7A490011DF74 /* NSPopoverExtension.swift */; }; 1D6A492129CF7A490011DF74 /* NSPopoverExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6A491F29CF7A490011DF74 /* NSPopoverExtension.swift */; }; + 1D710F4B2C48F1F200C3975F /* UpdateDialogHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D710F4A2C48F1F200C3975F /* UpdateDialogHelper.swift */; }; + 1D710F4C2C48F1F200C3975F /* UpdateDialogHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D710F4A2C48F1F200C3975F /* UpdateDialogHelper.swift */; }; + 1D72D59C2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D72D59B2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift */; }; + 1D72D59D2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D72D59B2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift */; }; 1D7693FF2BE3A1AA0016A22B /* DockCustomizerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7693FE2BE3A1AA0016A22B /* DockCustomizerMock.swift */; }; 1D7694002BE3A1AA0016A22B /* DockCustomizerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7693FE2BE3A1AA0016A22B /* DockCustomizerMock.swift */; }; 1D77921828FDC54C00BE0210 /* FaviconReferenceCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D77921728FDC54C00BE0210 /* FaviconReferenceCacheTests.swift */; }; 1D77921A28FDC79800BE0210 /* FaviconStoringMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D77921928FDC79800BE0210 /* FaviconStoringMock.swift */; }; 1D8057C82A83CAEE00F4FED6 /* SupportedOsChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D8057C72A83CAEE00F4FED6 /* SupportedOsChecker.swift */; }; 1D8057C92A83CB3C00F4FED6 /* SupportedOsChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D8057C72A83CAEE00F4FED6 /* SupportedOsChecker.swift */; }; + 1D838A332C44F0310078373F /* ReleaseNotesParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D838A312C44F0180078373F /* ReleaseNotesParserTests.swift */; }; + 1D838A342C44F0320078373F /* ReleaseNotesParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D838A312C44F0180078373F /* ReleaseNotesParserTests.swift */; }; 1D85BCCA2BA982FC0065BA04 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 1D85BCC92BA982FC0065BA04 /* InfoPlist.xcstrings */; }; 1D8B7D6A2A38BF050045C6F6 /* FireproofDomainsStoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6BBF1712744CE36004F850E /* FireproofDomainsStoreMock.swift */; }; 1D8B7D6B2A38BF060045C6F6 /* FireproofDomainsStoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6BBF1712744CE36004F850E /* FireproofDomainsStoreMock.swift */; }; @@ -89,6 +105,8 @@ 1D8C2FEE2B70F5D0005E4BBD /* MockViewSnapshotRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D8C2FEC2B70F5D0005E4BBD /* MockViewSnapshotRenderer.swift */; }; 1D8C2FF02B70F751005E4BBD /* MockTabSnapshotStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D8C2FEF2B70F751005E4BBD /* MockTabSnapshotStore.swift */; }; 1D8C2FF12B70F751005E4BBD /* MockTabSnapshotStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D8C2FEF2B70F751005E4BBD /* MockTabSnapshotStore.swift */; }; + 1D9297BF2C1B062900A38521 /* ApplicationUpdateDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9297BE2C1B062900A38521 /* ApplicationUpdateDetector.swift */; }; + 1D9297C02C1B062900A38521 /* ApplicationUpdateDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9297BE2C1B062900A38521 /* ApplicationUpdateDetector.swift */; }; 1D9A37672BD8EA8800EBC58D /* DockPositionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9A37662BD8EA8800EBC58D /* DockPositionProvider.swift */; }; 1D9A37682BD8EA8800EBC58D /* DockPositionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9A37662BD8EA8800EBC58D /* DockPositionProvider.swift */; }; 1D9A4E5A2B43213B00F449E2 /* TabSnapshotExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9A4E592B43213B00F449E2 /* TabSnapshotExtension.swift */; }; @@ -109,6 +127,10 @@ 1DA6D0FE2A1FF9A100540406 /* HTTPCookie.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA6D0FC2A1FF9A100540406 /* HTTPCookie.swift */; }; 1DA6D1022A1FFA3700540406 /* HTTPCookieTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA6D0FF2A1FF9DC00540406 /* HTTPCookieTests.swift */; }; 1DA6D1032A1FFA3B00540406 /* HTTPCookieTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA6D0FF2A1FF9DC00540406 /* HTTPCookieTests.swift */; }; + 1DA84D2F2C11989D0011C80F /* Update.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA84D2E2C11989D0011C80F /* Update.swift */; }; + 1DA84D302C11989D0011C80F /* Update.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA84D2E2C11989D0011C80F /* Update.swift */; }; + 1DA84D322C119AE70011C80F /* UpdateMenuItemFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA84D312C119AE70011C80F /* UpdateMenuItemFactory.swift */; }; + 1DA84D332C119AE70011C80F /* UpdateMenuItemFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA84D312C119AE70011C80F /* UpdateMenuItemFactory.swift */; }; 1DA860722BE3AE950027B813 /* DockPositionProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA860712BE3AE950027B813 /* DockPositionProviderTests.swift */; }; 1DA860732BE3AE950027B813 /* DockPositionProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA860712BE3AE950027B813 /* DockPositionProviderTests.swift */; }; 1DB67F292B6FE4A6003DF243 /* WebViewSnapshotRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DB67F282B6FE4A6003DF243 /* WebViewSnapshotRenderer.swift */; }; @@ -140,6 +162,8 @@ 1DDF076328F815AD00EDFBE3 /* BWCommunicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DDF075D28F815AD00EDFBE3 /* BWCommunicator.swift */; }; 1DDF076428F815AD00EDFBE3 /* BWManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DDF075E28F815AD00EDFBE3 /* BWManager.swift */; }; 1DE03425298BC7F000CAB3D7 /* InternalUserDeciderStoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D12F2E1298BC660009A65FD /* InternalUserDeciderStoreMock.swift */; }; + 1DEDB3642C19934C006B6D1B /* MoreOptionsMenuButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DEDB3632C19934C006B6D1B /* MoreOptionsMenuButton.swift */; }; + 1DEDB3652C19934C006B6D1B /* MoreOptionsMenuButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DEDB3632C19934C006B6D1B /* MoreOptionsMenuButton.swift */; }; 1DEF3BAD2BD145A9004A2FBA /* AutoClearHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DEF3BAC2BD145A9004A2FBA /* AutoClearHandler.swift */; }; 1DEF3BAE2BD145A9004A2FBA /* AutoClearHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DEF3BAC2BD145A9004A2FBA /* AutoClearHandler.swift */; }; 1DFAB51D2A8982A600A0F7F6 /* SetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DFAB51C2A8982A600A0F7F6 /* SetExtension.swift */; }; @@ -458,7 +482,7 @@ 3706FB9B293F65D500E42796 /* PrivacyDashboardPermissionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7E2E932902AC0E00C01B54 /* PrivacyDashboardPermissionHandler.swift */; }; 3706FB9C293F65D500E42796 /* TabCollectionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA9FF95E24A1FB680039E328 /* TabCollectionViewModel.swift */; }; 3706FB9D293F65D500E42796 /* BookmarkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAC5E4CE25D6A709007F5990 /* BookmarkManager.swift */; }; - 3706FB9E293F65D500E42796 /* AboutModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C527F2FDD100F1F7B9 /* AboutModel.swift */; }; + 3706FB9E293F65D500E42796 /* AboutPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C527F2FDD100F1F7B9 /* AboutPreferences.swift */; }; 3706FB9F293F65D500E42796 /* PasswordManagementCreditCardItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE65470271FCD40008D1D63 /* PasswordManagementCreditCardItemView.swift */; }; 3706FBA0293F65D500E42796 /* NSTextFieldExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA5C8F58258FE21F00748EB7 /* NSTextFieldExtension.swift */; }; 3706FBA1293F65D500E42796 /* FireproofDomainsContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6830960274CDE99004B46BB /* FireproofDomainsContainer.swift */; }; @@ -1056,7 +1080,7 @@ 37CD54CA27F2FDD100F1F7B9 /* AutofillPreferencesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C227F2FDD100F1F7B9 /* AutofillPreferencesModel.swift */; }; 37CD54CB27F2FDD100F1F7B9 /* DownloadsPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C327F2FDD100F1F7B9 /* DownloadsPreferences.swift */; }; 37CD54CC27F2FDD100F1F7B9 /* PreferencesSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C427F2FDD100F1F7B9 /* PreferencesSection.swift */; }; - 37CD54CD27F2FDD100F1F7B9 /* AboutModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C527F2FDD100F1F7B9 /* AboutModel.swift */; }; + 37CD54CD27F2FDD100F1F7B9 /* AboutPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C527F2FDD100F1F7B9 /* AboutPreferences.swift */; }; 37CD54CE27F2FDD100F1F7B9 /* PreferencesSidebarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C627F2FDD100F1F7B9 /* PreferencesSidebarModel.swift */; }; 37CD54CF27F2FDD100F1F7B9 /* AppearancePreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C727F2FDD100F1F7B9 /* AppearancePreferences.swift */; }; 37CD54D027F2FDD100F1F7B9 /* DefaultBrowserPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CD54C827F2FDD100F1F7B9 /* DefaultBrowserPreferences.swift */; }; @@ -2923,6 +2947,8 @@ 1D02633428D8A9A9005CBB41 /* BWEncryption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BWEncryption.h; sourceTree = ""; }; 1D02633528D8A9A9005CBB41 /* BWEncryption.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BWEncryption.m; sourceTree = ""; }; 1D074B262909A433006E4AC3 /* PasswordManagerCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordManagerCoordinator.swift; sourceTree = ""; }; + 1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRestarter.swift; sourceTree = ""; }; + 1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseNotesParser.swift; sourceTree = ""; }; 1D12F2E1298BC660009A65FD /* InternalUserDeciderStoreMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalUserDeciderStoreMock.swift; sourceTree = ""; }; 1D1A33482A6FEB170080ACED /* BurnerMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurnerMode.swift; sourceTree = ""; }; 1D1C36E229FAE8DA001FA40C /* FaviconManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconManagerTests.swift; sourceTree = ""; }; @@ -2934,6 +2960,8 @@ 1D36E657298AA3BA00AA485D /* InternalUserDeciderStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalUserDeciderStore.swift; sourceTree = ""; }; 1D36E65A298ACD2900AA485D /* AppIconChanger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconChanger.swift; sourceTree = ""; }; 1D36F4232A3B85C50052B527 /* TabCleanupPreparer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabCleanupPreparer.swift; sourceTree = ""; }; + 1D39E5762C2BFD5700757339 /* ReleaseNotesTabExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseNotesTabExtension.swift; sourceTree = ""; }; + 1D39E5792C2C0F3700757339 /* ReleaseNotesUserScript.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseNotesUserScript.swift; sourceTree = ""; }; 1D3B1AB82934062B006F4388 /* PasswordManagerCoordinatingMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordManagerCoordinatingMock.swift; sourceTree = ""; }; 1D3B1ABE29369FC8006F4388 /* BWEncryptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BWEncryptionTests.swift; sourceTree = ""; }; 1D3B1AC12936B816006F4388 /* BWMessageIdGeneratorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BWMessageIdGeneratorTests.swift; sourceTree = ""; }; @@ -2948,18 +2976,23 @@ 1D43EB39292B63B00065E5D6 /* BWRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BWRequest.swift; sourceTree = ""; }; 1D43EB3B292B664A0065E5D6 /* BWMessageIdGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BWMessageIdGenerator.swift; sourceTree = ""; }; 1D6216B129069BBF00386B2C /* BWKeyStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BWKeyStorage.swift; sourceTree = ""; }; + 1D638D602C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationUpdateDetectorTests.swift; sourceTree = ""; }; 1D69C552291302F200B75945 /* BWVault.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BWVault.swift; sourceTree = ""; }; 1D6A491F29CF7A490011DF74 /* NSPopoverExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSPopoverExtension.swift; sourceTree = ""; }; + 1D710F4A2C48F1F200C3975F /* UpdateDialogHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateDialogHelper.swift; sourceTree = ""; }; + 1D72D59B2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateNotificationPresenter.swift; sourceTree = ""; }; 1D7693FE2BE3A1AA0016A22B /* DockCustomizerMock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DockCustomizerMock.swift; sourceTree = ""; }; 1D77921728FDC54C00BE0210 /* FaviconReferenceCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconReferenceCacheTests.swift; sourceTree = ""; }; 1D77921928FDC79800BE0210 /* FaviconStoringMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconStoringMock.swift; sourceTree = ""; }; 1D77921C28FFF27C00BE0210 /* RunningApplicationCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunningApplicationCheck.swift; sourceTree = ""; }; 1D8057C72A83CAEE00F4FED6 /* SupportedOsChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedOsChecker.swift; sourceTree = ""; }; + 1D838A312C44F0180078373F /* ReleaseNotesParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseNotesParserTests.swift; sourceTree = ""; }; 1D85BCC92BA982FC0065BA04 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; 1D8C2FE42B70F4C4005E4BBD /* TabSnapshotExtensionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabSnapshotExtensionTests.swift; sourceTree = ""; }; 1D8C2FE92B70F5A7005E4BBD /* MockWebViewSnapshotRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockWebViewSnapshotRenderer.swift; sourceTree = ""; }; 1D8C2FEC2B70F5D0005E4BBD /* MockViewSnapshotRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockViewSnapshotRenderer.swift; sourceTree = ""; }; 1D8C2FEF2B70F751005E4BBD /* MockTabSnapshotStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockTabSnapshotStore.swift; sourceTree = ""; }; + 1D9297BE2C1B062900A38521 /* ApplicationUpdateDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationUpdateDetector.swift; sourceTree = ""; }; 1D9A37662BD8EA8800EBC58D /* DockPositionProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DockPositionProvider.swift; sourceTree = ""; }; 1D9A4E592B43213B00F449E2 /* TabSnapshotExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabSnapshotExtension.swift; sourceTree = ""; }; 1D9FDEB62B9B5D150040B78C /* SearchPreferencesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchPreferencesTests.swift; sourceTree = ""; }; @@ -2970,6 +3003,8 @@ 1D9FDEC52B9B64DB0040B78C /* PrivacyProtectionStatusTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyProtectionStatusTests.swift; sourceTree = ""; }; 1DA6D0FC2A1FF9A100540406 /* HTTPCookie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPCookie.swift; sourceTree = ""; }; 1DA6D0FF2A1FF9DC00540406 /* HTTPCookieTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPCookieTests.swift; sourceTree = ""; }; + 1DA84D2E2C11989D0011C80F /* Update.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Update.swift; sourceTree = ""; }; + 1DA84D312C119AE70011C80F /* UpdateMenuItemFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateMenuItemFactory.swift; sourceTree = ""; }; 1DA860712BE3AE950027B813 /* DockPositionProviderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DockPositionProviderTests.swift; sourceTree = ""; }; 1DB67F282B6FE4A6003DF243 /* WebViewSnapshotRenderer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewSnapshotRenderer.swift; sourceTree = ""; }; 1DB67F2C2B6FEFDB003DF243 /* ViewSnapshotRenderer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewSnapshotRenderer.swift; sourceTree = ""; }; @@ -2990,6 +3025,7 @@ 1DDF075F28F815AD00EDFBE3 /* BWStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BWStatus.swift; sourceTree = ""; }; 1DDF076028F815AD00EDFBE3 /* BWError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BWError.swift; sourceTree = ""; }; 1DDF076128F815AD00EDFBE3 /* BWResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BWResponse.swift; sourceTree = ""; }; + 1DEDB3632C19934C006B6D1B /* MoreOptionsMenuButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreOptionsMenuButton.swift; sourceTree = ""; }; 1DEF3BAC2BD145A9004A2FBA /* AutoClearHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutoClearHandler.swift; sourceTree = ""; }; 1DFAB51C2A8982A600A0F7F6 /* SetExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetExtension.swift; sourceTree = ""; }; 1DFAB51F2A89830D00A0F7F6 /* SetExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetExtensionTests.swift; sourceTree = ""; }; @@ -3138,7 +3174,7 @@ 37CD54C227F2FDD100F1F7B9 /* AutofillPreferencesModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillPreferencesModel.swift; sourceTree = ""; }; 37CD54C327F2FDD100F1F7B9 /* DownloadsPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadsPreferences.swift; sourceTree = ""; }; 37CD54C427F2FDD100F1F7B9 /* PreferencesSection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesSection.swift; sourceTree = ""; }; - 37CD54C527F2FDD100F1F7B9 /* AboutModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutModel.swift; sourceTree = ""; }; + 37CD54C527F2FDD100F1F7B9 /* AboutPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutPreferences.swift; sourceTree = ""; }; 37CD54C627F2FDD100F1F7B9 /* PreferencesSidebarModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesSidebarModel.swift; sourceTree = ""; }; 37CD54C727F2FDD100F1F7B9 /* AppearancePreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppearancePreferences.swift; sourceTree = ""; }; 37CD54C827F2FDD100F1F7B9 /* DefaultBrowserPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultBrowserPreferences.swift; sourceTree = ""; }; @@ -4654,6 +4690,23 @@ path = Logging; sourceTree = ""; }; + 1D72D5902BFF361700AEDE36 /* Updates */ = { + isa = PBXGroup; + children = ( + 1DA84D2E2C11989D0011C80F /* Update.swift */, + AAD86E51267A0DFF005C11BE /* UpdateController.swift */, + 1DA84D312C119AE70011C80F /* UpdateMenuItemFactory.swift */, + 1D72D59B2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift */, + 1D9297BE2C1B062900A38521 /* ApplicationUpdateDetector.swift */, + 1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */, + 1D39E5762C2BFD5700757339 /* ReleaseNotesTabExtension.swift */, + 1D39E5792C2C0F3700757339 /* ReleaseNotesUserScript.swift */, + 1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */, + 1D710F4A2C48F1F200C3975F /* UpdateDialogHelper.swift */, + ); + path = Updates; + sourceTree = ""; + }; 1D77921628FDC51B00BE0210 /* Favicons */ = { isa = PBXGroup; children = ( @@ -4681,6 +4734,15 @@ path = OsVersion; sourceTree = ""; }; + 1D838A302C44EFF20078373F /* Updates */ = { + isa = PBXGroup; + children = ( + 1D838A312C44F0180078373F /* ReleaseNotesParserTests.swift */, + 1D638D602C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift */, + ); + path = Updates; + sourceTree = ""; + }; 1D8C2FE72B70F51A005E4BBD /* TabPreview */ = { isa = PBXGroup; children = ( @@ -5028,7 +5090,7 @@ 1D01A3D32B88CF7700FE8150 /* AccessibilityPreferences.swift */, 37CD54C127F2FDD100F1F7B9 /* DataClearingPreferences.swift */, 37F19A6628E1B43200740DC6 /* DuckPlayerPreferences.swift */, - 37CD54C527F2FDD100F1F7B9 /* AboutModel.swift */, + 37CD54C527F2FDD100F1F7B9 /* AboutPreferences.swift */, 1D220BFB2B87AACF00F8BBC6 /* PrivacyProtectionStatus.swift */, 021EA07F2BD2A9D500772C9A /* TabsPreferences.swift */, 566B736B2BECC3C600FF1959 /* SyncPausedStateManaging.swift */, @@ -6715,7 +6777,6 @@ AA585D81248FD31100E9A3E2 /* AppDelegate.swift */, AA4D700625545EF800C3411E /* URLEventHandler.swift */, AA4FF40B2624751A004E2377 /* GrammarFeaturesManager.swift */, - AAD86E51267A0DFF005C11BE /* UpdateController.swift */, 858A798226A8B75F00A75A42 /* CopyHandler.swift */, 1D36E65A298ACD2900AA485D /* AppIconChanger.swift */, CB24F70B29A3D9CB006DCC58 /* AppConfigurationURLProvider.swift */, @@ -6853,6 +6914,7 @@ AA86491124D8318F001BABEE /* TabBar */, AAE8B0FD258A416F00E81239 /* TabPreview */, B6040859274B8C5200680351 /* UnprotectedDomains */, + 1D72D5902BFF361700AEDE36 /* Updates */, AACF6FD426BC35C200CF09F9 /* UserAgent */, 4B41EDAC2B168A66001EEDF4 /* VPNFeedbackForm */, 4B9DB0062A983B23000927DB /* Waitlist */, @@ -6911,6 +6973,7 @@ AAC9C01224CAFBB700AD1325 /* TabBar */, B6CA4822298CDC0B0067ECCE /* TabExtensionsTests */, 1D8C2FE72B70F51A005E4BBD /* TabPreview */, + 1D838A302C44EFF20078373F /* Updates */, AA0877B626D515EE00B05660 /* UserAgent */, 4B9DB04D2A983B55000927DB /* Waitlist */, 3776582B27F7163B009A6B35 /* WebsiteBreakageReport */, @@ -7222,6 +7285,7 @@ B60D64482AAF1B7C00B26F50 /* AddressBarTextSelectionNavigation.swift */, 14D9B8F924F7E089000D4D13 /* AddressBarViewController.swift */, AAA0CC462533833C0079BC96 /* MoreOptionsMenu.swift */, + 1DEDB3632C19934C006B6D1B /* MoreOptionsMenuButton.swift */, 85589E8C27BBBB870038AD11 /* NavigationBar.storyboard */, AAA0CC32252F181A0079BC96 /* NavigationButtonMenuDelegate.swift */, 85012B0129133F9F003D0DCC /* NavigationBarPopovers.swift */, @@ -9813,6 +9877,7 @@ B60D644A2AAF1B7C00B26F50 /* AddressBarTextSelectionNavigation.swift in Sources */, 1D01A3D52B88CF7700FE8150 /* AccessibilityPreferences.swift in Sources */, 3706FA98293F65D500E42796 /* SecureVaultSorting.swift in Sources */, + 1DEDB3652C19934C006B6D1B /* MoreOptionsMenuButton.swift in Sources */, 3706FA99293F65D500E42796 /* PreferencesSidebarModel.swift in Sources */, 3706FA9A293F65D500E42796 /* DuckPlayerURLExtension.swift in Sources */, 3706FA9D293F65D500E42796 /* PermissionState.swift in Sources */, @@ -9892,6 +9957,7 @@ 3706FAD6293F65D500E42796 /* ConfigurationStore.swift in Sources */, 3706FAD7293F65D500E42796 /* Feedback.swift in Sources */, 4B37EE742B4CFF0A00A89A61 /* HomePageRemoteMessagingRequest.swift in Sources */, + 1D0DE9422C3BB9CC0037ABC2 /* ReleaseNotesParser.swift in Sources */, 3707C722294B5D2900682A9F /* WKWebViewExtension.swift in Sources */, 3706FAD9293F65D500E42796 /* FirefoxFaviconsReader.swift in Sources */, 3706FADA293F65D500E42796 /* CopyHandler.swift in Sources */, @@ -9939,6 +10005,7 @@ 3706FAF5293F65D500E42796 /* SafariVersionReader.swift in Sources */, 3706FAF6293F65D500E42796 /* LoginFaviconView.swift in Sources */, F1B33DF72BAD970E001128B3 /* SubscriptionErrorReporter.swift in Sources */, + 1D9297C02C1B062900A38521 /* ApplicationUpdateDetector.swift in Sources */, 3706FEC0293F6EFF00E42796 /* BWRequest.swift in Sources */, 3706FAF7293F65D500E42796 /* FireproofDomainsViewController.swift in Sources */, F18826852BBEE31700D9AC4F /* PixelKit+Assertion.swift in Sources */, @@ -10022,6 +10089,7 @@ 3706FB31293F65D500E42796 /* PinnedTabsHostingView.swift in Sources */, B6AFE6BC29A5D3F8002FF962 /* PrivacyDashboardTabExtension.swift in Sources */, 3706FB32293F65D500E42796 /* FirefoxBookmarksReader.swift in Sources */, + 1D39E57B2C2C0F3700757339 /* ReleaseNotesUserScript.swift in Sources */, 3706FB33293F65D500E42796 /* DeviceIdleStateDetector.swift in Sources */, 1DB67F2A2B6FEB17003DF243 /* WebViewSnapshotRenderer.swift in Sources */, 3706FB35293F65D500E42796 /* FlatButton.swift in Sources */, @@ -10092,6 +10160,7 @@ 3706FB67293F65D500E42796 /* DownloadListCoordinator.swift in Sources */, 3706FB68293F65D500E42796 /* NSNotificationName+Debug.swift in Sources */, 3706FB69293F65D500E42796 /* NavigationBarBadgeAnimationView.swift in Sources */, + 1D39E5782C2BFD5700757339 /* ReleaseNotesTabExtension.swift in Sources */, 1D1A334A2A6FEB170080ACED /* BurnerMode.swift in Sources */, B603971B29BA084C00902A34 /* JSAlertController.swift in Sources */, 9FEE986A2B85B869002E44E8 /* BookmarksDialogViewModel.swift in Sources */, @@ -10141,6 +10210,7 @@ 3775912E29AAC72700E26367 /* SyncPreferences.swift in Sources */, 3706FB83293F65D500E42796 /* NSApplicationExtension.swift in Sources */, 37197EA42942441D00394917 /* NewWindowPolicy.swift in Sources */, + 1D72D59D2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift in Sources */, 3706FB84293F65D500E42796 /* NSWindowExtension.swift in Sources */, 3706FB85293F65D500E42796 /* AddBookmarkPopover.swift in Sources */, F18826922BC0105900D9AC4F /* PixelDataRecord.swift in Sources */, @@ -10187,7 +10257,7 @@ 3707C71A294B5D0F00682A9F /* TabExtensions.swift in Sources */, B66260DE29AC5D4300E9E3EE /* NavigationProtectionTabExtension.swift in Sources */, 98779A0129999B64005D8EB6 /* Bookmark.xcdatamodeld in Sources */, - 3706FB9E293F65D500E42796 /* AboutModel.swift in Sources */, + 3706FB9E293F65D500E42796 /* AboutPreferences.swift in Sources */, 3706FB9F293F65D500E42796 /* PasswordManagementCreditCardItemView.swift in Sources */, 9F9C4A022BC7F36D0099738D /* BookmarkAllTabsDialogCoordinatorViewModel.swift in Sources */, 3706FBA0293F65D500E42796 /* NSTextFieldExtension.swift in Sources */, @@ -10367,6 +10437,7 @@ 3706FC13293F65D500E42796 /* FaviconView.swift in Sources */, B69A14F72B4D701F00B9417D /* AddBookmarkPopoverViewModel.swift in Sources */, 3706FC14293F65D500E42796 /* OnboardingFlow.swift in Sources */, + 1DA84D302C11989D0011C80F /* Update.swift in Sources */, B6E3E5592BBFD51400A41922 /* PreviewViewController.swift in Sources */, EEC8EB3E2982CA3B0065AA39 /* JSAlertViewModel.swift in Sources */, 3706FC16293F65D500E42796 /* PasswordManagementLoginModel.swift in Sources */, @@ -10398,6 +10469,7 @@ 3706FC2B293F65D500E42796 /* DownloadViewModel.swift in Sources */, 4B9DB0272A983B24000927DB /* WaitlistViewModel.swift in Sources */, 4B9DB03F2A983B24000927DB /* JoinWaitlistView.swift in Sources */, + 1D710F4C2C48F1F200C3975F /* UpdateDialogHelper.swift in Sources */, 987799F22999993C005D8EB6 /* LegacyBookmarkStore.swift in Sources */, 37A6A8F72AFCCA59008580A3 /* FaviconsFetcherOnboardingViewController.swift in Sources */, F1C70D7D2BFF510000599292 /* SubscriptionEnvironment+Default.swift in Sources */, @@ -10436,6 +10508,7 @@ 3706FC43293F65D500E42796 /* PinnedTabsViewModel.swift in Sources */, 85D0327C2B8E3D090041D1FB /* HistoryCoordinatorExtension.swift in Sources */, B6685E4329A61C470043D2EE /* DownloadsTabExtension.swift in Sources */, + 1DA84D332C119AE70011C80F /* UpdateMenuItemFactory.swift in Sources */, 4BCBE4562BA7E16900FC75A1 /* DataBrokerProtectionSubscriptionEventHandler.swift in Sources */, 3706FC44293F65D500E42796 /* BookmarkList.swift in Sources */, 3706FC45293F65D500E42796 /* BookmarkTableRowView.swift in Sources */, @@ -10578,6 +10651,7 @@ 3707C71E294B5D2900682A9F /* URLRequestExtension.swift in Sources */, 3706FCA3293F65D500E42796 /* WKProcessPool+GeolocationProvider.swift in Sources */, 372A0FED2B2379310033BF7F /* SyncMetricsEventsHandler.swift in Sources */, + 1D0DE93F2C3BA9840037ABC2 /* AppRestarter.swift in Sources */, 3706FCA4293F65D500E42796 /* RecentlyClosedMenu.swift in Sources */, 4B9DB02D2A983B24000927DB /* WaitlistKeychainStorage.swift in Sources */, EECE10E629DD77E60044D027 /* FeatureFlag.swift in Sources */, @@ -10629,6 +10703,7 @@ 56534DEE29DF252C00121467 /* CapturingDefaultBrowserProvider.swift in Sources */, 561D29C32BDA745B007B91D0 /* MockSyncPausedStateManaging.swift in Sources */, 3706FDF8293F661700E42796 /* FileStoreTests.swift in Sources */, + 1D838A342C44F0320078373F /* ReleaseNotesParserTests.swift in Sources */, 5603D90729B7B746007F9F01 /* MockTabViewItemDelegate.swift in Sources */, 3706FDF9293F661700E42796 /* TabViewModelTests.swift in Sources */, 37DB56F62C3B3C420093D4DC /* MockRemoteMessagingStore.swift in Sources */, @@ -10824,6 +10899,7 @@ 3706FE62293F661700E42796 /* PasswordManagementListSectionTests.swift in Sources */, 3706FE63293F661700E42796 /* RecentlyClosedCoordinatorMock.swift in Sources */, 857E5AFB2A79628A00FC0FB4 /* PixelExperimentTests.swift in Sources */, + 1D638D622C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift in Sources */, 56A054142C1C3796007D8FAB /* CapturingDockCustomizer.swift in Sources */, 3706FE64293F661700E42796 /* DownloadListStoreTests.swift in Sources */, 3706FE65293F661700E42796 /* ContentBlockingUpdatingTests.swift in Sources */, @@ -11256,6 +11332,7 @@ B66260DD29AC5D4300E9E3EE /* NavigationProtectionTabExtension.swift in Sources */, 1D1A33492A6FEB170080ACED /* BurnerMode.swift in Sources */, 14505A08256084EF00272CC6 /* UserAgent.swift in Sources */, + 1D39E5772C2BFD5700757339 /* ReleaseNotesTabExtension.swift in Sources */, 987799F12999993C005D8EB6 /* LegacyBookmarkStore.swift in Sources */, 1D220BF82B86192200F8BBC6 /* PreferencesEmailProtectionView.swift in Sources */, 4B8AC93526B3B2FD00879451 /* NSAlert+DataImport.swift in Sources */, @@ -11302,6 +11379,7 @@ 4B92929B26670D2A00AD2C21 /* BookmarkOutlineViewDataSource.swift in Sources */, 56D145EB29E6C99B00E3488A /* DataImportStatusProviding.swift in Sources */, 31D5375C291D944100407A95 /* PasswordManagementBitwardenItemView.swift in Sources */, + 1D9297BF2C1B062900A38521 /* ApplicationUpdateDetector.swift in Sources */, B6104E9B2BA9C173008636B2 /* DownloadResumeData.swift in Sources */, 85D885B026A590A90077C374 /* NSNotificationName+PasswordManager.swift in Sources */, B610F2BB27A145C500FCEBE9 /* RulesCompilationMonitor.swift in Sources */, @@ -11384,6 +11462,7 @@ 1D8057C82A83CAEE00F4FED6 /* SupportedOsChecker.swift in Sources */, AA92127725ADA07900600CD4 /* WKWebViewExtension.swift in Sources */, AAAB9114288EB1D600A057A9 /* CleanThisHistoryMenuItem.swift in Sources */, + 1D0DE9412C3BB9CC0037ABC2 /* ReleaseNotesParser.swift in Sources */, B6C0B23626E732000031CB7F /* DownloadListItem.swift in Sources */, 9F872DA32B90920F00138637 /* BookmarkFolderInfo.swift in Sources */, 4B9DB0232A983B24000927DB /* WaitlistRequest.swift in Sources */, @@ -11403,12 +11482,14 @@ 4B9DB01D2A983B24000927DB /* Waitlist.swift in Sources */, BBDFDC5A2B2B8A0900F62D90 /* DataBrokerProtectionExternalWaitlistPixels.swift in Sources */, AAA0CC33252F181A0079BC96 /* NavigationButtonMenuDelegate.swift in Sources */, + 1DA84D2F2C11989D0011C80F /* Update.swift in Sources */, AAC30A2A268E239100D2D9CD /* CrashReport.swift in Sources */, 1D6A492029CF7A490011DF74 /* NSPopoverExtension.swift in Sources */, 37CC53F427E8D4620028713D /* NSPathControlView.swift in Sources */, B6BF5D8929470BC4006742B1 /* HTTPSUpgradeTabExtension.swift in Sources */, 1D36E65B298ACD2900AA485D /* AppIconChanger.swift in Sources */, 4B4D60E22A0C883A00BCD287 /* AppMain.swift in Sources */, + 1D0DE93E2C3BA9840037ABC2 /* AppRestarter.swift in Sources */, 7BCB90C22C18626E008E3543 /* VPNControllerXPCClient+ConvenienceInitializers.swift in Sources */, 4B9DB0202A983B24000927DB /* ProductWaitlistRequest.swift in Sources */, 98779A0029999B64005D8EB6 /* Bookmark.xcdatamodeld in Sources */, @@ -11619,7 +11700,7 @@ 4B520F632BA5573A006405C7 /* WaitlistThankYouView.swift in Sources */, 4BF0E5052AD2551A00FFEC9E /* NetworkProtectionPixelEvent.swift in Sources */, AAC5E4D125D6A709007F5990 /* BookmarkManager.swift in Sources */, - 37CD54CD27F2FDD100F1F7B9 /* AboutModel.swift in Sources */, + 37CD54CD27F2FDD100F1F7B9 /* AboutPreferences.swift in Sources */, B6F1B0262BCE5A50005E863C /* TabContent.swift in Sources */, 4BE65476271FCD41008D1D63 /* PasswordManagementCreditCardItemView.swift in Sources */, AA5C8F59258FE21F00748EB7 /* NSTextFieldExtension.swift in Sources */, @@ -11678,6 +11759,7 @@ 4B723E1026B0006700E14D75 /* CSVImporter.swift in Sources */, 37A4CEBA282E992F00D75B89 /* StartupPreferences.swift in Sources */, 4B41EDB12B168B1E001EEDF4 /* VPNFeedbackFormView.swift in Sources */, + 1D72D59C2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift in Sources */, AA4BBA3B25C58FA200C4FB0F /* MainMenu.swift in Sources */, AA585D84248FD31100E9A3E2 /* BrowserTabViewController.swift in Sources */, 85707F22276A32B600DC0649 /* CallToAction.swift in Sources */, @@ -11733,6 +11815,7 @@ B6B4D1CA2B0C8C9200C26286 /* FirefoxCompatibilityPreferences.swift in Sources */, AA6197C4276B314D008396F0 /* FaviconUrlReference.swift in Sources */, B696AFFB2AC5924800C93203 /* FileLineError.swift in Sources */, + 1D39E57A2C2C0F3700757339 /* ReleaseNotesUserScript.swift in Sources */, 85CC1D7B26A05ECF0062F04E /* PasswordManagementItemListModel.swift in Sources */, AABEE6A924AB4B910043105B /* SuggestionTableCellView.swift in Sources */, AA6820F125503DA9005ED0D5 /* FireViewModel.swift in Sources */, @@ -11740,6 +11823,7 @@ AAA0CC6A253CC43C0079BC96 /* WKUserContentControllerExtension.swift in Sources */, 4BE65479271FCD41008D1D63 /* EditableTextView.swift in Sources */, AA9FF95D24A1FA1C0039E328 /* TabCollection.swift in Sources */, + 1DA84D322C119AE70011C80F /* UpdateMenuItemFactory.swift in Sources */, B6B4D1CF2B0E0DD000C26286 /* DataImportNoDataView.swift in Sources */, B688B4DA273E6D3B0087BEAF /* MainView.swift in Sources */, B61E2CD5294346C000773D8A /* Tab+Navigation.swift in Sources */, @@ -11786,6 +11870,7 @@ 4B723E1326B0007A00E14D75 /* CSVLoginExporter.swift in Sources */, B6BCC51E2AFCD9ED002C5499 /* DataImportSourcePicker.swift in Sources */, 85C48CCC278D808F00D3263E /* NSAttributedStringExtension.swift in Sources */, + 1D710F4B2C48F1F200C3975F /* UpdateDialogHelper.swift in Sources */, 4B41EDB42B168C55001EEDF4 /* VPNFeedbackFormViewModel.swift in Sources */, AA7EB6E527E7D6DC00036718 /* AnimationView.swift in Sources */, 8562599A269CA0A600EE44BC /* NSRectExtension.swift in Sources */, @@ -11851,6 +11936,7 @@ AAA0CC472533833C0079BC96 /* MoreOptionsMenu.swift in Sources */, B64C84E32692DC9F0048FEBE /* PermissionAuthorizationViewController.swift in Sources */, 4B92929D26670D2A00AD2C21 /* BookmarkNode.swift in Sources */, + 1DEDB3642C19934C006B6D1B /* MoreOptionsMenuButton.swift in Sources */, B693955226F04BEB0015B914 /* LongPressButton.swift in Sources */, B6085D062743905F00A9C456 /* CoreDataStore.swift in Sources */, B6DB3AF6278EA0130024C5C4 /* BundleExtension.swift in Sources */, @@ -12036,6 +12122,7 @@ 37D2377C287EBDA300BCE03B /* TabIndexTests.swift in Sources */, 37534CA52811987D002621E7 /* AdjacentItemEnumeratorTests.swift in Sources */, 56B234BF2A84EFD200F2A1CC /* NavigationBarUrlExtensionsTests.swift in Sources */, + 1D838A332C44F0310078373F /* ReleaseNotesParserTests.swift in Sources */, 56A0542D2C201DA8007D8FAB /* MockContentBlocking.swift in Sources */, 56A054442C2252CE007D8FAB /* OnboardingUserScriptTests.swift in Sources */, 9FAD623A2BCFDB32007F3A65 /* WebsiteInfoHelpers.swift in Sources */, @@ -12287,6 +12374,7 @@ 021EA0842BD6E01A00772C9A /* TabsPreferencesTests.swift in Sources */, 1D12F2E2298BC660009A65FD /* InternalUserDeciderStoreMock.swift in Sources */, 4BB99D1026FE1A84001E4761 /* FirefoxBookmarksReaderTests.swift in Sources */, + 1D638D612C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift in Sources */, 9FBD84702BB3DD8400220859 /* MockAttributionsPixelHandler.swift in Sources */, 4B117F7D276C0CB5002F3D8C /* LocalStatisticsStoreTests.swift in Sources */, 378205F62837CBA800D1D4AA /* SavedStateMock.swift in Sources */, diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 982a947ab6..d65aff7d69 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -131,8 +131,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-argument-parser.git", "state" : { - "revision" : "0fbc8848e389af3bb55c182bc19ca9d5dc2f255b", - "version" : "1.4.0" + "revision" : "41982a3656a71c768319979febd796c6fd111d5c", + "version" : "1.5.0" } }, { diff --git a/DuckDuckGo/Application/AppDelegate.swift b/DuckDuckGo/Application/AppDelegate.swift index 2c21010cc3..0031f6afec 100644 --- a/DuckDuckGo/Application/AppDelegate.swift +++ b/DuckDuckGo/Application/AppDelegate.swift @@ -388,6 +388,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate { setUpAutofillPixelReporter() +#if SPARKLE + updateController.checkNewApplicationVersion() +#endif + remoteMessagingClient?.startRefreshingRemoteMessages() if didCrashDuringCrashHandlersSetUp { diff --git a/DuckDuckGo/Application/UpdateController.swift b/DuckDuckGo/Application/UpdateController.swift deleted file mode 100644 index 56f8d5c0fb..0000000000 --- a/DuckDuckGo/Application/UpdateController.swift +++ /dev/null @@ -1,132 +0,0 @@ -// -// UpdateController.swift -// -// Copyright © 2021 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 Combine -import Sparkle -import BrowserServicesKit -import SwiftUIExtensions -import PixelKit - -#if SPARKLE - -final class UpdateController: NSObject { - - enum Constants { - static let internalChannelName = "internal-channel" - } - - let willRelaunchAppPublisher: AnyPublisher - - init(internalUserDecider: InternalUserDecider) { - willRelaunchAppPublisher = willRelaunchAppSubject.eraseToAnyPublisher() - self.internalUserDecider = internalUserDecider - super.init() - - configureUpdater() - } - - func checkForUpdates(_ sender: Any!) { - if !SupportedOSChecker.isCurrentOSReceivingUpdates { - showNotSupportedInfo() - } - - NSApp.windows.forEach { - if let controller = $0.windowController, "\(type(of: controller))" == "SUUpdateAlert" { - $0.orderFrontRegardless() - $0.makeKey() - $0.makeMain() - } - } - updater.checkForUpdates(sender) - } - - // MARK: - Private - - private var updater: SPUStandardUpdaterController! - private let willRelaunchAppSubject = PassthroughSubject() - - private var internalUserDecider: InternalUserDecider - - private func configureUpdater() { - // The default configuration of Sparkle updates is in Info.plist - updater = SPUStandardUpdaterController(updaterDelegate: self, userDriverDelegate: self) - -#if DEBUG - updater.updater.automaticallyChecksForUpdates = false - updater.updater.updateCheckInterval = 0 -#endif - } - - private func showNotSupportedInfo() { - if NSAlert.osNotSupported().runModal() != .cancel { - let url = Preferences.UnsupportedDeviceInfoBox.softwareUpdateURL - NSWorkspace.shared.open(url) - } - } - -} - -extension UpdateController: SPUStandardUserDriverDelegate { - -} - -extension UpdateController: SPUUpdaterDelegate { - - func allowedChannels(for updater: SPUUpdater) -> Set { - if internalUserDecider.isInternalUser { - return Set([Constants.internalChannelName]) - } else { - return Set() - } - } - - func updaterWillRelaunchApplication(_ updater: SPUUpdater) { - willRelaunchAppSubject.send() - } - - func updater(_ updater: SPUUpdater, didAbortWithError error: Error) { - let errorCode = (error as NSError).code - guard ![Int(Sparkle.SUError.noUpdateError.rawValue), - Int(Sparkle.SUError.installationCanceledError.rawValue), - Int(Sparkle.SUError.runningTranslocated.rawValue)].contains(errorCode) else { - return - } - - PixelKit.fire(DebugEvent(GeneralPixel.updaterAborted, error: error)) - } - - func updater(_ updater: SPUUpdater, - userDidMake choice: SPUUserUpdateChoice, - forUpdate updateItem: SUAppcastItem, - state: SPUUserUpdateState) { - switch choice { - case .skip: - PixelKit.fire(DebugEvent(GeneralPixel.userSelectedToSkipUpdate)) - case .install: - PixelKit.fire(DebugEvent(GeneralPixel.userSelectedToInstallUpdate)) - case .dismiss: - PixelKit.fire(DebugEvent(GeneralPixel.userSelectedToDismissUpdate)) - @unknown default: - break - } - } - -} - -#endif diff --git a/DuckDuckGo/Assets.xcassets/Colors/UpdateIndicatorColor.colorset/Contents.json b/DuckDuckGo/Assets.xcassets/Colors/UpdateIndicatorColor.colorset/Contents.json new file mode 100644 index 0000000000..9554e21840 --- /dev/null +++ b/DuckDuckGo/Assets.xcassets/Colors/UpdateIndicatorColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xEF", + "green" : "0x69", + "red" : "0x39" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/AboutPageLogo.pdf b/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/AboutPageLogo.pdf deleted file mode 100644 index d97c69c0d3ad39f0338bf4f4723bb20035bde0eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54406 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 Jo@+br{{T?PmX81c diff --git a/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/Contents.json index 151626900b..8ceba93c7f 100644 --- a/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/Contents.json +++ b/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "AboutPageLogo.pdf", + "filename" : "DuckDuckGo.pdf", "idiom" : "universal" } ], diff --git a/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/DuckDuckGo.pdf b/DuckDuckGo/Assets.xcassets/Images/AboutPageLogo.imageset/DuckDuckGo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3dba34ce3fe4789b21737a2849a955ea7c7d4583 GIT binary patch literal 84197 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 z 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�d^{JDa3&2VREkY-77t|d7B-?E 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/Assets.xcassets/Images/CriticalUpdateNotificationInfo.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Images/CriticalUpdateNotificationInfo.imageset/Contents.json new file mode 100644 index 0000000000..c4a79c7d54 --- /dev/null +++ b/DuckDuckGo/Assets.xcassets/Images/CriticalUpdateNotificationInfo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Icon 22.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/Assets.xcassets/Images/CriticalUpdateNotificationInfo.imageset/Icon 22.pdf b/DuckDuckGo/Assets.xcassets/Images/CriticalUpdateNotificationInfo.imageset/Icon 22.pdf new file mode 100644 index 0000000000000000000000000000000000000000..97d2e7db8964ba0eb18a8870a48a8a28fe11e1fc GIT binary patch literal 1141 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^qJYvwnvS1X|wLbs4m* z$D*%ad$Q|BAn(SO;~Li%7j6@qp2a#Rxv0CNL1NMKuPHUJ-d*xN&UmiOZ|O6O%KT!U zx^o+p8&0HGddg^ZrEzt!k^la=1sfMe zE^k@cHHp)>O7m9B+dp$><>ci_ZrHTcB7RlGG!>=qV&}GrEO$9361zrGqxhQn(y45l zz6#$z7L(pSv2~M2VA%76JK2TK?0!F`XL;h%#+<)Lwi~{C{o(z`>b2U3TMk^Z;hJfG zeuMVkBac27={{np-7mU3$2+zly>3D7=ORAA3D!L})-i!kzGm6XE>oSfKQXVos=-F( zLYVKx3#Bc$-))gPzaX~rU(In(4TI#E-kwl~zcEf;0(y@QZ`vYxecmeln-^V{xII6` zaFbe4T{=b64#oYmjd+~Vz|E;lJH@HVTNK7 z$b-dj3qcNpc-%R$BrzvH9aU>ZQED2Ofr2>~#QPvp!OYau*i->13%pZ!Vo?d$JC;TUT&k+B{%!zjyNZVZ literal 0 HcmV?d00001 diff --git a/DuckDuckGo/Assets.xcassets/Images/HelpMenuItemIcon.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Images/HelpMenuItemIcon.imageset/Contents.json new file mode 100644 index 0000000000..8a134d78d9 --- /dev/null +++ b/DuckDuckGo/Assets.xcassets/Images/HelpMenuItemIcon.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "Icon 23.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/DuckDuckGo/Assets.xcassets/Images/HelpMenuItemIcon.imageset/Icon 23.pdf b/DuckDuckGo/Assets.xcassets/Images/HelpMenuItemIcon.imageset/Icon 23.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c02d06ee016b6c41f90af0fd52ad2b69ba5176bd GIT binary patch literal 1447 zcmY!laBhb(#{TKQ)*rc$Z1?gC~kDi%qdANQqXtH0lL#AH90>e72+m+pVYkc zk_-i7pztgKwdhmbF-n(S~%ZJ?h_WGU1x!DV6 z7jnI>JHL6;s%fdV%NxEQORe>rbv3Iv+E3M7Y1+Oy!RPmGjIusZS8U~3wrcGSZWq01 zyB$ply6RJ|-ZT$ie<^XnlWQxx^iD)|U2fY^v6d_RbnC7V_r^QYrja_Ut5ew;#hYY0 zH<~>>o1cCnM{b2;%~}txc4wAVeOQ6(cMQlxEHBCp7Qk8Tmjn?vt(|COtO+(Y+R_t+i`?-yMf@V zU5iY8Ie3>&RDQmr{M#bt%;#*nyvx@}O?kF3>*2(!ZO-p^l(cP#yW_r7tE;H7DzrI7 zc%e{J729>?DW_PUFVHPfms`hc` zzr6iT?#bWxjo#nVt_r?7%YL!lEaLP@L*9_;n{r25B$iw{wnl^Vq2!!`_17QF%Feag z#c9G~to`CQ!@@pg7fFxSn3oMT9_<tUA) z(cSIxFAm-+|Cr1nmiR!Xz`s5I)H}mEuNwzu@i|`GGJpEXLpQb`ljoivVSM0%rQMFS zy>Uk@ujB}QH`VptP@wx&VVi zqc}e|RZ~GDGer{;DEdM9`6UV<4}$|(KRB~073g|!QI%L!0``ufk&!8vs;aBM8vsYe B@+trT literal 0 HcmV?d00001 diff --git a/DuckDuckGo/Assets.xcassets/Images/UpdateMenuItemIcon.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Images/UpdateMenuItemIcon.imageset/Contents.json new file mode 100644 index 0000000000..918ee2d3b9 --- /dev/null +++ b/DuckDuckGo/Assets.xcassets/Images/UpdateMenuItemIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Icon 21.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/Assets.xcassets/Images/UpdateMenuItemIcon.imageset/Icon 21.pdf b/DuckDuckGo/Assets.xcassets/Images/UpdateMenuItemIcon.imageset/Icon 21.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ebf78ff5a71d73ca70d16551f472659c0a259312 GIT binary patch literal 1144 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~g0Xk9Z=Z-EPwRI}S3L){f1XMC zjGd+hEteD~%$j(?W6u2PtG29O@{aXp&-3CxuWtJ7uc`a{JG=Vtx2MVfzS!=a^FR0f zOaDbd-zUGe{ULBMS+D7B`6|~l5mFBfM1xok`R;x8{Vi|iox>-~_|rK5JxY1BD8)v{ zJJYS%GI+oG;s-9#RZRIWr&zvJt(wF;Q`fdJfTu!=d*%jtR!2Ry=DR@|EZq+bMVW3} zE>GD0#rUsB{>#_@*ZG_~ka+)gOk|3D^G+k(t-PV<_+Bk)o9bzpbyq!k=_%eOt%&ly zLPdGClS0j-Bi4u?D%}u0%Pji6Z?Sg4m5ev%s#iBRUb)-0SX;_yR%5~H9s5>m78EJd)#T^D(w`R?B2)h%?W*4$i zb4$0IgxLEfR$ulWc)2EejpOOl54?^STS_S2;-7G$V8^~ic{859`NYR*rX_v&m{766 z%H219J=wE)a^Im;UjDxce9|+fSbE0u@V=O%?)S{;*2ad(M>NcAnvPyO!4h@BewyUs zxjs{m%}~l_+&hCu^`P#L+1^b@UaTp;FJK#H*(D%mcXLb6HHWly%?Ga3h_0{>>*Sa3 zPyZFABX{%X>>upbXFu71k_j}PVF?D50w4*=#M~U7j7;F7z~rUxn3tDdQmhai3r##B zl?AB^`T>dQu+-$6nv$95lwY9`tze*M00sz#p&3jF!Gf6-lvTpp*zo zoX+`qC8>Ep8$qcVCK!-d1Qb&+g$g01d5{o1FX($`rU0F)0P;bQ0?Z!g{8FG^Lk#y9 zL()DhFw9U)0(r0)ZXw8F5RW@2mL%rnr=x1EC`wJ^GEgw*f_NW9Dwvs?8k;Hrg`vRE zKmp8B$b$%nZ%Zh0HB6%(5^;m{n4gn3j!66r2<_KE(j8fO2FQ+G&1H=Rdw}u0{~O@i-7vK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^lxhX+LH|o;}aCzx5p1bn;mx ztID|p>Mm;?va}a^)!0wYG2+W=ZIGFDbE9pU%<}U7-RHmWsjl2LUoP(I+?uDGe+5*< zy_z+RFRznr_F=Q8nvl~njSY-*e7gnz7u#vR{T2Sg@pxm*^Q)~d-Y)t2X6?n*?R-2D zLJn%$za}g1FbPyx?DZzXS?-s&DUX1bcBep@L-?90Ctvx#z3OTEf8XIBM}-2c_grJW zv~0&3P6f-!Yu3s3-3{fk(6WAgRnJ?(L(TEz#obfF7OrS~T;{>aH0y;QTjBIolcH5T z0+|=8unRhFF>+aPDe+s^w@b!vA|{({zIw5x<9Asgd-KmPcTX@Z4B%C6k-Z?QohslH zbjh&E)v&>5=9_2!eGe|VG#35)dp6!p=gcy{=SRF=cVx=%7LNf7`cg*SC-G??FTV}E+;hA>fjg1Lw7M(7U*r~Pa zD!;*>?hA8y@-kPKcwF%d-ZSgK0h30d@QWAPonQXne{22z|DFGC)YpXEe`!`Sw}|nr zfYY{L51wxio8~RJD)pJA!!FBjkIPK2_fDD`va{`)ykezCfUoZg#n&F&Ub*z9Pgt|$ z)r9M6^^9BUy(&RT1RBS%!~%+aNFp*ZH-;x66SycaY3V!W<>i+YD@4aa6HZ8FL8^j& zKw>&9CHbbNWF|W0S13d)80Z;*0fJ#@1`|TCU?v5n7U!21C8riEfD$t(6@n6`bADb) zY97!=P)ddg1|${%#S~1TLP+TyBm~a~`rer-K&L8zd=R7nv&T8V6sXq_!~MmObPo#* zGZd3R9xR4i2yz(2 { case networkProtectionWaitlistActiveOverrideRawValue = "networkProtectionWaitlistActiveOverrideRawValue" case networkProtectionWaitlistEnabledOverrideRawValue = "networkProtectionWaitlistEnabledOverrideRawValue" + // Updates + case automaticUpdates = "updates.automatic" + // Experiments case pixelExperimentInstalled = "pixel.experiment.installed" case pixelExperimentCohort = "pixel.experiment.cohort" @@ -192,6 +195,10 @@ public struct UserDefaultsWrapper { case pixelExperimentFiredPixels = "pixel.experiment.pixels.fired" case campaignVariant = "campaign.variant" + // Updates + case previousAppVersion = "previous.app.version" + case previousBuild = "previous.build" + // Sync case syncEnvironment = "sync.environment" diff --git a/DuckDuckGo/Info.plist b/DuckDuckGo/Info.plist index cbcdf8e6ea..4e6faad2e3 100644 --- a/DuckDuckGo/Info.plist +++ b/DuckDuckGo/Info.plist @@ -9,444 +9,444 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDocumentTypes - - - CFBundleTypeExtensions - - html - htm - shtml - xht - xhtml - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - HTML Document - CFBundleTypeOSTypes - - HTML - - CFBundleTypeRole - Viewer - LSHandlerRank - Default - - - CFBundleTypeExtensions - - txt - text - log - - CFBundleTypeMIMETypes - - text/plain - - LSItemContentTypes - - public.text - - CFBundleTypeOSTypes - - TEXT - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - Text document - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - webarchive - - CFBundleTypeMIMETypes - - application/x-webarchive - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - Web archive - CFBundleTypeRole - Viewer - LSHandlerRank - Default - - - CFBundleTypeExtensions - - duckload - - CFBundleTypeName - Incomplete download - CFBundleTypeRole - Editor - NSIsRelatedItemType - - LSHandlerRank - Owner - - - CFBundleTypeExtensions - - pdf - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - PDF Document - CFBundleTypeMIMETypes - - application/pdf - - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - png - - CFBundleTypeMIMETypes - - image/png - - LSItemContentTypes - - public.png - - CFBundleTypeOSTypes - - PNGf - - CFBundleTypeIconFile - document.icns - CFBundleTypeName - PNG image - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - jpg - jpeg - jp2 - jpeg2 - - CFBundleTypeMIMETypes - - image/jpeg - image/jp2 - image/jpeg2000 - - CFBundleTypeOSTypes - - JPEG - jp2 - - LSItemContentTypes - - public.jpeg - public.jpeg-2000 - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - JPEG image - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - gif - giff - - CFBundleTypeMIMETypes - - image/gif - - CFBundleTypeOSTypes - - GIFf - - LSItemContentTypes - - com.compuserve.gif - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - GIF image - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - svg - - CFBundleTypeMIMETypes - - image/svg+xml - - LSItemContentTypes - - public.svg-image - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - SVG image - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - tiff - tif - - CFBundleTypeMIMETypes - - image/tiff - - CFBundleTypeOSTypes - - TIFF - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - TIFF image - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - ico - - CFBundleTypeMIMETypes - - image/x-icon - image/icon - image/ico - - CFBundleTypeOSTypes - - ICO - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - Windows icon - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - bmp - - CFBundleTypeMIMETypes - - image/bmp - image/x-bitmap - image/x-bmp - image/x-ms-bitmap - image/x-ms-bmp - - LSItemContentTypes - - com.microsoft.bmp - - CFBundleTypeName - BMP Image - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - LSRoleHandlerScheme - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - xml - rss - atom - - CFBundleTypeMIMETypes - - text/xml - application/xml - application/rss+xml - application/atom+xml - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - XML document - CFBundleTypeRole - Viewer - LSHandlerRank - Default - - - CFBundleTypeExtensions - - json - - CFBundleTypeMIMETypes - - text/json - application/json - - LSItemContentTypes - - public.json - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - JSON document - CFBundleTypeRole - Viewer - LSHandlerRank - Default - - - CFBundleTypeExtensions - - flac - m4a - mp3 - mpg - wav - aac - amr - mp4 - mpeg - - CFBundleTypeMIMETypes - - audio/flac - audio/x-flac - audio/m4a - audio/mp4 - audio/mp3 - audio/mpeg - audio/mpeg3 - audio/qcp - audio/qcelp - audio/vnd.qcelp - audio/vnd.qcp - audio/vnd.wave - audio/x-wav - audio/x-aac - audio/aac - audio/x-amr - audio/amr - audio/x-m4a - audio/x-mp3 - audio/x-mp4 - audio/x-mpeg - audio/x-mpeg3 - audio/x-mpg - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - Audio File - LSRoleHandlerScheme - Viewer - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - 3gp - avi - m4v - mov - mp4 - - CFBundleTypeMIMETypes - - video/3gp - video/3gpp - video/avi - video/x-msvideo - video/x-m4v - video/mp4 - video/x-quicktime - video/quicktime - - LSItemContentTypes - - public.movie - - CFBundleTypeIconFile - document.icns - CFBundleTypeIconSystemGenerated - YES - CFBundleTypeName - Video File - LSRoleHandlerScheme - Viewer - LSHandlerRank - Alternate - - + + + CFBundleTypeExtensions + + html + htm + shtml + xht + xhtml + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + HTML Document + CFBundleTypeOSTypes + + HTML + + CFBundleTypeRole + Viewer + LSHandlerRank + Default + + + CFBundleTypeExtensions + + txt + text + log + + CFBundleTypeMIMETypes + + text/plain + + LSItemContentTypes + + public.text + + CFBundleTypeOSTypes + + TEXT + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + Text document + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + webarchive + + CFBundleTypeMIMETypes + + application/x-webarchive + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + Web archive + CFBundleTypeRole + Viewer + LSHandlerRank + Default + + + CFBundleTypeExtensions + + duckload + + CFBundleTypeName + Incomplete download + CFBundleTypeRole + Editor + NSIsRelatedItemType + + LSHandlerRank + Owner + + + CFBundleTypeExtensions + + pdf + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + PDF Document + CFBundleTypeMIMETypes + + application/pdf + + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + png + + CFBundleTypeMIMETypes + + image/png + + LSItemContentTypes + + public.png + + CFBundleTypeOSTypes + + PNGf + + CFBundleTypeIconFile + document.icns + CFBundleTypeName + PNG image + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + jpg + jpeg + jp2 + jpeg2 + + CFBundleTypeMIMETypes + + image/jpeg + image/jp2 + image/jpeg2000 + + CFBundleTypeOSTypes + + JPEG + jp2 + + LSItemContentTypes + + public.jpeg + public.jpeg-2000 + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + JPEG image + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + gif + giff + + CFBundleTypeMIMETypes + + image/gif + + CFBundleTypeOSTypes + + GIFf + + LSItemContentTypes + + com.compuserve.gif + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + GIF image + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + svg + + CFBundleTypeMIMETypes + + image/svg+xml + + LSItemContentTypes + + public.svg-image + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + SVG image + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + tiff + tif + + CFBundleTypeMIMETypes + + image/tiff + + CFBundleTypeOSTypes + + TIFF + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + TIFF image + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + ico + + CFBundleTypeMIMETypes + + image/x-icon + image/icon + image/ico + + CFBundleTypeOSTypes + + ICO + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + Windows icon + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + bmp + + CFBundleTypeMIMETypes + + image/bmp + image/x-bitmap + image/x-bmp + image/x-ms-bitmap + image/x-ms-bmp + + LSItemContentTypes + + com.microsoft.bmp + + CFBundleTypeName + BMP Image + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + LSRoleHandlerScheme + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + xml + rss + atom + + CFBundleTypeMIMETypes + + text/xml + application/xml + application/rss+xml + application/atom+xml + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + XML document + CFBundleTypeRole + Viewer + LSHandlerRank + Default + + + CFBundleTypeExtensions + + json + + CFBundleTypeMIMETypes + + text/json + application/json + + LSItemContentTypes + + public.json + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + JSON document + CFBundleTypeRole + Viewer + LSHandlerRank + Default + + + CFBundleTypeExtensions + + flac + m4a + mp3 + mpg + wav + aac + amr + mp4 + mpeg + + CFBundleTypeMIMETypes + + audio/flac + audio/x-flac + audio/m4a + audio/mp4 + audio/mp3 + audio/mpeg + audio/mpeg3 + audio/qcp + audio/qcelp + audio/vnd.qcelp + audio/vnd.qcp + audio/vnd.wave + audio/x-wav + audio/x-aac + audio/aac + audio/x-amr + audio/amr + audio/x-m4a + audio/x-mp3 + audio/x-mp4 + audio/x-mpeg + audio/x-mpeg3 + audio/x-mpg + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + Audio File + LSRoleHandlerScheme + Viewer + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + 3gp + avi + m4v + mov + mp4 + + CFBundleTypeMIMETypes + + video/3gp + video/3gpp + video/avi + video/x-msvideo + video/x-m4v + video/mp4 + video/x-quicktime + video/quicktime + + LSItemContentTypes + + public.movie + + CFBundleTypeIconFile + document.icns + CFBundleTypeIconSystemGenerated + YES + CFBundleTypeName + Video File + LSRoleHandlerScheme + Viewer + LSHandlerRank + Alternate + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -542,8 +542,6 @@ NSSupportsSuddenTermination - SUAllowsAutomaticUpdates - SUBSCRIPTION_APP_GROUP $(SUBSCRIPTION_APP_GROUP) SUEnableAutomaticChecks diff --git a/DuckDuckGo/Localizable.xcstrings b/DuckDuckGo/Localizable.xcstrings index 8f5606de7d..3cabec4533 100644 --- a/DuckDuckGo/Localizable.xcstrings +++ b/DuckDuckGo/Localizable.xcstrings @@ -211,6 +211,64 @@ } } }, + "%@: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@: %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ : %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + } + } + }, "%lld" : { "localizations" : { "de" : { @@ -429,7 +487,56 @@ } }, "0.0.0.0" : { - + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "0.0.0.0" + } + } + } }, "1." : { "localizations" : { @@ -2427,9 +2534,6 @@ } } } - }, - "Apply" : { - }, "auth.alert.login.button" : { "comment" : "Authentication Alert Sign In Button", @@ -4250,7 +4354,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "Borrar todas las contraseñas..." + "value" : "Eliminar todas las contraseñas..." } }, "fr" : { @@ -4550,7 +4654,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "Borrar todas las contraseñas" + "value" : "Eliminar todas las contraseñas" } }, "fr" : { @@ -6523,7 +6627,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "Cumpleaños" + "value" : "Fecha de nacimiento" } }, "fr" : { @@ -7169,8 +7273,8 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Die folgenden Bitwarden-Versionen sind mit DuckDuckGo inkompatibel: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Bitte kehre zu einer älteren Version zurück, indem du die folgenden Schritte ausführst:" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } }, "en" : { @@ -7181,44 +7285,44 @@ }, "es" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Las siguientes versiones de Bitwarden son incompatibles con DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Vuelve a una versión anterior siguiendo estos pasos:" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Les versions suivantes de Bitwarden sont incompatibles avec DuckDuckGo : v2024.3.0, v2024.3.2, v2024.4.0 et v2024.4.1. Veuillez revenir à une version antérieure en procédant comme suit :" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Le seguenti versioni di Bitwarden non sono compatibili con DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. È necessario tornare a una versione precedente seguendo questi passaggi:" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } }, "nl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "De volgende versies van Bitwarden zijn niet compatibel met DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Volg deze stappen om terug te gaan naar een oudere versie:" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Następujące wersje Bitwarden są niezgodne z DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Przywróć starszą wersję, wykonując następujące czynności:" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } }, "pt" : { "stringUnit" : { - "state" : "needs_review", - "value" : "As seguintes versões do Bitwarden são incompatíveis com o DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0 e v2024.4.1. Reverte para uma versão mais antiga seguindo estes passos:" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } }, "ru" : { "stringUnit" : { - "state" : "needs_review", - "value" : "С DuckDuckGo несовместимы следующие версии Bitwarden: 2024.3.0, 2024.3.2, 2024.4.0, 2024.4.1. Вернитесь к более старой версии, выполнив следующие действия:" + "state" : "translated", + "value" : "The following Bitwarden versions are incompatible with DuckDuckGo: v2024.3.0, v2024.3.2, v2024.4.0, v2024.4.1. Please update to a newer version by following these steps:" } } } @@ -7229,8 +7333,8 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", - "value" : "V2014.2.1 herunterladen" + "state" : "translated", + "value" : "Download v2024.4.3" } }, "en" : { @@ -7241,44 +7345,44 @@ }, "es" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Descargar v2014.2.1" + "state" : "translated", + "value" : "Download v2024.4.3" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Télécharger v2014.2.1" + "state" : "translated", + "value" : "Download v2024.4.3" } }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Scarica la versione v2014.2.1" + "state" : "translated", + "value" : "Download v2024.4.3" } }, "nl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Download v2014.2.1" + "state" : "translated", + "value" : "Download v2024.4.3" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Pobierz v2014.2.1" + "state" : "translated", + "value" : "Download v2024.4.3" } }, "pt" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Transfere a versão v2014.2.1" + "state" : "translated", + "value" : "Download v2024.4.3" } }, "ru" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Скачайте версию 2014.2.1" + "state" : "translated", + "value" : "Download v2024.4.3" } } } @@ -13578,12 +13682,6 @@ } } } - }, - "Custom" : { - - }, - "Custom DNS Server" : { - }, "dashboard.permission.allow" : { "comment" : "Privacy Dashboard: Website can always access input media device", @@ -16807,11 +16905,59 @@ "comment" : "Autoplay preference in settings", "extractionState" : "extracted_with_value", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Videos automatisch abspielen, wenn sie im Duck Player geöffnet werden" + } + }, "en" : { "stringUnit" : { "state" : "new", "value" : "Autoplay videos when opened in Duck Player" } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reproducir automáticamente los vídeos cuando se abran en Duck Player" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lecture automatique des vidéos ouvertes dans Duck Player" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riproduzione automatica dei video quando li apri in Duck Player" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Video's automatisch afspelen wanneer ze worden geopend in Duck Player" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatyczne odtwarzanie filmów po otwarciu w Duck Player" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reproduzir vídeos automaticamente quando abertos no Duck Player" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматически проигрывать видео при открытии в Duck Player" + } } } }, @@ -16819,11 +16965,59 @@ "comment" : "Autoplay title in settings", "extractionState" : "extracted_with_value", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisches Abspielen" + } + }, "en" : { "stringUnit" : { "state" : "new", "value" : "Autoplay" } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reproducción automática" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lecture automatique" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riproduzione automatica" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisch afspelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatyczne odtwarzanie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reprodução automática" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автовоспроизведение" + } } } }, @@ -17102,9 +17296,6 @@ } } } - }, - "DuckDuckGo (Recommended)" : { - }, "DuckDuckGo browser version" : { "comment" : "Data import failure Report dialog description of a report field providing current DuckDuckGo Browser version", @@ -17386,10 +17577,108 @@ } }, "Duplicates Skipped:" : { - + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplikate übersprungen:" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplicados omitidos:" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doublons ignorés :" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplicati ignorati:" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overgeslagen duplicaten:" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pominięte duplikaty:" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplicados ignorados:" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пропущенные дубликаты:" + } + } + } }, "Duplicates Skipped: " : { - + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplikate übersprungen: " + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplicados omitidos: " + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doublons ignorés : " + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplicati ignorati: " + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overgeslagen duplicaten: " + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pominięte duplikaty: " + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplicados ignorados: " + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пропущенные дубликаты: " + } + } + } }, "edit" : { "comment" : "Edit button", @@ -26788,9 +27077,6 @@ } } } - }, - "IPv4 Address:" : { - }, "JavaScript Console" : { "comment" : "Main Menu View-Developer item", @@ -32909,6 +33195,246 @@ } } }, + "notification.browser.downgraded" : { + "comment" : "Notification informing user the app has been downgraded", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browser herabgestuft" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Browser Downgraded" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navegador degradado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version antérieure du navigateur activée" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browser declassato" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browser gedegradeerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmieniono wersję przeglądarki na niższą" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navegador com versão anterior" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Версия браузера понижена" + } + } + } + }, + "notification.browser.updated" : { + "comment" : "Notification informing user the app has been updated", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browser aktualisiert" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Browser Updated" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navegador actualizado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navigateur mis à jour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browser aggiornato" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browser bijgewerkt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zaktualizowano przeglądarkę" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navegador atualizado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Браузер обновлен" + } + } + } + }, + "notification.critical.update" : { + "comment" : "Notification informing user a critical update is required.", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritisches Update erforderlich. Zum Aktualisieren neu starten." + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Critical update required. Restart to update." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se requiere una actualización crítica. Reinicia para actualizar." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une mise à jour critique est requise. Redémarrer pour mettre à jour." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento critico obbligatorio. Riavvia per aggiornare." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritieke update vereist. Start opnieuw om bij te werken." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wymagana krytyczna aktualizacja. Uruchom ponownie, aby zaktualizować." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atualização crítica obrigatória. Reiniciar para atualizar." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Требуется критическое обновление. Перезапустите приложение." + } + } + } + }, + "notification.update.available" : { + "comment" : "Notification informing user the a version of app is available", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neue Version verfügbar. Zum Aktualisieren neu starten." + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "New version available. Restart to update." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nueva versión disponible. Reinicia para actualizar." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une nouvelle version est disponible. Redémarrer pour mettre à jour." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuova versione disponibile. Riavvia per aggiornare." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nieuwe versie beschikbaar. Start opnieuw om bij te werken." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dostępna nowa wersja. Uruchom ponownie, aby zaktualizować." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nova versão disponível. Reiniciar para atualizar." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Доступна новая версия. Перезапустите приложение." + } + } + } + }, "notnow" : { "comment" : "Not Now button", "extractionState" : "extracted_with_value", @@ -40746,7 +41272,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "Si tus contraseñas se guardan en otro navegador, puedes importarlas a DuckDuckGo." + "value" : "Si tienes contraseñas guardadas en otro navegador, puedes importarlas a DuckDuckGo." } }, "fr" : { @@ -48812,6 +49338,66 @@ } } }, + "release.notes.menu.item" : { + "comment" : "Title of the dialog menu item that opens release notes", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versionshinweise" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Release Notes" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notas de la versión" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notes de mise à jour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Note di rilascio" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Release-opmerkingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informacje o wersji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notas de lançamento" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примечания к релизу" + } + } + } + }, "Reload Page" : { "comment" : "Main Menu View item", "localizations" : { @@ -50623,6 +51209,486 @@ } } }, + "settings.automatic.updates" : { + "comment" : "Title of the checkbox item to set up automatic updates of the browser", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Updates automatisch installieren (empfohlen)" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Automatically install updates (recommended)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instalar actualizaciones automáticamente (recomendado)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Installer automatiquement les mises à jour (recommandé)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Installa automaticamente gli aggiornamenti (scelta consigliata)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Updates automatisch installeren (aanbevolen)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatyczne instalowanie aktualizacji (zalecane)" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instalar atualizações automaticamente (recomendado)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматически устанавливать обновления (рекомендуется)" + } + } + } + }, + "settings.browser.updates.title" : { + "comment" : "Title of the section in Settings where people set up automatic vs manual updates", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browser-Updates" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Browser Updates" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actualizaciones del navegador" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mises à jour du navigateur" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamenti del browser" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browserupdates" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktualizacje przeglądarki" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atualizações do navegador" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Обновления браузера" + } + } + } + }, + "settings.checking.for.update" : { + "comment" : "Label informing users the app is currently checking for new update", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nach Update suchen" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Checking for update" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buscando actualización" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vérification de la mise à jour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controllo della presenza di aggiornamenti" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controleren op updates" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sprawdzanie dostępności aktualizacji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A verificar atualizações…" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Проверка обновлений" + } + } + } + }, + "settings.last.checked" : { + "comment" : "Label informing users what is the last time the app checked for the update.", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zuletzt nach Update gesucht" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Last checked" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Última comprobación" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dernière vérification" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ultimo controllo" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laatst gecontroleerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ostatnio sprawdzane" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Última verificação" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Последняя проверка" + } + } + } + }, + "settings.manual.updates" : { + "comment" : "Title of the checkbox item to set up manual updates of the browser", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nach Updates suchen, aber selbst entscheiden, ob du sie installieren möchtest" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Check for updates but let you choose to install them" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comprueba las actualizaciones, pero deja que tú decidas si las instalas" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rechercher les mises à jour sans les installer automatiquement" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlla gli aggiornamenti, ma ti fa scegliere se installarli" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controleren op updates, maar keuze om te installeren of niet" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sprawdź dostępność aktualizacji, ale użytkownik decyduje o instalacji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verificar se existem atualizações, mas deixa-te escolher instalá-las" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Проверять на обновления, но доверить установку вам" + } + } + } + }, + "settings.newer.version.available" : { + "comment" : "Label informing users the newer version of the app is available to install.", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neuere Version verfügbar" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Newer version available" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versión más reciente disponible" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une version plus récente est disponible" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È disponibile una versione più recente" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nieuwere versie beschikbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dostępna nowsza wersja" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versão mais recente disponível" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Доступна более новая версия" + } + } + } + }, + "settings.restart.to.update" : { + "comment" : "Button label trigering restart and update of the application.", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zum Aktualisieren neu starten" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Restart to Update" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reiniciar para actualizar" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redémarrer pour mettre à jour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavvia per aggiornare" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Start opnieuw om bij te werken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uruchom ponownie, aby zaktualizować" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reiniciar para atualizar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Перезапустите для обновления" + } + } + } + }, + "settings.up.to.date" : { + "comment" : "Label informing users the app is currently up to date and no update is required.", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "DuckDuckGo ist auf dem neuesten Stand" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "DuckDuckGo is up to date" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "DuckDuckGo está actualizado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "DuckDuckGo est à jour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "DuckDuckGo è aggiornato" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "DuckDuckGo is up-to-date" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przeglądarka DuckDuckGo jest aktualna" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "O DuckDuckGo está atualizado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "DuckDuckGo обновлен" + } + } + } + }, "share.menu.item" : { "comment" : "Menu item title", "extractionState" : "extracted_with_value", @@ -52971,6 +54037,66 @@ } } }, + "tab.releaseNotes.title" : { + "comment" : "Title of deticated tab for Release Notes", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versionshinweise" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Release Notes" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notas de la versión" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notes de mise à jour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Note di rilascio" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Release-opmerkingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informacje o wersji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notas de lançamento" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примечания к релизу" + } + } + } + }, "Text Replacement" : { "comment" : "Main Menu Edit-Substitutions item", "localizations" : { @@ -55156,8 +56282,65 @@ } } }, - "Using a custom DNS server can impact browsing speeds and expose your activity to third parties if the server isn't secure or reliable." : { - + "update.available.menu.item" : { + "comment" : "Title of the menu item that informs user that a new update is available. Clicking on the menu item restarts the app and installs the update", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Update verfügbar – Jetzt neu starten" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Update Available - Restart Now" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actualización disponible - Reiniciar ahora" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mise à jour disponible : redémarrer" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento disponibile - Riavvia ora" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Update beschikbaar - nu opnieuw opstarten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dostępna aktualizacja — uruchom ponownie teraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atualização disponível – Reiniciar agora" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Доступно обновление: перезапустить" + } + } + } }, "version" : { "comment" : "Displays the version and build numbers", @@ -55272,6 +56455,66 @@ } } }, + "view.details.button" : { + "comment" : "Button title to open more details about the update", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Details anzeigen" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "View Details" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ver detalles" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voir les détails" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guarda i dettagli" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Details bekijken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wyświetl szczegóły" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ver detalhes" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подробнее" + } + } + } + }, "warn.before.quit" : { "comment" : "Label after the checkbox in Settings which configures a warning before clearing data on the application termination.", "extractionState" : "extracted_with_value", @@ -55844,6 +57087,66 @@ } } }, + "whats.new.menu.item" : { + "comment" : "Title of the dialog menu item that opens the 'What's New' page", + "extractionState" : "extracted_with_value", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Was gibt's Neues?" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What's New" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Novedades" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nouveautés" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Novità" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wat is er nieuw?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Co nowego" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Novidades" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Что нового" + } + } + } + }, "Window" : { "comment" : "Main Menu ", "localizations" : { diff --git a/DuckDuckGo/Menus/MainMenu.swift b/DuckDuckGo/Menus/MainMenu.swift index a21e355a4f..d2eb8ea9e4 100644 --- a/DuckDuckGo/Menus/MainMenu.swift +++ b/DuckDuckGo/Menus/MainMenu.swift @@ -93,15 +93,11 @@ final class MainMenu: NSMenu { // MARK: Help - let helpMenu = NSMenu(title: UserText.mainMenuHelp) { - NSMenuItem(title: UserText.mainMenuHelpDuckDuckGoHelp, action: #selector(NSApplication.showHelp), keyEquivalent: "?") - .hidden() - -#if FEEDBACK - NSMenuItem.separator() - NSMenuItem(title: UserText.sendFeedback, action: #selector(AppDelegate.openFeedback)) -#endif - } + let helpMenu = NSMenu(title: UserText.mainMenuHelp) + let aboutMenuItem = NSMenuItem(title: UserText.about, action: #selector(AppDelegate.showAbout)) + let releaseNotesMenuItem = NSMenuItem(title: UserText.releaseNotesMenuItem, action: #selector(AppDelegate.showReleaseNotes)) + let whatIsNewMenuItem = NSMenuItem(title: UserText.whatsNewMenuItem, action: #selector(AppDelegate.showWhatIsNew)) + let sendFeedbackMenuItem = NSMenuItem(title: UserText.sendFeedback, action: #selector(AppDelegate.openFeedback)) // MARK: - Initialization @@ -378,7 +374,22 @@ final class MainMenu: NSMenu { func buildHelpMenu() -> NSMenuItem { NSMenuItem(title: UserText.mainMenuHelp) - .submenu(helpMenu) + .submenu(helpMenu.buildItems { + NSMenuItem(title: UserText.mainMenuHelpDuckDuckGoHelp, action: #selector(NSApplication.showHelp), keyEquivalent: "?") + .hidden() + + NSMenuItem.separator() + + aboutMenuItem +#if SPARKLE + releaseNotesMenuItem + whatIsNewMenuItem +#endif + +#if FEEDBACK + sendFeedbackMenuItem +#endif + }) } required init(coder: NSCoder) { diff --git a/DuckDuckGo/Menus/MainMenuActions.swift b/DuckDuckGo/Menus/MainMenuActions.swift index 60a901c2bd..4d02d356fd 100644 --- a/DuckDuckGo/Menus/MainMenuActions.swift +++ b/DuckDuckGo/Menus/MainMenuActions.swift @@ -34,9 +34,18 @@ extension AppDelegate { // MARK: - DuckDuckGo + @MainActor @objc func checkForUpdates(_ sender: Any?) { #if SPARKLE - updateController.checkForUpdates(sender) + if !SupportedOSChecker.isCurrentOSReceivingUpdates { + // Show not supported info + if NSAlert.osNotSupported().runModal() != .cancel { + let url = Preferences.UnsupportedDeviceInfoBox.softwareUpdateURL + NSWorkspace.shared.open(url) + } + } + + showAbout(sender) #endif } @@ -136,6 +145,21 @@ extension AppDelegate { // MARK: - Help + @MainActor + @objc func showAbout(_ sender: Any?) { + WindowControllersManager.shared.showTab(with: .settings(pane: .about)) + } + + @MainActor + @objc func showReleaseNotes(_ sender: Any?) { + WindowControllersManager.shared.showTab(with: .releaseNotes) + } + + @MainActor + @objc func showWhatIsNew(_ sender: Any?) { + WindowControllersManager.shared.showTab(with: .url(.updates, source: .appOpenUrl)) + } + #if FEEDBACK @objc func openFeedback(_ sender: Any?) { diff --git a/DuckDuckGo/MessageViews/PopoverMessageViewController.swift b/DuckDuckGo/MessageViews/PopoverMessageViewController.swift index 02c119a703..3e67e72352 100644 --- a/DuckDuckGo/MessageViews/PopoverMessageViewController.swift +++ b/DuckDuckGo/MessageViews/PopoverMessageViewController.swift @@ -19,8 +19,7 @@ import AppKit import SwiftUI import SwiftUIExtensions - -final class PopoverMessageViewController: NSHostingController { +final class PopoverMessageViewController: NSHostingController, NSPopoverDelegate { enum Constants { static let storyboardName = "MessageViews" @@ -30,6 +29,8 @@ final class PopoverMessageViewController: NSHostingController Void)? + let autoDismissDuration: TimeInterval + let onClick: (() -> Void)? private var timer: Timer? private var trackingArea: NSTrackingArea? @@ -37,11 +38,23 @@ final class PopoverMessageViewController: NSHostingController Void)? = nil, - onDismiss: (() -> Void)? = nil) { - self.viewModel = PopoverMessageViewModel(message: message, image: image, buttonText: buttonText, buttonAction: buttonAction) + shouldShowCloseButton: Bool = false, + presentMultiline: Bool = false, + autoDismissDuration: TimeInterval = Constants.autoDismissDuration, + onDismiss: (() -> Void)? = nil, + onClick: (() -> Void)? = nil) { + self.viewModel = PopoverMessageViewModel(message: message, + image: image, + buttonText: buttonText, + buttonAction: buttonAction, + shouldShowCloseButton: shouldShowCloseButton, + shouldPresentMultiline: presentMultiline) self.onDismiss = onDismiss - let contentView = PopoverMessageView(viewModel: self.viewModel) + self.autoDismissDuration = autoDismissDuration + self.onClick = onClick + let contentView = PopoverMessageView(viewModel: self.viewModel, onClick: { }, onClose: { }) super.init(rootView: contentView) + self.rootView = createContentView() } required init?(coder: NSCoder) { @@ -95,7 +108,7 @@ final class PopoverMessageViewController: NSHostingController PopoverMessageView { + return PopoverMessageView(viewModel: self.viewModel, onClick: { [weak self] in + self?.onClick?() + }) { [weak self] in + self?.dismissPopover() + } + } } diff --git a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift index beb0223dd2..08217ab8a9 100644 --- a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift +++ b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift @@ -98,6 +98,7 @@ final class MoreOptionsMenu: NSMenu { let zoomMenuItem = NSMenuItem(title: UserText.zoom, action: nil, keyEquivalent: "").withImage(.optionsButtonMenuZoom) private func setupMenuItems() { + addUpdateItem() #if FEEDBACK let feedbackString: String = { @@ -135,6 +136,10 @@ final class MoreOptionsMenu: NSMenu { addPageItems() + let helpItem = NSMenuItem(title: UserText.mainMenuHelp, action: nil, keyEquivalent: "").withImage(.helpMenuItemIcon) + helpItem.submenu = HelpSubMenu(targetting: self) + addItem(helpItem) + let preferencesItem = NSMenuItem(title: UserText.settings, action: #selector(openPreferences(_:)), keyEquivalent: "") .targetting(self) .withImage(.preferences) @@ -252,6 +257,16 @@ final class MoreOptionsMenu: NSMenu { actionDelegate?.optionsButtonMenuRequestedPrint(self) } + private func addUpdateItem() { +#if SPARKLE + if let update = Application.appDelegate.updateController.latestUpdate, + !update.isInstalled { + addItem(UpdateMenuItemFactory.menuItem(for: update)) + addItem(NSMenuItem.separator()) + } +#endif + } + private func addWindowItems() { // New Tab addItem(withTitle: UserText.plusButtonNewTabMenuItem, action: #selector(newTab(_:)), keyEquivalent: "t") @@ -688,6 +703,39 @@ final class LoginsSubMenu: NSMenu { } +@MainActor +final class HelpSubMenu: NSMenu { + + init(targetting target: AnyObject) { + super.init(title: UserText.mainMenuHelp) + + updateMenuItems(targetting: target) + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func updateMenuItems(targetting target: AnyObject) { + removeAllItems() + + let about = (NSApp.mainMenuTyped.aboutMenuItem.copy() as? NSMenuItem)! + addItem(about) +#if SPARKLE + let releaseNotes = (NSApp.mainMenuTyped.releaseNotesMenuItem.copy() as? NSMenuItem)! + addItem(releaseNotes) + + let whatIsNew = (NSApp.mainMenuTyped.whatIsNewMenuItem.copy() as? NSMenuItem)! + addItem(whatIsNew) +#endif + +#if FEEDBACK + let feedback = (NSApp.mainMenuTyped.sendFeedbackMenuItem.copy() as? NSMenuItem)! + addItem(feedback) +#endif + } +} + @MainActor final class SubscriptionSubMenu: NSMenu, NSMenuDelegate { diff --git a/DuckDuckGo/NavigationBar/View/MoreOptionsMenuButton.swift b/DuckDuckGo/NavigationBar/View/MoreOptionsMenuButton.swift new file mode 100644 index 0000000000..54a896c2af --- /dev/null +++ b/DuckDuckGo/NavigationBar/View/MoreOptionsMenuButton.swift @@ -0,0 +1,105 @@ +// +// MoreOptionsMenuButton.swift +// +// 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 Cocoa +import Combine + +final class MoreOptionsMenuButton: MouseOverButton { + + private static let notificationSize: CGFloat = 6 + private static let notificationOffset: CGFloat = 3 + +#if SPARKLE + private var updateController: UpdateControllerProtocol? +#endif + + private var notificationLayer: CALayer? + private var cancellable: AnyCancellable? + + var notificationColor: NSColor = .updateIndicator { + didSet { + updateNotificationLayer() + } + } + + var isNotificationVisible: Bool = false { + didSet { + updateNotificationVisibility() + } + } + + override func awakeFromNib() { + super.awakeFromNib() + +#if SPARKLE + updateController = Application.appDelegate.updateController +#endif + subscribeToUpdateInfo() + } + + override func updateLayer() { + super.updateLayer() + setupNotificationLayerIfNeeded() + } + + private func subscribeToUpdateInfo() { +#if SPARKLE + cancellable = updateController?.isUpdateAvailableToInstallPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] isAvailable in + self?.isNotificationVisible = isAvailable + } +#endif + } + + private func setupNotificationLayerIfNeeded() { + guard notificationLayer == nil, let layer = self.layer else { return } + + let notificationLayer = CALayer() + notificationLayer.backgroundColor = notificationColor.cgColor + layoutNotification(notificationLayer: notificationLayer) + notificationLayer.isHidden = !isNotificationVisible + layer.addSublayer(notificationLayer) + self.notificationLayer = notificationLayer + } + + private func updateNotificationLayer() { + notificationLayer?.backgroundColor = notificationColor.cgColor + } + + private func updateNotificationVisibility() { + notificationLayer?.isHidden = !isNotificationVisible + } + + override func layout() { + super.layout() + layoutNotification(notificationLayer: notificationLayer) + } + + private func layoutNotification(notificationLayer: CALayer?) { + // Position the dot notification indicator to upper right corner of the button + notificationLayer?.frame = CGRect( + x: self.bounds.width - MoreOptionsMenuButton.notificationSize - MoreOptionsMenuButton.notificationOffset, + y: MoreOptionsMenuButton.notificationOffset, + width: MoreOptionsMenuButton.notificationSize, + height: MoreOptionsMenuButton.notificationSize + ) + notificationLayer?.cornerRadius = MoreOptionsMenuButton.notificationSize / 2 + } + +} diff --git a/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard b/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard index 79e6e387a0..b4c3b61cc1 100644 --- a/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard +++ b/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard @@ -1,5 +1,5 @@ - + @@ -278,7 +278,7 @@ -