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

Passwords: Update save pixel with backfilled value #3903

Merged
merged 4 commits into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
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
4 changes: 2 additions & 2 deletions DuckDuckGo-iOS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11950,8 +11950,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
requirement = {
kind = exactVersion;
version = 232.1.1;
branch = "graeme/fix-backfill-pixels";
kind = branch;
};
};
9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

45 changes: 23 additions & 22 deletions DuckDuckGo/SaveLoginViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,14 @@ class SaveLoginViewController: UIViewController {
private let credentialManager: SaveAutofillLoginManager
private let appSettings: AppSettings
private let domainLastShownOn: String?
private let backfilled: Bool
var viewModel: SaveLoginViewModel?

internal init(credentialManager: SaveAutofillLoginManager, appSettings: AppSettings, domainLastShownOn: String? = nil) {
internal init(credentialManager: SaveAutofillLoginManager, appSettings: AppSettings, domainLastShownOn: String? = nil, backfilled: Bool) {
self.credentialManager = credentialManager
self.appSettings = appSettings
self.domainLastShownOn = domainLastShownOn
self.backfilled = backfilled
super.init(nibName: nil, bundle: nil)
}

Expand Down Expand Up @@ -69,19 +71,20 @@ class SaveLoginViewController: UIViewController {
if viewModel.didSave {
return
}
let backfilledParameter = [PixelParameters.backfilled: String(describing: backfilled)]

switch viewModel.layoutType {
case .newUser:
Pixel.fire(pixel: .autofillLoginsSaveLoginOnboardingModalDismissed)
Pixel.fire(pixel: .autofillLoginsSaveLoginOnboardingModalDismissed, withAdditionalParameters: backfilledParameter)
case .saveLogin:
Pixel.fire(pixel: .autofillLoginsSaveLoginModalDismissed)
Pixel.fire(pixel: .autofillLoginsSaveLoginModalDismissed, withAdditionalParameters: backfilledParameter)
case .savePassword:
Pixel.fire(pixel: .autofillLoginsSavePasswordModalDismissed)
Pixel.fire(pixel: .autofillLoginsSavePasswordModalDismissed, withAdditionalParameters: backfilledParameter)
case .updateUsername:
let isBackfilled = viewModel.isUpdatingEmptyUsername
Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalDismissed, withAdditionalParameters: [PixelParameters.backfilled: String(describing: isBackfilled)])
Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalDismissed, withAdditionalParameters: backfilledParameter)
case .updatePassword:
let isBackfilled = viewModel.isUpdatingEmptyPassword
Pixel.fire(pixel: .autofillLoginsUpdatePasswordModalDismissed, withAdditionalParameters: [PixelParameters.backfilled: String(describing: isBackfilled)])
Pixel.fire(pixel: .autofillLoginsUpdatePasswordModalDismissed, withAdditionalParameters: backfilledParameter)
}

viewModel.viewControllerDidDisappear()
Expand All @@ -96,43 +99,41 @@ class SaveLoginViewController: UIViewController {
let controller = UIHostingController(rootView: saveLoginView)
controller.view.backgroundColor = .clear
installChildViewController(controller)

let backfilledParameter = [PixelParameters.backfilled: String(describing: backfilled)]

switch saveViewModel.layoutType {
case .newUser:
Pixel.fire(pixel: .autofillLoginsSaveLoginOnboardingModalDisplayed)
Pixel.fire(pixel: .autofillLoginsSaveLoginOnboardingModalDisplayed, withAdditionalParameters: backfilledParameter)
case .saveLogin:
Pixel.fire(pixel: .autofillLoginsSaveLoginModalDisplayed)
Pixel.fire(pixel: .autofillLoginsSaveLoginModalDisplayed, withAdditionalParameters: backfilledParameter)
case .savePassword:
Pixel.fire(pixel: .autofillLoginsSavePasswordModalDisplayed)
Pixel.fire(pixel: .autofillLoginsSavePasswordModalDisplayed, withAdditionalParameters: backfilledParameter)
case .updateUsername:
let isBackfilled = saveViewModel.isUpdatingEmptyUsername
Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalDisplayed, withAdditionalParameters: [PixelParameters.backfilled: String(describing: isBackfilled)])
Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalDisplayed, withAdditionalParameters: backfilledParameter)
case .updatePassword:
let isBackfilled = saveViewModel.isUpdatingEmptyPassword
Pixel.fire(pixel: .autofillLoginsUpdatePasswordModalDisplayed, withAdditionalParameters: [PixelParameters.backfilled: String(describing: isBackfilled)])
Pixel.fire(pixel: .autofillLoginsUpdatePasswordModalDisplayed, withAdditionalParameters: backfilledParameter)
}
}
}

extension SaveLoginViewController: SaveLoginViewModelDelegate {
func saveLoginViewModelDidSave(_ viewModel: SaveLoginViewModel) {
let backfilledParameter = [PixelParameters.backfilled: String(describing: backfilled)]
switch viewModel.layoutType {
case .saveLogin, .savePassword, .newUser:
if case .newUser = viewModel.layoutType {
Pixel.fire(pixel: .autofillLoginsSaveLoginOnboardingModalConfirmed)
Pixel.fire(pixel: .autofillLoginsSaveLoginOnboardingModalConfirmed, withAdditionalParameters: backfilledParameter)
} else if case .savePassword = viewModel.layoutType {
Pixel.fire(pixel: .autofillLoginsSavePasswordModalConfirmed)
Pixel.fire(pixel: .autofillLoginsSavePasswordModalConfirmed, withAdditionalParameters: backfilledParameter)
} else {
Pixel.fire(pixel: .autofillLoginsSaveLoginModalConfirmed)
Pixel.fire(pixel: .autofillLoginsSaveLoginModalConfirmed, withAdditionalParameters: backfilledParameter)
}
delegate?.saveLoginViewController(self, didSaveCredentials: credentialManager.credentials)
case .updatePassword, .updateUsername:
if viewModel.layoutType == .updatePassword {
let isBackfilled = viewModel.isUpdatingEmptyPassword
Pixel.fire(pixel: .autofillLoginsUpdatePasswordModalConfirmed, withAdditionalParameters: [PixelParameters.backfilled: String(describing: isBackfilled)])
Pixel.fire(pixel: .autofillLoginsUpdatePasswordModalConfirmed, withAdditionalParameters: backfilledParameter)
} else {
let isBackfilled = viewModel.isUpdatingEmptyUsername
Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalConfirmed, withAdditionalParameters: [PixelParameters.backfilled: String(describing: isBackfilled)])
Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalConfirmed, withAdditionalParameters: backfilledParameter)
}
delegate?.saveLoginViewController(self, didUpdateCredentials: credentialManager.credentials)
}
Expand Down
7 changes: 4 additions & 3 deletions DuckDuckGo/TabViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2748,7 +2748,7 @@ extension NSError {

extension TabViewController: SecureVaultManagerDelegate {

private func presentSavePasswordModal(with vault: SecureVaultManager, credentials: SecureVaultModels.WebsiteCredentials) {
private func presentSavePasswordModal(with vault: SecureVaultManager, credentials: SecureVaultModels.WebsiteCredentials, backfilled: Bool) {
guard AutofillSettingStatus.isAutofillEnabledInSettings,
featureFlagger.isFeatureOn(.autofillCredentialsSaving),
let autofillUserScript = autofillUserScript else { return }
Expand All @@ -2759,7 +2759,8 @@ extension TabViewController: SecureVaultManagerDelegate {

let saveLoginController = SaveLoginViewController(credentialManager: manager,
appSettings: self.appSettings,
domainLastShownOn: self.domainSaveLoginPromptLastShownOn)
domainLastShownOn: self.domainSaveLoginPromptLastShownOn,
backfilled: backfilled)
self.domainSaveLoginPromptLastShownOn = self.url?.host
saveLoginController.delegate = self

Expand Down Expand Up @@ -2825,7 +2826,7 @@ extension TabViewController: SecureVaultManagerDelegate {
// Add a delay to allow propagation of pointer events to the page
// see https://app.asana.com/0/1202427674957632/1202532842924584/f
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.presentSavePasswordModal(with: vault, credentials: credentials)
self.presentSavePasswordModal(with: vault, credentials: credentials, backfilled: data.backfilled)
}
}
}
Expand Down
Loading