Skip to content

Commit f84cb5a

Browse files
mikescamellmalmstein
authored andcommitted
[WIP] Use sense of protection experiment to determine whether to show trackers blocked animation
I deleted AppPersonalityFeature which was the local toggle to determine whether to show the animation or not. I did not want to leave it in to cause any confusion with the experiment. It has not been completely removed in this PR which is why it's a WIP. It would be good to confirm with Ana that the checks to show based on the new variants are correct as things have changed so much but I believe I have the checks correct.
1 parent 9221289 commit f84cb5a

File tree

9 files changed

+28
-118
lines changed

9 files changed

+28
-118
lines changed

app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ import com.duckduckgo.app.browser.omnibar.model.OmnibarPosition.TOP
150150
import com.duckduckgo.app.browser.print.PrintDocumentAdapterFactory
151151
import com.duckduckgo.app.browser.print.PrintInjector
152152
import com.duckduckgo.app.browser.remotemessage.SharePromoLinkRMFBroadCastReceiver
153+
import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionExperiment
153154
import com.duckduckgo.app.browser.session.WebViewSessionStorage
154155
import com.duckduckgo.app.browser.shortcut.ShortcutBuilder
155156
import com.duckduckgo.app.browser.tabpreview.WebViewPreviewGenerator
@@ -236,7 +237,6 @@ import com.duckduckgo.browser.api.brokensite.BrokenSiteData
236237
import com.duckduckgo.browser.api.brokensite.BrokenSiteData.ReportFlow.RELOAD_THREE_TIMES_WITHIN_20_SECONDS
237238
import com.duckduckgo.browser.api.ui.BrowserScreens.WebViewActivityWithParams
238239
import com.duckduckgo.common.ui.DuckDuckGoFragment
239-
import com.duckduckgo.common.ui.experiments.visual.AppPersonalityFeature
240240
import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore
241241
import com.duckduckgo.common.ui.store.BrowserAppTheme
242242
import com.duckduckgo.common.ui.view.DaxDialog
@@ -544,7 +544,7 @@ class BrowserTabFragment :
544544
lateinit var experimentTrackersAnimationHelper: ExperimentTrackersAnimationHelper
545545

546546
@Inject
547-
lateinit var appPersonalityFeature: AppPersonalityFeature
547+
lateinit var senseOfProtectionExperiment: SenseOfProtectionExperiment
548548

549549
/**
550550
* We use this to monitor whether the user was seeing the in-context Email Protection signup prompt
@@ -678,8 +678,7 @@ class BrowserTabFragment :
678678
override fun onPopUpHandled(isCosmetic: Boolean) {
679679
launch {
680680
context?.let {
681-
if (appPersonalityFeature.self().isEnabled() &&
682-
!appPersonalityFeature.variant1().isEnabled() &&
681+
if (senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled() &&
683682
viewModel.trackersCount().isNotEmpty()
684683
) {
685684
if (isCosmetic) {
@@ -1263,9 +1262,7 @@ class BrowserTabFragment :
12631262

12641263
private fun initPrivacyProtectionsPopup() {
12651264
privacyProtectionsPopup = privacyProtectionsPopupFactory.createPopup(
1266-
anchor = if (appPersonalityFeature.self().isEnabled() &&
1267-
!appPersonalityFeature.variant1().isEnabled()
1268-
) {
1265+
anchor = if (senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled()) {
12691266
omnibar.shieldIconExperiment
12701267
} else {
12711268
omnibar.shieldIcon

app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@ import com.duckduckgo.app.global.model.SiteFactory
244244
import com.duckduckgo.app.global.model.domain
245245
import com.duckduckgo.app.global.model.domainMatchesUrl
246246
import com.duckduckgo.app.location.data.LocationPermissionType
247-
import com.duckduckgo.app.onboarding.store.UserStageStore
248247
import com.duckduckgo.app.pixels.AppPixelName
249248
import com.duckduckgo.app.pixels.AppPixelName.AUTOCOMPLETE_BANNER_DISMISSED
250249
import com.duckduckgo.app.pixels.AppPixelName.AUTOCOMPLETE_BANNER_SHOWN
@@ -283,7 +282,6 @@ import com.duckduckgo.browser.api.UserBrowserProperties
283282
import com.duckduckgo.browser.api.brokensite.BrokenSiteData
284283
import com.duckduckgo.browser.api.brokensite.BrokenSiteData.ReportFlow.MENU
285284
import com.duckduckgo.browser.api.brokensite.BrokenSiteData.ReportFlow.RELOAD_THREE_TIMES_WITHIN_20_SECONDS
286-
import com.duckduckgo.common.ui.experiments.visual.AppPersonalityFeature
287285
import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore
288286
import com.duckduckgo.common.utils.AppUrl
289287
import com.duckduckgo.common.utils.AppUrl.ParamKey.QUERY
@@ -478,7 +476,6 @@ class BrowserTabViewModel @Inject constructor(
478476
private val siteErrorHandlerKillSwitch: SiteErrorHandlerKillSwitch,
479477
private val siteErrorHandler: StringSiteErrorHandler,
480478
private val siteHttpErrorHandler: HttpCodeSiteErrorHandler,
481-
private val appPersonalityFeature: AppPersonalityFeature,
482479
private val senseOfProtectionExperiment: SenseOfProtectionExperiment,
483480
) : WebViewClientListener,
484481
EditSavedSiteListener,
@@ -1042,7 +1039,7 @@ class BrowserTabViewModel @Inject constructor(
10421039

10431040
when (cta) {
10441041
is DaxBubbleCta.DaxIntroSearchOptionsCta,
1045-
-> {
1042+
-> {
10461043
if (!ctaViewModel.isSuggestedSearchOption(query)) {
10471044
pixel.fire(ONBOARDING_SEARCH_CUSTOM, type = Unique())
10481045
}
@@ -4081,9 +4078,7 @@ class BrowserTabViewModel @Inject constructor(
40814078

40824079
fun onAnimationFinished() {
40834080
viewModelScope.launch {
4084-
if (appPersonalityFeature.self().isEnabled() &&
4085-
(appPersonalityFeature.variant2().isEnabled() || appPersonalityFeature.variant3().isEnabled())
4086-
) {
4081+
if (senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled()) {
40874082
command.value = StartTrackersExperimentShieldPopAnimation
40884083
}
40894084
}

app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ import com.duckduckgo.app.browser.omnibar.animations.PrivacyShieldAnimationHelpe
7979
import com.duckduckgo.app.browser.omnibar.animations.TrackersAnimatorListener
8080
import com.duckduckgo.app.browser.omnibar.animations.omnibaranimation.OmnibarAnimationManager
8181
import com.duckduckgo.app.browser.omnibar.model.OmnibarPosition
82+
import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionExperiment
8283
import com.duckduckgo.app.browser.tabswitcher.TabSwitcherButton
8384
import com.duckduckgo.app.browser.viewstate.LoadingViewState
8485
import com.duckduckgo.app.browser.viewstate.OmnibarViewState
@@ -87,7 +88,6 @@ import com.duckduckgo.app.global.view.renderIfChanged
8788
import com.duckduckgo.app.statistics.pixels.Pixel
8889
import com.duckduckgo.app.trackerdetection.model.Entity
8990
import com.duckduckgo.common.ui.DuckDuckGoActivity
90-
import com.duckduckgo.common.ui.experiments.visual.AppPersonalityFeature
9191
import com.duckduckgo.common.ui.view.KeyboardAwareEditText
9292
import com.duckduckgo.common.ui.view.KeyboardAwareEditText.ShowSuggestionsListener
9393
import com.duckduckgo.common.ui.view.gone
@@ -171,7 +171,7 @@ open class OmnibarLayout @JvmOverloads constructor(
171171
lateinit var dispatchers: DispatcherProvider
172172

173173
@Inject
174-
lateinit var appPersonalityFeature: AppPersonalityFeature
174+
lateinit var senseOfProtectionExperiment: SenseOfProtectionExperiment
175175

176176
@Inject
177177
lateinit var omnibarAnimationManager: OmnibarAnimationManager
@@ -555,7 +555,7 @@ open class OmnibarLayout @JvmOverloads constructor(
555555
}
556556

557557
OmnibarLayoutViewModel.LeadingIconState.PRIVACY_SHIELD -> {
558-
val isExperimentEnabled = appPersonalityFeature.self().isEnabled() && !appPersonalityFeature.variant1().isEnabled()
558+
val isExperimentEnabled = !senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled()
559559
if (isExperimentEnabled) {
560560
shieldIcon.gone()
561561
shieldIconExperiment.show()
@@ -776,7 +776,7 @@ open class OmnibarLayout @JvmOverloads constructor(
776776
if (targetView != null) {
777777
// We need a different asset when the experiment is enabled and the animation is played on the Privacy Shield.
778778
val isPrivacyShieldAnimation = targetView == placeholder
779-
val isExperimentEnabled = appPersonalityFeature.self().isEnabled() && !appPersonalityFeature.variant1().isEnabled()
779+
val isExperimentEnabled = senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled()
780780
if (pulseAnimation.isActive) {
781781
pulseAnimation.stop()
782782
}
@@ -855,7 +855,7 @@ open class OmnibarLayout @JvmOverloads constructor(
855855
renderIfChanged(privacyShield, lastSeenPrivacyShield) {
856856
lastSeenPrivacyShield = privacyShield
857857
val shieldIconView = if (viewMode is ViewMode.Browser) {
858-
val isExperimentEnabled = appPersonalityFeature.self().isEnabled() && !appPersonalityFeature.variant1().isEnabled()
858+
val isExperimentEnabled = senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled()
859859
if (isExperimentEnabled) shieldIconExperiment else shieldIcon
860860
} else {
861861
customTabToolbarContainer.customTabShieldIcon

app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconStat
4141
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState.GLOBE
4242
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState.PRIVACY_SHIELD
4343
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState.SEARCH
44+
import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionExperiment
4445
import com.duckduckgo.app.browser.viewstate.HighlightableButton
4546
import com.duckduckgo.app.browser.viewstate.LoadingViewState
4647
import com.duckduckgo.app.browser.viewstate.OmnibarViewState
@@ -52,7 +53,6 @@ import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Unique
5253
import com.duckduckgo.app.tabs.model.TabRepository
5354
import com.duckduckgo.app.trackerdetection.model.Entity
5455
import com.duckduckgo.browser.api.UserBrowserProperties
55-
import com.duckduckgo.common.ui.experiments.visual.AppPersonalityFeature
5656
import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore
5757
import com.duckduckgo.common.utils.DispatcherProvider
5858
import com.duckduckgo.di.scopes.FragmentScope
@@ -88,7 +88,7 @@ class OmnibarLayoutViewModel @Inject constructor(
8888
private val dispatcherProvider: DispatcherProvider,
8989
private val defaultBrowserPromptsExperiment: DefaultBrowserPromptsExperiment,
9090
visualDesignExperimentDataStore: VisualDesignExperimentDataStore,
91-
private val appPersonalityFeature: AppPersonalityFeature,
91+
private val senseOfProtectionExperiment: SenseOfProtectionExperiment,
9292
) : ViewModel() {
9393

9494
private val _viewState = MutableStateFlow(ViewState())
@@ -607,11 +607,11 @@ class OmnibarLayoutViewModel @Inject constructor(
607607
}
608608
viewModelScope.launch {
609609
when {
610-
appPersonalityFeature.self().isEnabled() && appPersonalityFeature.variant1().isEnabled() -> {
610+
senseOfProtectionExperiment.isUserEnrolledInModifiedControlCohortAndExperimentEnabled() -> {
611611
command.send(Command.StartExperimentVariant1Animation)
612612
}
613613

614-
appPersonalityFeature.self().isEnabled() && !appPersonalityFeature.variant1().isEnabled() -> {
614+
senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled() -> {
615615
command.send(
616616
Command.StartExperimentVariant2OrVariant3Animation(decoration.entities),
617617
)

app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelper.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ package com.duckduckgo.app.browser.omnibar.animations
1818

1919
import com.airbnb.lottie.LottieAnimationView
2020
import com.duckduckgo.app.browser.R
21+
import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionExperiment
2122
import com.duckduckgo.app.global.model.PrivacyShield
2223
import com.duckduckgo.app.global.model.PrivacyShield.MALICIOUS
2324
import com.duckduckgo.app.global.model.PrivacyShield.PROTECTED
2425
import com.duckduckgo.app.global.model.PrivacyShield.UNKNOWN
2526
import com.duckduckgo.app.global.model.PrivacyShield.UNPROTECTED
26-
import com.duckduckgo.common.ui.experiments.visual.AppPersonalityFeature
2727
import com.duckduckgo.common.ui.store.AppTheme
2828
import com.duckduckgo.di.scopes.AppScope
2929
import com.squareup.anvil.annotations.ContributesBinding
@@ -35,7 +35,7 @@ import timber.log.Timber
3535
@SingleInstanceIn(AppScope::class)
3636
class LottiePrivacyShieldAnimationHelper @Inject constructor(
3737
private val appTheme: AppTheme,
38-
private val appPersonalityFeature: AppPersonalityFeature,
38+
private val senseOfProtectionExperiment: SenseOfProtectionExperiment,
3939
) : PrivacyShieldAnimationHelper {
4040

4141
override fun setAnimationView(
@@ -46,7 +46,7 @@ class LottiePrivacyShieldAnimationHelper @Inject constructor(
4646
val protectedShieldDark: Int
4747
val unprotectedShield: Int
4848
val unprotectedShieldDark: Int
49-
if (appPersonalityFeature.self().isEnabled() && !appPersonalityFeature.variant1().isEnabled()) {
49+
if (!senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled()) {
5050
protectedShield = R.raw.protected_shield_experiment
5151
protectedShieldDark = R.raw.protected_shield_experiment
5252
unprotectedShield = R.raw.unprotected_shield_experiment

app/src/main/java/com/duckduckgo/app/browser/senseofprotection/SenseOfProtectionExperimentImpl.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ interface SenseOfProtectionExperiment {
3838
fun enrolUserInNewExperimentIfEligible(): Boolean
3939
fun getTabManagerPixelParams(): Map<String, String>
4040
fun firePrivacyDashboardClickedPixelIfInExperiment()
41+
fun isUserEnrolledInAVariantAndExperimentEnabled(): Boolean
4142
fun isUserEnrolledInVariant2CohortAndExperimentEnabled(): Boolean
43+
fun isUserEnrolledInModifiedControlCohortAndExperimentEnabled(): Boolean
4244
}
4345

4446
@ContributesBinding(
@@ -98,13 +100,18 @@ class SenseOfProtectionExperimentImpl @Inject constructor(
98100

99101
override fun firePrivacyDashboardClickedPixelIfInExperiment() {
100102
appCoroutineScope.launch(dispatcherProvider.io()) {
101-
if (isUserEnrolledInVariantAndExperimentEnabled()) {
103+
if (isUserEnrolledInAVariantAndExperimentEnabled()) {
102104
senseOfProtectionPixelsPlugin.getPrivacyDashboardClickedMetric()?.fire()
103105
}
104106
}
105107
}
106108

107-
private fun isUserEnrolledInVariantAndExperimentEnabled(): Boolean {
109+
override fun isUserEnrolledInModifiedControlCohortAndExperimentEnabled(): Boolean =
110+
getNewUserExperimentCohortName() == MODIFIED_CONTROL.cohortName && isNewUserExperimentEnabled(MODIFIED_CONTROL) ||
111+
getExistingUserExperimentCohortName() == MODIFIED_CONTROL.cohortName && isExistingUserExperimentEnabled(MODIFIED_CONTROL)
112+
113+
// TODO this _might_ be able to be simplified like the isUserEnrolledInModifiedControlCohortAndExperimentEnabled function
114+
override fun isUserEnrolledInAVariantAndExperimentEnabled(): Boolean {
108115
return when {
109116
isEnrolledInNewUserExperiment() -> {
110117
val cohortNameString = senseOfProtectionToggles.senseOfProtectionNewUserExperimentApr25().getCohort()?.name

common/common-ui-internal/src/main/java/com/duckduckgo/common/ui/internal/experiments/trackersblocking/TrackersBlockingExperimentViewModel.kt

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ import androidx.lifecycle.DefaultLifecycleObserver
2121
import androidx.lifecycle.ViewModel
2222
import androidx.lifecycle.viewModelScope
2323
import com.duckduckgo.anvil.annotations.ContributesViewModel
24-
import com.duckduckgo.common.ui.experiments.visual.AppPersonalityFeature
2524
import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore
2625
import com.duckduckgo.common.utils.DispatcherProvider
2726
import com.duckduckgo.di.scopes.ViewScope
28-
import com.duckduckgo.feature.toggles.api.Toggle.State
2927
import javax.inject.Inject
3028
import kotlinx.coroutines.flow.Flow
3129
import kotlinx.coroutines.flow.MutableStateFlow
@@ -37,7 +35,6 @@ import kotlinx.coroutines.launch
3735
@ContributesViewModel(ViewScope::class)
3836
class TrackersBlockingExperimentViewModel@Inject constructor(
3937
private val dispatchers: DispatcherProvider,
40-
private val appPersonalityFeature: AppPersonalityFeature,
4138
private val visualDesignExperimentDataStore: VisualDesignExperimentDataStore,
4239
) : ViewModel(), DefaultLifecycleObserver {
4340

@@ -57,57 +54,27 @@ class TrackersBlockingExperimentViewModel@Inject constructor(
5754
@SuppressLint("DenyListedApi")
5855
fun onTrackersBlockingVariant1ExperimentalUIModeChanged(checked: Boolean) {
5956
viewModelScope.launch(dispatchers.io()) {
60-
appPersonalityFeature.self().setRawStoredState(State(checked))
61-
appPersonalityFeature.variant1().setRawStoredState(State(checked))
62-
63-
if (checked) {
64-
visualDesignExperimentDataStore.setExperimentStateUserPreference(false)
65-
appPersonalityFeature.variant2().setRawStoredState(State(false))
66-
appPersonalityFeature.variant3().setRawStoredState(State(false))
67-
}
6857
updateCurrentState()
6958
}
7059
}
7160

7261
@SuppressLint("DenyListedApi")
7362
fun onTrackersBlockingVariant2ExperimentalUIModeChanged(checked: Boolean) {
7463
viewModelScope.launch(dispatchers.io()) {
75-
appPersonalityFeature.self().setRawStoredState(State(checked))
76-
appPersonalityFeature.variant2().setRawStoredState(State(checked))
77-
78-
if (checked) {
79-
visualDesignExperimentDataStore.setExperimentStateUserPreference(false)
80-
appPersonalityFeature.variant1().setRawStoredState(State(false))
81-
appPersonalityFeature.variant3().setRawStoredState(State(false))
82-
}
8364
updateCurrentState()
8465
}
8566
}
8667

8768
@SuppressLint("DenyListedApi")
8869
fun onTrackersBlockingVariant3ExperimentalUIModeChanged(checked: Boolean) {
8970
viewModelScope.launch(dispatchers.io()) {
90-
appPersonalityFeature.self().setRawStoredState(State(checked))
91-
appPersonalityFeature.variant3().setRawStoredState(State(checked))
92-
93-
if (checked) {
94-
visualDesignExperimentDataStore.setExperimentStateUserPreference(false)
95-
appPersonalityFeature.variant1().setRawStoredState(State(false))
96-
appPersonalityFeature.variant2().setRawStoredState(State(false))
97-
}
9871
updateCurrentState()
9972
}
10073
}
10174

10275
private fun updateCurrentState() {
10376
viewModelScope.launch {
104-
viewState.update {
105-
currentViewState().copy(
106-
variant1 = appPersonalityFeature.variant1().isEnabled(),
107-
variant2 = appPersonalityFeature.variant2().isEnabled(),
108-
variant3 = appPersonalityFeature.variant3().isEnabled(),
109-
)
110-
}
77+
viewState.update { currentViewState() }
11178
}
11279
}
11380
}

common/common-ui-internal/src/main/java/com/duckduckgo/common/ui/internal/experiments/visual/VisualDesignExperimentViewModel.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ import androidx.lifecycle.DefaultLifecycleObserver
2121
import androidx.lifecycle.ViewModel
2222
import androidx.lifecycle.viewModelScope
2323
import com.duckduckgo.anvil.annotations.ContributesViewModel
24-
import com.duckduckgo.common.ui.experiments.visual.AppPersonalityFeature
2524
import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore
2625
import com.duckduckgo.common.ui.store.ThemingDataStore
2726
import com.duckduckgo.di.scopes.ViewScope
28-
import com.duckduckgo.feature.toggles.api.Toggle.State
2927
import javax.inject.Inject
3028
import kotlinx.coroutines.flow.MutableStateFlow
3129
import kotlinx.coroutines.flow.SharingStarted
@@ -39,7 +37,6 @@ import kotlinx.coroutines.launch
3937
class VisualDesignExperimentViewModel @Inject constructor(
4038
private val visualDesignExperimentDataStore: VisualDesignExperimentDataStore,
4139
private val themingDataStore: ThemingDataStore,
42-
private val appPersonalityFeature: AppPersonalityFeature,
4340
) : ViewModel(), DefaultLifecycleObserver {
4441

4542
data class ViewState(
@@ -84,11 +81,5 @@ class VisualDesignExperimentViewModel @Inject constructor(
8481
@SuppressLint("DenyListedApi")
8582
fun onExperimentalUIModeChanged(checked: Boolean) {
8683
visualDesignExperimentDataStore.setExperimentStateUserPreference(checked)
87-
if (checked) {
88-
appPersonalityFeature.self().setRawStoredState(State(false))
89-
appPersonalityFeature.variant1().setRawStoredState(State(false))
90-
appPersonalityFeature.variant2().setRawStoredState(State(false))
91-
appPersonalityFeature.variant3().setRawStoredState(State(false))
92-
}
9384
}
9485
}

0 commit comments

Comments
 (0)