@@ -28,21 +28,19 @@ import com.duckduckgo.app.pixels.AppPixelName.SETTINGS_THEME_TOGGLED_SYSTEM_DEFA
2828import com.duckduckgo.app.settings.db.SettingsDataStore
2929import com.duckduckgo.app.statistics.pixels.Pixel
3030import com.duckduckgo.app.tabs.store.TabSwitcherDataStore
31- import com.duckduckgo.browser.ui.omnibar.OmnibarPosition
31+ import com.duckduckgo.browser.ui.omnibar.OmnibarType
3232import com.duckduckgo.common.ui.DuckDuckGoTheme
33- import com.duckduckgo.common.ui.DuckDuckGoTheme.DARK
34- import com.duckduckgo.common.ui.DuckDuckGoTheme.LIGHT
35- import com.duckduckgo.common.ui.DuckDuckGoTheme.SYSTEM_DEFAULT
3633import com.duckduckgo.common.ui.store.ThemingDataStore
3734import com.duckduckgo.common.utils.DispatcherProvider
3835import com.duckduckgo.di.scopes.ActivityScope
3936import kotlinx.coroutines.channels.BufferOverflow
4037import kotlinx.coroutines.channels.Channel
4138import kotlinx.coroutines.flow.Flow
4239import kotlinx.coroutines.flow.MutableStateFlow
43- import kotlinx.coroutines.flow.firstOrNull
44- import kotlinx.coroutines.flow.onStart
40+ import kotlinx.coroutines.flow.SharingStarted
41+ import kotlinx.coroutines.flow.combine
4542import kotlinx.coroutines.flow.receiveAsFlow
43+ import kotlinx.coroutines.flow.stateIn
4644import kotlinx.coroutines.flow.update
4745import kotlinx.coroutines.launch
4846import kotlinx.coroutines.withContext
@@ -64,7 +62,7 @@ class AppearanceViewModel @Inject constructor(
6462 val forceDarkModeEnabled : Boolean = false ,
6563 val canForceDarkMode : Boolean = false ,
6664 val supportsForceDarkMode : Boolean = true ,
67- val omnibarPosition : OmnibarPosition = OmnibarPosition . TOP ,
65+ val omnibarType : OmnibarType = OmnibarType . SINGLE_TOP ,
6866 val isFullUrlEnabled : Boolean = true ,
6967 val isTrackersCountInTabSwitcherEnabled : Boolean = true ,
7068 )
@@ -78,32 +76,33 @@ class AppearanceViewModel @Inject constructor(
7876
7977 data object UpdateTheme : Command ()
8078
81- data class LaunchOmnibarPositionSettings (
82- val position : OmnibarPosition ,
79+ data class LaunchOmnibarTypeSettings (
80+ val omnibarType : OmnibarType ,
8381 ) : Command()
8482 }
8583
86- private val viewState = MutableStateFlow (ViewState ())
87- private val command = Channel <Command >(1 , BufferOverflow .DROP_OLDEST )
84+ private val viewState = MutableStateFlow (
85+ ViewState (
86+ theme = themingDataStore.theme,
87+ appIcon = settingsDataStore.appIcon,
88+ forceDarkModeEnabled = settingsDataStore.experimentalWebsiteDarkMode,
89+ canForceDarkMode = canForceDarkMode(),
90+ supportsForceDarkMode = WebViewFeature .isFeatureSupported(WebViewFeature .ALGORITHMIC_DARKENING ),
91+ isFullUrlEnabled = settingsDataStore.isFullUrlEnabled,
92+ omnibarType = settingsDataStore.omnibarType,
93+ ),
94+ )
8895
89- fun viewState (): Flow <ViewState > =
90- viewState.onStart {
91- viewModelScope.launch {
92- viewState.update {
93- currentViewState().copy(
94- theme = themingDataStore.theme,
95- appIcon = settingsDataStore.appIcon,
96- forceDarkModeEnabled = settingsDataStore.experimentalWebsiteDarkMode,
97- canForceDarkMode = canForceDarkMode(),
98- supportsForceDarkMode = WebViewFeature .isFeatureSupported(WebViewFeature .ALGORITHMIC_DARKENING ),
99- omnibarPosition = settingsDataStore.omnibarPosition,
100- isFullUrlEnabled = settingsDataStore.isFullUrlEnabled,
101- isTrackersCountInTabSwitcherEnabled = tabSwitcherDataStore.isTrackersAnimationInfoTileHidden().firstOrNull() != true ,
102- )
103- }
104- }
105- }
96+ fun viewState () = combine(
97+ viewState,
98+ tabSwitcherDataStore.isTrackersAnimationInfoTileHidden(),
99+ ) { currentViewState, isTrackersAnimationTileHidden ->
100+ currentViewState.copy(
101+ isTrackersCountInTabSwitcherEnabled = ! isTrackersAnimationTileHidden,
102+ )
103+ }.stateIn(viewModelScope, SharingStarted .Lazily , viewState.value)
106104
105+ private val command = Channel <Command >(1 , BufferOverflow .DROP_OLDEST )
107106 fun commands (): Flow <Command > = command.receiveAsFlow()
108107
109108 private fun canForceDarkMode (): Boolean = themingDataStore.theme != DuckDuckGoTheme .LIGHT
@@ -119,7 +118,7 @@ class AppearanceViewModel @Inject constructor(
119118 }
120119
121120 fun userRequestedToChangeAddressBarPosition () {
122- viewModelScope.launch { command.send(Command .LaunchOmnibarPositionSettings (viewState.value.omnibarPosition )) }
121+ viewModelScope.launch { command.send(Command .LaunchOmnibarTypeSettings (viewState.value.omnibarType )) }
123122 pixel.fire(AppPixelName .SETTINGS_ADDRESS_BAR_POSITION_PRESSED )
124123 }
125124
@@ -132,34 +131,33 @@ class AppearanceViewModel @Inject constructor(
132131 viewModelScope.launch(dispatcherProvider.io()) {
133132 themingDataStore.theme = selectedTheme
134133 withContext(dispatcherProvider.main()) {
135- viewState.update { currentViewState() .copy(theme = selectedTheme, forceDarkModeEnabled = canForceDarkMode()) }
134+ viewState.update { it .copy(theme = selectedTheme, forceDarkModeEnabled = canForceDarkMode()) }
136135 command.send(Command .UpdateTheme )
137136 }
138137 }
139138
140139 val pixelName =
141140 when (selectedTheme) {
142- LIGHT -> SETTINGS_THEME_TOGGLED_LIGHT
143- DARK -> SETTINGS_THEME_TOGGLED_DARK
144- SYSTEM_DEFAULT -> SETTINGS_THEME_TOGGLED_SYSTEM_DEFAULT
141+ DuckDuckGoTheme . LIGHT -> SETTINGS_THEME_TOGGLED_LIGHT
142+ DuckDuckGoTheme . DARK -> SETTINGS_THEME_TOGGLED_DARK
143+ DuckDuckGoTheme . SYSTEM_DEFAULT -> SETTINGS_THEME_TOGGLED_SYSTEM_DEFAULT
145144 }
146145 pixel.fire(pixelName)
147146 }
148147
149- fun onOmnibarPositionUpdated ( position : OmnibarPosition ) {
148+ fun setOmnibarType ( type : OmnibarType ) {
150149 viewModelScope.launch(dispatcherProvider.io()) {
151- settingsDataStore.omnibarPosition = position
152- viewState.update { currentViewState() .copy(omnibarPosition = position ) }
150+ settingsDataStore.omnibarType = type
151+ viewState.update { it .copy(omnibarType = type ) }
153152
154- when (position) {
155- OmnibarPosition .TOP -> pixel.fire(AppPixelName .SETTINGS_ADDRESS_BAR_POSITION_SELECTED_TOP )
156- OmnibarPosition .BOTTOM -> pixel.fire(AppPixelName .SETTINGS_ADDRESS_BAR_POSITION_SELECTED_BOTTOM )
153+ when (type) {
154+ OmnibarType .SINGLE_TOP -> pixel.fire(AppPixelName .SETTINGS_ADDRESS_BAR_POSITION_SELECTED_TOP )
155+ OmnibarType .SINGLE_BOTTOM -> pixel.fire(AppPixelName .SETTINGS_ADDRESS_BAR_POSITION_SELECTED_BOTTOM )
156+ OmnibarType .SPLIT -> pixel.fire(AppPixelName .SETTINGS_ADDRESS_BAR_POSITION_SELECTED_SPLIT_TOP )
157157 }
158158 }
159159 }
160160
161- private fun currentViewState (): ViewState = viewState.value
162-
163161 fun onForceDarkModeSettingChanged (checked : Boolean ) {
164162 viewModelScope.launch(dispatcherProvider.io()) {
165163 if (checked) {
0 commit comments