Skip to content

Commit 436d546

Browse files
committed
Refactor post CTA experience toggles and remove unneeded experiment references.
1 parent 293a5c8 commit 436d546

File tree

9 files changed

+15
-639
lines changed

9 files changed

+15
-639
lines changed

app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import com.duckduckgo.app.settings.SettingsViewModel.Command.LaunchPrivateSearch
6464
import com.duckduckgo.app.settings.SettingsViewModel.Command.LaunchSyncSettings
6565
import com.duckduckgo.app.settings.SettingsViewModel.Command.LaunchWebTrackingProtectionScreen
6666
import com.duckduckgo.app.statistics.pixels.Pixel
67-
import com.duckduckgo.app.widget.experiment.PostCtaExperienceExperiment
67+
import com.duckduckgo.app.widget.experiment.PostCtaExperienceToggles
6868
import com.duckduckgo.app.widget.ui.WidgetCapabilities
6969
import com.duckduckgo.autoconsent.api.Autoconsent
7070
import com.duckduckgo.autofill.api.AutofillCapabilityChecker
@@ -124,7 +124,7 @@ class SettingsViewModel @Inject constructor(
124124
private val androidBrowserConfigFeature: AndroidBrowserConfigFeature,
125125
private val settingsPageFeature: SettingsPageFeature,
126126
private val widgetCapabilities: WidgetCapabilities,
127-
private val postCtaExperienceExperiment: PostCtaExperienceExperiment,
127+
private val postCtaExperienceToggles: PostCtaExperienceToggles,
128128
private val rebrandingFeatureToggle: SubscriptionRebrandingFeatureToggle,
129129
) : ViewModel(), DefaultLifecycleObserver {
130130

@@ -255,13 +255,11 @@ class SettingsViewModel @Inject constructor(
255255

256256
fun userRequestedToAddHomeScreenWidget() {
257257
viewModelScope.launch(dispatcherProvider.io()) {
258-
postCtaExperienceExperiment.enroll()
259-
val simpleWidgetPrompt = postCtaExperienceExperiment.isSimpleSearchWidgetPrompt()
258+
val simpleWidgetPrompt = postCtaExperienceToggles.self().isEnabled() && postCtaExperienceToggles.simpleSearchWidgetPrompt().isEnabled()
260259
command.send(LaunchAddHomeScreenWidget(simpleWidgetPrompt))
261260
if (!currentViewState().widgetsInstalled) {
262261
widgetPromptShown = true
263262
}
264-
postCtaExperienceExperiment.fireSettingsWidgetDisplay()
265263
}
266264
}
267265

@@ -356,7 +354,6 @@ class SettingsViewModel @Inject constructor(
356354
widgetPromptShown = false
357355
if (!widgetsInstalled) {
358356
logcat { "Widget bottom sheet was dismissed." }
359-
postCtaExperienceExperiment.fireSettingsWidgetDismiss()
360357
}
361358
}
362359
}

app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import com.duckduckgo.app.settings.db.SettingsDataStore
3232
import com.duckduckgo.app.statistics.pixels.Pixel
3333
import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Daily
3434
import com.duckduckgo.app.systemsearch.SystemSearchViewModel.Command.UpdateVoiceSearch
35-
import com.duckduckgo.app.widget.experiment.PostCtaExperienceExperiment
3635
import com.duckduckgo.browser.api.autocomplete.AutoComplete
3736
import com.duckduckgo.browser.api.autocomplete.AutoComplete.AutoCompleteResult
3837
import com.duckduckgo.browser.api.autocomplete.AutoComplete.AutoCompleteSuggestion
@@ -91,7 +90,6 @@ class SystemSearchViewModel @Inject constructor(
9190
private val history: NavigationHistory,
9291
private val dispatchers: DispatcherProvider,
9392
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
94-
private val postCtaExperienceExperiment: PostCtaExperienceExperiment,
9593
private val onboardingHomeScreenWidgetExperiment: OnboardingHomeScreenWidgetExperiment,
9694
) : ViewModel(), EditSavedSiteDialogFragment.EditSavedSiteListener {
9795

@@ -308,8 +306,6 @@ class SystemSearchViewModel @Inject constructor(
308306
userStageStore.stageCompleted(AppStage.NEW)
309307
command.value = Command.LaunchBrowser(query.trim())
310308
pixel.fire(INTERSTITIAL_LAUNCH_BROWSER_QUERY)
311-
postCtaExperienceExperiment.fireWidgetSearch()
312-
postCtaExperienceExperiment.fireWidgetSearchXCount()
313309
onboardingHomeScreenWidgetExperiment.fireWidgetSearch()
314310
onboardingHomeScreenWidgetExperiment.fireWidgetSearchXCount()
315311
}
@@ -326,8 +322,6 @@ class SystemSearchViewModel @Inject constructor(
326322
}
327323
pixel.fire(INTERSTITIAL_LAUNCH_BROWSER_QUERY)
328324
viewModelScope.launch {
329-
postCtaExperienceExperiment.fireWidgetSearch()
330-
postCtaExperienceExperiment.fireWidgetSearchXCount()
331325
onboardingHomeScreenWidgetExperiment.fireWidgetSearch()
332326
onboardingHomeScreenWidgetExperiment.fireWidgetSearchXCount()
333327
}

app/src/main/java/com/duckduckgo/app/widget/experiment/PostCtaExperienceExperiment.kt

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

app/src/main/java/com/duckduckgo/app/widget/experiment/PostCtaExperienceToggles.kt

Lines changed: 2 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -17,129 +17,18 @@
1717
package com.duckduckgo.app.widget.experiment
1818

1919
import com.duckduckgo.anvil.annotations.ContributesRemoteFeature
20-
import com.duckduckgo.app.widget.experiment.PostCtaExperienceToggles.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
26-
import com.duckduckgo.feature.toggles.api.Toggle.State.CohortName
27-
import com.squareup.anvil.annotations.ContributesMultibinding
28-
import dagger.SingleInstanceIn
29-
import javax.inject.Inject
3022

3123
@ContributesRemoteFeature(
3224
scope = AppScope::class,
33-
featureName = BASE_EXPERIMENT_NAME,
25+
featureName = "postCtaExperience",
3426
)
3527
interface PostCtaExperienceToggles {
3628

3729
@Toggle.DefaultValue(Toggle.DefaultFeatureValue.FALSE)
3830
fun self(): Toggle
3931

4032
@Toggle.DefaultValue(Toggle.DefaultFeatureValue.FALSE)
41-
fun postCtaExperienceExperimentJun25(): Toggle
42-
43-
enum class Cohorts(override val cohortName: String) : CohortName {
44-
CONTROL("control"), // Search and Favorites widget prompt
45-
VARIANT_SIMPLE_SEARCH_WIDGET_PROMPT("simpleSearchWidgetPrompt"), // Simple Search widget prompt
46-
}
47-
48-
companion object {
49-
internal const val BASE_EXPERIMENT_NAME = "postCtaExperience"
50-
}
51-
}
52-
53-
@ContributesMultibinding(AppScope::class)
54-
@SingleInstanceIn(AppScope::class)
55-
class PostCtaExperiencePixelsPlugin @Inject constructor(
56-
private val toggles: PostCtaExperienceToggles,
57-
) : MetricsPixelPlugin {
58-
59-
override suspend fun getMetrics(): List<MetricsPixel> {
60-
return listOf(
61-
MetricsPixel(
62-
metric = METRIC_SETTINGS_WIDGET_DISPLAY,
63-
value = "1",
64-
toggle = toggles.postCtaExperienceExperimentJun25(),
65-
conversionWindow = listOf(
66-
ConversionWindow(lowerWindow = 0, upperWindow = 0),
67-
),
68-
),
69-
MetricsPixel(
70-
metric = METRIC_SETTINGS_WIDGET_ADD,
71-
value = "1",
72-
toggle = toggles.postCtaExperienceExperimentJun25(),
73-
conversionWindow = listOf(
74-
ConversionWindow(lowerWindow = 0, upperWindow = 0),
75-
),
76-
),
77-
MetricsPixel(
78-
metric = METRIC_SETTINGS_WIDGET_DISMISS,
79-
value = "1",
80-
toggle = toggles.postCtaExperienceExperimentJun25(),
81-
conversionWindow = listOf(
82-
ConversionWindow(lowerWindow = 0, upperWindow = 0),
83-
),
84-
),
85-
MetricsPixel(
86-
metric = METRIC_WIDGET_SEARCH,
87-
value = "1",
88-
toggle = toggles.postCtaExperienceExperimentJun25(),
89-
conversionWindow = listOf(
90-
ConversionWindow(lowerWindow = 5, upperWindow = 7),
91-
ConversionWindow(lowerWindow = 8, upperWindow = 14),
92-
),
93-
),
94-
MetricsPixel(
95-
metric = METRIC_WIDGET_SEARCH_3X,
96-
value = "1",
97-
toggle = toggles.postCtaExperienceExperimentJun25(),
98-
conversionWindow = listOf(
99-
ConversionWindow(lowerWindow = 5, upperWindow = 7),
100-
),
101-
),
102-
MetricsPixel(
103-
metric = METRIC_WIDGET_SEARCH_5X,
104-
value = "1",
105-
toggle = toggles.postCtaExperienceExperimentJun25(),
106-
conversionWindow = listOf(
107-
ConversionWindow(lowerWindow = 5, upperWindow = 7),
108-
),
109-
),
110-
)
111-
}
112-
113-
suspend fun getSettingsWidgetDisplayMetric(): MetricsPixel? {
114-
return this.getMetrics().firstOrNull { it.metric == METRIC_SETTINGS_WIDGET_DISPLAY }
115-
}
116-
117-
suspend fun getSettingsWidgetAddMetric(): MetricsPixel? {
118-
return this.getMetrics().firstOrNull { it.metric == METRIC_SETTINGS_WIDGET_ADD }
119-
}
120-
121-
suspend fun getSettingsWidgetDismissMetric(): MetricsPixel? {
122-
return this.getMetrics().firstOrNull { it.metric == METRIC_SETTINGS_WIDGET_DISMISS }
123-
}
124-
125-
suspend fun getWidgetSearchMetric(): MetricsPixel? {
126-
return this.getMetrics().firstOrNull { it.metric == METRIC_WIDGET_SEARCH }
127-
}
128-
129-
suspend fun getWidgetSearch3xMetric(): MetricsPixel? {
130-
return this.getMetrics().firstOrNull { it.metric == METRIC_WIDGET_SEARCH_3X }
131-
}
132-
133-
suspend fun getWidgetSearch5xMetric(): MetricsPixel? {
134-
return this.getMetrics().firstOrNull { it.metric == METRIC_WIDGET_SEARCH_5X }
135-
}
136-
137-
companion object {
138-
internal const val METRIC_SETTINGS_WIDGET_DISPLAY = "settingsWidgetDisplay"
139-
internal const val METRIC_SETTINGS_WIDGET_ADD = "settingsWidgetAdd"
140-
internal const val METRIC_SETTINGS_WIDGET_DISMISS = "settingsWidgetDismiss"
141-
internal const val METRIC_WIDGET_SEARCH = "widgetSearch"
142-
internal const val METRIC_WIDGET_SEARCH_3X = "widgetSearch3x"
143-
internal const val METRIC_WIDGET_SEARCH_5X = "widgetSearch5x"
144-
}
33+
fun simpleSearchWidgetPrompt(): Toggle
14534
}

app/src/main/java/com/duckduckgo/widget/SearchWidgetLifecycleDelegate.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,21 @@ import com.duckduckgo.app.global.install.AppInstallStore
2020
import com.duckduckgo.app.pixels.AppPixelName
2121
import com.duckduckgo.app.pixels.AppPixelName.WIDGETS_DELETED
2222
import com.duckduckgo.app.statistics.pixels.Pixel
23-
import com.duckduckgo.app.widget.experiment.PostCtaExperienceExperiment
2423
import com.duckduckgo.app.widget.ui.AppWidgetCapabilities
2524
import javax.inject.Inject
2625

2726
class SearchWidgetLifecycleDelegate @Inject constructor(
2827
private val appInstallStore: AppInstallStore,
2928
private val widgetCapabilities: AppWidgetCapabilities,
3029
private val pixel: Pixel,
31-
private val postCtaExperienceExperiment: PostCtaExperienceExperiment,
3230
) {
3331

34-
suspend fun handleOnWidgetEnabled(widgetSpecificAddedPixel: AppPixelName) {
32+
fun handleOnWidgetEnabled(widgetSpecificAddedPixel: AppPixelName) {
3533
if (!appInstallStore.widgetInstalled) {
3634
appInstallStore.widgetInstalled = true
3735
pixel.fire(AppPixelName.WIDGETS_ADDED)
3836
}
3937
pixel.fire(widgetSpecificAddedPixel)
40-
postCtaExperienceExperiment.fireSettingsWidgetAdd()
4138
}
4239

4340
fun handleOnWidgetDisabled(widgetSpecificDeletedPixel: AppPixelName) {

0 commit comments

Comments
 (0)