Skip to content

Commit cceb644

Browse files
committed
Refactor onboarding widget experiment references to use new toggles implementation.
1 parent 436d546 commit cceb644

File tree

9 files changed

+25
-522
lines changed

9 files changed

+25
-522
lines changed

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ import com.duckduckgo.app.browser.commands.NavigationCommand
9191
import com.duckduckgo.app.browser.commands.NavigationCommand.Navigate
9292
import com.duckduckgo.app.browser.customtabs.CustomTabPixelNames
9393
import com.duckduckgo.app.browser.defaultbrowsing.prompts.AdditionalDefaultBrowserPrompts
94-
import com.duckduckgo.app.browser.defaultbrowsing.prompts.ui.experiment.OnboardingHomeScreenWidgetExperiment
94+
import com.duckduckgo.app.browser.defaultbrowsing.prompts.ui.experiment.OnboardingHomeScreenWidgetToggles
9595
import com.duckduckgo.app.browser.duckplayer.DUCK_PLAYER_FEATURE_NAME
9696
import com.duckduckgo.app.browser.duckplayer.DUCK_PLAYER_PAGE_FEATURE_NAME
9797
import com.duckduckgo.app.browser.duckplayer.DuckPlayerJSHelper
@@ -561,7 +561,7 @@ class BrowserTabViewModelTest {
561561
private val mockSiteHttpErrorHandler: HttpCodeSiteErrorHandler = mock()
562562
private val mockSubscriptionsJSHelper: SubscriptionsJSHelper = mock()
563563
private val mockReactivateUsersExperiment: ReactivateUsersExperiment = mock()
564-
private val mockOnboardingHomeScreenWidgetExperiment: OnboardingHomeScreenWidgetExperiment = mock()
564+
private val mockOnboardingHomeScreenWidgetToggles: OnboardingHomeScreenWidgetToggles = mock()
565565
private val mockRebrandingFeatureToggle: SubscriptionRebrandingFeatureToggle = mock()
566566
private val tabManager: TabManager = mock()
567567

@@ -674,7 +674,7 @@ class BrowserTabViewModelTest {
674674
subscriptions = subscriptions,
675675
duckPlayer = mockDuckPlayer,
676676
brokenSitePrompt = mockBrokenSitePrompt,
677-
onboardingHomeScreenWidgetExperiment = mockOnboardingHomeScreenWidgetExperiment,
677+
onboardingHomeScreenWidgetToggles = mockOnboardingHomeScreenWidgetToggles,
678678
onboardingDesignExperimentManager = mockOnboardingDesignExperimentManager,
679679
rebrandingFeatureToggle = mockRebrandingFeatureToggle,
680680
)

app/src/androidTest/java/com/duckduckgo/app/cta/ui/CtaViewModelTest.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import androidx.room.Room
2525
import androidx.test.platform.app.InstrumentationRegistry
2626
import com.duckduckgo.app.browser.DuckDuckGoUrlDetectorImpl
2727
import com.duckduckgo.app.browser.R
28-
import com.duckduckgo.app.browser.defaultbrowsing.prompts.ui.experiment.OnboardingHomeScreenWidgetExperiment
28+
import com.duckduckgo.app.browser.defaultbrowsing.prompts.ui.experiment.OnboardingHomeScreenWidgetToggles
2929
import com.duckduckgo.app.cta.db.DismissedCtaDao
3030
import com.duckduckgo.app.cta.model.CtaId
3131
import com.duckduckgo.app.cta.model.DismissedCta
@@ -60,6 +60,7 @@ import com.duckduckgo.duckplayer.api.DuckPlayer.DuckPlayerState.DISABLED
6060
import com.duckduckgo.duckplayer.api.DuckPlayer.DuckPlayerState.ENABLED
6161
import com.duckduckgo.duckplayer.api.DuckPlayer.UserPreferences
6262
import com.duckduckgo.duckplayer.api.PrivatePlayerMode.AlwaysAsk
63+
import com.duckduckgo.feature.toggles.api.FakeFeatureToggleFactory
6364
import com.duckduckgo.feature.toggles.api.Toggle
6465
import com.duckduckgo.subscriptions.api.SubscriptionRebrandingFeatureToggle
6566
import com.duckduckgo.subscriptions.api.Subscriptions
@@ -121,7 +122,7 @@ class CtaViewModelTest {
121122

122123
private val mockBrokenSitePrompt: BrokenSitePrompt = mock()
123124

124-
private val mockOnboardingHomeScreenWidgetExperiment: OnboardingHomeScreenWidgetExperiment = mock()
125+
private val fakeOnboardingHomeScreenWidgetToggles = FakeFeatureToggleFactory.create(OnboardingHomeScreenWidgetToggles::class.java)
125126

126127
private val mockOnboardingDesignExperimentManager: OnboardingDesignExperimentManager = mock()
127128

@@ -183,7 +184,7 @@ class CtaViewModelTest {
183184
subscriptions = mockSubscriptions,
184185
duckPlayer = mockDuckPlayer,
185186
brokenSitePrompt = mockBrokenSitePrompt,
186-
onboardingHomeScreenWidgetExperiment = mockOnboardingHomeScreenWidgetExperiment,
187+
onboardingHomeScreenWidgetToggles = fakeOnboardingHomeScreenWidgetToggles,
187188
onboardingDesignExperimentManager = mockOnboardingDesignExperimentManager,
188189
rebrandingFeatureToggle = mockRebrandingFeatureToggle,
189190
)
@@ -356,7 +357,8 @@ class CtaViewModelTest {
356357
fun whenRefreshCtaOnHomeTabAndHideTipsIsTrueAndWidgetCompatibleThenReturnWidgetCta() = runTest {
357358
whenever(mockSettingsDataStore.hideTips).thenReturn(true)
358359
whenever(mockWidgetCapabilities.supportsAutomaticWidgetAdd).thenReturn(true)
359-
whenever(mockOnboardingHomeScreenWidgetExperiment.isOnboardingHomeScreenWidgetExperiment()).thenReturn(false)
360+
fakeOnboardingHomeScreenWidgetToggles.self().setRawStoredState(Toggle.State(true))
361+
fakeOnboardingHomeScreenWidgetToggles.onboardingHomeScreenWidgetPrompt().setRawStoredState(Toggle.State(false))
360362

361363
val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false, detectedRefreshPatterns = detectedRefreshPatterns)
362364
assertTrue(value is HomePanelCta.AddWidgetAuto)
@@ -382,7 +384,8 @@ class CtaViewModelTest {
382384
whenever(mockSettingsDataStore.hideTips).thenReturn(true)
383385
whenever(mockWidgetCapabilities.supportsAutomaticWidgetAdd).thenReturn(true)
384386
whenever(mockWidgetCapabilities.hasInstalledWidgets).thenReturn(false)
385-
whenever(mockOnboardingHomeScreenWidgetExperiment.isOnboardingHomeScreenWidgetExperiment()).thenReturn(false)
387+
fakeOnboardingHomeScreenWidgetToggles.self().setRawStoredState(Toggle.State(true))
388+
fakeOnboardingHomeScreenWidgetToggles.onboardingHomeScreenWidgetPrompt().setRawStoredState(Toggle.State(false))
386389

387390
val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false, detectedRefreshPatterns = detectedRefreshPatterns)
388391
assertTrue(value is HomePanelCta.AddWidgetAuto)
@@ -393,7 +396,8 @@ class CtaViewModelTest {
393396
whenever(mockSettingsDataStore.hideTips).thenReturn(true)
394397
whenever(mockWidgetCapabilities.supportsAutomaticWidgetAdd).thenReturn(true)
395398
whenever(mockWidgetCapabilities.hasInstalledWidgets).thenReturn(false)
396-
whenever(mockOnboardingHomeScreenWidgetExperiment.isOnboardingHomeScreenWidgetExperiment()).thenReturn(true)
399+
fakeOnboardingHomeScreenWidgetToggles.self().setRawStoredState(Toggle.State(true))
400+
fakeOnboardingHomeScreenWidgetToggles.onboardingHomeScreenWidgetPrompt().setRawStoredState(Toggle.State(true))
397401

398402
val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false, detectedRefreshPatterns = detectedRefreshPatterns)
399403
assertTrue(value is HomePanelCta.AddWidgetAutoOnboardingExperiment)
@@ -897,7 +901,8 @@ class CtaViewModelTest {
897901
whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO_VISIT_SITE)).thenReturn(true)
898902
whenever(mockDismissedCtaDao.exists(CtaId.DAX_END)).thenReturn(true)
899903
whenever(mockWidgetCapabilities.supportsAutomaticWidgetAdd).thenReturn(true)
900-
whenever(mockOnboardingHomeScreenWidgetExperiment.isOnboardingHomeScreenWidgetExperiment()).thenReturn(false)
904+
fakeOnboardingHomeScreenWidgetToggles.self().setRawStoredState(Toggle.State(true))
905+
fakeOnboardingHomeScreenWidgetToggles.onboardingHomeScreenWidgetPrompt().setRawStoredState(Toggle.State(false))
901906

902907
val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false, detectedRefreshPatterns = detectedRefreshPatterns)
903908
assertFalse(value is DaxBubbleCta.DaxPrivacyProCta)

app/src/main/java/com/duckduckgo/app/browser/defaultbrowsing/prompts/ui/experiment/OnboardingHomeScreenWidgetExperiment.kt

Lines changed: 0 additions & 140 deletions
This file was deleted.

app/src/main/java/com/duckduckgo/app/browser/defaultbrowsing/prompts/ui/experiment/OnboardingHomeScreenWidgetToggles.kt

Lines changed: 2 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -17,131 +17,20 @@
1717
package com.duckduckgo.app.browser.defaultbrowsing.prompts.ui.experiment
1818

1919
import com.duckduckgo.anvil.annotations.ContributesRemoteFeature
20-
import com.duckduckgo.app.browser.defaultbrowsing.prompts.ui.experiment.OnboardingHomeScreenWidgetToggles.Companion.BASE_EXPERIMENT_NAME
2120
import com.duckduckgo.di.scopes.AppScope
22-
import com.duckduckgo.feature.toggles.api.ConversionWindow
23-
import com.duckduckgo.feature.toggles.api.MetricsPixel
24-
import com.duckduckgo.feature.toggles.api.MetricsPixelPlugin
2521
import com.duckduckgo.feature.toggles.api.Toggle
2622
import com.duckduckgo.feature.toggles.api.Toggle.DefaultFeatureValue.FALSE
2723
import com.duckduckgo.feature.toggles.api.Toggle.DefaultValue
28-
import com.duckduckgo.feature.toggles.api.Toggle.State.CohortName
29-
import com.squareup.anvil.annotations.ContributesMultibinding
30-
import dagger.SingleInstanceIn
31-
import javax.inject.Inject
3224

3325
@ContributesRemoteFeature(
3426
scope = AppScope::class,
35-
featureName = BASE_EXPERIMENT_NAME,
27+
featureName = "onboardingHomeScreenWidget",
3628
)
3729
interface OnboardingHomeScreenWidgetToggles {
3830

3931
@DefaultValue(FALSE)
4032
fun self(): Toggle
4133

4234
@DefaultValue(FALSE)
43-
fun onboardingHomeScreenWidgetExperimentJun25(): Toggle
44-
45-
enum class Cohorts(override val cohortName: String) : CohortName {
46-
CONTROL("control"), // current bottom sheet prompt
47-
VARIANT_ONBOARDING_HOME_SCREEN_WIDGET_PROMPT("experimentalOnboardingHomeScreenWidgetPrompt"), // new bottom sheet prompt
48-
}
49-
50-
companion object {
51-
internal const val BASE_EXPERIMENT_NAME = "onboardingHomeScreenWidget"
52-
}
53-
}
54-
55-
@ContributesMultibinding(AppScope::class)
56-
@SingleInstanceIn(AppScope::class)
57-
class OnboardingHomeScreenWidgetPixelsPlugin @Inject constructor(
58-
private val toggles: OnboardingHomeScreenWidgetToggles,
59-
) : MetricsPixelPlugin {
60-
61-
override suspend fun getMetrics(): List<MetricsPixel> {
62-
return listOf(
63-
MetricsPixel(
64-
metric = METRIC_ONBOARDING_WIDGET_DISPLAY,
65-
value = "1",
66-
toggle = toggles.onboardingHomeScreenWidgetExperimentJun25(),
67-
conversionWindow = listOf(
68-
ConversionWindow(lowerWindow = 0, upperWindow = 0),
69-
),
70-
),
71-
MetricsPixel(
72-
metric = METRIC_ONBOARDING_WIDGET_ADD,
73-
value = "1",
74-
toggle = toggles.onboardingHomeScreenWidgetExperimentJun25(),
75-
conversionWindow = listOf(
76-
ConversionWindow(lowerWindow = 0, upperWindow = 0),
77-
),
78-
),
79-
MetricsPixel(
80-
metric = METRIC_ONBOARDING_WIDGET_DISMISS,
81-
value = "1",
82-
toggle = toggles.onboardingHomeScreenWidgetExperimentJun25(),
83-
conversionWindow = listOf(
84-
ConversionWindow(lowerWindow = 0, upperWindow = 0),
85-
),
86-
),
87-
MetricsPixel(
88-
metric = METRIC_WIDGET_SEARCH,
89-
value = "1",
90-
toggle = toggles.onboardingHomeScreenWidgetExperimentJun25(),
91-
conversionWindow = listOf(
92-
ConversionWindow(lowerWindow = 5, upperWindow = 7),
93-
ConversionWindow(lowerWindow = 8, upperWindow = 14),
94-
),
95-
),
96-
MetricsPixel(
97-
metric = METRIC_WIDGET_SEARCH_3X,
98-
value = "1",
99-
toggle = toggles.onboardingHomeScreenWidgetExperimentJun25(),
100-
conversionWindow = listOf(
101-
ConversionWindow(lowerWindow = 5, upperWindow = 7),
102-
),
103-
),
104-
MetricsPixel(
105-
metric = METRIC_WIDGET_SEARCH_5X,
106-
value = "1",
107-
toggle = toggles.onboardingHomeScreenWidgetExperimentJun25(),
108-
conversionWindow = listOf(
109-
ConversionWindow(lowerWindow = 5, upperWindow = 7),
110-
),
111-
),
112-
)
113-
}
114-
115-
suspend fun getOnboardingWidgetDisplayMetric(): MetricsPixel? {
116-
return this.getMetrics().firstOrNull { it.metric == METRIC_ONBOARDING_WIDGET_DISPLAY }
117-
}
118-
119-
suspend fun getOnboardingWidgetAddMetric(): MetricsPixel? {
120-
return this.getMetrics().firstOrNull { it.metric == METRIC_ONBOARDING_WIDGET_ADD }
121-
}
122-
123-
suspend fun getOnboardingWidgetDismissMetric(): MetricsPixel? {
124-
return this.getMetrics().firstOrNull { it.metric == METRIC_ONBOARDING_WIDGET_DISMISS }
125-
}
126-
127-
suspend fun getWidgetSearchMetric(): MetricsPixel? {
128-
return this.getMetrics().firstOrNull { it.metric == METRIC_WIDGET_SEARCH }
129-
}
130-
131-
suspend fun getWidgetSearch3xMetric(): MetricsPixel? {
132-
return this.getMetrics().firstOrNull { it.metric == METRIC_WIDGET_SEARCH_3X }
133-
}
134-
135-
suspend fun getWidgetSearch5xMetric(): MetricsPixel? {
136-
return this.getMetrics().firstOrNull { it.metric == METRIC_WIDGET_SEARCH_5X }
137-
}
138-
139-
companion object {
140-
internal const val METRIC_ONBOARDING_WIDGET_DISPLAY = "onboardingWidgetDisplay"
141-
internal const val METRIC_ONBOARDING_WIDGET_ADD = "onboardingWidgetAdd"
142-
internal const val METRIC_ONBOARDING_WIDGET_DISMISS = "onboardingWidgetDismiss"
143-
internal const val METRIC_WIDGET_SEARCH = "widgetSearch"
144-
internal const val METRIC_WIDGET_SEARCH_3X = "widgetSearch3x"
145-
internal const val METRIC_WIDGET_SEARCH_5X = "widgetSearch5x"
146-
}
35+
fun onboardingHomeScreenWidgetPrompt(): Toggle
14736
}

0 commit comments

Comments
 (0)