Skip to content
This repository was archived by the owner on Feb 24, 2025. It is now read-only.

Commit d0a3183

Browse files
authored
Post international Privacy Pro launch cleanup (#3778)
Task/Issue URL: https://app.asana.com/0/1203936086921904/1208836865988474/f CC: @federicocappelli **Description**: Post launch remove isLaunchedROW and isLaunchedROWOverride feature flags and clean related business logic **Steps to test this PR**: - Verify purchase paths for both US and non-US Privacy Pro variants work correctly (no functional changes expected) <!-- Before submitting a PR, please ensure you have tested the combinations you expect the reviewer to test, then delete configurations you *know* do not need explicit testing. Using a simulator where a physical device is unavailable is acceptable. --> **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943)
1 parent bb26dd2 commit d0a3183

File tree

10 files changed

+15
-80
lines changed

10 files changed

+15
-80
lines changed

Core/FeatureFlag.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ public enum FeatureFlag: String {
5858
/// https://app.asana.com/0/1208592102886666/1208613627589762/f
5959
case crashReportOptInStatusResetting
6060

61-
case isPrivacyProLaunchedROW
62-
case isPrivacyProLaunchedROWOverride
63-
6461
/// https://app.asana.com/0/0/1208767141940869/f
6562
case freeTrials
6663
}
@@ -71,8 +68,6 @@ extension FeatureFlag: FeatureFlagDescribing {
7168

7269
public var supportsLocalOverriding: Bool {
7370
switch self {
74-
case .isPrivacyProLaunchedROWOverride:
75-
return true
7671
default:
7772
return false
7873
}
@@ -140,10 +135,6 @@ extension FeatureFlag: FeatureFlagDescribing {
140135
return .remoteReleasable(.feature(.adAttributionReporting))
141136
case .crashReportOptInStatusResetting:
142137
return .internalOnly()
143-
case .isPrivacyProLaunchedROW:
144-
return .remoteReleasable(.subfeature(PrivacyProSubfeature.isLaunchedROW))
145-
case .isPrivacyProLaunchedROWOverride:
146-
return .remoteReleasable(.subfeature(PrivacyProSubfeature.isLaunchedROWOverride))
147138
case .freeTrials:
148139
return .remoteDevelopment(.subfeature(PrivacyProSubfeature.freeTrials))
149140
}

DuckDuckGo.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11865,7 +11865,7 @@
1186511865
repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
1186611866
requirement = {
1186711867
kind = exactVersion;
11868-
version = 223.0.0;
11868+
version = "223.0.0-1";
1186911869
};
1187011870
};
1187111871
9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = {

DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

DuckDuckGo/AppDependencyProvider.swift

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -124,28 +124,14 @@ final class AppDependencyProvider: DependencyProvider {
124124
subscriptionEndpointService: subscriptionService,
125125
authEndpointService: authService)
126126

127-
let theFeatureFlagger = featureFlagger
128-
let subscriptionFeatureFlagger: FeatureFlaggerMapping<SubscriptionFeatureFlags> = FeatureFlaggerMapping { feature in
129-
switch feature {
130-
case .isLaunchedROW:
131-
return theFeatureFlagger.isFeatureOn(.isPrivacyProLaunchedROW)
132-
case .isLaunchedROWOverride:
133-
return theFeatureFlagger.isFeatureOn(.isPrivacyProLaunchedROWOverride)
134-
default:
135-
return feature.defaultState
136-
}
137-
}
138-
139-
let storePurchaseManager = DefaultStorePurchaseManager(subscriptionFeatureMappingCache: subscriptionFeatureMappingCache,
140-
subscriptionFeatureFlagger: subscriptionFeatureFlagger)
127+
let storePurchaseManager = DefaultStorePurchaseManager(subscriptionFeatureMappingCache: subscriptionFeatureMappingCache)
141128

142129
let subscriptionManager = DefaultSubscriptionManager(storePurchaseManager: storePurchaseManager,
143130
accountManager: accountManager,
144131
subscriptionEndpointService: subscriptionService,
145132
authEndpointService: authService,
146133
subscriptionFeatureMappingCache: subscriptionFeatureMappingCache,
147-
subscriptionEnvironment: subscriptionEnvironment,
148-
subscriptionFeatureFlagger: subscriptionFeatureFlagger)
134+
subscriptionEnvironment: subscriptionEnvironment)
149135
accountManager.delegate = subscriptionManager
150136

151137
self.subscriptionManager = subscriptionManager

DuckDuckGo/SettingsState.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ struct SettingsState {
3737
}
3838

3939
struct Subscription: Codable {
40-
var enabled: Bool
4140
var canPurchase: Bool
4241
var isSignedIn: Bool
4342
var hasActiveSubscription: Bool
@@ -136,8 +135,7 @@ struct SettingsState {
136135
speechRecognitionAvailable: false,
137136
loginsEnabled: false,
138137
networkProtectionConnected: false,
139-
subscription: Subscription(enabled: false,
140-
canPurchase: false,
138+
subscription: Subscription(canPurchase: false,
141139
isSignedIn: false,
142140
hasActiveSubscription: false,
143141
isRestoring: false,

DuckDuckGo/SettingsSubscriptionView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ struct SettingsSubscriptionView: View {
272272
}
273273
}
274274
.onReceive(settingsViewModel.$state) { state in
275-
isShowingPrivacyPro = state.subscription.enabled && (state.subscription.isSignedIn || state.subscription.canPurchase)
275+
isShowingPrivacyPro = (state.subscription.isSignedIn || state.subscription.canPurchase)
276276
}
277277
}
278278
}

DuckDuckGo/SettingsViewModel.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -757,9 +757,6 @@ extension SettingsViewModel {
757757
state.subscription = SettingsState.defaults.subscription
758758
}
759759

760-
// Update visibility based on Feature flag
761-
state.subscription.enabled = subscriptionFeatureAvailability.isFeatureAvailable
762-
763760
// Update if can purchase based on App Store product availability
764761
state.subscription.canPurchase = subscriptionManager.canPurchase
765762

DuckDuckGo/SubscriptionDebugViewController.swift

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ final class SubscriptionDebugViewController: UITableViewController {
4444
Sections.appstore: "App Store",
4545
Sections.environment: "Environment",
4646
Sections.pixels: "Promo Pixel Parameters",
47-
Sections.metadata: "StoreKit Metadata",
48-
Sections.featureFlags: "Feature flags"
47+
Sections.metadata: "StoreKit Metadata"
4948
]
5049

5150
enum Sections: Int, CaseIterable {
@@ -55,7 +54,6 @@ final class SubscriptionDebugViewController: UITableViewController {
5554
case environment
5655
case pixels
5756
case metadata
58-
case featureFlags
5957
}
6058

6159
enum AuthorizationRows: Int, CaseIterable {
@@ -88,10 +86,6 @@ final class SubscriptionDebugViewController: UITableViewController {
8886
case countryCode
8987
}
9088

91-
enum FeatureFlagRows: Int, CaseIterable {
92-
case isLaunchedROW
93-
}
94-
9589
private var storefrontID = "Loading"
9690
private var storefrontCountryCode = "Loading"
9791

@@ -184,15 +178,6 @@ final class SubscriptionDebugViewController: UITableViewController {
184178
break
185179
}
186180

187-
case .featureFlags:
188-
switch FeatureFlagRows(rawValue: indexPath.row) {
189-
case .isLaunchedROW:
190-
cell.textLabel?.text = "isPrivacyProLaunchedROWOverride"
191-
cell.accessoryType = featureFlagger.isFeatureOn(.isPrivacyProLaunchedROWOverride) ? .checkmark : .none
192-
case .none:
193-
break
194-
}
195-
196181
case .none:
197182
break
198183
}
@@ -208,7 +193,6 @@ final class SubscriptionDebugViewController: UITableViewController {
208193
case .environment: return EnvironmentRows.allCases.count
209194
case .pixels: return PixelsRows.allCases.count
210195
case .metadata: return MetadataRows.allCases.count
211-
case .featureFlags: return FeatureFlagRows.allCases.count
212196
case .none: return 0
213197
}
214198
}
@@ -244,11 +228,6 @@ final class SubscriptionDebugViewController: UITableViewController {
244228
}
245229
case .metadata:
246230
break
247-
case .featureFlags:
248-
switch FeatureFlagRows(rawValue: indexPath.row) {
249-
case .isLaunchedROW: toggleIsLaunchedROWFlag()
250-
default: break
251-
}
252231
case .none:
253232
break
254233
}
@@ -357,16 +336,6 @@ final class SubscriptionDebugViewController: UITableViewController {
357336
showAlert(title: "", message: message)
358337
}
359338

360-
private func toggleIsLaunchedROWFlag() {
361-
let flag = FeatureFlag.isPrivacyProLaunchedROWOverride
362-
if featureFlagger.localOverrides?.override(for: flag) == nil {
363-
featureFlagger.localOverrides?.toggleOverride(for: flag)
364-
} else {
365-
featureFlagger.localOverrides?.clearOverride(for: flag)
366-
}
367-
tableView.reloadData()
368-
}
369-
370339
private func syncAppleIDAccount() {
371340
Task {
372341
do {

DuckDuckGoTests/Subscription/SubscriptionFeatureAvailabilityMock.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,13 @@ import Foundation
2222

2323
public final class SubscriptionFeatureAvailabilityMock: SubscriptionFeatureAvailability {
2424
static var enabled: SubscriptionFeatureAvailabilityMock {
25-
return SubscriptionFeatureAvailabilityMock(isFeatureAvailable: true, isSubscriptionPurchaseAllowed: true, usesUnifiedFeedbackForm: true)
25+
return SubscriptionFeatureAvailabilityMock(isSubscriptionPurchaseAllowed: true, usesUnifiedFeedbackForm: true)
2626
}
2727

28-
public var isFeatureAvailable: Bool
2928
public var isSubscriptionPurchaseAllowed: Bool
3029
public var usesUnifiedFeedbackForm: Bool
3130

32-
public init(isFeatureAvailable: Bool, isSubscriptionPurchaseAllowed: Bool, usesUnifiedFeedbackForm: Bool) {
33-
self.isFeatureAvailable = isFeatureAvailable
31+
public init(isSubscriptionPurchaseAllowed: Bool, usesUnifiedFeedbackForm: Bool) {
3432
self.isSubscriptionPurchaseAllowed = isSubscriptionPurchaseAllowed
3533
self.usesUnifiedFeedbackForm = usesUnifiedFeedbackForm
3634
}

DuckDuckGoTests/Subscription/SubscriptionPagesUseSubscriptionFeatureTests.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ final class SubscriptionPagesUseSubscriptionFeatureTests: XCTestCase {
8282
var subscriptionEnvironment: SubscriptionEnvironment!
8383

8484
var subscriptionFeatureMappingCache: SubscriptionFeatureMappingCacheMock!
85-
var subscriptionFeatureFlagger: FeatureFlaggerMapping<SubscriptionFeatureFlags>!
8685

8786
var appStorePurchaseFlow: AppStorePurchaseFlow!
8887
var appStoreRestoreFlow: AppStoreRestoreFlow!
@@ -134,7 +133,6 @@ final class SubscriptionPagesUseSubscriptionFeatureTests: XCTestCase {
134133
settings: UserDefaultsCacheSettings(defaultExpirationInterval: .minutes(20)))
135134

136135
subscriptionFeatureMappingCache = SubscriptionFeatureMappingCacheMock()
137-
subscriptionFeatureFlagger = FeatureFlaggerMapping<SubscriptionFeatureFlags>(mapping: { $0.defaultState })
138136

139137
// Real AccountManager
140138
accountManager = DefaultAccountManager(storage: accountStorage,
@@ -164,8 +162,7 @@ final class SubscriptionPagesUseSubscriptionFeatureTests: XCTestCase {
164162
subscriptionEndpointService: subscriptionService,
165163
authEndpointService: authService,
166164
subscriptionFeatureMappingCache: subscriptionFeatureMappingCache,
167-
subscriptionEnvironment: subscriptionEnvironment,
168-
subscriptionFeatureFlagger: subscriptionFeatureFlagger)
165+
subscriptionEnvironment: subscriptionEnvironment)
169166

170167
feature = SubscriptionPagesUseSubscriptionFeature(subscriptionManager: subscriptionManager,
171168
subscriptionFeatureAvailability: subscriptionFeatureAvailability,
@@ -318,7 +315,6 @@ final class SubscriptionPagesUseSubscriptionFeatureTests: XCTestCase {
318315
func testGetSubscriptionOptionsReturnsEmptyOptionsWhenPurchaseNotAllowed() async throws {
319316
// Given
320317
let subscriptionFeatureAvailabilityWithoutPurchaseAllowed = SubscriptionFeatureAvailabilityMock(
321-
isFeatureAvailable: true,
322318
isSubscriptionPurchaseAllowed: false,
323319
usesUnifiedFeedbackForm: true
324320
)

0 commit comments

Comments
 (0)