Skip to content

Commit f8afe22

Browse files
authored
Add new onboarding design experiment for Oct25 (#6851)
Task/Issue URL: https://app.asana.com/1/137249556945/project/488551667048375/task/1211475325524763?focus=true ### Description This PR updates the onboarding design experiment toggle from `onboardingDesignExperimentAug25` to `onboardingDesignExperimentOct25` and adds the corresponding feature configuration in the privacy config JSON with three cohorts: modifiedControl, bb, and buck. ### Steps to test this PR _Onboarding Design Experiment_ - [ ] Verify that the experiment toggle is correctly renamed to `onboardingDesignExperimentOct25` - [ ] Confirm that the privacy config includes the new experiment with the three cohorts (modifiedControl, bb, buck) with equal weights - [ ] Test that the metrics pixel plugin correctly references the updated toggle name ### UI changes No UI changes in this PR.
1 parent 465359c commit f8afe22

File tree

4 files changed

+456
-403
lines changed

4 files changed

+456
-403
lines changed

app/src/main/java/com/duckduckgo/app/onboardingdesignexperiment/OnboardingDesignExperimentManager.kt

Lines changed: 53 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -36,34 +36,58 @@ import com.duckduckgo.privacy.config.api.PrivacyConfigCallbackPlugin
3636
import com.squareup.anvil.annotations.ContributesBinding
3737
import com.squareup.anvil.annotations.ContributesMultibinding
3838
import dagger.SingleInstanceIn
39-
import javax.inject.Inject
4039
import kotlinx.coroutines.CoroutineScope
4140
import kotlinx.coroutines.delay
4241
import kotlinx.coroutines.launch
4342
import kotlinx.coroutines.withContext
43+
import javax.inject.Inject
4444

4545
interface OnboardingDesignExperimentManager {
4646
suspend fun enroll()
47+
4748
fun isAnyExperimentEnrolledAndEnabled(): Boolean
49+
4850
fun isModifiedControlEnrolledAndEnabled(): Boolean
51+
4952
fun isBuckEnrolledAndEnabled(): Boolean
53+
5054
fun isBbEnrolledAndEnabled(): Boolean
55+
5156
suspend fun fireIntroScreenDisplayedPixel()
57+
5258
suspend fun fireComparisonScreenDisplayedPixel()
59+
5360
suspend fun fireChooseBrowserPixel()
61+
5462
suspend fun fireSetDefaultRatePixel()
63+
5564
suspend fun fireSetAddressBarDisplayedPixel()
65+
5666
suspend fun fireAddressBarSetTopPixel()
67+
5768
suspend fun fireAddressBarSetBottomPixel()
69+
5870
suspend fun fireSearchOrNavCustomPixel()
71+
5972
suspend fun firePrivacyDashClickedFromOnboardingPixel()
73+
6074
suspend fun fireFireButtonClickedFromOnboardingPixel()
75+
6176
suspend fun fireInContextDialogShownPixel(cta: Cta?)
62-
suspend fun fireOptionSelectedPixel(cta: Cta, index: Int)
77+
78+
suspend fun fireOptionSelectedPixel(
79+
cta: Cta,
80+
index: Int,
81+
)
82+
6383
suspend fun fireSiteSuggestionOptionSelectedPixel(index: Int)
84+
6485
suspend fun onWebPageFinishedLoading(url: String?)
86+
6587
fun getCohort(): String?
88+
6689
suspend fun waitForPrivacyConfig(): Boolean
90+
6791
suspend fun isWaitForLocalPrivacyConfigEnabled(): Boolean
6892
}
6993

@@ -86,8 +110,8 @@ class RealOnboardingDesignExperimentManager @Inject constructor(
86110
private val appBuildConfig: AppBuildConfig,
87111
private val deviceInfo: DeviceInfo,
88112
private val duckDuckGoUrlDetector: DuckDuckGoUrlDetector,
89-
) : OnboardingDesignExperimentManager, PrivacyConfigCallbackPlugin {
90-
113+
) : OnboardingDesignExperimentManager,
114+
PrivacyConfigCallbackPlugin {
91115
private var isExperimentEnabled: Boolean? = null
92116
private var onboardingDesignExperimentCohort: OnboardingDesignExperimentCohort? = null
93117

@@ -100,9 +124,7 @@ class RealOnboardingDesignExperimentManager @Inject constructor(
100124
return true
101125
}
102126

103-
override suspend fun isWaitForLocalPrivacyConfigEnabled(): Boolean {
104-
return onboardingDesignExperimentToggles.waitForLocalPrivacyConfig().isEnabled()
105-
}
127+
override suspend fun isWaitForLocalPrivacyConfigEnabled(): Boolean = onboardingDesignExperimentToggles.waitForLocalPrivacyConfig().isEnabled()
106128

107129
override fun onPrivacyConfigPersisted() {
108130
privacyPersisted = true
@@ -117,9 +139,7 @@ class RealOnboardingDesignExperimentManager @Inject constructor(
117139
}
118140
}
119141

120-
override fun getCohort(): String? {
121-
return onboardingDesignExperimentCohort?.cohortName
122-
}
142+
override fun getCohort(): String? = onboardingDesignExperimentCohort?.cohortName
123143

124144
/**
125145
* Enrolls the user in the onboarding design experiment if they are eligible.
@@ -128,24 +148,28 @@ class RealOnboardingDesignExperimentManager @Inject constructor(
128148
override suspend fun enroll() {
129149
withContext(dispatcherProvider.io()) {
130150
if (isEligibleForEnrolment()) {
131-
onboardingDesignExperimentToggles.onboardingDesignExperimentAug25().enroll()
151+
onboardingDesignExperimentToggles.onboardingDesignExperimentOct25().enroll()
132152
setCachedProperties()
133153
}
134154
}
135155
}
136156

137-
override fun isAnyExperimentEnrolledAndEnabled() = isModifiedControlEnrolledAndEnabled() ||
138-
isBuckEnrolledAndEnabled() ||
139-
isBbEnrolledAndEnabled()
157+
override fun isAnyExperimentEnrolledAndEnabled() =
158+
isModifiedControlEnrolledAndEnabled() ||
159+
isBuckEnrolledAndEnabled() ||
160+
isBbEnrolledAndEnabled()
140161

141-
override fun isModifiedControlEnrolledAndEnabled(): Boolean = isExperimentEnabled == true &&
142-
onboardingDesignExperimentCohort == MODIFIED_CONTROL
162+
override fun isModifiedControlEnrolledAndEnabled(): Boolean =
163+
isExperimentEnabled == true &&
164+
onboardingDesignExperimentCohort == MODIFIED_CONTROL
143165

144-
override fun isBuckEnrolledAndEnabled(): Boolean = isExperimentEnabled == true &&
145-
onboardingDesignExperimentCohort == BUCK
166+
override fun isBuckEnrolledAndEnabled(): Boolean =
167+
isExperimentEnabled == true &&
168+
onboardingDesignExperimentCohort == BUCK
146169

147-
override fun isBbEnrolledAndEnabled(): Boolean = isExperimentEnabled == true &&
148-
onboardingDesignExperimentCohort == BB
170+
override fun isBbEnrolledAndEnabled(): Boolean =
171+
isExperimentEnabled == true &&
172+
onboardingDesignExperimentCohort == BB
149173

150174
override suspend fun fireIntroScreenDisplayedPixel() {
151175
onboardingExperimentMetricsPixelPlugin.getIntroScreenDisplayedMetric()?.fire()
@@ -326,24 +350,21 @@ class RealOnboardingDesignExperimentManager @Inject constructor(
326350

327351
private suspend fun isEligibleForEnrolment(): Boolean = isAtLeastAndroid11() && !isTablet() && !isReturningUser()
328352

329-
private fun isTablet(): Boolean =
330-
deviceInfo.formFactor() == TABLET
353+
private fun isTablet(): Boolean = deviceInfo.formFactor() == TABLET
331354

332-
private suspend fun isReturningUser(): Boolean =
333-
appBuildConfig.isAppReinstall()
355+
private suspend fun isReturningUser(): Boolean = appBuildConfig.isAppReinstall()
334356

335-
private fun isAtLeastAndroid11(): Boolean =
336-
appBuildConfig.sdkInt >= 30
357+
private fun isAtLeastAndroid11(): Boolean = appBuildConfig.sdkInt >= 30
337358

338359
private suspend fun setCachedProperties() {
339360
withContext(dispatcherProvider.io()) {
340361
onboardingDesignExperimentCohort = getEnrolledAndEnabledExperimentCohort()
341-
isExperimentEnabled = onboardingDesignExperimentToggles.onboardingDesignExperimentAug25().isEnabled()
362+
isExperimentEnabled = onboardingDesignExperimentToggles.onboardingDesignExperimentOct25().isEnabled()
342363
}
343364
}
344365

345366
private suspend fun getEnrolledAndEnabledExperimentCohort(): OnboardingDesignExperimentCohort? {
346-
val cohort = onboardingDesignExperimentToggles.onboardingDesignExperimentAug25().getCohort()
367+
val cohort = onboardingDesignExperimentToggles.onboardingDesignExperimentOct25().getCohort()
347368

348369
return when (cohort?.name) {
349370
MODIFIED_CONTROL.cohortName -> MODIFIED_CONTROL
@@ -353,7 +374,8 @@ class RealOnboardingDesignExperimentManager @Inject constructor(
353374
}
354375
}
355376

356-
private fun MetricsPixel.fire() = getPixelDefinitions().forEach {
357-
pixel.fire(it.pixelName, it.params)
358-
}
377+
private fun MetricsPixel.fire() =
378+
getPixelDefinitions().forEach {
379+
pixel.fire(it.pixelName, it.params)
380+
}
359381
}

0 commit comments

Comments
 (0)