diff --git a/app/src/androidTest/java/com/duckduckgo/app/settings/SettingsViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/settings/SettingsViewModelTest.kt index 229fc51b207f..9c9baccae195 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/settings/SettingsViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/settings/SettingsViewModelTest.kt @@ -29,6 +29,7 @@ import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.Variant import com.duckduckgo.app.statistics.VariantManager import com.duckduckgo.app.statistics.VariantManager.VariantFeature.ThemeFeature.ThemeToggle +import com.duckduckgo.app.statistics.pixels.Pixel import com.nhaarman.mockito_kotlin.* import org.junit.Assert.* import org.junit.Before @@ -59,6 +60,9 @@ class SettingsViewModelTest { @Mock private lateinit var mockVariantManager: VariantManager + @Mock + private lateinit var mockPixel: Pixel + private lateinit var commandCaptor: KArgumentCaptor @Before @@ -68,12 +72,18 @@ class SettingsViewModelTest { context = InstrumentationRegistry.getTargetContext() commandCaptor = argumentCaptor() - testee = SettingsViewModel(mockAppSettingsDataStore, mockDefaultBrowserDetector, mockVariantManager) + testee = SettingsViewModel(mockAppSettingsDataStore, mockDefaultBrowserDetector, mockVariantManager, mockPixel) testee.command.observeForever(commandObserver) whenever(mockVariantManager.getVariant()).thenReturn(VariantManager.DEFAULT_VARIANT) } + @Test + fun whenViewModelInitialisedThenPixelIsFired() { + testee // init + verify(mockPixel).fire(Pixel.PixelName.SETTINGS_OPENED) + } + @Test fun whenStartNotCalledYetThenViewStateInitialisedDefaultValues() { assertNotNull(testee.viewState) @@ -111,6 +121,12 @@ class SettingsViewModelTest { assertEquals(Command.UpdateTheme, commandCaptor.firstValue) } + @Test + fun whenLightThemeToggledOnThenLighThemePixelIsSent() { + testee.onLightThemeToggled(true) + verify(mockPixel).fire(Pixel.PixelName.SETTINGS_THEME_TOGGLED_LIGHT) + } + @Test fun whenLightThemeTogglesOffThenDataStoreIsUpdatedAndUpdateThemeCommandIsSent() { testee.onLightThemeToggled(false) @@ -121,6 +137,12 @@ class SettingsViewModelTest { assertEquals(Command.UpdateTheme, commandCaptor.firstValue) } + @Test + fun whenLightThemeToggledOffThenDarkThemePixelIsSent() { + testee.onLightThemeToggled(false) + verify(mockPixel).fire(Pixel.PixelName.SETTINGS_THEME_TOGGLED_DARK) + } + @Test fun whenAutocompleteSwitchedOnThenDataStoreIsUpdated() { testee.onAutocompleteSettingChanged(true) diff --git a/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt b/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt index 3257ea236c2f..076b8b8fb114 100644 --- a/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt +++ b/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt @@ -95,7 +95,8 @@ class ViewModelFactory @Inject constructor( isAssignableFrom(SettingsViewModel::class.java) -> SettingsViewModel( appSettingsPreferencesStore, defaultBrowserDetector, - variantManager + variantManager, + pixel ) isAssignableFrom(BookmarksViewModel::class.java) -> BookmarksViewModel(bookmarksDao) isAssignableFrom(FireViewModel::class.java) -> FireViewModel() diff --git a/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt b/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt index 9b18c1018fe7..3e06e1efcd72 100644 --- a/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt @@ -25,13 +25,16 @@ import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.VariantManager import com.duckduckgo.app.statistics.VariantManager.VariantFeature.ThemeFeature.ThemeToggle +import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.* import timber.log.Timber import javax.inject.Inject class SettingsViewModel @Inject constructor( private val settingsDataStore: SettingsDataStore, private val defaultWebBrowserCapability: DefaultBrowserDetector, - private val variantManager: VariantManager + private val variantManager: VariantManager, + private val pixel: Pixel ) : ViewModel() { data class ViewState( @@ -58,6 +61,10 @@ class SettingsViewModel @Inject constructor( val command: SingleLiveEvent = SingleLiveEvent() + init { + pixel.fire(SETTINGS_OPENED) + } + fun start() { val defaultBrowserAlready = defaultWebBrowserCapability.isCurrentlyConfiguredAsDefaultBrowser() @@ -83,6 +90,9 @@ class SettingsViewModel @Inject constructor( Timber.i("User toggled light theme, is now enabled: $enabled") settingsDataStore.theme = if (enabled) DuckDuckGoTheme.LIGHT else DuckDuckGoTheme.DARK command.value = Command.UpdateTheme + + val pixelName = if (enabled) SETTINGS_THEME_TOGGLED_LIGHT else SETTINGS_THEME_TOGGLED_DARK + pixel.fire(pixelName) } fun onAutocompleteSettingChanged(enabled: Boolean) { diff --git a/app/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt b/app/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt index 7c9974c3eeee..06d896cbf0e2 100644 --- a/app/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt +++ b/app/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt @@ -50,6 +50,10 @@ interface Pixel { LONG_PRESS_SHARE("mlp_s"), LONG_PRESS_COPY_URL("mlp_c"), + SETTINGS_OPENED("ms"), + SETTINGS_THEME_TOGGLED_LIGHT("ms_tl"), + SETTINGS_THEME_TOGGLED_DARK("ms_td"), + HTTPS_UPGRADE_SITE_ERROR("ehd"), HTTPS_UPGRADE_SITE_SUMMARY("ehs") }