diff --git a/PixelDefinitions/pixels/onboarding.json5 b/PixelDefinitions/pixels/onboarding.json5 new file mode 100644 index 000000000000..36657e4bdf59 --- /dev/null +++ b/PixelDefinitions/pixels/onboarding.json5 @@ -0,0 +1,23 @@ +{ + "m_preonboarding_choose_search_experience_impressions_unique": { + "description": "Fires during onboarding when the Search Experience view appears", + "owners": ["joshliebe"], + "triggers": ["other"], + "suffixes": ["form_factor"], + "parameters": ["appVersion"] + }, + "m_preonboarding_aichat_selected": { + "description": "Fires when the user selects the 'Search & Duck.ai' option during onboarding", + "owners": ["joshliebe"], + "triggers": ["other"], + "suffixes": ["form_factor"], + "parameters": ["appVersion"] + }, + "m_preonboarding_search_only_selected": { + "description": "Fires when the user selects the 'Search Only' option during onboarding", + "owners": ["joshliebe"], + "triggers": ["other"], + "suffixes": ["form_factor"], + "parameters": ["appVersion"] + } +} diff --git a/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt b/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt index 364b5c6901c8..d67b6ef24338 100644 --- a/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt +++ b/app/src/main/java/com/duckduckgo/app/global/api/PixelParamRemovalInterceptor.kt @@ -116,6 +116,9 @@ object PixelInterceptorPixelsRequiringDataCleaning : PixelParamRemovalPlugin { AppPixelName.PREONBOARDING_SKIP_ONBOARDING_PRESSED.pixelName to PixelParameter.removeAtb(), AppPixelName.PREONBOARDING_CONFIRM_SKIP_ONBOARDING_PRESSED.pixelName to PixelParameter.removeAtb(), AppPixelName.PREONBOARDING_RESUME_ONBOARDING_PRESSED.pixelName to PixelParameter.removeAtb(), + AppPixelName.PREONBOARDING_CHOOSE_SEARCH_EXPERIENCE_IMPRESSIONS_UNIQUE.pixelName to PixelParameter.removeAtb(), + AppPixelName.PREONBOARDING_AICHAT_SELECTED.pixelName to PixelParameter.removeAtb(), + AppPixelName.PREONBOARDING_SEARCH_ONLY_SELECTED.pixelName to PixelParameter.removeAtb(), AppPixelName.SEARCH_AND_FAVORITES_WIDGET_ADDED.pixelName to PixelParameter.removeAtb(), AppPixelName.SEARCH_AND_FAVORITES_WIDGET_DELETED.pixelName to PixelParameter.removeAtb(), AppPixelName.SEARCH_WIDGET_ADDED.pixelName to PixelParameter.removeAtb(), diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt index dcd62bfa436a..b899b8d8063e 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt @@ -45,13 +45,16 @@ import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentM import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.pixels.AppPixelName.NOTIFICATION_RUNTIME_PERMISSION_SHOWN import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_ADDRESS_BAR_POSITION_SHOWN_UNIQUE +import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_AICHAT_SELECTED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_BOTTOM_ADDRESS_BAR_SELECTED_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_CHOOSE_BROWSER_PRESSED +import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_CHOOSE_SEARCH_EXPERIENCE_IMPRESSIONS_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_COMPARISON_CHART_SHOWN_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_CONFIRM_SKIP_ONBOARDING_PRESSED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_INTRO_REINSTALL_USER_SHOWN_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_INTRO_SHOWN_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_RESUME_ONBOARDING_PRESSED +import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_SEARCH_ONLY_SELECTED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_SKIP_ONBOARDING_PRESSED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_SKIP_ONBOARDING_SHOWN_UNIQUE import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature @@ -192,6 +195,11 @@ class WelcomePageViewModel @Inject constructor( INPUT_SCREEN -> { viewModelScope.launch(dispatchers.io()) { + if (inputScreenSelected) { + pixel.fire(PREONBOARDING_AICHAT_SELECTED) + } else { + pixel.fire(PREONBOARDING_SEARCH_ONLY_SELECTED) + } onboardingStore.storeInputScreenSelection(inputScreenSelected) _commands.send(Finish) } @@ -290,7 +298,7 @@ class WelcomePageViewModel @Inject constructor( } } INPUT_SCREEN -> { - // no-op + pixel.fire(PREONBOARDING_CHOOSE_SEARCH_EXPERIENCE_IMPRESSIONS_UNIQUE, type = Unique()) } } } diff --git a/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt b/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt index b17070edbafd..eda97d6d0eb0 100644 --- a/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt +++ b/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt @@ -44,6 +44,9 @@ enum class AppPixelName(override val pixelName: String) : Pixel.PixelName { PREONBOARDING_ADDRESS_BAR_POSITION_SHOWN_UNIQUE("m_preonboarding_address_bar_position_dialog_shown_unique"), PREONBOARDING_BOTTOM_ADDRESS_BAR_SELECTED_UNIQUE("m_preonboarding_bottom_address_bar_selected_unique"), PREONBOARDING_SKIP_ONBOARDING_SHOWN_UNIQUE("m_preonboarding_skip_onboarding_shown_unique"), + PREONBOARDING_CHOOSE_SEARCH_EXPERIENCE_IMPRESSIONS_UNIQUE("m_preonboarding_choose_search_experience_impressions_unique"), + PREONBOARDING_AICHAT_SELECTED("m_preonboarding_aichat_selected"), + PREONBOARDING_SEARCH_ONLY_SELECTED("m_preonboarding_search_only_selected"), PREONBOARDING_SKIP_ONBOARDING_PRESSED("m_preonboarding_skip-onboarding-pressed"), PREONBOARDING_CONFIRM_SKIP_ONBOARDING_PRESSED("m_preonboarding_confirm-skip-onboarding-pressed"), PREONBOARDING_RESUME_ONBOARDING_PRESSED("m_preonboarding_resume-onboarding-pressed"), diff --git a/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt b/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt index c6c45565136c..11b463c349f4 100644 --- a/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt +++ b/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt @@ -34,13 +34,16 @@ import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowSk import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentManager import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.pixels.AppPixelName.NOTIFICATION_RUNTIME_PERMISSION_SHOWN +import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_AICHAT_SELECTED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_BOTTOM_ADDRESS_BAR_SELECTED_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_CHOOSE_BROWSER_PRESSED +import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_CHOOSE_SEARCH_EXPERIENCE_IMPRESSIONS_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_COMPARISON_CHART_SHOWN_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_CONFIRM_SKIP_ONBOARDING_PRESSED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_INTRO_REINSTALL_USER_SHOWN_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_INTRO_SHOWN_UNIQUE import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_RESUME_ONBOARDING_PRESSED +import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_SEARCH_ONLY_SELECTED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_SKIP_ONBOARDING_PRESSED import com.duckduckgo.app.pixels.AppPixelName.PREONBOARDING_SKIP_ONBOARDING_SHOWN_UNIQUE import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature @@ -414,7 +417,7 @@ class WelcomePageViewModelTest { } @Test - fun whenOnPrimaryCtaClickedWithInputScreenSelectedThenStoreSelectionAndFinish() = + fun whenOnPrimaryCtaClickedWithInputScreenSelectedThenFireAiChatSelectedPixelAndStoreSelectionAndFinish() = runTest { mockAndroidBrowserConfigFeature.showInputScreenOnboarding().setRawStoredState(Toggle.State(enable = true)) testee.onInputScreenOptionSelected(true) @@ -424,11 +427,12 @@ class WelcomePageViewModelTest { val command = awaitItem() Assert.assertTrue(command is Finish) } + verify(mockPixel).fire(PREONBOARDING_AICHAT_SELECTED) verify(mockOnboardingStore).storeInputScreenSelection(true) } @Test - fun whenOnPrimaryCtaClickedWithInputScreenNotSelectedThenStoreSelectionAndFinish() = + fun whenOnPrimaryCtaClickedWithInputScreenNotSelectedThenFireSearchOnlySelectedPixelAndStoreSelectionAndFinish() = runTest { mockAndroidBrowserConfigFeature.showInputScreenOnboarding().setRawStoredState(Toggle.State(enable = true)) testee.onInputScreenOptionSelected(false) @@ -438,6 +442,7 @@ class WelcomePageViewModelTest { val command = awaitItem() Assert.assertTrue(command is Finish) } + verify(mockPixel).fire(PREONBOARDING_SEARCH_ONLY_SELECTED) verify(mockOnboardingStore).storeInputScreenSelection(false) } @@ -458,4 +463,11 @@ class WelcomePageViewModelTest { Assert.assertEquals(2, viewModel.getMaxPageCount()) } + + @Test + fun whenInputScreenDialogIsShownThenFireChooseSearchExperienceImpressionsUniquePixel() { + testee.onDialogShown(PreOnboardingDialogType.INPUT_SCREEN) + + verify(mockPixel).fire(PREONBOARDING_CHOOSE_SEARCH_EXPERIENCE_IMPRESSIONS_UNIQUE, type = Unique()) + } }