@@ -43,20 +43,28 @@ import com.duckduckgo.common.ui.DuckDuckGoTheme.DARK
4343import com.duckduckgo.common.ui.DuckDuckGoTheme.LIGHT
4444import com.duckduckgo.common.ui.DuckDuckGoTheme.SYSTEM_DEFAULT
4545import com.duckduckgo.common.ui.sendThemeChangedBroadcast
46+ import com.duckduckgo.common.ui.store.AppTheme
4647import com.duckduckgo.common.ui.view.dialog.RadioListAlertDialogBuilder
4748import com.duckduckgo.common.ui.view.dialog.TextAlertDialogBuilder
4849import com.duckduckgo.common.ui.view.getColorFromAttr
50+ import com.duckduckgo.common.ui.view.gone
51+ import com.duckduckgo.common.ui.view.show
4952import com.duckduckgo.common.ui.viewbinding.viewBinding
5053import com.duckduckgo.di.scopes.ActivityScope
5154import com.duckduckgo.navigation.api.getActivityParams
5255import kotlinx.coroutines.flow.launchIn
5356import kotlinx.coroutines.flow.onEach
5457import logcat.logcat
58+ import javax.inject.Inject
59+ import com.duckduckgo.mobile.android.R as CommonR
5560
5661@InjectWith(ActivityScope ::class )
5762@ContributeToActivityStarter(Default ::class , screenName = " appearance" )
5863@ContributeToActivityStarter(HighlightedItem ::class , screenName = " appearance" )
5964class AppearanceActivity : DuckDuckGoActivity () {
65+ @Inject
66+ lateinit var appTheme: AppTheme
67+
6068 private val viewModel: AppearanceViewModel by bindViewModel()
6169 private val binding: ActivityAppearanceBinding by viewBinding()
6270
@@ -110,10 +118,43 @@ class AppearanceActivity : DuckDuckGoActivity() {
110118 scrollToHighlightedItem()
111119 }
112120
121+ private fun configureOmnibarSettings (viewState : AppearanceViewModel .ViewState ) {
122+ if (viewState.shouldShowSplitOmnibarSettings) {
123+ configureOmnibarTypeToggle(
124+ top = InputScreenToggleButton .Top (
125+ isActive = viewState.omnibarType == OmnibarType .SINGLE_TOP ,
126+ isLightMode = appTheme.isLightModeEnabled(),
127+ ),
128+ bottom = InputScreenToggleButton .Bottom (
129+ isActive = viewState.omnibarType == OmnibarType .SINGLE_BOTTOM ,
130+ isLightMode = appTheme.isLightModeEnabled(),
131+ ),
132+ split = InputScreenToggleButton .Split (
133+ isActive = viewState.omnibarType == OmnibarType .SPLIT ,
134+ isLightMode = appTheme.isLightModeEnabled(),
135+ ),
136+ )
137+
138+ binding.omnibarTypeSettingsTitle.show()
139+ binding.omnibarTypeToggleContainer.show()
140+ binding.showFullUrlSettingDivider.show()
141+ binding.addressBarPositionSetting.gone()
142+ } else {
143+ updateSelectedOmnibarPosition(viewState.omnibarType)
144+ binding.omnibarTypeSettingsTitle.gone()
145+ binding.omnibarTypeToggleContainer.gone()
146+ binding.showFullUrlSettingDivider.gone()
147+ binding.addressBarPositionSetting.show()
148+ }
149+ }
150+
113151 private fun configureUiEventHandlers () {
114152 binding.selectedThemeSetting.setClickListener { viewModel.userRequestedToChangeTheme() }
115153 binding.changeAppIconSetting.setOnClickListener { viewModel.userRequestedToChangeIcon() }
116154 binding.addressBarPositionSetting.setOnClickListener { viewModel.userRequestedToChangeAddressBarPosition() }
155+ binding.topOmnibarContainer.setOnClickListener { viewModel.onOmnibarTypeSelected(OmnibarType .SINGLE_TOP ) }
156+ binding.bottomOmnibarContainer.setOnClickListener { viewModel.onOmnibarTypeSelected(OmnibarType .SINGLE_BOTTOM ) }
157+ binding.splitOmnibarContainer.setOnClickListener { viewModel.onOmnibarTypeSelected(OmnibarType .SPLIT ) }
117158 }
118159
119160 private fun observeViewModel () {
@@ -127,12 +168,12 @@ class AppearanceActivity : DuckDuckGoActivity() {
127168 binding.experimentalNightMode.quietlySetIsChecked(viewState.forceDarkModeEnabled, forceDarkModeToggleListener)
128169 binding.experimentalNightMode.isEnabled = viewState.canForceDarkMode
129170 binding.experimentalNightMode.isVisible = viewState.supportsForceDarkMode
130- updateSelectedOmnibarPosition(it.omnibarType)
131171 binding.showFullUrlSetting.quietlySetIsChecked(viewState.isFullUrlEnabled, showFullUrlToggleListener)
132172 binding.showTrackersCountInTabSwitcher.quietlySetIsChecked(
133173 viewState.isTrackersCountInTabSwitcherEnabled,
134174 showTrackersCountInTabSwitcher,
135175 )
176+ configureOmnibarSettings(it)
136177 }
137178 }.launchIn(lifecycleScope)
138179
@@ -159,9 +200,8 @@ class AppearanceActivity : DuckDuckGoActivity() {
159200 val subtitle =
160201 getString(
161202 when (omnibarType) {
162- OmnibarType .SINGLE_TOP -> R .string.settingsAddressBarPositionTop
203+ OmnibarType .SINGLE_TOP , OmnibarType . SPLIT -> R .string.settingsAddressBarPositionTop
163204 OmnibarType .SINGLE_BOTTOM -> R .string.settingsAddressBarPositionBottom
164- OmnibarType .SPLIT -> TODO ()
165205 },
166206 )
167207 binding.addressBarPositionSetting.setSecondaryText(subtitle)
@@ -224,7 +264,7 @@ class AppearanceActivity : DuckDuckGoActivity() {
224264 object : RadioListAlertDialogBuilder .EventListener () {
225265 override fun onPositiveButtonClicked (selectedItem : Int ) {
226266 val newType = OmnibarType .entries[selectedItem - 1 ]
227- viewModel.setOmnibarType (newType)
267+ viewModel.onOmnibarTypeSelected (newType)
228268 }
229269 },
230270 ).show()
@@ -260,6 +300,74 @@ class AppearanceActivity : DuckDuckGoActivity() {
260300 colorAnimator.start()
261301 }
262302
303+ private fun configureOmnibarTypeToggle (
304+ top : InputScreenToggleButton ,
305+ bottom : InputScreenToggleButton ,
306+ split : InputScreenToggleButton ,
307+ ) = with (binding) {
308+ val context = this @AppearanceActivity
309+ topOmnibarToggleImage.setImageDrawable(ContextCompat .getDrawable(context, top.imageRes))
310+ topOmnibarToggleCheck.setImageDrawable(ContextCompat .getDrawable(context, top.checkRes))
311+
312+ bottomOmnibarToggleImage.setImageDrawable(ContextCompat .getDrawable(context, bottom.imageRes))
313+ bottomOmnibarToggleCheck.setImageDrawable(ContextCompat .getDrawable(context, bottom.checkRes))
314+
315+ splitOmnibarToggleImage.setImageDrawable(ContextCompat .getDrawable(context, split.imageRes))
316+ splitOmnibarToggleCheck.setImageDrawable(ContextCompat .getDrawable(context, split.checkRes))
317+ }
318+
319+ private sealed class InputScreenToggleButton (
320+ isActive : Boolean ,
321+ ) {
322+ abstract val imageRes: Int
323+
324+ val checkRes: Int =
325+ if (isActive) {
326+ CommonR .drawable.ic_check_accent_24
327+ } else {
328+ CommonR .drawable.ic_shape_circle_disabled_24
329+ }
330+
331+ class Top (
332+ isActive : Boolean ,
333+ isLightMode : Boolean ,
334+ ) : InputScreenToggleButton(isActive) {
335+ override val imageRes: Int =
336+ when {
337+ isActive && isLightMode -> R .drawable.mobile_toolbar_top_selected_light
338+ isActive && ! isLightMode -> R .drawable.mobile_toolbar_top_selected_dark
339+ ! isActive && isLightMode -> R .drawable.mobile_toolbar_top_unselected_light
340+ else -> R .drawable.mobile_toolbar_top_unselected_dark
341+ }
342+ }
343+
344+ class Bottom (
345+ isActive : Boolean ,
346+ isLightMode : Boolean ,
347+ ) : InputScreenToggleButton(isActive) {
348+ override val imageRes: Int =
349+ when {
350+ isActive && isLightMode -> R .drawable.mobile_toolbar_bottom_selected_light
351+ isActive && ! isLightMode -> R .drawable.mobile_toolbar_bottom_selected_dark
352+ ! isActive && isLightMode -> R .drawable.mobile_toolbar_bottom_unselected_light
353+ else -> R .drawable.mobile_toolbar_bottom_unselected_dark
354+ }
355+ }
356+
357+ class Split (
358+ isActive : Boolean ,
359+ isLightMode : Boolean ,
360+ ) : InputScreenToggleButton(isActive) {
361+ override val imageRes: Int =
362+ when {
363+ isActive && isLightMode -> R .drawable.mobile_toolbar_split_selected_light
364+ isActive && ! isLightMode -> R .drawable.mobile_toolbar_split_selected_dark
365+ ! isActive && isLightMode -> R .drawable.mobile_toolbar_split_unselected_light
366+ else -> R .drawable.mobile_toolbar_split_unselected_dark
367+ }
368+ }
369+ }
370+
263371 companion object {
264372 private const val ADDRESS_BAR = " addressBar"
265373 private const val FADE_DURATION = 300L
0 commit comments