Skip to content

Commit c4c3cf8

Browse files
mikescamell0nko
authored andcommitted
Update Settings: Address Ppro Issues (#5460)
Task/Issue URL: https://app.asana.com/0/1207908166761516/1209138029097313/f ### Description Address Ship Review comments regarding not being able to see Ppro settings items when subscriptions expired. It was necessary to consider available Products ([you may see these referred to as "features" internally in the subscription module](https://app.asana.com/0/414730916066338/1209117572597478/f)) when a user's subscription has expired or they are in a waiting state, as their entitlements would end up being empty. Now we know what Products are available to the user, we can display them correctly in their disabled state to match the new Settings design. ### Steps to test this PR Prerequisite: `newSettings` feature flag is enabled Follow these [instructions](https://app.asana.com/0/1142021229838617/1208861246073828/f) to install Play Billing Lab so you can test US and ROW subscription plans **US** Prerequisite: Country/Region is set to US in Play Billing Lab _New Settings Top Level_ - [x] Open Settings screen - [x] Verify items displayed match design Not Subscribed state _Subscribed State_ - [ ] Tap "Get Privacy Pro" - [ ] Purchase Ppro monthly - [ ] One Purchase is completed return to top level settings screen - [ ] Verify VPN, PIR, ITR and Settings items are displayed, matching design Subscribed state - [ ] Turn on VPN - [ ] Return to top level settings screen - [ ] Ensure VPN status indicator is on - [ ] Turn VPN off - [ ] Return to top level settings screen - [ ] Ensure VPN status is off _Expired State_ - [ ] Tap "Subscription Settings" - [ ] Click "Update Plan or Cancel" item - [ ] Cancel the Subscription - [ ] Wait 5 mins - [ ] Return to top level settings screen - [ ] Verify VPN, PIR, ITR are in a disabled state like designs - [ ] Verify VPN, PIR, ITR are not clickable - [ ] Verify Settings item is in expired state _Remove subscription_ - [ ] Re-purchase Ppro - [ ] From the Subscription Settings screen click "Remove From this Device" - [ ] Return to top level settings screen - [ ] Verify you're in the Not Subscribed state _Activating State_ Prerequisite: Apply patch in [task](https://app.asana.com/0/1207908166761516/1209138029097313/f) as this is hard to reproduce via device - [ ] Apply patch - [ ] Open settings - [ ] Verify Ppro is in Activating state like designs - [ ] Verify VPN, PIR, ITR are not clickable - [ ] Re-purchase Ppro - [ ] From the Subscription Settings screen click "Remove From this Device" - [ ] Return to top level settings screen - [ ] Verify you're in the Not Subscribed state **ROW** Prerequisite: Country/Region is set to UK in Play Billing Lab _New Settings Top Level_ - [ ] Open Settings screen - [ ] Verify items displayed match design Not Subscribed state _Subscribed State_ - [ ] Tap "Get Privacy Pro" - [ ] Purchase Ppro monthly - [ ] One Purchase is completed return to top level settings screen - [ ] Verify only VPN, ITR and Settings items are displayed and match design Subscribed state - [ ] Turn on VPN - [ ] Return to top level settings screen - [ ] Ensure VPN status indicator is on - [ ] Turn VPN off - [ ] Return to top level settings screen - [ ] Ensure VPN status is off _Expired State_ - [ ] Tap "Subscription Settings" - [ ] Click "Update Plan or Cancel" item - [ ] Cancel the Subscription - [ ] Wait 5 mins - [ ] Return to top level settings screen - [ ] Verify only VPN, ITR are in a disabled state like designs - [ ] Verify VPN, ITR are not clickable - [ ] Verify Settings item is in expired state _Remove subscription_ - [ ] Re-purchase Ppro - [ ] From the Subscription Settings screen click "Remove From this Device" - [ ] Return to top level settings screen - [ ] Verify you're in the Not Subscribed state ### UI changes No UI changes but it's helpful to see the [designs](https://www.figma.com/design/CjH849hL53lhsPlf6Ufeo4/%E2%9A%99%EF%B8%8F-Browser-Settings-Documentation-(All-Platforms)?node-id=7605-431390&t=RdmuNULWUyR1cMH7-4) to remember our new states
1 parent d88e5ae commit c4c3cf8

File tree

79 files changed

+1633
-632
lines changed

Some content is hidden

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

79 files changed

+1633
-632
lines changed

.github/workflows/build-ad-hoc.yml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ on:
77
description: 'Ref to build APK from (branch, tag, commit)'
88
required: true
99
default: 'develop'
10+
build-variant:
11+
description: 'Android build variant'
12+
required: true
13+
default: 'playRelease'
14+
type: choice
15+
options:
16+
- fdroidRelease
17+
- internalDebug
18+
- internalRelease
19+
- playDebug
20+
- playRelease
1021

1122
env:
1223
ASANA_PAT: ${{ secrets.GH_ASANA_SECRET }}
@@ -52,15 +63,15 @@ jobs:
5263
- name: Setup Gradle
5364
uses: gradle/actions/setup-gradle@v3
5465

55-
- name: Assemble release APK
56-
run: ./gradlew assemblePlayRelease -Pforce-default-variant
66+
- name: Assemble APK
67+
run: ./gradlew assemble${{github.event.inputs.build-variant}} -Pforce-default-variant
5768

5869
- name: Move APK to new folder
59-
run: find . -name "*.apk" -exec mv '{}' apk/release.apk \;
70+
run: find . -name "*.apk" -exec mv '{}' apk/release${{github.event.inputs.build-variant}}.apk \;
6071

6172
- name: Upload debug apk
6273
if: always()
6374
uses: actions/upload-artifact@v4
6475
with:
6576
name: release
66-
path: apk/release.apk
77+
path: apk/release${{github.event.inputs.build-variant}}.apk

.github/workflows/release_upload_play_store.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ name: Release - Production Release to Play Store and Github
22

33
on:
44
workflow_dispatch:
5+
inputs:
6+
ref:
7+
description: 'Ref to build APK from (branch, tag, commit)'
8+
required: true
59

610
env:
711
ASANA_PAT: ${{ secrets.GH_ASANA_SECRET }}
@@ -20,6 +24,7 @@ jobs:
2024
with:
2125
submodules: recursive
2226
token: ${{ secrets.GT_DAXMOBILE }}
27+
ref: ${{ github.event.inputs.ref }}
2328

2429
- name: Setup Gradle
2530
uses: gradle/actions/setup-gradle@v3

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

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ import com.duckduckgo.app.browser.session.WebViewSessionInMemoryStorage
2727
import com.duckduckgo.app.browser.weblocalstorage.WebLocalStorageManager
2828
import com.duckduckgo.app.global.file.FileDeleter
2929
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
30+
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
31+
import com.duckduckgo.appbuildconfig.api.BuildFlavor.INTERNAL
32+
import com.duckduckgo.appbuildconfig.api.BuildFlavor.PLAY
3033
import com.duckduckgo.common.test.CoroutineTestRule
3134
import com.duckduckgo.cookies.api.DuckDuckGoCookieManager
3235
import com.duckduckgo.feature.toggles.api.FakeFeatureToggleFactory
@@ -41,6 +44,7 @@ import org.junit.Test
4144
import org.mockito.kotlin.mock
4245
import org.mockito.kotlin.never
4346
import org.mockito.kotlin.verify
47+
import org.mockito.kotlin.verifyNoInteractions
4448
import org.mockito.kotlin.whenever
4549

4650
@Suppress("RemoveExplicitTypeArguments")
@@ -52,8 +56,9 @@ class WebViewDataManagerTest {
5256
private val context = InstrumentationRegistry.getInstrumentation().targetContext
5357
private val mockFileDeleter: FileDeleter = mock()
5458
private val mockWebViewHttpAuthStore: WebViewHttpAuthStore = mock()
55-
private val webLocalStorageManager: WebLocalStorageManager = mock()
59+
private val mockWebLocalStorageManager: WebLocalStorageManager = mock()
5660
private val mockCrashLogger: CrashLogger = mock()
61+
private val mockAppBuildConfig: AppBuildConfig = mock()
5762
private val feature = FakeFeatureToggleFactory.create(AndroidBrowserConfigFeature::class.java)
5863

5964
private val testee = WebViewDataManager(
@@ -63,10 +68,11 @@ class WebViewDataManagerTest {
6368
mockFileDeleter,
6469
mockWebViewHttpAuthStore,
6570
feature,
66-
webLocalStorageManager,
71+
mockWebLocalStorageManager,
6772
mockCrashLogger,
6873
TestScope(),
6974
CoroutineTestRule().testDispatcherProvider,
75+
mockAppBuildConfig,
7076
)
7177

7278
@Test
@@ -96,29 +102,50 @@ class WebViewDataManagerTest {
96102
}
97103
}
98104

105+
@SuppressLint("DenyListedApi")
99106
@Test
100107
fun whenDataClearedThenWebViewWebStorageCleared() = runTest {
101108
withContext(Dispatchers.Main) {
109+
feature.webLocalStorage().setRawStoredState(State(enable = true))
102110
val webView = TestWebView(context)
103111
testee.clearData(webView, mockStorage)
104-
verify(webLocalStorageManager).clearWebLocalStorage()
112+
verify(mockWebLocalStorageManager).clearWebLocalStorage()
105113
verify(mockStorage, never()).deleteAllData()
106114
}
107115
}
108116

117+
@SuppressLint("DenyListedApi")
109118
@Test
110-
fun whenDataClearedAndThrowsExceptionThenSendCrashPixelAndDeleteAllData() = runTest {
119+
fun whenDataClearedAndThrowsExceptionAndInternalThenSendCrashPixelAndDeleteAllData() = runTest {
111120
withContext(Dispatchers.Main) {
121+
feature.webLocalStorage().setRawStoredState(State(enable = true))
112122
val exception = RuntimeException("test")
113123
val webView = TestWebView(context)
114-
whenever(webLocalStorageManager.clearWebLocalStorage()).thenThrow(exception)
124+
whenever(mockAppBuildConfig.flavor).thenReturn(INTERNAL)
125+
whenever(mockWebLocalStorageManager.clearWebLocalStorage()).thenThrow(exception)
115126
testee.clearData(webView, mockStorage)
116-
verify(webLocalStorageManager).clearWebLocalStorage()
127+
verify(mockWebLocalStorageManager).clearWebLocalStorage()
117128
verify(mockCrashLogger).logCrash(CrashLogger.Crash(shortName = "web_storage_on_clear_error", t = exception))
118129
verify(mockStorage).deleteAllData()
119130
}
120131
}
121132

133+
@SuppressLint("DenyListedApi")
134+
@Test
135+
fun whenDataClearedAndThrowsExceptionAndNotInternalThenDoNotSendCrashPixelAndDeleteAllData() = runTest {
136+
withContext(Dispatchers.Main) {
137+
feature.webLocalStorage().setRawStoredState(State(enable = true))
138+
val exception = RuntimeException("test")
139+
val webView = TestWebView(context)
140+
whenever(mockAppBuildConfig.flavor).thenReturn(PLAY)
141+
whenever(mockWebLocalStorageManager.clearWebLocalStorage()).thenThrow(exception)
142+
testee.clearData(webView, mockStorage)
143+
verify(mockWebLocalStorageManager).clearWebLocalStorage()
144+
verifyNoInteractions(mockCrashLogger)
145+
verify(mockStorage).deleteAllData()
146+
}
147+
}
148+
122149
@Test
123150
fun whenDataClearedThenWebViewAuthCredentialsCleared() = runTest {
124151
withContext(Dispatchers.Main) {
@@ -173,6 +200,7 @@ class WebViewDataManagerTest {
173200
File(context.applicationInfo.dataDir, "app_webview/Default"),
174201
listOf("Cookies"),
175202
)
203+
verifyNoInteractions(mockWebLocalStorageManager)
176204
}
177205
}
178206

@@ -189,6 +217,7 @@ class WebViewDataManagerTest {
189217
File(context.applicationInfo.dataDir, "app_webview/Default"),
190218
listOf("Cookies", "Local Storage"),
191219
)
220+
verify(mockWebLocalStorageManager).clearWebLocalStorage()
192221
}
193222
}
194223

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

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ import com.duckduckgo.app.privacy.model.TestEntity
4444
import com.duckduckgo.app.settings.db.SettingsDataStore
4545
import com.duckduckgo.app.statistics.pixels.Pixel
4646
import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Count
47-
import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Unique
4847
import com.duckduckgo.app.tabs.model.TabEntity
4948
import com.duckduckgo.app.tabs.model.TabRepository
50-
import com.duckduckgo.app.trackerdetection.blocklist.BlockList.Cohorts.CONTROL
5149
import com.duckduckgo.app.trackerdetection.model.Entity
5250
import com.duckduckgo.app.trackerdetection.model.TrackerStatus
5351
import com.duckduckgo.app.trackerdetection.model.TrackerType
@@ -794,7 +792,6 @@ class CtaViewModelTest {
794792
val site = site(url = privacyProUrl)
795793

796794
val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site)
797-
verify(mockPixel, never()).fire(eq(ONBOARDING_SKIP_MAJOR_NETWORK_UNIQUE), any(), any(), eq(Unique()))
798795
assertNull(value)
799796
}
800797

@@ -813,36 +810,6 @@ class CtaViewModelTest {
813810
assertNull(value)
814811
}
815812

816-
@Test
817-
fun givenDuckPlayerSiteWhenRefreshCtaWhileBrowsingThenFireSkipMajorNetworkPixel() = runTest {
818-
givenDaxOnboardingActive()
819-
val site = site(url = "duck://player/12345", entity = TestEntity("Google", "Google", 9.0))
820-
821-
whenever(mockDuckPlayer.isDuckPlayerUri(any())).thenReturn(true)
822-
whenever(mockDuckPlayer.getDuckPlayerState()).thenReturn(ENABLED)
823-
whenever(mockDuckPlayer.getUserPreferences()).thenReturn(UserPreferences(false, AlwaysAsk))
824-
whenever(mockDuckPlayer.isYouTubeUrl(any())).thenReturn(false)
825-
whenever(mockDuckPlayer.isSimulatedYoutubeNoCookie(any())).thenReturn(false)
826-
827-
testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site)
828-
verify(mockPixel).fire(eq(ONBOARDING_SKIP_MAJOR_NETWORK_UNIQUE), any(), any(), eq(Unique()))
829-
}
830-
831-
@Test
832-
fun givenDuckPlayerSiteWhenRefreshCtaWhileBrowsingAndTrackersDialogAlreadyShownThenDontSentSkipMajorNetworkPixel() = runTest {
833-
givenDaxOnboardingActive()
834-
val site = site(url = "duck://player/12345", entity = TestEntity("Google", "Google", 9.0))
835-
836-
whenever(mockDuckPlayer.isDuckPlayerUri(any())).thenReturn(true)
837-
whenever(mockDuckPlayer.getDuckPlayerState()).thenReturn(ENABLED)
838-
whenever(mockDuckPlayer.getUserPreferences()).thenReturn(UserPreferences(false, AlwaysAsk))
839-
whenever(mockDuckPlayer.isYouTubeUrl(any())).thenReturn(false)
840-
whenever(mockDuckPlayer.isSimulatedYoutubeNoCookie(any())).thenReturn(false)
841-
842-
testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site)
843-
verify(mockPixel).fire(eq(ONBOARDING_SKIP_MAJOR_NETWORK_UNIQUE), any(), any(), eq(Unique()))
844-
}
845-
846813
@Test
847814
fun givenHighlightsExperimentWhenRefreshCtaOnHomeTabAndIntroCtaWasNotPreviouslyShownThenExperimentIntroCtaShown() = runTest {
848815
givenDaxOnboardingActive()

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import com.duckduckgo.app.browser.weblocalstorage.WebLocalStorageManager
2626
import com.duckduckgo.app.di.AppCoroutineScope
2727
import com.duckduckgo.app.global.file.FileDeleter
2828
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
29+
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
30+
import com.duckduckgo.appbuildconfig.api.isInternalBuild
2931
import com.duckduckgo.common.utils.DispatcherProvider
3032
import com.duckduckgo.cookies.api.DuckDuckGoCookieManager
3133
import com.duckduckgo.di.scopes.AppScope
@@ -61,6 +63,7 @@ class WebViewDataManager @Inject constructor(
6163
private val crashLogger: CrashLogger,
6264
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
6365
private val dispatcherProvider: DispatcherProvider,
66+
private val appBuildConfig: AppBuildConfig,
6467
) : WebDataManager {
6568

6669
override suspend fun clearData(
@@ -86,13 +89,20 @@ class WebViewDataManager @Inject constructor(
8689

8790
private suspend fun clearWebStorage(webStorage: WebStorage) {
8891
suspendCoroutine { continuation ->
89-
kotlin.runCatching {
90-
webLocalStorageManager.clearWebLocalStorage()
91-
continuation.resume(Unit)
92-
}.onFailure { e ->
93-
Timber.e(e, "WebDataManager: Could not selectively clear web storage")
94-
sendCrashPixel(e)
95-
// fallback, if we crash we delete everything
92+
if (androidBrowserConfigFeature.webLocalStorage().isEnabled()) {
93+
kotlin.runCatching {
94+
webLocalStorageManager.clearWebLocalStorage()
95+
continuation.resume(Unit)
96+
}.onFailure { e ->
97+
Timber.e(e, "WebDataManager: Could not selectively clear web storage")
98+
if (appBuildConfig.isInternalBuild()) {
99+
sendCrashPixel(e)
100+
}
101+
// fallback, if we crash we delete everything
102+
webStorage.deleteAllData()
103+
continuation.resume(Unit)
104+
}
105+
} else {
96106
webStorage.deleteAllData()
97107
continuation.resume(Unit)
98108
}

app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,9 @@ import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.testPrivacyProOn
4242
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.testPrivacyProOnboardingSecondaryButtonMetricPixel
4343
import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.testPrivacyProOnboardingShownMetricPixel
4444
import com.duckduckgo.app.pixels.AppPixelName
45-
import com.duckduckgo.app.pixels.AppPixelName.ONBOARDING_SKIP_MAJOR_NETWORK_UNIQUE
4645
import com.duckduckgo.app.privacy.db.UserAllowListRepository
4746
import com.duckduckgo.app.settings.db.SettingsDataStore
4847
import com.duckduckgo.app.statistics.pixels.Pixel
49-
import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Unique
5048
import com.duckduckgo.app.tabs.model.TabRepository
5149
import com.duckduckgo.app.widget.ui.WidgetCapabilities
5250
import com.duckduckgo.brokensite.api.BrokenSitePrompt
@@ -486,15 +484,6 @@ class CtaViewModel @Inject constructor(
486484
duckPlayer.isDuckPlayerUri(site.url) || duckPlayer.isSimulatedYoutubeNoCookie(uri)
487485
)
488486

489-
if (isDuckPlayerUrl) { // temporary pixel
490-
val isMayorNetwork = !daxDialogNetworkShown() && !daxDialogTrackersFoundShown() && OnboardingDaxDialogCta.mainTrackerNetworks.any {
491-
site.entity?.displayName?.contains(it) ?: false
492-
}
493-
if (isMayorNetwork) {
494-
pixel.fire(pixel = ONBOARDING_SKIP_MAJOR_NETWORK_UNIQUE, type = Unique())
495-
}
496-
}
497-
498487
return isDuckPlayerUrl
499488
}
500489

app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragment.kt

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616

1717
package com.duckduckgo.app.feedback.ui.initial
1818

19+
import android.app.UiModeManager
1920
import android.os.Bundle
21+
import androidx.core.content.ContextCompat.getSystemService
2022
import com.duckduckgo.anvil.annotations.InjectWith
2123
import com.duckduckgo.app.browser.R
2224
import com.duckduckgo.app.browser.databinding.ContentFeedbackBinding
2325
import com.duckduckgo.app.feedback.ui.common.FeedbackFragment
2426
import com.duckduckgo.app.feedback.ui.initial.InitialFeedbackFragmentViewModel.Command.*
25-
import com.duckduckgo.common.ui.DuckDuckGoTheme
27+
import com.duckduckgo.common.ui.DuckDuckGoTheme.DARK
28+
import com.duckduckgo.common.ui.DuckDuckGoTheme.LIGHT
29+
import com.duckduckgo.common.ui.DuckDuckGoTheme.SYSTEM_DEFAULT
2630
import com.duckduckgo.common.ui.store.ThemingDataStore
2731
import com.duckduckgo.common.ui.viewbinding.viewBinding
2832
import com.duckduckgo.di.scopes.FragmentScope
@@ -50,15 +54,29 @@ class InitialFeedbackFragment : FeedbackFragment(R.layout.content_feedback) {
5054
override fun onActivityCreated(savedInstanceState: Bundle?) {
5155
super.onActivityCreated(savedInstanceState)
5256

53-
if (themingDataStore.theme == DuckDuckGoTheme.LIGHT) {
54-
binding.positiveFeedbackButton.setImageResource(R.drawable.button_happy_light_theme)
55-
binding.negativeFeedbackButton.setImageResource(R.drawable.button_sad_light_theme)
56-
} else {
57-
binding.positiveFeedbackButton.setImageResource(R.drawable.button_happy_dark_theme)
58-
binding.negativeFeedbackButton.setImageResource(R.drawable.button_sad_dark_theme)
57+
when (themingDataStore.theme) {
58+
SYSTEM_DEFAULT -> {
59+
val uiManager = getSystemService(requireContext(), UiModeManager::class.java)
60+
when (uiManager?.nightMode) {
61+
UiModeManager.MODE_NIGHT_YES -> renderDarkButtons()
62+
else -> renderLightButtons()
63+
}
64+
}
65+
DARK -> renderDarkButtons()
66+
LIGHT -> renderLightButtons()
5967
}
6068
}
6169

70+
private fun renderLightButtons() {
71+
binding.positiveFeedbackButton.setImageResource(R.drawable.button_happy_light_theme)
72+
binding.negativeFeedbackButton.setImageResource(R.drawable.button_sad_light_theme)
73+
}
74+
75+
private fun renderDarkButtons() {
76+
binding.positiveFeedbackButton.setImageResource(R.drawable.button_happy_dark_theme)
77+
binding.negativeFeedbackButton.setImageResource(R.drawable.button_sad_dark_theme)
78+
}
79+
6280
override fun configureViewModelObservers() {
6381
viewModel.command.observe(this) {
6482
when (it) {

app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ enum class AppPixelName(override val pixelName: String) : Pixel.PixelName {
4949
ONBOARDING_DAX_ALL_CTA_HIDDEN("m_odc_h"),
5050
ONBOARDING_DAX_CTA_OK_BUTTON("m_odc_ok"),
5151
ONBOARDING_DAX_CTA_CANCEL_BUTTON("m_onboarding_dax_cta_cancel"),
52-
ONBOARDING_SKIP_MAJOR_NETWORK_UNIQUE("m_onboarding_skip_major_network_unique"),
5352
ONBOARDING_VISIT_SITE_CTA_SHOWN("onboarding_visit_site_cta_shown"),
5453

5554
BROWSER_MENU_ALLOWLIST_ADD("mb_wla"),

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import com.duckduckgo.autofill.api.AutofillScreens.AutofillSettingsScreen
7171
import com.duckduckgo.autofill.api.AutofillSettingsLaunchSource
7272
import com.duckduckgo.common.ui.DuckDuckGoActivity
7373
import com.duckduckgo.common.ui.view.gone
74+
import com.duckduckgo.common.ui.view.listitem.DaxListItem.IconSize.Small
7475
import com.duckduckgo.common.ui.view.listitem.TwoLineListItem
7576
import com.duckduckgo.common.ui.view.show
7677
import com.duckduckgo.common.ui.viewbinding.viewBinding
@@ -201,6 +202,7 @@ class NewSettingsActivity : DuckDuckGoActivity() {
201202
with(viewsOther) {
202203
aboutSetting.setOnClickListener { viewModel.onAboutSettingClicked() }
203204
shareFeedbackSetting.setOnClickListener { viewModel.onShareFeedbackClicked() }
205+
ddgOnOtherPlatformsSetting.setTrailingIconSize(Small)
204206
ddgOnOtherPlatformsSetting.setOnClickListener { viewModel.onDdgOnOtherPlatformsClicked() }
205207
}
206208
}

0 commit comments

Comments
 (0)