Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New autofill onboarding for existing DDG users #3170

Merged
merged 34 commits into from
Aug 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
8d68309
Add assets for new autofill onboarding view
graeme Jul 26, 2024
1848ecf
Add basic features list for new users
graeme Jul 26, 2024
4ecf3bb
Add basic featureList view for new user prompt
graeme Jul 26, 2024
a6e6f9b
Add TODO for cancel to clear new user state on
graeme Jul 26, 2024
2ca860f
(In Bob Marley's voice) Localize it
graeme Jul 26, 2024
ca13c23
Add biometrics format string
graeme Jul 26, 2024
ff55d99
Update never prompt CTA text
graeme Jul 26, 2024
06824ed
Replace disable prompt alert with toast
graeme Jul 29, 2024
2a5a5e1
Copy tweaks
graeme Jul 30, 2024
23f3e87
Tweak layout again
graeme Jul 31, 2024
b0054e7
Toggle first time user on save event
graeme Jul 31, 2024
93bd7fc
Set first time user false when autofill enabled
graeme Jul 31, 2024
9c4b0c6
Disable prompt on selecting never for website
graeme Aug 1, 2024
34534f4
Clear all prompts state on resetting autofill
graeme Aug 1, 2024
5b36ddd
Update fonts
graeme Aug 1, 2024
ee43b68
Update feature list fonts to be larger
graeme Aug 2, 2024
bef4785
Localize snackbar copy
graeme Aug 2, 2024
f10503d
Use generated image resource helpers
graeme Aug 2, 2024
390c362
Adjust font features title font weight
graeme Aug 5, 2024
7b71b72
Adjust spacing between title and content
graeme Aug 5, 2024
5f3969e
Increase icon size
graeme Aug 5, 2024
b57eb68
Stop showing onboarding after 2nd website dismiss
graeme Aug 5, 2024
2a8e489
Show disable prompt for 5 seconds
graeme Aug 5, 2024
20f10d2
Change snackbar duration to 4 seconds
graeme Aug 6, 2024
7a63d20
Maybe fix scrolling issue on iPad iOS 15 landscape
graeme Aug 6, 2024
8a16fd9
Move magic numbers to constants
graeme Aug 6, 2024
c360221
Change Never button back to old copy
graeme Aug 6, 2024
dd7b2a7
Enable Autofill for existing DDG users feature flag and pixels (#3182)
graeme Aug 7, 2024
713ef47
Update headline image asset
graeme Aug 7, 2024
62e3d68
Update never ask button text...again
graeme Aug 7, 2024
e6a56a6
Merge remote-tracking branch 'origin/main' into graeme/turn-autofill-…
graeme Aug 9, 2024
a25b96c
Point to update BSK
graeme Aug 9, 2024
91dd5ed
Point to BSK 182.0.0
graeme Aug 9, 2024
14b7119
Remove dupe MockFeatureFlagger
graeme Aug 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Core/FeatureFlag.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public enum FeatureFlag: String {
case autofillPasswordGeneration
case autofillOnByDefault
case autofillFailureReporting
case autofillOnForExistingUsers
case incontextSignup
case autoconsentOnByDefault
case history
Expand Down Expand Up @@ -58,6 +59,8 @@ extension FeatureFlag: FeatureFlagSourceProviding {
return .remoteReleasable(.subfeature(AutofillSubfeature.onByDefault))
case .autofillFailureReporting:
return .remoteReleasable(.feature(.autofillBreakageReporter))
case .autofillOnForExistingUsers:
return .remoteReleasable(.subfeature(AutofillSubfeature.onForExistingUsers))
case .incontextSignup:
return .remoteReleasable(.feature(.incontextSignup))
case .autoconsentOnByDefault:
Expand Down
26 changes: 17 additions & 9 deletions Core/PixelEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,12 @@ extension Pixel {
case autofillLoginsSaveLoginModalConfirmed
case autofillLoginsSaveLoginModalDismissed
case autofillLoginsSaveLoginModalExcludeSiteConfirmed


case autofillLoginsSaveLoginOnboardingModalDisplayed
case autofillLoginsSaveLoginOnboardingModalConfirmed
case autofillLoginsSaveLoginOnboardingModalDismissed
case autofillLoginsSaveLoginOnboardingModalExcludeSiteConfirmed

case autofillLoginsSavePasswordModalDisplayed
case autofillLoginsSavePasswordModalConfirmed
case autofillLoginsSavePasswordModalDismissed
Expand All @@ -246,10 +251,9 @@ extension Pixel {
case autofillLoginsFillLoginInlineAuthenticationDeviceAuthCancelled
case autofillLoginsAutopromptDismissed

case autofillLoginsFillLoginInlineDisablePromptShown
case autofillLoginsFillLoginInlineDisablePromptAutofillKept
case autofillLoginsFillLoginInlineDisablePromptAutofillDisabled

case autofillLoginsFillLoginInlineDisableSnackbarShown
case autofillLoginsFillLoginInlineDisableSnackbarOpenSettings

case autofillLoginsSettingsEnabled
case autofillLoginsSettingsDisabled
case autofillLoginsSettingsResetExcludedDisplayed
Expand Down Expand Up @@ -946,7 +950,12 @@ extension Pixel.Event {
case .autofillLoginsSaveLoginModalConfirmed: return "m_autofill_logins_save_login_inline_confirmed"
case .autofillLoginsSaveLoginModalDismissed: return "m_autofill_logins_save_login_inline_dismissed"
case .autofillLoginsSaveLoginModalExcludeSiteConfirmed: return "m_autofill_logins_save_login_exclude_site_confirmed"


case .autofillLoginsSaveLoginOnboardingModalDisplayed: return "autofill_logins_save_login_inline_onboarding_displayed"
case .autofillLoginsSaveLoginOnboardingModalConfirmed: return "autofill_logins_save_login_inline_onboarding_confirmed"
case .autofillLoginsSaveLoginOnboardingModalDismissed: return "autofill_logins_save_login_inline_onboarding_dismissed"
case .autofillLoginsSaveLoginOnboardingModalExcludeSiteConfirmed: return "autofill_logins_save_login_onboarding_exclude_site_confirmed"

case .autofillLoginsSavePasswordModalDisplayed: return "m_autofill_logins_save_password_inline_displayed"
case .autofillLoginsSavePasswordModalConfirmed: return "m_autofill_logins_save_password_inline_confirmed"
case .autofillLoginsSavePasswordModalDismissed: return "m_autofill_logins_save_password_inline_dismissed"
Expand Down Expand Up @@ -979,9 +988,8 @@ extension Pixel.Event {
case .autofillLoginsAutopromptDismissed:
return "m_autofill_logins_autoprompt_dismissed"

case .autofillLoginsFillLoginInlineDisablePromptShown: return "m_autofill_logins_save_disable-prompt_shown"
case .autofillLoginsFillLoginInlineDisablePromptAutofillKept: return "m_autofill_logins_save_disable-prompt_autofill-kept"
case .autofillLoginsFillLoginInlineDisablePromptAutofillDisabled: return "m_autofill_logins_save_disable-prompt_autofill-disabled"
case .autofillLoginsFillLoginInlineDisableSnackbarShown: return "autofill_logins_save_disable_snackbar_shown"
case .autofillLoginsFillLoginInlineDisableSnackbarOpenSettings: return "autofill_logins_save_disable_snackbar_open_settings"

case .autofillLoginsSettingsEnabled: return "m_autofill_logins_settings_enabled"
case .autofillLoginsSettingsDisabled: return "m_autofill_logins_settings_disabled"
Expand Down
10 changes: 9 additions & 1 deletion DuckDuckGo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -950,7 +950,9 @@
EE4FB1882A28D11900E5CBA7 /* NetworkProtectionStatusViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE4FB1872A28D11900E5CBA7 /* NetworkProtectionStatusViewModel.swift */; };
EE50052E29C369D300AE0773 /* FeatureFlag.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE50052D29C369D300AE0773 /* FeatureFlag.swift */; };
EE50053029C3BA0800AE0773 /* InternalUserStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE50052F29C3BA0800AE0773 /* InternalUserStore.swift */; };
EE5929622C5A8AF40029380B /* AutofillUsageMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE5929612C5A8AF40029380B /* AutofillUsageMonitor.swift */; };
EE72CA852A862D000043B5B3 /* NetworkProtectionDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE72CA842A862D000043B5B3 /* NetworkProtectionDebugViewController.swift */; };
EE7623BE2C5D038200FA061C /* MockFeatureFlagger.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE7623BD2C5D038200FA061C /* MockFeatureFlagger.swift */; };
EE7917912A83DE93008DFF28 /* CombineTestUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE7917902A83DE93008DFF28 /* CombineTestUtilities.swift */; };
EE7A92872AC6DE4700832A36 /* NetworkProtectionNotificationIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE7A92862AC6DE4700832A36 /* NetworkProtectionNotificationIdentifier.swift */; };
EE8594992A44791C008A6D06 /* NetworkProtectionTunnelController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE8594982A44791C008A6D06 /* NetworkProtectionTunnelController.swift */; };
Expand Down Expand Up @@ -2694,7 +2696,9 @@
EE4FB1872A28D11900E5CBA7 /* NetworkProtectionStatusViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionStatusViewModel.swift; sourceTree = "<group>"; };
EE50052D29C369D300AE0773 /* FeatureFlag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlag.swift; sourceTree = "<group>"; };
EE50052F29C3BA0800AE0773 /* InternalUserStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalUserStore.swift; sourceTree = "<group>"; };
EE5929612C5A8AF40029380B /* AutofillUsageMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillUsageMonitor.swift; sourceTree = "<group>"; };
EE72CA842A862D000043B5B3 /* NetworkProtectionDebugViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionDebugViewController.swift; sourceTree = "<group>"; };
EE7623BD2C5D038200FA061C /* MockFeatureFlagger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFeatureFlagger.swift; sourceTree = "<group>"; };
EE7917902A83DE93008DFF28 /* CombineTestUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombineTestUtilities.swift; sourceTree = "<group>"; };
EE7A92862AC6DE4700832A36 /* NetworkProtectionNotificationIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionNotificationIdentifier.swift; sourceTree = "<group>"; };
EE8594982A44791C008A6D06 /* NetworkProtectionTunnelController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionTunnelController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5613,6 +5617,7 @@
6F03CB032C32EFA8004179A8 /* MockPixelFiring.swift */,
9F23B8082C2BE9B700950875 /* MockURLOpener.swift */,
9FEA22332C3271DC006B03BF /* MockTimer.swift */,
EE7623BD2C5D038200FA061C /* MockFeatureFlagger.swift */,
9F8007252C5261AF003EDAF4 /* MockPrivacyDataReporter.swift */,
9F69331C2C5A191400CD6A5D /* MockTutorialSettings.swift */,
);
Expand Down Expand Up @@ -6002,6 +6007,7 @@
C17B59552A03AAC40055F2D1 /* PasswordGeneration */,
31951E9328230D8900CAF535 /* Shared */,
F407605428131923006B1E0B /* SaveLogin */,
EE5929612C5A8AF40029380B /* AutofillUsageMonitor.swift */,
);
name = Autofill;
sourceTree = "<group>";
Expand Down Expand Up @@ -7162,6 +7168,7 @@
D66F683D2BB333C100AE93E2 /* SubscriptionContainerView.swift in Sources */,
851B128822200575004781BC /* Onboarding.swift in Sources */,
9FB027192C26BC29009EA190 /* BrowsersComparisonModel.swift in Sources */,
EE5929622C5A8AF40029380B /* AutofillUsageMonitor.swift in Sources */,
3151F0EE2735800800226F58 /* VoiceSearchFeedbackView.swift in Sources */,
37CF91642BB4A82A00BADCAE /* CrashCollectionOnboardingViewModel.swift in Sources */,
6F64AA5D2C4920D200CF4489 /* ShortcutAccessoryView.swift in Sources */,
Expand Down Expand Up @@ -7513,6 +7520,7 @@
F1BDDBFE2C340D9C00459306 /* SubscriptionFlowViewModelTests.swift in Sources */,
F1BDDC022C340DDF00459306 /* SyncManagementViewModelTests.swift in Sources */,
D625AAEC2BBEF27600BC189A /* TabURLInterceptorTests.swift in Sources */,
EE7623BE2C5D038200FA061C /* MockFeatureFlagger.swift in Sources */,
5694372B2BE3F2D900C0881B /* SyncErrorHandlerTests.swift in Sources */,
987130C7294AAB9F00AB05E0 /* MenuBookmarksViewModelTests.swift in Sources */,
858650D32469BFAD00C36F8A /* DaxDialogTests.swift in Sources */,
Expand Down Expand Up @@ -10473,7 +10481,7 @@
repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
requirement = {
kind = exactVersion;
version = 181.1.0;
version = 182.0.0;
};
};
9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,17 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/DuckDuckGo/BrowserServicesKit",
"state" : {
"revision" : "ff87c19636bce8baa34b7984defa779c083f9ce9",
"version" : "181.1.0"
"revision" : "d67979814bdd3c4c43a38e6694c56f1fdb5969ac",
"version" : "182.0.0"
}
},
{
"identity" : "content-scope-scripts",
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/content-scope-scripts",
"state" : {
"revision" : "097e545c737db78cb1d253a87a9acd6dd8ad8497",
"version" : "6.4.0"
"revision" : "f97053d24c21ea301d4067adbbe0899ff940526a",
"version" : "6.7.0"
}
},
{
Expand Down
7 changes: 6 additions & 1 deletion DuckDuckGo/ActionMessageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class ActionMessageView: UIView {
numberOfLines: Int = 0,
actionTitle: String? = nil,
presentationLocation: PresentationLocation = .withBottomBar(andAddressBarBottom: false),
duration: TimeInterval = Constants.duration,
onAction: @escaping () -> Void = {},
onDidDismiss: @escaping () -> Void = {}) {
let messageView = loadFromXib()
Expand All @@ -99,13 +100,15 @@ class ActionMessageView: UIView {
message: message.string,
actionTitle: actionTitle,
presentationLocation: presentationLocation,
duration: duration,
onAction: onAction,
onDidDismiss: onDidDismiss)
}

static func present(message: String,
actionTitle: String? = nil,
presentationLocation: PresentationLocation = .withBottomBar(andAddressBarBottom: false),
duration: TimeInterval = Constants.duration,
onAction: @escaping () -> Void = {},
onDidDismiss: @escaping () -> Void = {}) {
let messageView = loadFromXib()
Expand All @@ -114,6 +117,7 @@ class ActionMessageView: UIView {
message: message,
actionTitle: actionTitle,
presentationLocation: presentationLocation,
duration: duration,
onAction: onAction,
onDidDismiss: onDidDismiss)
}
Expand All @@ -122,6 +126,7 @@ class ActionMessageView: UIView {
message: String,
actionTitle: String? = nil,
presentationLocation: PresentationLocation = .withBottomBar(andAddressBarBottom: false),
duration: TimeInterval = Constants.duration,
onAction: @escaping () -> Void = {},
onDidDismiss: @escaping () -> Void = {}) {
guard let window = UIApplication.shared.firstKeyWindow else { return }
Expand Down Expand Up @@ -159,7 +164,7 @@ class ActionMessageView: UIView {
messageView?.dismissAndFadeOut()
}
messageView.dismissWorkItem = workItem
DispatchQueue.main.asyncAfter(deadline: .now() + Constants.duration, execute: workItem)
DispatchQueue.main.asyncAfter(deadline: .now() + duration, execute: workItem)
presentedMessages.append(messageView)
}

Expand Down
1 change: 1 addition & 0 deletions DuckDuckGo/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ import WebKit
private var crashReportUploaderOnboarding: CrashCollectionOnboarding?

private var autofillPixelReporter: AutofillPixelReporter?
private var autofillUsageMonitor = AutofillUsageMonitor()

var privacyProDataReporter: PrivacyProDataReporting!

Expand Down
12 changes: 9 additions & 3 deletions DuckDuckGo/AppUserDefaults.swift
Original file line number Diff line number Diff line change
Expand Up @@ -257,12 +257,18 @@ public class AppUserDefaults: AppSettings {
if let isNewInstall = autofillIsNewInstallForOnByDefault,
isNewInstall,
featureFlagger.isFeatureOn(.autofillOnByDefault) {
autofillCredentialsHasBeenEnabledAutomaticallyIfNecessary = true
autofillCredentialsEnabled = true
enableAutofillCredentials()
} else if featureFlagger.isFeatureOn(.autofillOnForExistingUsers) {
enableAutofillCredentials()
}
}
}


private func enableAutofillCredentials() {
autofillCredentialsHasBeenEnabledAutomaticallyIfNecessary = true
autofillCredentialsEnabled = true
}

var autofillCredentialsEnabled: Bool {
get {
// setAutofillCredentialsEnabledAutomaticallyIfNecessary() used here to automatically turn on autofill for people if:
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "App-DuckDuckGo-32.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Autofill-Color-24.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Lock-Color-24.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Sync-Color-24.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
13 changes: 13 additions & 0 deletions DuckDuckGo/AutofillDebugViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,15 @@ class AutofillDebugViewController: UITableViewController {
}
}

@UserDefaultsWrapper(key: .autofillSaveModalRejectionCount, defaultValue: 0)
private var autofillSaveModalRejectionCount: Int

@UserDefaultsWrapper(key: .autofillSaveModalDisablePromptShown, defaultValue: false)
private var autofillSaveModalDisablePromptShown: Bool

@UserDefaultsWrapper(key: .autofillFirstTimeUser, defaultValue: true)
private var autofillFirstTimeUser: Bool

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)

Expand All @@ -59,6 +68,10 @@ class AutofillDebugViewController: UITableViewController {
eventMapping: EventMapping<AutofillPixelEvent> { _, _, _, _ in })
autofillPixelReporter.resetStoreDefaults()
ActionMessageView.present(message: "Autofill Data reset")
autofillSaveModalRejectionCount = 0
autofillSaveModalDisablePromptShown = false
autofillFirstTimeUser = true
_ = AppDependencyProvider.shared.autofillNeverPromptWebsitesManager.deleteAllNeverPromptWebsites()
} else if cell.tag == Row.addAutofillData.rawValue {
promptForNumberOfLoginsToAdd()
} else if cell.tag == Row.resetEmailProtectionInContextSignUp.rawValue {
Expand Down
9 changes: 5 additions & 4 deletions DuckDuckGo/AutofillLoginListViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ final class AutofillLoginListViewModel: ObservableObject {
private let secureVault: (any AutofillSecureVault)?
private let autofillNeverPromptWebsitesManager: AutofillNeverPromptWebsitesManager
private let privacyConfig: PrivacyConfiguration
private let breakageReporterKeyValueStoring: KeyValueStoringDictionaryRepresentable
private let keyValueStore: KeyValueStoringDictionaryRepresentable
private var cachedDeletedCredentials: SecureVaultModels.WebsiteCredentials?
private let autofillDomainNameUrlMatcher = AutofillDomainNameUrlMatcher()
private let autofillDomainNameUrlSort = AutofillDomainNameUrlSort()
Expand All @@ -111,7 +111,7 @@ final class AutofillLoginListViewModel: ObservableObject {
}
self?.updateData()
self?.showBreakageReporter = false
}, keyValueStoring: breakageReporterKeyValueStoring, storageConfiguration: .autofillConfig)
}, keyValueStoring: keyValueStore, storageConfiguration: .autofillConfig)

@Published private (set) var viewState: AutofillLoginListViewModel.ViewState = .authLocked
@Published private(set) var sections = [AutofillLoginListSectionType]() {
Expand All @@ -138,6 +138,7 @@ final class AutofillLoginListViewModel: ObservableObject {
get { appSettings.autofillCredentialsEnabled }
set {
appSettings.autofillCredentialsEnabled = newValue
keyValueStore.set(false, forKey: UserDefaultsWrapper<Bool>.Key.autofillFirstTimeUser.rawValue)
NotificationCenter.default.post(name: AppUserDefaults.Notifications.autofillEnabledChange, object: self)
}
}
Expand All @@ -149,15 +150,15 @@ final class AutofillLoginListViewModel: ObservableObject {
currentTabUid: String? = nil,
autofillNeverPromptWebsitesManager: AutofillNeverPromptWebsitesManager = AppDependencyProvider.shared.autofillNeverPromptWebsitesManager,
privacyConfig: PrivacyConfiguration = ContentBlocking.shared.privacyConfigurationManager.privacyConfig,
breakageReporterKeyValueStoring: KeyValueStoringDictionaryRepresentable = UserDefaults.standard) {
keyValueStore: KeyValueStoringDictionaryRepresentable = UserDefaults.standard) {
self.appSettings = appSettings
self.tld = tld
self.secureVault = secureVault
self.currentTabUrl = currentTabUrl
self.currentTabUid = currentTabUid
self.autofillNeverPromptWebsitesManager = autofillNeverPromptWebsitesManager
self.privacyConfig = privacyConfig
self.breakageReporterKeyValueStoring = breakageReporterKeyValueStoring
self.keyValueStore = keyValueStore

if let count = getAccountsCount() {
authenticationNotRequired = count == 0 || AppDependencyProvider.shared.autofillLoginSession.isSessionValid
Expand Down
Loading
Loading