From 0360a5baa204abbc1496f78350c2413fcf5da129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Carri=C3=B3n?= Date: Tue, 23 May 2023 16:59:22 -0500 Subject: [PATCH 1/3] Add Privacy Choices analytics events definitions --- .../Classes/Analytics/WooAnalyticsEvent.swift | 19 +++++++++++++++++++ .../Classes/Analytics/WooAnalyticsStat.swift | 5 +++++ 2 files changed, 24 insertions(+) diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift index 0a2ee94fb2f..2ac7871b44c 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift @@ -2380,3 +2380,22 @@ extension WooAnalyticsEvent { } } } + + +// MARK: - Privacy Choices Banner +// +extension WooAnalyticsEvent { + enum PrivacyChoicesBanner { + static func bannerPresented() -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .privacyChoicesBannerPresented, properties: [:]) + } + + static func settingsButtonTapped() -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .privacyChoicesSettingsButtonTapped, properties: [:]) + } + + static func saveButtonTapped() -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .privacyChoicesSaveButtonTapped, properties: [:]) + } + } +} diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift index d08f6935cab..0c83c0a34a4 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift @@ -920,6 +920,11 @@ public enum WooAnalyticsStat: String { case jetpackSetupFlow = "jetpack_setup_flow" case jetpackSetupCompleted = "jetpack_setup_completed" case jetpackSetupSynchronizationCompleted = "jetpack_setup_synchronization_completed" + + // MARK: Privacy Banner + case privacyChoicesBannerPresented = "privacy_choices_banner_presented" + case privacyChoicesSettingsButtonTapped = "privacy_choices_banner_settings_button_tapped" + case privacyChoicesSaveButtonTapped = "privacy_choices_banner_save_button_tapped" } public extension WooAnalyticsStat { From a142bb00b28fead3d439296f84622a87f4e56ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Carri=C3=B3n?= Date: Tue, 23 May 2023 17:49:27 -0500 Subject: [PATCH 2/3] Add analytics events --- .../Privacy/PrivacyBannerPresenter.swift | 9 ++++++- .../Privacy/PrivacyBannerViewModel.swift | 16 ++++++++++++ .../Privacy/PrivacyBannerViewModelTest.swift | 26 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift index f2188502bd9..5f28505d6de 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift @@ -10,8 +10,13 @@ final class PrivacyBannerPresenter { /// private let defaults: UserDefaults - init(defaults: UserDefaults = UserDefaults.standard) { + /// Analytics manager. + /// + private let analytics: Analytics + + init(defaults: UserDefaults = UserDefaults.standard, analytics: Analytics = ServiceLocator.analytics) { self.defaults = defaults + self.analytics = analytics } /// Present the banner when the appropriate conditions are met. @@ -63,6 +68,8 @@ final class PrivacyBannerPresenter { let bottomSheetViewController = BottomSheetViewController(childViewController: privacyBanner) bottomSheetViewController.show(from: viewController) + + analytics.track(event: .PrivacyChoicesBanner.bannerPresented()) } /// Presents an error notice and provide a retry action to update the analytics setting. diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift index bdebaaf064c..30cf1dda1b7 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift @@ -57,6 +57,22 @@ final class PrivacyBannerViewModel: ObservableObject { // Revert Loading state isLoading = false isViewEnabled = true + + // Analytics + trackAnalyticsFrom(destination: destination) + } + + /// Track analytics based on the destination provided by the view. + /// Dismiss ----> Save + /// Settings ----> Settings + /// + private func trackAnalyticsFrom(destination: Destination) { + switch destination { + case .dismiss: + analytics.track(event: .PrivacyChoicesBanner.saveButtonTapped()) + case .settings: + analytics.track(event: .PrivacyChoicesBanner.settingsButtonTapped()) + } } } diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift b/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift index 49df109cd8f..66d55e56b9d 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift @@ -111,6 +111,32 @@ import TestKit XCTAssertTrue(completionCalled) } + @MainActor func test_tapping_go_to_settings_tracks_analytic_event() async { + // Given + let analytics = WaitingTimeTrackerTests.TestAnalytics() + let stores = MockStoresManager(sessionManager: .makeForTesting(authenticated: true, isWPCom: false)) + let viewModel = PrivacyBannerViewModel(analytics: analytics, stores: stores, onCompletion: { _ in }) + + // When + await viewModel.submitChanges(destination: .settings) + + // Then + XCTAssertEqual(analytics.lastReceivedStat, WooAnalyticsStat.privacyChoicesSettingsButtonTapped) + } + + @MainActor func test_tapping_go_to_save_tracks_analytic_event() async { + // Given + let analytics = WaitingTimeTrackerTests.TestAnalytics() + let stores = MockStoresManager(sessionManager: .makeForTesting(authenticated: true, isWPCom: false)) + let viewModel = PrivacyBannerViewModel(analytics: analytics, stores: stores, onCompletion: { _ in }) + + // When + await viewModel.submitChanges(destination: .dismiss) + + // Then + XCTAssertEqual(analytics.lastReceivedStat, WooAnalyticsStat.privacyChoicesSaveButtonTapped) + } + override class func tearDown() { super.tearDown() SessionManager.removeTestingDatabase() From 6f3cf01426c641c900d51e9e817ca56048d54be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Carri=C3=B3n?= Date: Wed, 24 May 2023 10:03:08 -0500 Subject: [PATCH 3/3] Update wording --- .../Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift index 30cf1dda1b7..616cdba0dd1 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift @@ -59,14 +59,14 @@ final class PrivacyBannerViewModel: ObservableObject { isViewEnabled = true // Analytics - trackAnalyticsFrom(destination: destination) + trackAnalytics(from: destination) } /// Track analytics based on the destination provided by the view. /// Dismiss ----> Save /// Settings ----> Settings /// - private func trackAnalyticsFrom(destination: Destination) { + private func trackAnalytics(from destination: Destination) { switch destination { case .dismiss: analytics.track(event: .PrivacyChoicesBanner.saveButtonTapped())