diff --git a/Configuration/BuildNumber.xcconfig b/Configuration/BuildNumber.xcconfig index b3f6d1dba0..1c3d661283 100644 --- a/Configuration/BuildNumber.xcconfig +++ b/Configuration/BuildNumber.xcconfig @@ -1 +1 @@ -CURRENT_PROJECT_VERSION = 337 +CURRENT_PROJECT_VERSION = 338 diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index a5f3779e00..5e2fb41190 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -15342,7 +15342,7 @@ repositoryURL = "https://github.com/duckduckgo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 224.2.0; + version = 224.3.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 420ef2965a..fe3980e758 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" : "4f591a8fd91bf72f3f80d513a6016a9b70bd0b96", - "version" : "224.2.0" + "revision" : "9d802fef9b1704adad1675ce5656843202d1f28e", + "version" : "224.3.0" } }, { diff --git a/DuckDuckGo/Menus/MainMenuActions.swift b/DuckDuckGo/Menus/MainMenuActions.swift index dda445c349..b0bc789066 100644 --- a/DuckDuckGo/Menus/MainMenuActions.swift +++ b/DuckDuckGo/Menus/MainMenuActions.swift @@ -909,21 +909,6 @@ extension MainViewController { guard let internalUserDecider = NSApp.delegateTyped.internalUserDecider as? DefaultInternalUserDecider else { return } let state = internalUserDecider.isInternalUser internalUserDecider.debugSetInternalUserState(!state) - - if !DefaultSubscriptionFeatureAvailability().isFeatureAvailable { - // We only clear PPro state when it's not available, as otherwise - // there should be no state to clear. Clearing PPro state can - // trigger notifications which we want to avoid unless - // necessary. - clearPrivacyProState() - } - } - - /// Clears the PrivacyPro state to make testing easier. - /// - private func clearPrivacyProState() { - Application.appDelegate.subscriptionManager.accountManager.signOut() - UserDefaults.netP.networkProtectionEntitlementsExpired = false } @objc func resetDailyPixels(_ sender: Any?) { diff --git a/DuckDuckGo/NavigationBar/View/AddressBarTextField.swift b/DuckDuckGo/NavigationBar/View/AddressBarTextField.swift index 2ebc439811..65c5207f49 100644 --- a/DuckDuckGo/NavigationBar/View/AddressBarTextField.swift +++ b/DuckDuckGo/NavigationBar/View/AddressBarTextField.swift @@ -421,14 +421,13 @@ final class AddressBarTextField: NSTextField { } #endif - if DefaultSubscriptionFeatureAvailability().isFeatureAvailable { - let baseURL = Application.appDelegate.subscriptionManager.url(for: .baseURL) - let identityTheftRestorationURL = Application.appDelegate.subscriptionManager.url(for: .identityTheftRestoration) - if providedUrl.isChild(of: baseURL) || providedUrl.isChild(of: identityTheftRestorationURL) { - self.updateValue(selectedTabViewModel: nil, addressBarString: nil) // reset - self.window?.makeFirstResponder(nil) - return - } + // Prevent typing in subscription URLs directly in the address bar + let baseURL = Application.appDelegate.subscriptionManager.url(for: .baseURL) + let identityTheftRestorationURL = Application.appDelegate.subscriptionManager.url(for: .identityTheftRestoration) + if providedUrl.isChild(of: baseURL) || providedUrl.isChild(of: identityTheftRestorationURL) { + self.updateValue(selectedTabViewModel: nil, addressBarString: nil) // reset + self.window?.makeFirstResponder(nil) + return } self.window?.makeFirstResponder(nil) diff --git a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift index 4604858512..308f7b95da 100644 --- a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift +++ b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift @@ -419,8 +419,6 @@ final class MoreOptionsMenu: NSMenu, NSMenuDelegate { @MainActor private func addSubscriptionItems() { - guard subscriptionFeatureAvailability.isFeatureAvailable else { return } - func shouldHideDueToNoProduct() -> Bool { let platform = subscriptionManager.currentEnvironment.purchasePlatform return platform == .appStore && subscriptionManager.canPurchase == false @@ -966,7 +964,7 @@ final class SubscriptionSubMenu: NSMenu, NSMenuDelegate { } private func refreshAvailabilityBasedOnEntitlements() { - guard subscriptionFeatureAvailability.isFeatureAvailable, subscriptionManager.accountManager.isUserAuthenticated else { return } + guard subscriptionManager.accountManager.isUserAuthenticated else { return } @Sendable func hasEntitlement(for productName: Entitlement.ProductName) async -> Bool { switch await self.subscriptionManager.accountManager.hasEntitlement(forProductName: productName) { diff --git a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift index ef178b6eed..712a744136 100644 --- a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift +++ b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift @@ -331,8 +331,7 @@ final class NavigationBarViewController: NSViewController { } private func toggleNetworkProtectionPopover() { - guard DefaultSubscriptionFeatureAvailability().isFeatureAvailable, - NetworkProtectionKeychainTokenStore().isFeatureActivated else { + guard NetworkProtectionKeychainTokenStore().isFeatureActivated else { return } diff --git a/DuckDuckGo/Preferences/Model/PreferencesSection.swift b/DuckDuckGo/Preferences/Model/PreferencesSection.swift index a97027c40a..8af316402f 100644 --- a/DuckDuckGo/Preferences/Model/PreferencesSection.swift +++ b/DuckDuckGo/Preferences/Model/PreferencesSection.swift @@ -65,24 +65,22 @@ struct PreferencesSection: Hashable, Identifiable { .init(id: .about, panes: otherPanes) ] - if DefaultSubscriptionFeatureAvailability().isFeatureAvailable { - let subscriptionManager = Application.appDelegate.subscriptionManager - let platform = subscriptionManager.currentEnvironment.purchasePlatform - var shouldHidePrivacyProDueToNoProducts = platform == .appStore && subscriptionManager.canPurchase == false + let subscriptionManager = Application.appDelegate.subscriptionManager + let platform = subscriptionManager.currentEnvironment.purchasePlatform + var shouldHidePrivacyProDueToNoProducts = platform == .appStore && subscriptionManager.canPurchase == false - if subscriptionManager.accountManager.isUserAuthenticated { - shouldHidePrivacyProDueToNoProducts = false - } - - if !shouldHidePrivacyProDueToNoProducts { - var subscriptionPanes: [PreferencePaneIdentifier] = [.subscription] + if subscriptionManager.accountManager.isUserAuthenticated { + shouldHidePrivacyProDueToNoProducts = false + } - if includingVPN { - subscriptionPanes.append(.vpn) - } + if !shouldHidePrivacyProDueToNoProducts { + var subscriptionPanes: [PreferencePaneIdentifier] = [.subscription] - sections.insert(.init(id: .privacyPro, panes: subscriptionPanes), at: 1) + if includingVPN { + subscriptionPanes.append(.vpn) } + + sections.insert(.init(id: .privacyPro, panes: subscriptionPanes), at: 1) } return sections diff --git a/DuckDuckGo/Subscription/SubscriptionManager+StandardConfiguration.swift b/DuckDuckGo/Subscription/SubscriptionManager+StandardConfiguration.swift index 8dde58203e..1b0896d1a4 100644 --- a/DuckDuckGo/Subscription/SubscriptionManager+StandardConfiguration.swift +++ b/DuckDuckGo/Subscription/SubscriptionManager+StandardConfiguration.swift @@ -53,10 +53,6 @@ extension DefaultSubscriptionManager { } switch feature { - case .isLaunchedROW: - return featureFlagger.isFeatureOn(.isPrivacyProLaunchedROW) - case .isLaunchedROWOverride: - return featureFlagger.isFeatureOn(.isPrivacyProLaunchedROWOverride) case .usePrivacyProUSARegionOverride: return (featureFlagger.internalUserDecider.isInternalUser && subscriptionEnvironment.serviceEnvironment == .staging && @@ -76,15 +72,13 @@ extension DefaultSubscriptionManager { subscriptionEndpointService: subscriptionEndpointService, authEndpointService: authEndpointService, subscriptionFeatureMappingCache: subscriptionFeatureMappingCache, - subscriptionEnvironment: subscriptionEnvironment, - subscriptionFeatureFlagger: subscriptionFeatureFlagger) + subscriptionEnvironment: subscriptionEnvironment) } else { self.init(accountManager: accountManager, subscriptionEndpointService: subscriptionEndpointService, authEndpointService: authEndpointService, subscriptionFeatureMappingCache: subscriptionFeatureMappingCache, - subscriptionEnvironment: subscriptionEnvironment, - subscriptionFeatureFlagger: subscriptionFeatureFlagger) + subscriptionEnvironment: subscriptionEnvironment) } accountManager.delegate = self diff --git a/DuckDuckGo/Subscription/SubscriptionRedirectManager.swift b/DuckDuckGo/Subscription/SubscriptionRedirectManager.swift index 2a5bdfb4e4..8e946da48b 100644 --- a/DuckDuckGo/Subscription/SubscriptionRedirectManager.swift +++ b/DuckDuckGo/Subscription/SubscriptionRedirectManager.swift @@ -26,16 +26,13 @@ protocol SubscriptionRedirectManager: AnyObject { final class PrivacyProSubscriptionRedirectManager: SubscriptionRedirectManager { - private let featureAvailabiltyProvider: () -> Bool private let subscriptionEnvironment: SubscriptionEnvironment private let canPurchase: () -> Bool private let baseURL: URL - init(featureAvailabiltyProvider: @escaping @autoclosure () -> Bool = DefaultSubscriptionFeatureAvailability().isFeatureAvailable, - subscriptionEnvironment: SubscriptionEnvironment, + init(subscriptionEnvironment: SubscriptionEnvironment, baseURL: URL, canPurchase: @escaping () -> Bool) { - self.featureAvailabiltyProvider = featureAvailabiltyProvider self.subscriptionEnvironment = subscriptionEnvironment self.canPurchase = canPurchase self.baseURL = baseURL @@ -45,9 +42,8 @@ final class PrivacyProSubscriptionRedirectManager: SubscriptionRedirectManager { guard url.isPart(ofDomain: "duckduckgo.com") else { return nil } if url.pathComponents == URL.privacyPro.pathComponents { - let isFeatureAvailable = featureAvailabiltyProvider() let shouldHidePrivacyProDueToNoProducts = subscriptionEnvironment.purchasePlatform == .appStore && canPurchase() == false - let isPurchasePageRedirectActive = isFeatureAvailable && !shouldHidePrivacyProDueToNoProducts + let isPurchasePageRedirectActive = !shouldHidePrivacyProDueToNoProducts // Redirect the `/pro` URL to `/subscriptions` URL. If there are any query items in the original URL it appends to the `/subscriptions` URL. return isPurchasePageRedirectActive ? baseURL.addingQueryItems(from: url) : nil } diff --git a/DuckDuckGo/Tab/Navigation/RedirectNavigationResponder.swift b/DuckDuckGo/Tab/Navigation/RedirectNavigationResponder.swift index 5e57ccab46..863a3c13ad 100644 --- a/DuckDuckGo/Tab/Navigation/RedirectNavigationResponder.swift +++ b/DuckDuckGo/Tab/Navigation/RedirectNavigationResponder.swift @@ -36,20 +36,4 @@ struct RedirectNavigationResponder: NavigationResponder { navigator.load(request) } } - -// private func redirectURL(for url: URL) -> URL? { -// guard url.isPart(ofDomain: "duckduckgo.com") else { return nil } -// -// if url.pathComponents == URL.privacyPro.pathComponents { -// let isFeatureAvailable = DefaultSubscriptionFeatureAvailability().isFeatureAvailable -// let subscriptionManager = Application.appDelegate.subscriptionManager -// let platform = subscriptionManager.currentEnvironment.purchasePlatform -// let shouldHidePrivacyProDueToNoProducts = platform == .appStore && subscriptionManager.canPurchase == false -// let isPurchasePageRedirectActive = isFeatureAvailable && !shouldHidePrivacyProDueToNoProducts -// let url = SubscriptionURL.baseURL.subscriptionURL(environment: subscriptionManager.currentEnvironment.serviceEnvironment) -// return isPurchasePageRedirectActive ? url : nil -// } -// -// return nil -// } } diff --git a/DuckDuckGo/Tab/UserScripts/UserScripts.swift b/DuckDuckGo/Tab/UserScripts/UserScripts.swift index f492ec9bac..9febd742e8 100644 --- a/DuckDuckGo/Tab/UserScripts/UserScripts.swift +++ b/DuckDuckGo/Tab/UserScripts/UserScripts.swift @@ -125,22 +125,20 @@ final class UserScripts: UserScriptsProvider { userScripts.append(specialPages) } - if DefaultSubscriptionFeatureAvailability().isFeatureAvailable { - let subscriptionManager = Application.appDelegate.subscriptionManager - let stripePurchaseFlow = DefaultStripePurchaseFlow(subscriptionEndpointService: subscriptionManager.subscriptionEndpointService, - authEndpointService: subscriptionManager.authEndpointService, - accountManager: subscriptionManager.accountManager) - let freemiumDBPPixelExperimentManager = FreemiumDBPPixelExperimentManager(subscriptionManager: subscriptionManager) - let delegate = SubscriptionPagesUseSubscriptionFeature(subscriptionManager: subscriptionManager, - stripePurchaseFlow: stripePurchaseFlow, - uiHandler: Application.appDelegate.subscriptionUIHandler, - freemiumDBPPixelExperimentManager: freemiumDBPPixelExperimentManager) - subscriptionPagesUserScript.registerSubfeature(delegate: delegate) - userScripts.append(subscriptionPagesUserScript) - - identityTheftRestorationPagesUserScript.registerSubfeature(delegate: IdentityTheftRestorationPagesFeature()) - userScripts.append(identityTheftRestorationPagesUserScript) - } + let subscriptionManager = Application.appDelegate.subscriptionManager + let stripePurchaseFlow = DefaultStripePurchaseFlow(subscriptionEndpointService: subscriptionManager.subscriptionEndpointService, + authEndpointService: subscriptionManager.authEndpointService, + accountManager: subscriptionManager.accountManager) + let freemiumDBPPixelExperimentManager = FreemiumDBPPixelExperimentManager(subscriptionManager: subscriptionManager) + let delegate = SubscriptionPagesUseSubscriptionFeature(subscriptionManager: subscriptionManager, + stripePurchaseFlow: stripePurchaseFlow, + uiHandler: Application.appDelegate.subscriptionUIHandler, + freemiumDBPPixelExperimentManager: freemiumDBPPixelExperimentManager) + subscriptionPagesUserScript.registerSubfeature(delegate: delegate) + userScripts.append(subscriptionPagesUserScript) + + identityTheftRestorationPagesUserScript.registerSubfeature(delegate: IdentityTheftRestorationPagesFeature()) + userScripts.append(identityTheftRestorationPagesUserScript) } lazy var userScripts: [UserScript] = [ diff --git a/DuckDuckGo/Waitlist/VPNFeatureGatekeeper.swift b/DuckDuckGo/Waitlist/VPNFeatureGatekeeper.swift index 1569d68f97..413d1bbc41 100644 --- a/DuckDuckGo/Waitlist/VPNFeatureGatekeeper.swift +++ b/DuckDuckGo/Waitlist/VPNFeatureGatekeeper.swift @@ -65,10 +65,6 @@ struct DefaultVPNFeatureGatekeeper: VPNFeatureGatekeeper { /// For subscription users this means they have entitlements. /// func canStartVPN() async throws -> Bool { - guard subscriptionFeatureAvailability.isFeatureAvailable else { - return false - } - switch await subscriptionManager.accountManager.hasEntitlement(forProductName: .networkProtection) { case .success(let hasEntitlement): return hasEntitlement @@ -83,22 +79,13 @@ struct DefaultVPNFeatureGatekeeper: VPNFeatureGatekeeper { /// For subscription users this means they are authenticated. /// func isVPNVisible() -> Bool { - guard subscriptionFeatureAvailability.isFeatureAvailable else { - return false - } - return subscriptionManager.accountManager.isUserAuthenticated - } - - /// We've had to add this method because accessing the singleton in app delegate is crashing the integration tests. - /// - var subscriptionFeatureAvailability: DefaultSubscriptionFeatureAvailability { - DefaultSubscriptionFeatureAvailability() + subscriptionManager.accountManager.isUserAuthenticated } /// Returns whether the VPN should be uninstalled automatically. /// This is only true when the user is not an Easter Egg user, the waitlist test has ended, and the user is onboarded. func shouldUninstallAutomatically() -> Bool { - return subscriptionFeatureAvailability.isFeatureAvailable && !subscriptionManager.accountManager.isUserAuthenticated && LoginItem.vpnMenu.status.isInstalled + !subscriptionManager.accountManager.isUserAuthenticated && LoginItem.vpnMenu.status.isInstalled } /// Whether the user is fully onboarded diff --git a/LocalPackages/DataBrokerProtection/Package.swift b/LocalPackages/DataBrokerProtection/Package.swift index e790dcf790..1a0b8632bb 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: "224.2.0"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.3.0"), .package(path: "../SwiftUIExtensions"), .package(path: "../AppKitExtensions"), .package(path: "../XPCHelper"), diff --git a/LocalPackages/FeatureFlags/Package.swift b/LocalPackages/FeatureFlags/Package.swift index 46de00dd64..5b863978ae 100644 --- a/LocalPackages/FeatureFlags/Package.swift +++ b/LocalPackages/FeatureFlags/Package.swift @@ -32,7 +32,7 @@ let package = Package( targets: ["FeatureFlags"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.2.0"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.3.0"), ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. diff --git a/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift b/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift index 23f683678f..ca29d420f8 100644 --- a/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift +++ b/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift @@ -47,17 +47,13 @@ public enum FeatureFlag: String, CaseIterable { /// https://app.asana.com/0/72649045549333/1208241266421040/f case htmlNewTabPage - case isPrivacyProLaunchedROW - case isPrivacyProLaunchedROWOverride - case autofillPartialFormSaves } extension FeatureFlag: FeatureFlagDescribing { public var supportsLocalOverriding: Bool { switch self { - case .htmlNewTabPage, - .isPrivacyProLaunchedROWOverride: + case .htmlNewTabPage: return true case .maliciousSiteProtection: return true @@ -71,8 +67,7 @@ extension FeatureFlag: FeatureFlagDescribing { .unknownUsernameCategorization, .credentialsImportPromotionForExistingUsers, .networkProtectionUserTips, - .networkProtectionEnforceRoutes, - .isPrivacyProLaunchedROW: + .networkProtectionEnforceRoutes: return false } } @@ -101,10 +96,6 @@ extension FeatureFlag: FeatureFlagDescribing { return .remoteDevelopment(.subfeature(NetworkProtectionSubfeature.enforceRoutes)) case .htmlNewTabPage: return .disabled - case .isPrivacyProLaunchedROW: - return .remoteReleasable(.subfeature(PrivacyProSubfeature.isLaunchedROW)) - case .isPrivacyProLaunchedROWOverride: - return .remoteReleasable(.subfeature(PrivacyProSubfeature.isLaunchedROWOverride)) case .autofillPartialFormSaves: return .remoteReleasable(.subfeature(AutofillSubfeature.partialFormSaves)) } diff --git a/LocalPackages/NetworkProtectionMac/Package.swift b/LocalPackages/NetworkProtectionMac/Package.swift index c0aa1443b5..03bfa9ca56 100644 --- a/LocalPackages/NetworkProtectionMac/Package.swift +++ b/LocalPackages/NetworkProtectionMac/Package.swift @@ -33,7 +33,7 @@ let package = Package( .library(name: "VPNAppLauncher", targets: ["VPNAppLauncher"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.2.0"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.3.0"), .package(url: "https://github.com/airbnb/lottie-spm", exact: "4.4.3"), .package(path: "../AppLauncher"), .package(path: "../UDSHelper"), diff --git a/LocalPackages/NewTabPage/Package.swift b/LocalPackages/NewTabPage/Package.swift index a6688cb944..42a0d0f119 100644 --- a/LocalPackages/NewTabPage/Package.swift +++ b/LocalPackages/NewTabPage/Package.swift @@ -32,7 +32,7 @@ let package = Package( targets: ["NewTabPage"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.2.0"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.3.0"), .package(path: "../WebKitExtensions"), .package(path: "../Utilities"), ], diff --git a/LocalPackages/SubscriptionUI/Package.swift b/LocalPackages/SubscriptionUI/Package.swift index 41634d18a6..a6f3d3ff0d 100644 --- a/LocalPackages/SubscriptionUI/Package.swift +++ b/LocalPackages/SubscriptionUI/Package.swift @@ -13,7 +13,7 @@ let package = Package( targets: ["SubscriptionUI"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.2.0"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.3.0"), .package(path: "../SwiftUIExtensions"), .package(path: "../FeatureFlags") ], diff --git a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionModel.swift b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionModel.swift index e0a7bab18c..aede601bb7 100644 --- a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionModel.swift +++ b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionModel.swift @@ -43,7 +43,6 @@ public final class PreferencesSubscriptionModel: ObservableObject { var hasEmail: Bool { !(email?.isEmpty ?? true) } let featureFlagger: FeatureFlagger - var isROWLaunched: Bool = false private var subscriptionPlatform: Subscription.Platform? @@ -165,7 +164,6 @@ public final class PreferencesSubscriptionModel: ObservableObject { } else { self.subscriptionStorefrontRegion = currentStorefrontRegion() } - isROWLaunched = featureFlagger.isFeatureOn(.isPrivacyProLaunchedROW) || featureFlagger.isFeatureOn(.isPrivacyProLaunchedROWOverride) } private func updateUserAuthenticatedState(_ isUserAuthenticated: Bool) { diff --git a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionView.swift b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionView.swift index 8bcc0f4ba0..a7d7cf88fa 100644 --- a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionView.swift +++ b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Preferences/PreferencesSubscriptionView.swift @@ -298,13 +298,10 @@ public struct PreferencesSubscriptionView: View { private var helpSection: some View { PreferencePaneSection { TextMenuItemHeader(UserText.preferencesSubscriptionFooterTitle, bottomPadding: 0) - if !model.isROWLaunched { - TextMenuItemCaption(UserText.preferencesSubscriptionFooterCaption) - .padding(.bottom, 8) - } else { - TextMenuItemCaption(UserText.preferencesSubscriptionHelpFooterCaption) - .padding(.bottom, 8) - } + + TextMenuItemCaption(UserText.preferencesSubscriptionHelpFooterCaption) + .padding(.bottom, 8) + VStack(alignment: .leading, spacing: 16) { TextButton(UserText.viewFaqsButton, weight: .semibold) { model.openFAQ() } diff --git a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Resources/Localizable.xcstrings b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Resources/Localizable.xcstrings index f909d5486a..6d5811e393 100644 --- a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Resources/Localizable.xcstrings +++ b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/Resources/Localizable.xcstrings @@ -3713,7 +3713,7 @@ }, "subscription.preferences.subscription.footer.caption" : { "comment" : "Caption for the subscription preferences pane footer", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "de" : { "stringUnit" : { diff --git a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift index 8f4e5a018a..f28b2dc163 100644 --- a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift +++ b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift @@ -48,7 +48,6 @@ enum UserText { // MARK: Preferences footer static let preferencesSubscriptionFooterTitle = NSLocalizedString("subscription.preferences.subscription.footer.title", bundle: Bundle.module, value: "Need help with Privacy Pro?", comment: "Title for the subscription preferences pane footer") - static let preferencesSubscriptionFooterCaption = NSLocalizedString("subscription.preferences.subscription.footer.caption", bundle: Bundle.module, value: "Get answers to frequently asked questions or contact Privacy Pro support from our help pages.", comment: "Caption for the subscription preferences pane footer") static let preferencesSubscriptionHelpFooterCaption = NSLocalizedString("subscription.preferences.subscription.help.footer.caption", bundle: Bundle.module, value: "Get answers to frequently asked questions or contact Privacy Pro support from our help pages. Feature availability varies by country.", comment: "Caption for the subscription preferences pane footer") static let viewFaqsButton = NSLocalizedString("subscription.preferences.view.faqs.button", bundle: Bundle.module, value: "FAQs and Support", comment: "Button to open page for FAQs") static let preferencesSubscriptionFeedbackTitle = NSLocalizedString("subscription.preferences.feedback.title", bundle: Bundle.module, value: "Send Feedback", comment: "Title for the subscription feedback section") diff --git a/LocalPackages/WebKitExtensions/Package.swift b/LocalPackages/WebKitExtensions/Package.swift index dc3e795b52..44b247d5ff 100644 --- a/LocalPackages/WebKitExtensions/Package.swift +++ b/LocalPackages/WebKitExtensions/Package.swift @@ -32,7 +32,7 @@ let package = Package( ), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.2.0"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "224.3.0"), .package(path: "../AppKitExtensions") ], targets: [ diff --git a/UnitTests/DBP/Tests/DataBrokerProtectionFeatureGatekeeperTests.swift b/UnitTests/DBP/Tests/DataBrokerProtectionFeatureGatekeeperTests.swift index f82095119b..8e5d2ac1b3 100644 --- a/UnitTests/DBP/Tests/DataBrokerProtectionFeatureGatekeeperTests.swift +++ b/UnitTests/DBP/Tests/DataBrokerProtectionFeatureGatekeeperTests.swift @@ -159,7 +159,6 @@ private class MockFeatureAvailability: SubscriptionFeatureAvailability { var mockSubscriptionPurchaseAllowed: Bool = false var mockUsesUnifiedFeedbackForm: Bool = false - var isFeatureAvailable: Bool { mockFeatureAvailable } var isSubscriptionPurchaseAllowed: Bool { mockSubscriptionPurchaseAllowed } var usesUnifiedFeedbackForm: Bool { mockUsesUnifiedFeedbackForm } diff --git a/UnitTests/Menus/MoreOptionsMenuTests.swift b/UnitTests/Menus/MoreOptionsMenuTests.swift index f25dcdd5ae..adb281daca 100644 --- a/UnitTests/Menus/MoreOptionsMenuTests.swift +++ b/UnitTests/Menus/MoreOptionsMenuTests.swift @@ -92,8 +92,7 @@ final class MoreOptionsMenuTests: XCTestCase { moreOptionsMenu = MoreOptionsMenu(tabCollectionViewModel: tabCollectionViewModel, passwordManagerCoordinator: passwordManagerCoordinator, vpnFeatureGatekeeper: networkProtectionVisibilityMock, - subscriptionFeatureAvailability: SubscriptionFeatureAvailabilityMock(isFeatureAvailable: true, - isSubscriptionPurchaseAllowed: true, + subscriptionFeatureAvailability: SubscriptionFeatureAvailabilityMock(isSubscriptionPurchaseAllowed: true, usesUnifiedFeedbackForm: false), sharingMenu: NSMenu(), internalUserDecider: internalUserDecider, diff --git a/UnitTests/Subscription/Mocks/SubscriptionFeatureAvailabilityMock.swift b/UnitTests/Subscription/Mocks/SubscriptionFeatureAvailabilityMock.swift index f8ac00a609..4273492c3a 100644 --- a/UnitTests/Subscription/Mocks/SubscriptionFeatureAvailabilityMock.swift +++ b/UnitTests/Subscription/Mocks/SubscriptionFeatureAvailabilityMock.swift @@ -21,12 +21,10 @@ import Subscription import BrowserServicesKit public final class SubscriptionFeatureAvailabilityMock: SubscriptionFeatureAvailability { - public var isFeatureAvailable: Bool public var isSubscriptionPurchaseAllowed: Bool public var usesUnifiedFeedbackForm: Bool - public init(isFeatureAvailable: Bool, isSubscriptionPurchaseAllowed: Bool, usesUnifiedFeedbackForm: Bool) { - self.isFeatureAvailable = isFeatureAvailable + public init(isSubscriptionPurchaseAllowed: Bool, usesUnifiedFeedbackForm: Bool) { self.isSubscriptionPurchaseAllowed = isSubscriptionPurchaseAllowed self.usesUnifiedFeedbackForm = usesUnifiedFeedbackForm } diff --git a/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTests.swift b/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTests.swift index c339e89c3f..2046934d1f 100644 --- a/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTests.swift +++ b/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTests.swift @@ -170,8 +170,7 @@ final class SubscriptionPagesUseSubscriptionFeatureTests: XCTestCase { subscriptionAttributionPixelHandler = PrivacyProSubscriptionAttributionPixelHandler() - subscriptionFeatureAvailability = SubscriptionFeatureAvailabilityMock(isFeatureAvailable: true, - isSubscriptionPurchaseAllowed: true, + subscriptionFeatureAvailability = SubscriptionFeatureAvailabilityMock(isSubscriptionPurchaseAllowed: true, usesUnifiedFeedbackForm: false) // Real SubscriptionManager @@ -180,8 +179,7 @@ final class SubscriptionPagesUseSubscriptionFeatureTests: XCTestCase { subscriptionEndpointService: subscriptionService, authEndpointService: authService, subscriptionFeatureMappingCache: subscriptionFeatureMappingCache, - subscriptionEnvironment: subscriptionEnvironment, - subscriptionFeatureFlagger: subscriptionFeatureFlagger) + subscriptionEnvironment: subscriptionEnvironment) mockFreemiumDBPExperimentManager = MockFreemiumDBPExperimentManager() mockPixelHandler = MockFreemiumDBPExperimentPixelHandler() diff --git a/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTestsForStripe.swift b/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTestsForStripe.swift index c7a35c81c6..a9530000da 100644 --- a/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTestsForStripe.swift +++ b/UnitTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTestsForStripe.swift @@ -174,8 +174,7 @@ final class SubscriptionPagesUseSubscriptionFeatureTestsForStripe: XCTestCase { authEndpointService: authService, accountManager: accountManager) - subscriptionFeatureAvailability = SubscriptionFeatureAvailabilityMock(isFeatureAvailable: true, - isSubscriptionPurchaseAllowed: true, + subscriptionFeatureAvailability = SubscriptionFeatureAvailabilityMock(isSubscriptionPurchaseAllowed: true, usesUnifiedFeedbackForm: false) // Real SubscriptionManager @@ -184,8 +183,7 @@ final class SubscriptionPagesUseSubscriptionFeatureTestsForStripe: XCTestCase { subscriptionEndpointService: subscriptionService, authEndpointService: authService, subscriptionFeatureMappingCache: subscriptionFeatureMappingCache, - subscriptionEnvironment: subscriptionEnvironment, - subscriptionFeatureFlagger: subscriptionFeatureFlagger) + subscriptionEnvironment: subscriptionEnvironment) mockFreemiumDBPExperimentManager = MockFreemiumDBPExperimentManager() diff --git a/UnitTests/Subscription/SubscriptionRedirectManagerTests.swift b/UnitTests/Subscription/SubscriptionRedirectManagerTests.swift index 13a5f591ac..481d21a8e1 100644 --- a/UnitTests/Subscription/SubscriptionRedirectManagerTests.swift +++ b/UnitTests/Subscription/SubscriptionRedirectManagerTests.swift @@ -34,8 +34,7 @@ final class SubscriptionRedirectManagerTests: XCTestCase { override func setUpWithError() throws { try super.setUpWithError() - sut = PrivacyProSubscriptionRedirectManager(featureAvailabiltyProvider: true, - subscriptionEnvironment: Constants.environment, + sut = PrivacyProSubscriptionRedirectManager(subscriptionEnvironment: Constants.environment, baseURL: Constants.redirectURL, canPurchase: { [self] in canPurchase }) }