Skip to content

Commit c042171

Browse files
Merge branch 'release/5.243.0'
2 parents 418c410 + c2da6ea commit c042171

File tree

382 files changed

+12386
-2084
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

382 files changed

+12386
-2084
lines changed

app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/tracker_activity/view/message/PProUpsellBannerPlugin.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,12 @@ class PProUpsellBannerPlugin @Inject constructor(
5656
): View? {
5757
val isEligible = runBlocking { subscriptions.isUpsellEligible() && !vpnStore.isPproUpsellBannerDismised() }
5858
return if (isEligible) {
59-
val subtitle: String
6059
val actionText: String
6160
runBlocking {
62-
if (subscriptions.isFreeTrialEligible() && appTPStateMessageToggle.freeTrialCopy().isEnabled()) {
63-
subtitle = context.getString(R.string.apptp_PproUpsellBannerMessage_freeTrial)
64-
actionText = context.getString(R.string.apptp_PproUpsellBannerAction_freeTrial)
61+
actionText = if (subscriptions.isFreeTrialEligible() && appTPStateMessageToggle.freeTrialCopy().isEnabled()) {
62+
context.getString(R.string.apptp_PproUpsellBannerAction_freeTrial)
6563
} else {
66-
subtitle = context.getString(R.string.apptp_PproUpsellBannerMessage)
67-
actionText = context.getString(R.string.apptp_PproUpsellBannerAction)
64+
context.getString(R.string.apptp_PproUpsellBannerAction)
6865
}
6966
}
7067
MessageCta(context)
@@ -73,7 +70,7 @@ class PProUpsellBannerPlugin @Inject constructor(
7370
Message(
7471
topIllustration = com.duckduckgo.mobile.android.R.drawable.ic_privacy_pro,
7572
title = context.getString(R.string.apptp_PproUpsellBannerTitle),
76-
subtitle = subtitle,
73+
subtitle = context.getString(R.string.apptp_PproUpsellBannerMessage_freeTrial),
7774
action = actionText,
7875
messageType = REMOTE_MESSAGE,
7976
),

app/build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ dependencies {
289289
implementation project(':macos-api')
290290
implementation project(':macos-impl')
291291

292+
implementation project(":pir-api")
293+
implementation project(":pir-impl")
292294
internalImplementation project(':pir-internal')
293295

294296
implementation project(':privacy-dashboard-api')
@@ -593,4 +595,4 @@ tasks.register('assemblePlayReleaseDefaultVariant', Exec) {
593595

594596
task newModule(type: com.duckduckgo.gradle.ModuleCreator) {
595597
feature = project.hasProperty('feature') ? project.getProperty('feature') : null
596-
}
598+
}

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

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ class BrowserTabViewModelTest {
552552
private val swipingTabsFeature = FakeFeatureToggleFactory.create(SwipingTabsFeature::class.java)
553553
private val swipingTabsFeatureProvider = SwipingTabsFeatureProvider(swipingTabsFeature)
554554
private val mockSenseOfProtectionExperiment: SenseOfProtectionExperiment = mock()
555+
private val mockOnboardingDesignExperimentToggles: OnboardingDesignExperimentToggles = mock()
555556

556557
private val defaultBrowserPromptsExperimentShowPopupMenuItemFlow = MutableStateFlow(false)
557558
private val mockDefaultBrowserPromptsExperiment: DefaultBrowserPromptsExperiment = mock()
@@ -672,6 +673,7 @@ class BrowserTabViewModelTest {
672673
brokenSitePrompt = mockBrokenSitePrompt,
673674
senseOfProtectionExperiment = mockSenseOfProtectionExperiment,
674675
onboardingHomeScreenWidgetExperiment = mockOnboardingHomeScreenWidgetExperiment,
676+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
675677
)
676678

677679
val siteFactory = SiteFactoryImpl(
@@ -691,7 +693,7 @@ class BrowserTabViewModelTest {
691693
coroutineRule.testScope,
692694
)
693695

694-
whenever(mockOmnibarConverter.convertQueryToUrl(any(), any(), any())).thenReturn("duckduckgo.com")
696+
whenever(mockOmnibarConverter.convertQueryToUrl(any(), any(), any(), any())).thenReturn("duckduckgo.com")
695697
whenever(mockTabRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
696698
whenever(mockNavigationAwareLoginDetector.loginEventLiveData).thenReturn(loginEventLiveData)
697699
whenever(mockTabRepository.retrieveSiteData(any())).thenReturn(MutableLiveData())
@@ -2750,7 +2752,7 @@ class BrowserTabViewModelTest {
27502752

27512753
@Test
27522754
fun whenUserClickedDaxMainNetworkCtaOKButtonAndMaliciousSiteBlockedThenCtaIsNull() {
2753-
val cta = DaxMainNetworkCta(mockOnboardingStore, mockAppInstallStore, "", "")
2755+
val cta = DaxMainNetworkCta(mockOnboardingStore, mockAppInstallStore, "", "", mockOnboardingDesignExperimentToggles)
27542756
setCta(cta)
27552757

27562758
testee.onUserClickCtaOkButton(cta)
@@ -5494,7 +5496,13 @@ class BrowserTabViewModelTest {
54945496

54955497
@Test
54965498
fun whenTrackersBlockedCtaShownWithBrowserShowingThenPrivacyShieldIsHighlighted() = runTest {
5497-
val cta = DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList(), mockSettingsDataStore)
5499+
val cta = DaxTrackersBlockedCta(
5500+
onboardingStore = mockOnboardingStore,
5501+
appInstallStore = mockAppInstallStore,
5502+
trackers = emptyList(),
5503+
settingsDataStore = mockSettingsDataStore,
5504+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
5505+
)
54985506
testee.ctaViewState.value = ctaViewState().copy(cta = cta)
54995507
testee.browserViewState.value = browserViewState().copy(browserShowing = true, maliciousSiteBlocked = false)
55005508

@@ -5505,7 +5513,13 @@ class BrowserTabViewModelTest {
55055513

55065514
@Test
55075515
fun whenTrackersBlockedCtaShownWithMaliciousSiteBlockedThenPrivacyShieldIsNotHighlighted() = runTest {
5508-
val cta = DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList(), mockSettingsDataStore)
5516+
val cta = DaxTrackersBlockedCta(
5517+
onboardingStore = mockOnboardingStore,
5518+
appInstallStore = mockAppInstallStore,
5519+
trackers = emptyList(),
5520+
settingsDataStore = mockSettingsDataStore,
5521+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
5522+
)
55095523
testee.ctaViewState.value = ctaViewState().copy(cta = cta)
55105524
testee.browserViewState.value = browserViewState().copy(browserShowing = false, maliciousSiteBlocked = true)
55115525

@@ -5516,17 +5530,29 @@ class BrowserTabViewModelTest {
55165530

55175531
@Test
55185532
fun givenTrackersBlockedCtaShownWhenLaunchingTabSwitcherThenCtaIsDismissed() = runTest {
5519-
val cta = DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList(), mockSettingsDataStore)
5533+
val cta = DaxTrackersBlockedCta(
5534+
onboardingStore = mockOnboardingStore,
5535+
appInstallStore = mockAppInstallStore,
5536+
trackers = emptyList(),
5537+
settingsDataStore = mockSettingsDataStore,
5538+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
5539+
)
55205540
testee.ctaViewState.value = ctaViewState().copy(cta = cta)
55215541

5522-
testee.userLaunchingTabSwitcher()
5542+
testee.userLaunchingTabSwitcher(false)
55235543

55245544
verify(mockDismissedCtaDao).insert(DismissedCta(cta.ctaId))
55255545
}
55265546

55275547
@Test
55285548
fun givenTrackersBlockedCtaShownWhenUserRequestOpeningNewTabThenCtaIsDismissed() = runTest {
5529-
val cta = DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList(), mockSettingsDataStore)
5549+
val cta = DaxTrackersBlockedCta(
5550+
onboardingStore = mockOnboardingStore,
5551+
appInstallStore = mockAppInstallStore,
5552+
trackers = emptyList(),
5553+
settingsDataStore = mockSettingsDataStore,
5554+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
5555+
)
55305556
testee.ctaViewState.value = ctaViewState().copy(cta = cta)
55315557

55325558
testee.onNewTabMenuItemClicked()
@@ -5536,7 +5562,13 @@ class BrowserTabViewModelTest {
55365562

55375563
@Test
55385564
fun givenPrivacyShieldHighlightedWhenShieldIconSelectedThenStopPulse() = runTest {
5539-
val cta = DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList(), mockSettingsDataStore)
5565+
val cta = DaxTrackersBlockedCta(
5566+
onboardingStore = mockOnboardingStore,
5567+
appInstallStore = mockAppInstallStore,
5568+
trackers = emptyList(),
5569+
settingsDataStore = mockSettingsDataStore,
5570+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
5571+
)
55405572
testee.ctaViewState.value = ctaViewState().copy(cta = cta)
55415573

55425574
testee.onPrivacyShieldSelected()
@@ -5555,7 +5587,13 @@ class BrowserTabViewModelTest {
55555587

55565588
@Test
55575589
fun whenUserDismissDaxTrackersBlockedDialogThenFinishPrivacyShieldPulse() {
5558-
val cta = DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList(), mockSettingsDataStore)
5590+
val cta = DaxTrackersBlockedCta(
5591+
onboardingStore = mockOnboardingStore,
5592+
appInstallStore = mockAppInstallStore,
5593+
trackers = emptyList(),
5594+
settingsDataStore = mockSettingsDataStore,
5595+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
5596+
)
55595597
setCta(cta)
55605598

55615599
testee.onUserDismissedCta(cta)
@@ -5565,7 +5603,7 @@ class BrowserTabViewModelTest {
55655603
@Test
55665604
fun givenOnboardingCtaShownWhenUserSubmittedQueryThenDismissCta() {
55675605
whenever(mockOmnibarConverter.convertQueryToUrl("foo", null)).thenReturn("foo.com")
5568-
val cta = DaxSerpCta(mockOnboardingStore, mockAppInstallStore)
5606+
val cta = DaxSerpCta(mockOnboardingStore, mockAppInstallStore, mockOnboardingDesignExperimentToggles)
55695607
testee.ctaViewState.value = CtaViewState(cta = cta)
55705608

55715609
testee.onUserSubmittedQuery("foo")
@@ -5679,7 +5717,7 @@ class BrowserTabViewModelTest {
56795717
PixelParameter.TAB_INACTIVE_3W to inactive3w,
56805718
)
56815719

5682-
testee.userLaunchingTabSwitcher()
5720+
testee.userLaunchingTabSwitcher(false)
56835721

56845722
assertCommandIssued<Command.LaunchTabSwitcher>()
56855723
verify(mockPixel).fire(AppPixelName.TAB_MANAGER_CLICKED)
@@ -6032,30 +6070,40 @@ class BrowserTabViewModelTest {
60326070
val domain = "https://www.example.com"
60336071
givenCurrentSite(domain)
60346072

6035-
testee.userLaunchingTabSwitcher()
6073+
testee.userLaunchingTabSwitcher(false)
60366074

60376075
verify(mockPixel).fire(AppPixelName.TAB_MANAGER_OPENED_FROM_SITE)
60386076
}
60396077

60406078
@Test
6041-
fun whenTabSwitcherPressedAndUserOnSerpThenPixelIsSent() = runTest {
6079+
fun whenTabSwitcherPressedAndUserOnNtpThenPixelIsSent() = runTest {
60426080
givenTabManagerData()
60436081
setBrowserShowing(false)
60446082

6045-
testee.userLaunchingTabSwitcher()
6083+
testee.userLaunchingTabSwitcher(false)
60466084

6047-
verify(mockPixel).fire(AppPixelName.TAB_MANAGER_OPENED_FROM_NEW_TAB)
6085+
verify(mockPixel).fire(AppPixelName.TAB_MANAGER_OPENED_FROM_NEW_TAB, mapOf(PixelParameter.FROM_FOCUSED_NTP to "false"))
60486086
}
60496087

60506088
@Test
6051-
fun whenTabSwitcherPressedAndUserOnNewTabThenPixelIsSent() = runTest {
6089+
fun whenTabSwitcherPressedInFocusModeAndUserOnNtpThenPixelIsSent() = runTest {
6090+
givenTabManagerData()
6091+
setBrowserShowing(false)
6092+
6093+
testee.userLaunchingTabSwitcher(true)
6094+
6095+
verify(mockPixel).fire(AppPixelName.TAB_MANAGER_OPENED_FROM_NEW_TAB, mapOf(PixelParameter.FROM_FOCUSED_NTP to "true"))
6096+
}
6097+
6098+
@Test
6099+
fun whenTabSwitcherPressedAndUserOnSerpThenPixelIsSent() = runTest {
60526100
givenTabManagerData()
60536101
setBrowserShowing(true)
60546102
whenever(mockDuckDuckGoUrlDetector.isDuckDuckGoUrl(any())).thenReturn(true)
60556103
val domain = "https://duckduckgo.com/?q=test&atb=v395-1-wb&ia=web"
60566104
givenCurrentSite(domain)
60576105

6058-
testee.userLaunchingTabSwitcher()
6106+
testee.userLaunchingTabSwitcher(false)
60596107

60606108
verify(mockPixel).fire(AppPixelName.TAB_MANAGER_OPENED_FROM_SERP)
60616109
}
@@ -6363,7 +6411,7 @@ class BrowserTabViewModelTest {
63636411

63646412
@Test
63656413
fun whenUserClicksDaxSerpCtaDismissButtonThenHideOnboardingDaxDialogCommandIssuedAndPixelFired() = runTest {
6366-
val cta = DaxSerpCta(mockOnboardingStore, mockAppInstallStore)
6414+
val cta = DaxSerpCta(mockOnboardingStore, mockAppInstallStore, mockOnboardingDesignExperimentToggles)
63676415

63686416
testee.onUserClickCtaDismissButton(cta)
63696417

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import com.duckduckgo.app.onboarding.store.AppStage
3737
import com.duckduckgo.app.onboarding.store.OnboardingStore
3838
import com.duckduckgo.app.onboarding.store.UserStageStore
3939
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles
40+
import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentToggles
4041
import com.duckduckgo.app.pixels.AppPixelName.*
4142
import com.duckduckgo.app.privacy.db.UserAllowListRepository
4243
import com.duckduckgo.app.privacy.model.HttpsStatus
@@ -123,6 +124,8 @@ class CtaViewModelTest {
123124
private val mockSenseOfProtectionExperiment: SenseOfProtectionExperiment = mock()
124125
private val mockOnboardingHomeScreenWidgetExperiment: OnboardingHomeScreenWidgetExperiment = mock()
125126

127+
private val mockOnboardingDesignExperimentToggles: OnboardingDesignExperimentToggles = mock()
128+
126129
private val requiredDaxOnboardingCtas: List<CtaId> = listOf(
127130
CtaId.DAX_INTRO,
128131
CtaId.DAX_DIALOG_SERP,
@@ -178,6 +181,7 @@ class CtaViewModelTest {
178181
brokenSitePrompt = mockBrokenSitePrompt,
179182
senseOfProtectionExperiment = mockSenseOfProtectionExperiment,
180183
onboardingHomeScreenWidgetExperiment = mockOnboardingHomeScreenWidgetExperiment,
184+
onboardingDesignExperimentToggles = mockOnboardingDesignExperimentToggles,
181185
)
182186
}
183187

@@ -265,7 +269,7 @@ class CtaViewModelTest {
265269
fun whenCtaDismissedAndAllDaxOnboardingCtasShownThenStageCompleted() = runTest {
266270
givenDaxOnboardingActive()
267271
givenShownDaxOnboardingCtas(requiredDaxOnboardingCtas)
268-
testee.onUserDismissedCta(OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore))
272+
testee.onUserDismissedCta(OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore, mockOnboardingDesignExperimentToggles))
269273
verify(mockUserStageStore).stageCompleted(AppStage.DAX_ONBOARDING)
270274
}
271275

@@ -817,14 +821,14 @@ class CtaViewModelTest {
817821

818822
@Test
819823
fun whenCtaShownIfCtaIsNotMarkedAsReadOnShowThenCtaNotInsertedInDatabase() = runTest {
820-
testee.onCtaShown(OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore))
824+
testee.onCtaShown(OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore, mockOnboardingDesignExperimentToggles))
821825

822826
verify(mockDismissedCtaDao, never()).insert(DismissedCta(CtaId.DAX_DIALOG_SERP))
823827
}
824828

825829
@Test
826830
fun whenCtaShownIfCtaIsMarkedAsReadOnShowThenCtaInsertedInDatabase() = runTest {
827-
testee.onCtaShown(OnboardingDaxDialogCta.DaxEndCta(mockOnboardingStore, mockAppInstallStore))
831+
testee.onCtaShown(OnboardingDaxDialogCta.DaxEndCta(mockOnboardingStore, mockAppInstallStore, mockOnboardingDesignExperimentToggles))
828832

829833
verify(mockDismissedCtaDao).insert(DismissedCta(CtaId.DAX_END))
830834
}
@@ -871,6 +875,7 @@ class CtaViewModelTest {
871875
whenever(mockSubscriptions.isEligible()).thenReturn(true)
872876
whenever(mockExtendedOnboardingFeatureToggles.noBrowserCtas()).thenReturn(mockEnabledToggle)
873877
whenever(mockExtendedOnboardingFeatureToggles.privacyProCta()).thenReturn(mockEnabledToggle)
878+
whenever(mockOnboardingDesignExperimentToggles.buckOnboarding()).thenReturn(mockDisabledToggle)
874879
whenever(mockExtendedOnboardingFeatureToggles.freeTrialCopy()).thenReturn(mockDisabledToggle)
875880
whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO)).thenReturn(true)
876881
whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO_VISIT_SITE)).thenReturn(true)

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@
298298
<activity
299299
android:name="com.duckduckgo.app.SelectedTextSearchActivity"
300300
android:exported="true"
301+
android:launchMode="singleTask"
301302
android:label="@string/systemTextSearchMessage">
302303
<intent-filter>
303304
<action android:name="android.intent.action.PROCESS_TEXT" />

app/src/main/java/com/duckduckgo/app/about/AboutDuckDuckGoActivity.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import com.duckduckgo.app.about.AboutDuckDuckGoViewModel.Command.LaunchWebViewWi
4040
import com.duckduckgo.app.about.AboutDuckDuckGoViewModel.Command.LaunchWebViewWithPPROUrl
4141
import com.duckduckgo.app.about.AboutDuckDuckGoViewModel.Command.LaunchWebViewWithPrivacyPolicyUrl
4242
import com.duckduckgo.app.about.AboutDuckDuckGoViewModel.Command.LaunchWebViewWithVPNUrl
43+
import com.duckduckgo.app.about.AboutDuckDuckGoViewModel.ViewState
4344
import com.duckduckgo.app.browser.BrowserActivity
4445
import com.duckduckgo.app.browser.R
4546
import com.duckduckgo.app.browser.databinding.ActivityAboutDuckDuckGoBinding
@@ -86,23 +87,26 @@ class AboutDuckDuckGoActivity : DuckDuckGoActivity() {
8687

8788
configureUiEventHandlers()
8889
observeViewModel()
89-
configureClickableLinks()
9090
}
9191

9292
override fun onResume() {
9393
super.onResume()
9494
viewModel.resetEasterEggCounter()
9595
}
9696

97-
private fun configureClickableLinks() {
97+
private fun configureClickableLinks(viewState: ViewState) {
9898
with(binding.includeContent.aboutText) {
99-
text = addClickableLinks()
99+
text = addClickableLinks(viewState)
100100
movementMethod = LinkMovementMethod.getInstance()
101101
}
102102
}
103103

104-
private fun addClickableLinks(): SpannableString {
105-
val fullText = getText(R.string.aboutDescriptionBrandUpdate2025) as SpannedString
104+
private fun addClickableLinks(viewState: ViewState): SpannableString {
105+
val fullText = if (viewState.rebrandingEnabled) {
106+
getText(R.string.aboutDescriptionBrandUpdate2025Rebranding) as SpannedString
107+
} else {
108+
getText(R.string.aboutDescriptionBrandUpdate2025) as SpannedString
109+
}
106110

107111
val spannableString = SpannableString(fullText)
108112
val annotations = fullText.getSpans(0, fullText.length, Annotation::class.java)
@@ -190,6 +194,7 @@ class AboutDuckDuckGoActivity : DuckDuckGoActivity() {
190194
.onEach { viewState ->
191195
viewState.let {
192196
binding.includeContent.aboutVersion.setSecondaryText(it.version)
197+
configureClickableLinks(viewState)
193198
}
194199
}.launchIn(lifecycleScope)
195200

app/src/main/java/com/duckduckgo/app/about/AboutDuckDuckGoViewModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.duckduckgo.appbuildconfig.api.AppBuildConfig
2626
import com.duckduckgo.di.scopes.ActivityScope
2727
import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback
2828
import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeedbackSource.DDG_SETTINGS
29+
import com.duckduckgo.subscriptions.api.SubscriptionRebrandingFeatureToggle
2930
import javax.inject.Inject
3031
import kotlinx.coroutines.channels.BufferOverflow
3132
import kotlinx.coroutines.channels.Channel
@@ -42,10 +43,12 @@ class AboutDuckDuckGoViewModel @Inject constructor(
4243
private val appBuildConfig: AppBuildConfig,
4344
private val pixel: Pixel,
4445
private val privacyProUnifiedFeedback: PrivacyProUnifiedFeedback,
46+
private val subscriptionRebrandingFeatureToggle: SubscriptionRebrandingFeatureToggle,
4547
) : ViewModel() {
4648

4749
data class ViewState(
4850
val version: String = "",
51+
val rebrandingEnabled: Boolean = false,
4952
)
5053

5154
sealed class Command {
@@ -69,6 +72,7 @@ class AboutDuckDuckGoViewModel @Inject constructor(
6972
viewState.emit(
7073
currentViewState().copy(
7174
version = obtainVersion(),
75+
rebrandingEnabled = subscriptionRebrandingFeatureToggle.isSubscriptionRebrandingEnabled(),
7276
),
7377
)
7478
}

0 commit comments

Comments
 (0)