Skip to content

Commit

Permalink
Removed HighlightsOnboardingExperimentManager
Browse files Browse the repository at this point in the history
  • Loading branch information
nalcalag committed Jan 31, 2025
1 parent d506739 commit 5deffb0
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 167 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ import com.duckduckgo.app.browser.logindetection.NavigationEvent.LoginAttempt
import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials
import com.duckduckgo.app.browser.model.BasicAuthenticationRequest
import com.duckduckgo.app.browser.model.LongPressTarget
import com.duckduckgo.app.browser.newtab.FavoritesQuickAccessAdapter
import com.duckduckgo.app.browser.newtab.FavoritesQuickAccessAdapter.QuickAccessFavorite
import com.duckduckgo.app.browser.omnibar.ChangeOmnibarPositionFeature
import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter
Expand Down Expand Up @@ -150,7 +149,6 @@ import com.duckduckgo.app.onboarding.store.AppStage.ESTABLISHED
import com.duckduckgo.app.onboarding.store.OnboardingStore
import com.duckduckgo.app.onboarding.store.UserStageStore
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.HighlightsOnboardingExperimentManager
import com.duckduckgo.app.pixels.AppPixelName
import com.duckduckgo.app.pixels.AppPixelName.AUTOCOMPLETE_BANNER_SHOWN
import com.duckduckgo.app.pixels.AppPixelName.DUCK_PLAYER_SETTING_ALWAYS_DUCK_PLAYER
Expand Down Expand Up @@ -492,7 +490,6 @@ class BrowserTabViewModelTest {
private val mockUserBrowserProperties: UserBrowserProperties = mock()
private val mockAutoCompleteRepository: AutoCompleteRepository = mock()
private val changeOmnibarPositionFeature: ChangeOmnibarPositionFeature = mock()
private val mockHighlightsOnboardingExperimentManager: HighlightsOnboardingExperimentManager = mock()
private val protectionTogglePlugin = FakePrivacyProtectionTogglePlugin()
private val protectionTogglePluginPoint = FakePluginPoint(protectionTogglePlugin)
private var fakeAndroidConfigBrowserFeature = FakeFeatureToggleFactory.create(AndroidBrowserConfigFeature::class.java)
Expand Down Expand Up @@ -528,7 +525,6 @@ class BrowserTabViewModelTest {
lazyFaviconManager,
)

whenever(mockHighlightsOnboardingExperimentManager.isHighlightsEnabled()).thenReturn(false)
whenever(mockDuckPlayer.observeUserPreferences()).thenReturn(flowOf(UserPreferences(false, Disabled)))
whenever(mockDismissedCtaDao.dismissedCtas()).thenReturn(dismissedCtaDaoChannel.consumeAsFlow())
whenever(mockTabRepository.flowTabs).thenReturn(flowOf(emptyList()))
Expand Down Expand Up @@ -568,7 +564,6 @@ class BrowserTabViewModelTest {
extendedOnboardingFeatureToggles = mockExtendedOnboardingFeatureToggles,
subscriptions = mock(),
duckPlayer = mockDuckPlayer,
highlightsOnboardingExperimentManager = mockHighlightsOnboardingExperimentManager,
brokenSitePrompt = mockBrokenSitePrompt,
)

Expand Down Expand Up @@ -603,7 +598,6 @@ class BrowserTabViewModelTest {
whenever(mockPrivacyProtectionsPopupManager.viewState).thenReturn(flowOf(PrivacyProtectionsPopupViewState.Gone))
whenever(mockAppBuildConfig.buildType).thenReturn("debug")
whenever(mockDuckPlayer.observeUserPreferences()).thenReturn(flowOf(UserPreferences(false, AlwaysAsk)))
whenever(mockHighlightsOnboardingExperimentManager.isHighlightsEnabled()).thenReturn(false)

testee = BrowserTabViewModel(
statisticsUpdater = mockStatisticsUpdater,
Expand Down Expand Up @@ -664,7 +658,6 @@ class BrowserTabViewModelTest {
duckChatJSHelper = mockDuckChatJSHelper,
refreshPixelSender = refreshPixelSender,
changeOmnibarPositionFeature = changeOmnibarPositionFeature,
highlightsOnboardingExperimentManager = mockHighlightsOnboardingExperimentManager,
privacyProtectionTogglePlugin = protectionTogglePluginPoint,
showOnAppLaunchOptionHandler = mockShowOnAppLaunchHandler,
customHeadersProvider = fakeCustomHeadersPlugin,
Expand Down Expand Up @@ -695,9 +688,9 @@ class BrowserTabViewModelTest {
loadUrl("https://duckduckgo.com/?q=test&atb=v117-1&t=ddg_test")
testee.onShareSelected()
verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
assertTrue(commandCaptor.lastValue is Command.ShareLink)
assertTrue(commandCaptor.lastValue is ShareLink)

val shareLink = commandCaptor.lastValue as Command.ShareLink
val shareLink = commandCaptor.lastValue as ShareLink
assertEquals("https://duckduckgo.com/?q=test", shareLink.url)
}

Expand All @@ -707,9 +700,9 @@ class BrowserTabViewModelTest {
loadUrl(url)
testee.onShareSelected()
verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
assertTrue(commandCaptor.lastValue is Command.ShareLink)
assertTrue(commandCaptor.lastValue is ShareLink)

val shareLink = commandCaptor.lastValue as Command.ShareLink
val shareLink = commandCaptor.lastValue as ShareLink
assertEquals(url, shareLink.url)
}

Expand Down Expand Up @@ -1975,15 +1968,15 @@ class BrowserTabViewModelTest {
fun whenUserSelectsToShareLinkThenShareLinkCommandSent() {
loadUrl("foo.com")
testee.onShareSelected()
val command = captureCommands().lastValue as Command.ShareLink
val command = captureCommands().lastValue as ShareLink
assertEquals("foo.com", command.url)
}

@Test
fun whenUserSelectsToShareLinkWithNullUrlThenShareLinkCommandNotSent() {
loadUrl(null)
testee.onShareSelected()
assertCommandNotIssued<Command.ShareLink>()
assertCommandNotIssued<ShareLink>()
}

@Test
Expand Down Expand Up @@ -3342,7 +3335,7 @@ class BrowserTabViewModelTest {

verify(mockPixel).enqueueFire(
AppPixelName.EMAIL_COPIED_TO_CLIPBOARD,
mapOf(Pixel.PixelParameter.COHORT to "cohort", Pixel.PixelParameter.LAST_USED_DAY to "2021-01-01"),
mapOf(PixelParameter.COHORT to "cohort", PixelParameter.LAST_USED_DAY to "2021-01-01"),
)
}

Expand Down Expand Up @@ -3663,7 +3656,7 @@ class BrowserTabViewModelTest {
@Test
fun whenRemoveFavoriteUndoThenViewStateUpdated() = runTest {
val favoriteSite = Favorite(id = UUID.randomUUID().toString(), title = "", url = "www.example.com", position = 0, lastModified = "timestamp")
val quickAccessFavorites = listOf(FavoritesQuickAccessAdapter.QuickAccessFavorite(favoriteSite))
val quickAccessFavorites = listOf(QuickAccessFavorite(favoriteSite))

whenever(mockSavedSitesRepository.getFavorite("www.example.com")).thenReturn(favoriteSite)
favoriteListFlow.send(listOf(favoriteSite))
Expand Down Expand Up @@ -4760,7 +4753,7 @@ class BrowserTabViewModelTest {

@Test
fun whenPageIsChangedWithWebViewErrorResponseThenPrivacyProtectionsPopupManagerIsNotified() = runTest {
testee.onReceivedError(WebViewErrorResponse.BAD_URL, "example2.com")
testee.onReceivedError(BAD_URL, "example2.com")

updateUrl(
originalUrl = "example.com",
Expand Down Expand Up @@ -5729,7 +5722,7 @@ class BrowserTabViewModelTest {
private suspend fun givenFireButtonPulsing() {
whenever(mockExtendedOnboardingFeatureToggles.noBrowserCtas()).thenReturn(mockEnabledToggle)
whenever(mockUserStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING)
dismissedCtaDaoChannel.send(listOf(DismissedCta(CtaId.DAX_DIALOG_TRACKERS_FOUND)))
dismissedCtaDaoChannel.send(listOf(DismissedCta(DAX_DIALOG_TRACKERS_FOUND)))
}

private inline fun <reified T : Command> assertCommandIssued(instanceAssertions: T.() -> Unit = {}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ import com.duckduckgo.app.onboarding.store.AppStage
import com.duckduckgo.app.onboarding.store.OnboardingStore
import com.duckduckgo.app.onboarding.store.UserStageStore
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.HighlightsOnboardingExperimentManager
import com.duckduckgo.app.pixels.AppPixelName.*
import com.duckduckgo.app.privacy.db.UserAllowListRepository
import com.duckduckgo.app.privacy.model.HttpsStatus
Expand Down Expand Up @@ -113,8 +112,6 @@ class CtaViewModelTest {

private val mockSubscriptions: Subscriptions = mock()

private val mockHighlightsOnboardingExperimentManager: HighlightsOnboardingExperimentManager = mock()

private val mockBrokenSitePrompt: BrokenSitePrompt = mock()

private val requiredDaxOnboardingCtas: List<CtaId> = listOf(
Expand Down Expand Up @@ -168,7 +165,6 @@ class CtaViewModelTest {
extendedOnboardingFeatureToggles = mockExtendedOnboardingFeatureToggles,
subscriptions = mockSubscriptions,
duckPlayer = mockDuckPlayer,
highlightsOnboardingExperimentManager = mockHighlightsOnboardingExperimentManager,
brokenSitePrompt = mockBrokenSitePrompt,
)
}
Expand Down Expand Up @@ -794,28 +790,6 @@ class CtaViewModelTest {
assertNull(value)
}

@Test
fun givenHighlightsExperimentWhenRefreshCtaOnHomeTabAndIntroCtaWasNotPreviouslyShownThenExperimentIntroCtaShown() = runTest {
givenDaxOnboardingActive()
whenever(mockHighlightsOnboardingExperimentManager.isHighlightsEnabled()).thenReturn(true)
whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO)).thenReturn(false)
whenever(mockDismissedCtaDao.exists(CtaId.DAX_DIALOG_SERP)).thenReturn(true)

val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false)
assertTrue(value is DaxBubbleCta.DaxIntroSearchOptionsCta)
}

@Test
fun givenHighlightsExperimentWhenGettingFireDialogOnboardingDialogThenReturnExperimentFireDialogCta() = runTest {
givenDaxOnboardingActive()
whenever(mockHighlightsOnboardingExperimentManager.isHighlightsEnabled()).thenReturn(true)
whenever(mockDismissedCtaDao.exists(CtaId.DAX_FIRE_BUTTON)).thenReturn(false)

val value = testee.getFireDialogCta()

assertTrue(value is OnboardingDaxDialogCta.DaxFireButtonCta)
}

private suspend fun givenDaxOnboardingActive() {
whenever(mockUserStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,6 @@ import com.duckduckgo.app.global.model.SiteFactory
import com.duckduckgo.app.global.model.domain
import com.duckduckgo.app.global.model.domainMatchesUrl
import com.duckduckgo.app.location.data.LocationPermissionType
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.HighlightsOnboardingExperimentManager
import com.duckduckgo.app.pixels.AppPixelName
import com.duckduckgo.app.pixels.AppPixelName.AUTOCOMPLETE_BANNER_DISMISSED
import com.duckduckgo.app.pixels.AppPixelName.AUTOCOMPLETE_BANNER_SHOWN
Expand Down Expand Up @@ -449,7 +448,6 @@ class BrowserTabViewModel @Inject constructor(
private val duckChatJSHelper: DuckChatJSHelper,
private val refreshPixelSender: RefreshPixelSender,
private val changeOmnibarPositionFeature: ChangeOmnibarPositionFeature,
private val highlightsOnboardingExperimentManager: HighlightsOnboardingExperimentManager,
private val privacyProtectionTogglePlugin: PluginPoint<PrivacyProtectionTogglePlugin>,
private val showOnAppLaunchOptionHandler: ShowOnAppLaunchOptionHandler,
private val customHeadersProvider: CustomHeadersProvider,
Expand Down
88 changes: 18 additions & 70 deletions app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ import com.duckduckgo.app.onboarding.store.OnboardingStore
import com.duckduckgo.app.onboarding.store.UserStageStore
import com.duckduckgo.app.onboarding.store.daxOnboardingActive
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.HighlightsOnboardingExperimentManager
import com.duckduckgo.app.privacy.db.UserAllowListRepository
import com.duckduckgo.app.settings.db.SettingsDataStore
import com.duckduckgo.app.statistics.pixels.Pixel
Expand Down Expand Up @@ -80,7 +79,6 @@ class CtaViewModel @Inject constructor(
private val extendedOnboardingFeatureToggles: ExtendedOnboardingFeatureToggles,
private val subscriptions: Subscriptions,
private val duckPlayer: DuckPlayer,
private val highlightsOnboardingExperimentManager: HighlightsOnboardingExperimentManager,
private val brokenSitePrompt: BrokenSitePrompt,
) {
@ExperimentalCoroutinesApi
Expand Down Expand Up @@ -205,22 +203,14 @@ class CtaViewModel @Inject constructor(
suspend fun getFireDialogCta(): OnboardingDaxDialogCta? {
return withContext(dispatchers.io()) {
if (!daxOnboardingActive() || daxDialogFireEducationShown()) return@withContext null
if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
return@withContext OnboardingDaxDialogCta.DaxFireButtonCta(onboardingStore, appInstallStore)
} else {
return@withContext OnboardingDaxDialogCta.DaxFireButtonCta(onboardingStore, appInstallStore)
}
OnboardingDaxDialogCta.DaxFireButtonCta(onboardingStore, appInstallStore)
}
}

suspend fun getSiteSuggestionsDialogCta(): OnboardingDaxDialogCta? {
return withContext(dispatchers.io()) {
if (!daxOnboardingActive() || !canShowDaxIntroVisitSiteCta()) return@withContext null
if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
return@withContext OnboardingDaxDialogCta.DaxSiteSuggestionsCta(onboardingStore, appInstallStore)
} else {
return@withContext OnboardingDaxDialogCta.DaxSiteSuggestionsCta(onboardingStore, appInstallStore)
}
OnboardingDaxDialogCta.DaxSiteSuggestionsCta(onboardingStore, appInstallStore)
}
}

Expand All @@ -240,38 +230,22 @@ class CtaViewModel @Inject constructor(
}

canShowDaxIntroCta() && !extendedOnboardingFeatureToggles.noBrowserCtas().isEnabled() -> {
if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
DaxBubbleCta.DaxIntroSearchOptionsCta(onboardingStore, appInstallStore)
} else {
DaxBubbleCta.DaxIntroSearchOptionsCta(onboardingStore, appInstallStore)
}
DaxBubbleCta.DaxIntroSearchOptionsCta(onboardingStore, appInstallStore)
}

canShowDaxIntroVisitSiteCta() && !extendedOnboardingFeatureToggles.noBrowserCtas().isEnabled() -> {
if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
DaxBubbleCta.DaxIntroVisitSiteOptionsCta(onboardingStore, appInstallStore)
} else {
DaxBubbleCta.DaxIntroVisitSiteOptionsCta(onboardingStore, appInstallStore)
}
DaxBubbleCta.DaxIntroVisitSiteOptionsCta(onboardingStore, appInstallStore)
}

canShowDaxCtaEndOfJourney() && !extendedOnboardingFeatureToggles.noBrowserCtas().isEnabled() -> {
if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
DaxBubbleCta.DaxEndCta(onboardingStore, appInstallStore)
} else {
DaxBubbleCta.DaxEndCta(onboardingStore, appInstallStore)
}
DaxBubbleCta.DaxEndCta(onboardingStore, appInstallStore)
}

canShowPrivacyProCta() -> {
val titleRes: Int = R.string.onboardingPrivacyProDaxDialogTitle
val descriptionRes: Int = R.string.onboardingPrivacyProDaxDialogDescription

if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
DaxBubbleCta.DaxPrivacyProCta(onboardingStore, appInstallStore, titleRes, descriptionRes)
} else {
DaxBubbleCta.DaxPrivacyProCta(onboardingStore, appInstallStore, titleRes, descriptionRes)
}
DaxBubbleCta.DaxPrivacyProCta(onboardingStore, appInstallStore, titleRes, descriptionRes)
}

canShowWidgetCta() -> {
Expand Down Expand Up @@ -344,64 +318,38 @@ class CtaViewModel @Inject constructor(

// Trackers blocked
if (!daxDialogTrackersFoundShown() && !isSerpUrl(it.url) && it.orderedTrackerBlockedEntities().isNotEmpty()) {
return if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
OnboardingDaxDialogCta.DaxTrackersBlockedCta(
onboardingStore,
appInstallStore,
it.orderedTrackerBlockedEntities(),
settingsDataStore,
)
} else {
OnboardingDaxDialogCta.DaxTrackersBlockedCta(
onboardingStore,
appInstallStore,
it.orderedTrackerBlockedEntities(),
settingsDataStore,
)
}
return OnboardingDaxDialogCta.DaxTrackersBlockedCta(
onboardingStore,
appInstallStore,
it.orderedTrackerBlockedEntities(),
settingsDataStore,
)
}

// Is major network
if (it.entity != null) {
it.entity?.let { entity ->
if (!daxDialogNetworkShown() && !daxDialogTrackersFoundShown() && OnboardingDaxDialogCta.mainTrackerNetworks.any { mainNetwork ->
entity.displayName.contains(mainNetwork)
}
if (!daxDialogNetworkShown() && !daxDialogTrackersFoundShown() &&
OnboardingDaxDialogCta.mainTrackerNetworks.any { mainNetwork -> entity.displayName.contains(mainNetwork) }
) {
return if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
OnboardingDaxDialogCta.DaxMainNetworkCta(onboardingStore, appInstallStore, entity.displayName, host)
} else {
OnboardingDaxDialogCta.DaxMainNetworkCta(onboardingStore, appInstallStore, entity.displayName, host)
}
return OnboardingDaxDialogCta.DaxMainNetworkCta(onboardingStore, appInstallStore, entity.displayName, host)
}
}
}

// SERP
if (isSerpUrl(it.url) && !daxDialogSerpShown()) {
return if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
OnboardingDaxDialogCta.DaxSerpCta(onboardingStore, appInstallStore)
} else {
OnboardingDaxDialogCta.DaxSerpCta(onboardingStore, appInstallStore)
}
return OnboardingDaxDialogCta.DaxSerpCta(onboardingStore, appInstallStore)
}

// No trackers blocked
if (!isSerpUrl(it.url) && !daxDialogOtherShown() && !daxDialogTrackersFoundShown() && !daxDialogNetworkShown()) {
return if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
OnboardingDaxDialogCta.DaxNoTrackersCta(onboardingStore, appInstallStore)
} else {
OnboardingDaxDialogCta.DaxNoTrackersCta(onboardingStore, appInstallStore)
}
return OnboardingDaxDialogCta.DaxNoTrackersCta(onboardingStore, appInstallStore)
}

// End
if (canShowDaxCtaEndOfJourney() && daxDialogFireEducationShown()) {
return if (highlightsOnboardingExperimentManager.isHighlightsEnabled()) {
OnboardingDaxDialogCta.DaxEndCta(onboardingStore, appInstallStore)
} else {
OnboardingDaxDialogCta.DaxEndCta(onboardingStore, appInstallStore)
}
return OnboardingDaxDialogCta.DaxEndCta(onboardingStore, appInstallStore)
}

return null
Expand Down
Loading

0 comments on commit 5deffb0

Please sign in to comment.