From ce613ddac37772fce48c7ee79721fe183da4b606 Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Sun, 9 Jun 2024 13:34:46 -0700 Subject: [PATCH 1/4] Add Privacy Pro survey parameters (#2920) Task/Issue URL: https://app.asana.com/0/414235014887631/1207500645737162/f Tech Design URL: CC: Description: This PR adds new survey parameters for Privacy Pro. --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../Contents.json | 0 .../RemoteMessagePrivacyPro.pdf | Bin DuckDuckGo/RemoteMessaging.swift | 8 ++- .../RemoteMessagingSurveyURLBuilder.swift | 63 +++++++++++++++--- 6 files changed, 64 insertions(+), 13 deletions(-) rename DuckDuckGo/HomeMessage.xcassets/RemoteMessage/{RemoteMessagePrivacyPro.imageset => RemoteMessagePrivacyShield.imageset}/Contents.json (100%) rename DuckDuckGo/HomeMessage.xcassets/RemoteMessage/{RemoteMessagePrivacyPro.imageset => RemoteMessagePrivacyShield.imageset}/RemoteMessagePrivacyPro.pdf (100%) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 40c1e7526c..d202f5c0cd 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9770,7 +9770,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 152.0.1; + version = 153.0.0; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b98b5cde48..d43793703e 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" : "43d6c090699ddc1b92c0c016dc31b923fb06f59f", - "version" : "152.0.1" + "revision" : "b78ae617c7fe66244741f489158a1f40e567e674", + "version" : "153.0.0" } }, { diff --git a/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyPro.imageset/Contents.json b/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyShield.imageset/Contents.json similarity index 100% rename from DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyPro.imageset/Contents.json rename to DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyShield.imageset/Contents.json diff --git a/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyPro.imageset/RemoteMessagePrivacyPro.pdf b/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyShield.imageset/RemoteMessagePrivacyPro.pdf similarity index 100% rename from DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyPro.imageset/RemoteMessagePrivacyPro.pdf rename to DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessagePrivacyShield.imageset/RemoteMessagePrivacyPro.pdf diff --git a/DuckDuckGo/RemoteMessaging.swift b/DuckDuckGo/RemoteMessaging.swift index 494010a7ad..7dcd862ab4 100644 --- a/DuckDuckGo/RemoteMessaging.swift +++ b/DuckDuckGo/RemoteMessaging.swift @@ -141,6 +141,7 @@ struct RemoteMessaging { isWidgetInstalled: isWidgetInstalled) } + // swiftlint:disable:next function_body_length static private func fetchAndProcess(bookmarksCount: Int, favoritesCount: Int, remoteMessagingStore: RemoteMessagingStore = AppDependencyProvider.shared.remoteMessagingStore, @@ -159,10 +160,10 @@ struct RemoteMessaging { let activationDateStore = DefaultVPNActivationDateStore() let daysSinceNetworkProtectionEnabled = activationDateStore.daysSinceActivation() ?? -1 - let surveyActionMapper = DefaultRemoteMessagingSurveyURLBuilder(statisticsStore: statisticsStore) var privacyProDaysSinceSubscribed: Int = -1 var privacyProDaysUntilExpiry: Int = -1 + let surveyActionMapper: DefaultRemoteMessagingSurveyURLBuilder if let accessToken = AppDependencyProvider.shared.subscriptionManager.accountManager.accessToken { let subscriptionResult = await AppDependencyProvider.shared.subscriptionManager.subscriptionService.getSubscription( @@ -172,7 +173,12 @@ struct RemoteMessaging { if case let .success(subscription) = subscriptionResult { privacyProDaysSinceSubscribed = Calendar.current.numberOfDaysBetween(subscription.startedAt, and: Date()) ?? -1 privacyProDaysUntilExpiry = Calendar.current.numberOfDaysBetween(Date(), and: subscription.expiresOrRenewsAt) ?? -1 + surveyActionMapper = DefaultRemoteMessagingSurveyURLBuilder(statisticsStore: statisticsStore, subscription: subscription) + } else { + surveyActionMapper = DefaultRemoteMessagingSurveyURLBuilder(statisticsStore: statisticsStore, subscription: nil) } + } else { + surveyActionMapper = DefaultRemoteMessagingSurveyURLBuilder(statisticsStore: statisticsStore, subscription: nil) } let remoteMessagingConfigMatcher = RemoteMessagingConfigMatcher( diff --git a/DuckDuckGo/RemoteMessagingSurveyURLBuilder.swift b/DuckDuckGo/RemoteMessagingSurveyURLBuilder.swift index c6034c5e8f..1ea51ddc39 100644 --- a/DuckDuckGo/RemoteMessagingSurveyURLBuilder.swift +++ b/DuckDuckGo/RemoteMessagingSurveyURLBuilder.swift @@ -22,19 +22,23 @@ import BrowserServicesKit import RemoteMessaging import Core import Common +import Subscription struct DefaultRemoteMessagingSurveyURLBuilder: RemoteMessagingSurveyActionMapping { private let statisticsStore: StatisticsStore - private let activationDateStore: VPNActivationDateStore + private let vpnActivationDateStore: VPNActivationDateStore + private let subscription: Subscription? init(statisticsStore: StatisticsStore = StatisticsUserDefaults(), - activationDateStore: VPNActivationDateStore = DefaultVPNActivationDateStore()) { + vpnActivationDateStore: VPNActivationDateStore = DefaultVPNActivationDateStore(), + subscription: Subscription?) { self.statisticsStore = statisticsStore - self.activationDateStore = activationDateStore + self.vpnActivationDateStore = vpnActivationDateStore + self.subscription = subscription } - // swiftlint:disable:next cyclomatic_complexity + // swiftlint:disable:next cyclomatic_complexity function_body_length func add(parameters: [RemoteMessagingSurveyActionParameter], to surveyURL: URL) -> URL { guard var components = URLComponents(string: surveyURL.absoluteString) else { assertionFailure("Could not build URL components from survey URL") @@ -60,15 +64,56 @@ struct DefaultRemoteMessagingSurveyURLBuilder: RemoteMessagingSurveyActionMappin case .hardwareModel: let model = hardwareModel().addingPercentEncoding(withAllowedCharacters: .alphanumerics) queryItems.append(URLQueryItem(name: parameter.rawValue, value: model)) - case .lastActiveDate: - if let daysSinceLastActive = activationDateStore.daysSinceLastActive() { - queryItems.append(URLQueryItem(name: parameter.rawValue, value: String(describing: daysSinceLastActive))) - } case .daysInstalled: if let installDate = statisticsStore.installDate, - let daysSinceInstall = Calendar.current.numberOfDaysBetween(installDate, and: Date()) { + let daysSinceInstall = Calendar.current.numberOfDaysBetween(installDate, and: Date()) { queryItems.append(URLQueryItem(name: parameter.rawValue, value: String(describing: daysSinceInstall))) } + case .privacyProStatus: + switch subscription?.status { + case .autoRenewable: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "auto_renewable")) + case .notAutoRenewable: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "not_auto_renewable")) + case .gracePeriod: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "grace_period")) + case .inactive: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "inactive")) + case .expired: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "expired")) + case .unknown: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "unknown")) + case nil: break + } + case .privacyProPlatform: + + switch subscription?.platform { + case .apple: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "apple")) + case .google: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "google")) + case .stripe: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "stripe")) + case .unknown: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "unknown")) + case nil: break + } + case .privacyProBilling: + switch subscription?.billingPeriod { + case .monthly: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "monthly")) + case .yearly: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "yearly")) + case .unknown: queryItems.append(URLQueryItem(name: parameter.rawValue, value: "unknown")) + case nil: break + } + + case .privacyProDaysSincePurchase: + if let startDate = subscription?.startedAt, + let daysSincePurchase = Calendar.current.numberOfDaysBetween(startDate, and: Date()) { + queryItems.append(URLQueryItem(name: parameter.rawValue, value: String(describing: daysSincePurchase))) + } + case .privacyProDaysUntilExpiry: + if let expiryDate = subscription?.expiresOrRenewsAt, + let daysUntilExpiry = Calendar.current.numberOfDaysBetween(Date(), and: expiryDate) { + queryItems.append(URLQueryItem(name: parameter.rawValue, value: String(describing: daysUntilExpiry))) + } + case .vpnFirstUsed: + if let vpnFirstUsed = vpnActivationDateStore.daysSinceActivation() { + queryItems.append(URLQueryItem(name: parameter.rawValue, value: String(describing: vpnFirstUsed))) + } + case .vpnLastUsed: + if let vpnLastUsed = vpnActivationDateStore.daysSinceLastActive() { + queryItems.append(URLQueryItem(name: parameter.rawValue, value: String(describing: vpnLastUsed))) + } } } From 019652369f4e1cc0a328836db238035ee77a4e2a Mon Sep 17 00:00:00 2001 From: Federico Cappelli Date: Mon, 10 Jun 2024 15:41:43 +0100 Subject: [PATCH 2/4] Release 7.124.0-0 (#2939) --- Configuration/Version.xcconfig | 2 +- .../AppPrivacyConfigurationDataProvider.swift | 4 +- Core/ios-config.json | 12 +++- DuckDuckGo.xcodeproj/project.pbxproj | 56 +++++++++---------- DuckDuckGo/Settings.bundle/Root.plist | 2 +- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig index 3c0a2aab0f..72b2b542fe 100644 --- a/Configuration/Version.xcconfig +++ b/Configuration/Version.xcconfig @@ -1 +1 @@ -MARKETING_VERSION = 7.123.0 +MARKETING_VERSION = 7.124.0 diff --git a/Core/AppPrivacyConfigurationDataProvider.swift b/Core/AppPrivacyConfigurationDataProvider.swift index 2c90c886a4..b173c6637e 100644 --- a/Core/AppPrivacyConfigurationDataProvider.swift +++ b/Core/AppPrivacyConfigurationDataProvider.swift @@ -23,8 +23,8 @@ import BrowserServicesKit final public class AppPrivacyConfigurationDataProvider: EmbeddedDataProvider { public struct Constants { - public static let embeddedDataETag = "\"36c78de66c85602ab5f7b27b5dc5fa3c\"" - public static let embeddedDataSHA = "4983dd4691181b5285887b10dffe2f8fa7a0a4328b47ddf66019e55bc5485d4b" + public static let embeddedDataETag = "\"24b0fb60a4b541395e39707ff21d1395\"" + public static let embeddedDataSHA = "60329154c65a74fbf0a6a0ba20b9c3f3cf14b0057ee29f659e34aa542ec5584d" } public var embeddedDataEtag: String { diff --git a/Core/ios-config.json b/Core/ios-config.json index a95efc3248..40fb4f4cbb 100644 --- a/Core/ios-config.json +++ b/Core/ios-config.json @@ -1,6 +1,6 @@ { "readme": "https://github.com/duckduckgo/privacy-configuration", - "version": 1717171433682, + "version": 1717679238533, "features": { "adClickAttribution": { "readme": "https://help.duckduckgo.com/duckduckgo-help-pages/privacy/web-tracking-protections/#3rd-party-tracker-loading-protection", @@ -1963,6 +1963,14 @@ { "selector": "#credential_picker_container", "type": "override" + }, + { + "selector": ".shop-display-ad", + "type": "hide-empty" + }, + { + "selector": ".row.full-bleed-row", + "type": "hide-empty" } ] }, @@ -4431,7 +4439,7 @@ ] }, "state": "enabled", - "hash": "adc17fadc45c61f4a27fbf94b4980bdd" + "hash": "c51c06a39ff0d11c62ef9ea4f9fdcd88" }, "exceptionHandler": { "exceptions": [ diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index d202f5c0cd..700acf7942 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -7965,7 +7965,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -8002,7 +8002,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -8094,7 +8094,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -8122,7 +8122,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -8272,7 +8272,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -8298,7 +8298,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -8368,7 +8368,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -8403,7 +8403,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -8437,7 +8437,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -8468,7 +8468,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -8783,7 +8783,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -8815,7 +8815,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -8844,7 +8844,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -8878,7 +8878,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -8909,7 +8909,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -8942,11 +8942,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -9182,7 +9182,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9210,7 +9210,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9243,7 +9243,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9281,7 +9281,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9317,7 +9317,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9352,11 +9352,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -9532,11 +9532,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -9565,10 +9565,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 0; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; diff --git a/DuckDuckGo/Settings.bundle/Root.plist b/DuckDuckGo/Settings.bundle/Root.plist index d1d530b146..c52392a156 100644 --- a/DuckDuckGo/Settings.bundle/Root.plist +++ b/DuckDuckGo/Settings.bundle/Root.plist @@ -6,7 +6,7 @@ DefaultValue - 7.123.0 + 7.124.0 Key version Title From 441d14695929e441233e75eef18931278be12bd1 Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Mon, 10 Jun 2024 14:40:23 -0700 Subject: [PATCH 3/4] Remove nightly CodeQL scans (#2937) Task/Issue URL: https://app.asana.com/0/1203301625297703/1207523828742824/f Tech Design URL: CC: Description: This PR removes the CodeQL workflow due to its instability. It hasn't been running successfully for a long time and it wasn't trivial to fix, so let's just remove it. --- .github/workflows/codeql.yml | 52 ------------------------------------ 1 file changed, 52 deletions(-) delete mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index c1b68f040c..0000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,52 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - schedule: - - cron: '0 2 * * *' # Run at 2 AM UTC - -jobs: - analyze: - name: Analyze - runs-on: macos-13 - timeout-minutes: 60 - permissions: - actions: read - contents: read - security-events: write - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: 'swift' - - - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer - - - name: Build - run: | - xcodebuild clean build \ - -target "DuckDuckGo" \ - -scheme "DuckDuckGo" \ - -destination "platform=iOS Simulator,name=iPhone 14,OS=16.4" - -skipPackagePluginValidation \ - -skipMacroValidation \ - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:swift" From 00d2b53d932f56e9427b034324240562b69ab491 Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Mon, 10 Jun 2024 18:28:49 -0700 Subject: [PATCH 4/4] Clean up VPN waitlist debug screen and copy (#2936) Task/Issue URL: https://app.asana.com/0/414235014887631/1207522817421761/f Tech Design URL: CC: Description: This PR cleans up the VPN waitlist debug screen and removes some leftover additional VPN copy. --- .../Waitlist/VPN Waitlist/Contents.json | 6 - .../InvitedVPNWaitlist.imageset/Contents.json | 12 -- .../InvitedVPNWaitlist.imageset/Gift-96.pdf | Bin 9684 -> 0 bytes .../JoinVPNWaitlist.imageset/Contents.json | 12 -- .../Network-Protection-VPN-96.pdf | Bin 15349 -> 0 bytes .../JoinedVPNWaitlist.imageset/Contents.json | 12 -- .../JoinedVPNWaitlist.imageset/Success-96.pdf | Bin 13451 -> 0 bytes .../VPN-Ended.imageset/Contents.json | 12 -- .../VPN-Ended.imageset/VPN-Ended.pdf | Bin 11455 -> 0 bytes DuckDuckGo/Debug.storyboard | 137 +++--------------- DuckDuckGo/UserText.swift | 47 +----- DuckDuckGo/en.lproj/Localizable.strings | 90 ------------ 12 files changed, 26 insertions(+), 302 deletions(-) delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Gift-96.pdf delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Network-Protection-VPN-96.pdf delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Success-96.pdf delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json delete mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/VPN-Ended.pdf diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json deleted file mode 100644 index 73c00596a7..0000000000 --- a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json deleted file mode 100644 index 0223097db0..0000000000 --- a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Gift-96.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Gift-96.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Gift-96.pdf deleted file mode 100644 index 41180d6d4063373a4e87e2a6ae4d3acaefac519f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9684 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 H^uvDv9PwaX diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json deleted file mode 100644 index e9f9e938f0..0000000000 --- a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Network-Protection-VPN-96.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Network-Protection-VPN-96.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Network-Protection-VPN-96.pdf deleted file mode 100644 index 2e31d6e5ae561f6dee47d54a3eec79ec0e4d5458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15349 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 SBE!6KT@OF|*=N7|)&Bw;x74u! diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json deleted file mode 100644 index 3d42417002..0000000000 --- a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Success-96.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Success-96.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Success-96.pdf deleted file mode 100644 index 98e6385c2434da37526178fc927ecc729ad24316..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13451 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 Bc@qEt diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json deleted file mode 100644 index b87a2c36f5..0000000000 --- a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "VPN-Ended.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/VPN-Ended.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/VPN-Ended.pdf deleted file mode 100644 index a34830d0e08e54aa50cb9677a3dce866c9c98902..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11455 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 - + - + @@ -116,28 +116,8 @@ - - - - - - - - - - - - - - - + @@ -157,7 +137,7 @@ - + @@ -177,7 +157,7 @@ - + @@ -197,7 +177,7 @@ - + @@ -217,7 +197,7 @@ - + @@ -237,7 +217,7 @@ - + @@ -249,7 +229,7 @@ - + @@ -261,7 +241,7 @@ - + @@ -270,7 +250,7 @@ - + @@ -279,7 +259,7 @@ - + @@ -288,7 +268,7 @@ - + @@ -297,7 +277,7 @@ - + @@ -306,7 +286,7 @@ - + @@ -315,7 +295,7 @@ - + @@ -823,69 +803,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -925,34 +842,34 @@ - + - + - + - + @@ -1003,14 +920,8 @@ - - - - - - diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift index e518001dc7..878c46cd13 100644 --- a/DuckDuckGo/UserText.swift +++ b/DuckDuckGo/UserText.swift @@ -851,51 +851,7 @@ But if you *do* want a peek under the hood, you can find more information about static let emailProtectionSignInBody = NSLocalizedString("error.email-protection-sign-in.body", value: "Sorry, please sign in again to re-enable Email Protection features on this browser.", comment: "Alert message") static let emailProtectionSignInAction = NSLocalizedString("error.email-protection-sign-in.action", value: "Sign In", comment: "Button title to Sign In") - // MARK: - VPN Waitlist - - static let networkProtectionWaitlistJoinTitle = NSLocalizedString("network-protection.waitlist.join.title", value: "VPN Early Access", comment: "Title for Network Protection join waitlist screen") - static let networkProtectionWaitlistJoinSubtitle1 = NSLocalizedString("network-protection.waitlist.join.subtitle.1", value: "Secure your connection anytime, anywhere with Network Protection, the VPN from DuckDuckGo.", comment: "First subtitle for Network Protection join waitlist screen") - static let networkProtectionWaitlistJoinSubtitle2 = NSLocalizedString("network-protection.waitlist.join.subtitle.2", value: "Join the waitlist, and we’ll notify you when it’s your turn.", comment: "Second subtitle for Network Protection join waitlist screen") - - static let networkProtectionWaitlistJoinedTitle = NSLocalizedString("network-protection.waitlist.joined.title", value: "You’re on the list!", comment: "Title for Network Protection joined waitlist screen") - static let networkProtectionWaitlistJoinedWithNotificationsSubtitle1 = NSLocalizedString("network-protection.waitlist.joined.with-notifications.subtitle.1", value: "New invites are sent every few days, on a first come, first served basis.", comment: "Subtitle 1 for Network Protection joined waitlist screen when notifications are enabled") - static let networkProtectionWaitlistJoinedWithNotificationsSubtitle2 = NSLocalizedString("network-protection.waitlist.joined.with-notifications.subtitle.2", value: "We’ll notify you when your invite is ready.", comment: "Subtitle 2 for Network Protection joined waitlist screen when notifications are enabled") - - static let networkProtectionWaitlistNotificationTitle = NSLocalizedString("network-protection.waitlist.notification.title", value: "DuckDuckGo VPN is ready!", comment: "Title for Network Protection waitlist notification") - static let networkProtectionWaitlistNotificationText = NSLocalizedString("network-protection.waitlist.notification.text", value: "Open your invite", comment: "Title for Network Protection waitlist notification") - - static let networkProtectionWaitlistInvitedTitle = NSLocalizedString("network-protection.waitlist.invited.title", value: "You’re invited to try\nDuckDuckGo VPN early access!", comment: "Title for Network Protection invited screen") - static let networkProtectionWaitlistInvitedSubtitle = NSLocalizedString("network-protection.waitlist.invited.subtitle", value: "Get an extra layer of protection online with the VPN built for speed and simplicity. Encrypt your internet connection across your entire device and hide your location and IP address from sites you visit.", comment: "Subtitle for Network Protection invited screen") - - static let networkProtectionWaitlistInvitedSection1Title = NSLocalizedString("network-protection.waitlist.invited.section-1.title", value: "Full-device coverage", comment: "Title for section 1 of the Network Protection invited screen") - static let networkProtectionWaitlistInvitedSection1Subtitle = NSLocalizedString("network-protection.waitlist.invited.section-1.subtitle", value: "Encrypt online traffic across your browsers and apps.", comment: "Subtitle for section 1 of the Network Protection invited screen") - - static let networkProtectionWaitlistInvitedSection2Title = NSLocalizedString("network-protection.waitlist.invited.section-2.title", value: "Fast, reliable, and easy to use", comment: "Title for section 2 of the Network Protection invited screen") - static let networkProtectionWaitlistInvitedSection2Subtitle = NSLocalizedString("network-protection.waitlist.invited.section-2.subtitle", value: "No need for a separate app. Connect in one click and see your connection status at a glance.", comment: "Subtitle for section 2 of the Network Protection invited screen") - - static let networkProtectionWaitlistInvitedSection3Title = NSLocalizedString("network-protection.waitlist.invited.section-3.title", value: "Strict no-logging policy", comment: "Title for section 3 of the Network Protection invited screen") - static let networkProtectionWaitlistInvitedSection3Subtitle = NSLocalizedString("network-protection.waitlist.invited.section-3.subtitle", value: "We do not log or save any data that can connect you to your online activity.", comment: "Subtitle for section 3 of the Network Protection invited screen") - - static let networkProtectionWaitlistButtonEnableNotifications = NSLocalizedString("network-protection.waitlist.button.enable-notifications", value: "Enable Notifications", comment: "Enable Notifications button for Network Protection joined waitlist screen") - static let networkProtectionWaitlistButtonJoinWaitlist = NSLocalizedString("network-protection.waitlist.button.join-waitlist", value: "Join the Waitlist", comment: "Join Waitlist button for Network Protection join waitlist screen") - static let networkProtectionWaitlistButtonAgreeAndContinue = NSLocalizedString("network-protection.waitlist.button.agree-and-continue", value: "Agree and Continue", comment: "Agree and Continue button for Network Protection join waitlist screen") - static let networkProtectionWaitlistButtonExistingInviteCode = NSLocalizedString("network-protection.waitlist.button.existing-invite-code", value: "I Have an Invite Code", comment: "Button title for users who already have an invite code") - - static let networkProtectionWaitlistAvailabilityDisclaimer = NSLocalizedString("network-protection.waitlist.availability-disclaimer", value: "DuckDuckGo VPN is free to use during early access.", comment: "Availability disclaimer for Network Protection join waitlist screen") - - static let networkProtectionPrivacyPolicyTitle = NSLocalizedString("network-protection.privacy-policy.title", value: "Privacy Policy", comment: "Privacy Policy title for Network Protection") - - static let networkProtectionWaitlistNotificationAlertDescription = NSLocalizedString("network-protection.waitlist.notification-alert.description", value: "We’ll send you a notification when your invite to test DuckDuckGo VPN is ready.", comment: "Body text for the alert to enable notifications") - - static let networkProtectionWaitlistGetStarted = NSLocalizedString("network-protection.waitlist.get-started", value: "Get Started", comment: "Button title text for the Network Protection waitlist confirmation prompt") - static let networkProtectionWaitlistAgreeAndContinue = NSLocalizedString("network-protection.waitlist.agree-and-continue", value: "Agree and Continue", comment: "Title text for the Network Protection terms and conditions accept button") - - static let networkProtectionSettingsSubtitleNotJoined = NSLocalizedString("network-protection.waitlist.settings-subtitle.waitlist-not-joined", value: "Join the private waitlist", comment: "Subtitle text for the Network Protection settings row") - static let networkProtectionSettingsSubtitleJoinedButNotInvited = NSLocalizedString("network-protection.waitlist.settings-subtitle.joined-but-not-invited", value: "You’re on the list!", comment: "Subtitle text for the Network Protection settings row") - static let networkProtectionSettingsSubtitleJoinedAndInvited = NSLocalizedString("network-protection.waitlist.settings-subtitle.joined-and-invited", value: "Your invite is ready!", comment: "Subtitle text for the Network Protection settings row") - - static let networkProtectionNotificationPromptTitle = NSLocalizedString("network-protection.waitlist.notification-prompt-title", value: "Know the instant you're invited", comment: "Title for the alert to confirm enabling notifications") - static let networkProtectionNotificationPromptDescription = NSLocalizedString("network-protection.waitlist.notification-prompt-description", value: "Get a notification when your copy of Network Protection early access is ready.", comment: "Subtitle for the alert to confirm enabling notifications") + // MARK: VPN static let networkProtectionNotificationsTitle = NSLocalizedString("network.protection.notification.title", value: "DuckDuckGo", comment: "The title of the notifications shown from Network Protection") static let networkProtectionConnectionSuccessNotificationBody = NSLocalizedString("network.protection.success.notification.body", value: "Network Protection is On. Your location and online activity are protected.", comment: "The body of the notification shown when Network Protection reconnects successfully") @@ -912,6 +868,7 @@ But if you *do* want a peek under the hood, you can find more information about static let networkProtectionEntitlementExpiredNotificationBody = NSLocalizedString("network.protection.entitlement.expired.notification.body", value: "VPN disconnected due to expired subscription. Subscribe to Privacy Pro to reconnect DuckDuckGo VPN.", comment: "The body of the notification when Privacy Pro subscription expired") // MARK: Settings Screeen + public static let settingsTitle = NSLocalizedString("settings.title", value: "Settings", comment: "Title for the Settings View") public static let settingsOn = NSLocalizedString("settings.on", value: "On", comment: "Label describing a feature which is turned on") public static let settingsOff = NSLocalizedString("settings.off", value: "Off", comment: "Label describing a feature which is turned off") diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings index 91077fe7e4..cf771c6e5f 100644 --- a/DuckDuckGo/en.lproj/Localizable.strings +++ b/DuckDuckGo/en.lproj/Localizable.strings @@ -1333,96 +1333,6 @@ https://duckduckgo.com/mac"; /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; -/* Privacy Policy title for Network Protection */ -"network-protection.privacy-policy.title" = "Privacy Policy"; - -/* Title text for the Network Protection terms and conditions accept button */ -"network-protection.waitlist.agree-and-continue" = "Agree and Continue"; - -/* Availability disclaimer for Network Protection join waitlist screen */ -"network-protection.waitlist.availability-disclaimer" = "DuckDuckGo VPN is free to use during early access."; - -/* Agree and Continue button for Network Protection join waitlist screen */ -"network-protection.waitlist.button.agree-and-continue" = "Agree and Continue"; - -/* Enable Notifications button for Network Protection joined waitlist screen */ -"network-protection.waitlist.button.enable-notifications" = "Enable Notifications"; - -/* Button title for users who already have an invite code */ -"network-protection.waitlist.button.existing-invite-code" = "I Have an Invite Code"; - -/* Join Waitlist button for Network Protection join waitlist screen */ -"network-protection.waitlist.button.join-waitlist" = "Join the Waitlist"; - -/* Button title text for the Network Protection waitlist confirmation prompt */ -"network-protection.waitlist.get-started" = "Get Started"; - -/* Subtitle for section 1 of the Network Protection invited screen */ -"network-protection.waitlist.invited.section-1.subtitle" = "Encrypt online traffic across your browsers and apps."; - -/* Title for section 1 of the Network Protection invited screen */ -"network-protection.waitlist.invited.section-1.title" = "Full-device coverage"; - -/* Subtitle for section 2 of the Network Protection invited screen */ -"network-protection.waitlist.invited.section-2.subtitle" = "No need for a separate app. Connect in one click and see your connection status at a glance."; - -/* Title for section 2 of the Network Protection invited screen */ -"network-protection.waitlist.invited.section-2.title" = "Fast, reliable, and easy to use"; - -/* Subtitle for section 3 of the Network Protection invited screen */ -"network-protection.waitlist.invited.section-3.subtitle" = "We do not log or save any data that can connect you to your online activity."; - -/* Title for section 3 of the Network Protection invited screen */ -"network-protection.waitlist.invited.section-3.title" = "Strict no-logging policy"; - -/* Subtitle for Network Protection invited screen */ -"network-protection.waitlist.invited.subtitle" = "Get an extra layer of protection online with the VPN built for speed and simplicity. Encrypt your internet connection across your entire device and hide your location and IP address from sites you visit."; - -/* Title for Network Protection invited screen */ -"network-protection.waitlist.invited.title" = "You’re invited to try\nDuckDuckGo VPN early access!"; - -/* First subtitle for Network Protection join waitlist screen */ -"network-protection.waitlist.join.subtitle.1" = "Secure your connection anytime, anywhere with Network Protection, the VPN from DuckDuckGo."; - -/* Second subtitle for Network Protection join waitlist screen */ -"network-protection.waitlist.join.subtitle.2" = "Join the waitlist, and we’ll notify you when it’s your turn."; - -/* Title for Network Protection join waitlist screen */ -"network-protection.waitlist.join.title" = "VPN Early Access"; - -/* Title for Network Protection joined waitlist screen */ -"network-protection.waitlist.joined.title" = "You’re on the list!"; - -/* Subtitle 1 for Network Protection joined waitlist screen when notifications are enabled */ -"network-protection.waitlist.joined.with-notifications.subtitle.1" = "New invites are sent every few days, on a first come, first served basis."; - -/* Subtitle 2 for Network Protection joined waitlist screen when notifications are enabled */ -"network-protection.waitlist.joined.with-notifications.subtitle.2" = "We’ll notify you when your invite is ready."; - -/* Body text for the alert to enable notifications */ -"network-protection.waitlist.notification-alert.description" = "We’ll send you a notification when your invite to test DuckDuckGo VPN is ready."; - -/* Subtitle for the alert to confirm enabling notifications */ -"network-protection.waitlist.notification-prompt-description" = "Get a notification when your copy of Network Protection early access is ready."; - -/* Title for the alert to confirm enabling notifications */ -"network-protection.waitlist.notification-prompt-title" = "Know the instant you're invited"; - -/* Title for Network Protection waitlist notification */ -"network-protection.waitlist.notification.text" = "Open your invite"; - -/* Title for Network Protection waitlist notification */ -"network-protection.waitlist.notification.title" = "DuckDuckGo VPN is ready!"; - -/* Subtitle text for the Network Protection settings row */ -"network-protection.waitlist.settings-subtitle.joined-and-invited" = "Your invite is ready!"; - -/* Subtitle text for the Network Protection settings row */ -"network-protection.waitlist.settings-subtitle.joined-but-not-invited" = "You’re on the list!"; - -/* Subtitle text for the Network Protection settings row */ -"network-protection.waitlist.settings-subtitle.waitlist-not-joined" = "Join the private waitlist"; - /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN disconnected due to expired subscription. Subscribe to Privacy Pro to reconnect DuckDuckGo VPN.";