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 f01221520ebd..491036bda026 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 @@ -94,6 +94,7 @@ object PixelInterceptorPixelsRequiringDataCleaning : PixelParamRemovalPlugin { SITE_NOT_WORKING_SHOWN.pixelName to PixelParameter.removeAtb(), SITE_NOT_WORKING_WEBSITE_BROKEN.pixelName to PixelParameter.removeAtb(), AppPixelName.APP_VERSION_AT_SEARCH_TIME.pixelName to PixelParameter.removeAll(), + AppPixelName.SPLASHSCREEN_SHOWN.pixelName to PixelParameter.removeAll(), ) } } diff --git a/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt b/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt index 0f246bfe47e2..0a737c4706c8 100644 --- a/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt @@ -52,6 +52,7 @@ class LaunchBridgeActivity : DuckDuckGoActivity() { ) lifecycleScope.launch { + viewModel.sendWelcomeScreenPixel() delay(delay) viewModel.determineViewToShow() } diff --git a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt index b1c37d678355..1175fd19c86e 100644 --- a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt @@ -21,8 +21,10 @@ import com.duckduckgo.anvil.annotations.ContributesViewModel import com.duckduckgo.app.onboarding.store.UserStageStore import com.duckduckgo.app.onboarding.store.isNewUser import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.HighlightsOnboardingExperimentManager +import com.duckduckgo.app.pixels.AppPixelName.SPLASHSCREEN_SHOWN import com.duckduckgo.app.referral.AppInstallationReferrerStateListener import com.duckduckgo.app.referral.AppInstallationReferrerStateListener.Companion.MAX_REFERRER_WAIT_TIME_MS +import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.common.utils.SingleLiveEvent import com.duckduckgo.di.scopes.ActivityScope import javax.inject.Inject @@ -34,6 +36,7 @@ class LaunchViewModel @Inject constructor( private val userStageStore: UserStageStore, private val appReferrerStateListener: AppInstallationReferrerStateListener, private val highlightsOnboardingExperimentManager: HighlightsOnboardingExperimentManager, + private val pixel: Pixel, ) : ViewModel() { @@ -44,6 +47,10 @@ class LaunchViewModel @Inject constructor( data class Home(val replaceExistingSearch: Boolean = false) : Command() } + fun sendWelcomeScreenPixel() { + pixel.fire(SPLASHSCREEN_SHOWN) + } + suspend fun determineViewToShow() { waitForReferrerData() 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 cacc84640075..649d008b93c4 100644 --- a/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt +++ b/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt @@ -37,6 +37,8 @@ enum class AppPixelName(override val pixelName: String) : Pixel.PixelName { BROKEN_SITE_ALLOWLIST_REMOVE("m_broken_site_allowlist_remove"), PROTECTION_TOGGLE_BROKEN_SITE_REPORT("m_protection-toggled-off-breakage-report"), + SPLASHSCREEN_SHOWN("m_splashscreen_shown"), + PREONBOARDING_INTRO_SHOWN_UNIQUE("m_preonboarding_intro_shown_unique"), PREONBOARDING_COMPARISON_CHART_SHOWN_UNIQUE("m_preonboarding_comparison_chart_shown_unique"), PREONBOARDING_CHOOSE_BROWSER_PRESSED("m_preonboarding_choose_browser_pressed"), diff --git a/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt b/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt index fb4a21a4ce36..371157fafc89 100644 --- a/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt +++ b/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt @@ -23,10 +23,13 @@ import com.duckduckgo.app.launch.LaunchViewModel.Command.Onboarding import com.duckduckgo.app.onboarding.store.AppStage import com.duckduckgo.app.onboarding.store.UserStageStore import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.HighlightsOnboardingExperimentManager +import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.referral.StubAppReferrerFoundStateListener import com.duckduckgo.common.test.CoroutineTestRule +import com.duckduckgo.fakes.FakePixel import kotlinx.coroutines.test.runTest import org.junit.After +import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test import org.mockito.kotlin.any @@ -49,6 +52,7 @@ class LaunchViewModelTest { private val mockHighlightsOnboardingExperimentManager: HighlightsOnboardingExperimentManager = mock { on { it.isHighlightsEnabled() } doReturn false } + private val fakePixel: FakePixel = FakePixel() private lateinit var testee: LaunchViewModel @@ -63,6 +67,7 @@ class LaunchViewModelTest { userStageStore, StubAppReferrerFoundStateListener("xx"), mockHighlightsOnboardingExperimentManager, + fakePixel, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.NEW) testee.command.observeForever(mockCommandObserver) @@ -78,6 +83,7 @@ class LaunchViewModelTest { userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = 1_000), mockHighlightsOnboardingExperimentManager, + fakePixel, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.NEW) testee.command.observeForever(mockCommandObserver) @@ -93,6 +99,7 @@ class LaunchViewModelTest { userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), mockHighlightsOnboardingExperimentManager, + fakePixel, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.NEW) testee.command.observeForever(mockCommandObserver) @@ -108,6 +115,7 @@ class LaunchViewModelTest { userStageStore, StubAppReferrerFoundStateListener("xx"), mockHighlightsOnboardingExperimentManager, + fakePixel, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING) testee.command.observeForever(mockCommandObserver) @@ -121,6 +129,7 @@ class LaunchViewModelTest { userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = 1_000), mockHighlightsOnboardingExperimentManager, + fakePixel, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING) testee.command.observeForever(mockCommandObserver) @@ -134,6 +143,7 @@ class LaunchViewModelTest { userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), mockHighlightsOnboardingExperimentManager, + fakePixel, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING) testee.command.observeForever(mockCommandObserver) @@ -147,6 +157,7 @@ class LaunchViewModelTest { userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), mockHighlightsOnboardingExperimentManager, + fakePixel, ) whenever(mockHighlightsOnboardingExperimentManager.isHighlightsEnabled()).thenReturn(true) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.NEW) @@ -156,4 +167,18 @@ class LaunchViewModelTest { verify(mockHighlightsOnboardingExperimentManager).setExperimentVariants() } + + @Test + fun whenSendingWelcomeScreenPixelThenSplashScreenShownPixelIsSent() = runTest { + testee = LaunchViewModel( + userStageStore, + StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), + mockHighlightsOnboardingExperimentManager, + fakePixel, + ) + + testee.sendWelcomeScreenPixel() + + assertEquals(AppPixelName.SPLASHSCREEN_SHOWN.pixelName, fakePixel.firedPixels.first()) + } }