Skip to content

Commit 2330570

Browse files
authored
Move Duck.ai settings pixels to ViewModel (#6561)
Task/Issue URL: https://app.asana.com/1/137249556945/project/488551667048375/task/1211021941669121?focus=true ### Description - Moves settings pixels from `RealDuckChat` to `DuckChatSettingsViewModel` ### Steps to test this PR - [x] Disable Duck.ai - [x] Verify `aichat_disabled` is sent - [x] Enable Duck.ai - [x] Verify `aichat_enabled` is sent - [x] Enable Experimental Address Bar - [x] Verify `aichat_experimental_address_bar_setting_on` is sent - [x] Disable Experimental Address Bar - [x] Verify `aichat_experimental_address_bar_setting_off` is sent - [x] Disable Browser Menu - [x] Verify `aichat_menu_setting_off` is sent - [x] Enable Browser Menu - [x] Verify `aichat_menu_setting_on` is sent - [x] Disable Address Bar - [x] Verify `aichat_searchbar_setting_off` is sent - [x] Enable Address Bar - [x] Verify `aichat_searchbar_setting_on` is sent
1 parent cd46796 commit 2330570

File tree

4 files changed

+74
-60
lines changed

4 files changed

+74
-60
lines changed

duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/RealDuckChat.kt

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -261,41 +261,21 @@ class RealDuckChat @Inject constructor(
261261
}
262262

263263
override suspend fun setEnableDuckChatUserSetting(enabled: Boolean) {
264-
if (enabled) {
265-
pixel.fire(DuckChatPixelName.DUCK_CHAT_USER_ENABLED)
266-
} else {
267-
pixel.fire(DuckChatPixelName.DUCK_CHAT_USER_DISABLED)
268-
}
269264
duckChatFeatureRepository.setDuckChatUserEnabled(enabled)
270265
cacheUserSettings()
271266
}
272267

273268
override suspend fun setInputScreenUserSetting(enabled: Boolean) {
274-
if (enabled) {
275-
pixel.fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_ON)
276-
} else {
277-
pixel.fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_OFF)
278-
}
279269
duckChatFeatureRepository.setInputScreenUserSetting(enabled)
280270
cacheUserSettings()
281271
}
282272

283273
override suspend fun setShowInBrowserMenuUserSetting(showDuckChat: Boolean) = withContext(dispatchers.io()) {
284-
if (showDuckChat) {
285-
pixel.fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_ON)
286-
} else {
287-
pixel.fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_OFF)
288-
}
289274
duckChatFeatureRepository.setShowInBrowserMenu(showDuckChat)
290275
cacheUserSettings()
291276
}
292277

293278
override suspend fun setShowInAddressBarUserSetting(showDuckChat: Boolean) = withContext(dispatchers.io()) {
294-
if (showDuckChat) {
295-
pixel.fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_ON)
296-
} else {
297-
pixel.fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_OFF)
298-
}
299279
duckChatFeatureRepository.setShowInAddressBar(showDuckChat)
300280
cacheUserSettings()
301281
}

duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/DuckChatSettingsViewModel.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,44 @@ class DuckChatSettingsViewModel @Inject constructor(
8383

8484
fun onDuckChatUserEnabledToggled(checked: Boolean) {
8585
viewModelScope.launch {
86+
if (checked) {
87+
pixel.fire(DuckChatPixelName.DUCK_CHAT_USER_ENABLED)
88+
} else {
89+
pixel.fire(DuckChatPixelName.DUCK_CHAT_USER_DISABLED)
90+
}
8691
duckChat.setEnableDuckChatUserSetting(checked)
8792
}
8893
}
8994

9095
fun onDuckAiInputScreenToggled(checked: Boolean) {
9196
viewModelScope.launch {
97+
if (checked) {
98+
pixel.fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_ON)
99+
} else {
100+
pixel.fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_OFF)
101+
}
92102
duckChat.setInputScreenUserSetting(checked)
93103
}
94104
}
95105

96106
fun onShowDuckChatInMenuToggled(checked: Boolean) {
97107
viewModelScope.launch {
108+
if (checked) {
109+
pixel.fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_ON)
110+
} else {
111+
pixel.fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_OFF)
112+
}
98113
duckChat.setShowInBrowserMenuUserSetting(checked)
99114
}
100115
}
101116

102117
fun onShowDuckChatInAddressBarToggled(checked: Boolean) {
103118
viewModelScope.launch {
119+
if (checked) {
120+
pixel.fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_ON)
121+
} else {
122+
pixel.fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_OFF)
123+
}
104124
duckChat.setShowInAddressBarUserSetting(checked)
105125
}
106126
}

duckchat/duckchat-impl/src/test/kotlin/com/duckduckgo/duckchat/impl/RealDuckChatTest.kt

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import com.duckduckgo.common.ui.experiments.visual.store.ExperimentalThemingData
3131
import com.duckduckgo.duckchat.api.DuckChatSettingsNoParams
3232
import com.duckduckgo.duckchat.impl.feature.AIChatImageUploadFeature
3333
import com.duckduckgo.duckchat.impl.feature.DuckChatFeature
34-
import com.duckduckgo.duckchat.impl.pixel.DuckChatPixelName
3534
import com.duckduckgo.duckchat.impl.repository.DuckChatFeatureRepository
3635
import com.duckduckgo.duckchat.impl.ui.DuckChatWebViewActivityWithParams
3736
import com.duckduckgo.feature.toggles.api.FakeFeatureToggleFactory
@@ -60,7 +59,6 @@ import org.mockito.Mockito.mock
6059
import org.mockito.Mockito.spy
6160
import org.mockito.kotlin.any
6261
import org.mockito.kotlin.argumentCaptor
63-
import org.mockito.kotlin.inOrder
6462
import org.mockito.kotlin.verify
6563
import org.mockito.kotlin.whenever
6664

@@ -122,36 +120,12 @@ class RealDuckChatTest {
122120
whenever(mockGlobalActivityStarter.startIntent(any(), any<DuckChatWebViewActivityWithParams>())).thenReturn(mockIntent)
123121
}
124122

125-
@Test
126-
fun whenSetShowInBrowserMenuSetTrueThenPixelOnIsSent() = runTest {
127-
testee.setShowInBrowserMenuUserSetting(true)
128-
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_ON)
129-
}
130-
131-
@Test
132-
fun whenSetShowInBrowserMenuSetFalseThenPixelOffIsSent() = runTest {
133-
testee.setShowInBrowserMenuUserSetting(false)
134-
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_OFF)
135-
}
136-
137123
@Test
138124
fun whenSetShowInBrowserMenuUserSettingThenRepositorySetCalled() = runTest {
139125
testee.setShowInBrowserMenuUserSetting(true)
140126
verify(mockDuckChatFeatureRepository).setShowInBrowserMenu(true)
141127
}
142128

143-
@Test
144-
fun whenSetShowInAddressBarSetTrueThenPixelOnIsSent() = runTest {
145-
testee.setShowInAddressBarUserSetting(true)
146-
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_ON)
147-
}
148-
149-
@Test
150-
fun whenSetShowInAddressBarSetFalseThenPixelOffIsSent() = runTest {
151-
testee.setShowInAddressBarUserSetting(false)
152-
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_OFF)
153-
}
154-
155129
@Test
156130
fun whenSetShowInAddressBarUserSettingThenRepositorySetCalled() = runTest {
157131
testee.setShowInAddressBarUserSetting(true)
@@ -457,23 +431,21 @@ class RealDuckChatTest {
457431
}
458432

459433
@Test
460-
fun whenSetEnableDuckChatUserSettingTrueThenEnabledPixelSentAndRepositoryUpdated() = runTest {
434+
fun whenSetEnableDuckChatUserSettingTrueThenRepositoryUpdated() = runTest {
461435
whenever(mockDuckChatFeatureRepository.isDuckChatUserEnabled()).thenReturn(true)
462436

463437
testee.setEnableDuckChatUserSetting(true)
464438

465-
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_USER_ENABLED)
466439
verify(mockDuckChatFeatureRepository).setDuckChatUserEnabled(true)
467440
assertTrue(testee.isDuckChatUserEnabled())
468441
}
469442

470443
@Test
471-
fun whenSetEnableDuckChatUserSettingFalseThenDisabledPixelSentAndRepositoryUpdated() = runTest {
444+
fun whenSetEnableDuckChatUserSettingFalseThenRepositoryUpdated() = runTest {
472445
whenever(mockDuckChatFeatureRepository.isDuckChatUserEnabled()).thenReturn(false)
473446

474447
testee.setEnableDuckChatUserSetting(false)
475448

476-
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_USER_DISABLED)
477449
verify(mockDuckChatFeatureRepository).setDuckChatUserEnabled(false)
478450
assertFalse(testee.isDuckChatUserEnabled())
479451
}
@@ -674,23 +646,17 @@ class RealDuckChatTest {
674646
}
675647

676648
@Test
677-
fun `when enable input screen user setting then repository updated and pixel fired`() = runTest {
649+
fun `when enable input screen user setting then repository updated`() = runTest {
678650
testee.setInputScreenUserSetting(true)
679651

680-
val inOrder = inOrder(mockDuckChatFeatureRepository, mockPixel)
681-
inOrder.verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_ON)
682-
inOrder.verify(mockDuckChatFeatureRepository).setInputScreenUserSetting(true)
683-
inOrder.verify(mockDuckChatFeatureRepository).isInputScreenUserSettingEnabled()
652+
verify(mockDuckChatFeatureRepository).setInputScreenUserSetting(true)
684653
}
685654

686655
@Test
687-
fun `when disable input screen user setting then repository updated and pixel fired`() = runTest {
656+
fun `when disable input screen user setting then repository updated`() = runTest {
688657
testee.setInputScreenUserSetting(false)
689658

690-
val inOrder = inOrder(mockDuckChatFeatureRepository, mockPixel)
691-
inOrder.verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_OFF)
692-
inOrder.verify(mockDuckChatFeatureRepository).setInputScreenUserSetting(false)
693-
inOrder.verify(mockDuckChatFeatureRepository).isInputScreenUserSettingEnabled()
659+
verify(mockDuckChatFeatureRepository).setInputScreenUserSetting(false)
694660
}
695661

696662
@Test

duckchat/duckchat-impl/src/test/kotlin/com/duckduckgo/duckchat/impl/ui/DuckChatSettingsViewModelTest.kt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,4 +271,52 @@ class DuckChatSettingsViewModelTest {
271271
testee.duckChatSearchAISettingsClicked()
272272
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_SEARCH_ASSIST_SETTINGS_BUTTON_CLICKED)
273273
}
274+
275+
@Test
276+
fun `when onDuckChatUserEnabledToggled true then enabled pixel fired`() = runTest {
277+
testee.onDuckChatUserEnabledToggled(true)
278+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_USER_ENABLED)
279+
}
280+
281+
@Test
282+
fun `when onDuckChatUserEnabledToggled false then disabled pixel fired`() = runTest {
283+
testee.onDuckChatUserEnabledToggled(false)
284+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_USER_DISABLED)
285+
}
286+
287+
@Test
288+
fun `when onDuckAiInputScreenToggled true then on pixel fired`() = runTest {
289+
testee.onDuckAiInputScreenToggled(true)
290+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_ON)
291+
}
292+
293+
@Test
294+
fun `when onDuckAiInputScreenToggled false then off pixel fired`() = runTest {
295+
testee.onDuckAiInputScreenToggled(false)
296+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_EXPERIMENTAL_ADDRESS_BAR_SETTING_OFF)
297+
}
298+
299+
@Test
300+
fun `when onShowDuckChatInMenuToggled true then on pixel fired`() = runTest {
301+
testee.onShowDuckChatInMenuToggled(true)
302+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_ON)
303+
}
304+
305+
@Test
306+
fun `when onShowDuckChatInMenuToggled false then off pixel fired`() = runTest {
307+
testee.onShowDuckChatInMenuToggled(false)
308+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_MENU_SETTING_OFF)
309+
}
310+
311+
@Test
312+
fun `when onShowDuckChatInAddressBarToggled true then on pixel fired`() = runTest {
313+
testee.onShowDuckChatInAddressBarToggled(true)
314+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_ON)
315+
}
316+
317+
@Test
318+
fun `when onShowDuckChatInAddressBarToggled false then off pixel fired`() = runTest {
319+
testee.onShowDuckChatInAddressBarToggled(false)
320+
verify(mockPixel).fire(DuckChatPixelName.DUCK_CHAT_SEARCHBAR_SETTING_OFF)
321+
}
274322
}

0 commit comments

Comments
 (0)