Skip to content

Commit f86b700

Browse files
committed
show proper omnibar based on flag
1 parent f0ada0c commit f86b700

File tree

3 files changed

+83
-32
lines changed

3 files changed

+83
-32
lines changed

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import android.content.Context
2020
import android.util.AttributeSet
2121
import android.widget.FrameLayout
2222
import com.duckduckgo.anvil.annotations.InjectWith
23-
import com.duckduckgo.browser.ui.omnibar.OmnibarType
2423
import com.duckduckgo.browser.ui.tabs.NewTabSwitcherButton
2524
import com.duckduckgo.di.scopes.FragmentScope
2625
import com.duckduckgo.duckchat.impl.R
@@ -52,10 +51,6 @@ class DuckChatOmnibarLayout @JvmOverloads constructor(
5251
inflate(context, R.layout.view_duck_chat_omnibar, this)
5352

5453
AndroidSupportInjection.inject(this)
55-
56-
val attr = context.theme.obtainStyledAttributes(attrs, R.styleable.DuckChatOmnibarLayout, defStyle, 0)
57-
val omnibarType = OmnibarType.entries[attr.getInt(R.styleable.DuckChatOmnibarLayout_duckOmnibarPosition, 0)]
58-
val isTopPosition = omnibarType == OmnibarType.SINGLE_TOP || omnibarType == OmnibarType.SPLIT
5954
}
6055

6156
fun setOmnibarItemPressedListener(itemPressedListener: ItemPressedListener) {

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

Lines changed: 61 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@ import android.webkit.WebView
3939
import androidx.annotation.AnyThread
4040
import androidx.appcompat.widget.Toolbar
4141
import androidx.core.content.ContextCompat
42+
import androidx.lifecycle.Lifecycle
4243
import androidx.lifecycle.ViewModelProvider
44+
import androidx.lifecycle.flowWithLifecycle
4345
import androidx.lifecycle.lifecycleScope
4446
import com.duckduckgo.anvil.annotations.InjectWith
4547
import com.duckduckgo.app.di.AppCoroutineScope
4648
import com.duckduckgo.app.tabs.BrowserNav
4749
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
4850
import com.duckduckgo.common.ui.DuckDuckGoFragment
4951
import com.duckduckgo.common.ui.view.dialog.ActionBottomSheetDialog
52+
import com.duckduckgo.common.ui.view.gone
5053
import com.duckduckgo.common.ui.view.makeSnackbarWithNoBottomInset
54+
import com.duckduckgo.common.ui.view.show
5155
import com.duckduckgo.common.ui.viewbinding.viewBinding
5256
import com.duckduckgo.common.utils.ConflatedJob
5357
import com.duckduckgo.common.utils.DispatcherProvider
@@ -174,9 +178,6 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
174178
super.onViewCreated(view, savedInstanceState)
175179

176180
val url = arguments?.getString(KEY_DUCK_AI_URL) ?: "https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=5"
177-
val tabs = arguments?.getInt(KEY_DUCK_AI_TABS) ?: 0
178-
179-
configureOmnibar(tabs)
180181

181182
simpleWebview.let {
182183
it.webViewClient = webViewClient
@@ -302,7 +303,15 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
302303
pendingUploadTask = null
303304
}
304305

305-
// Observe ViewModel commands
306+
observeViewModel()
307+
}
308+
309+
private fun observeViewModel() {
310+
viewModel.viewState
311+
.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED)
312+
.onEach { renderViewState(it) }
313+
.launchIn(lifecycleScope)
314+
306315
viewModel.commands
307316
.onEach { command ->
308317
when (command) {
@@ -318,33 +327,58 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
318327
}.launchIn(lifecycleScope)
319328
}
320329

321-
private fun configureOmnibar(tabs: Int) {
322-
if (false) {
323-
toolbar?.let {
324-
it.setNavigationIcon(com.duckduckgo.mobile.android.R.drawable.ic_arrow_left_24)
325-
it.setNavigationOnClickListener {
326-
requireActivity().onBackPressed()
327-
}
328-
it.setTitle(R.string.duck_chat_title)
329-
}
330+
private fun renderViewState(viewState: DuckChatWebViewViewModel.ViewState) {
331+
if (viewState.isFullScreenModeEnabled) {
332+
configureFullscreenMode()
330333
} else {
331-
duckChatOmnibar?.setOmnibarItemPressedListener(
332-
object : DuckChatOmnibarLayout.ItemPressedListener {
333-
override fun onTabsButtonPressed() {
334-
TODO("Not yet implemented")
335-
}
334+
configureLegacyMode()
335+
}
336+
}
336337

337-
override fun onFireButtonPressed() {
338-
TODO("Not yet implemented")
339-
}
338+
private fun configureLegacyMode() {
339+
configureLegacyOmnibar()
340+
}
340341

341-
override fun onBrowserMenuPressed() {
342-
TODO("Not yet implemented")
343-
}
344-
},
345-
)
346-
duckChatOmnibar?.setTabsCount(tabs)
342+
private fun configureFullscreenMode() {
343+
configureTabs()
344+
configureFullscreenOmnibar()
345+
}
346+
347+
private fun configureTabs() {
348+
val tabs = arguments?.getInt(KEY_DUCK_AI_TABS) ?: 0
349+
duckChatOmnibar?.setTabsCount(tabs)
350+
}
351+
352+
private fun configureLegacyOmnibar() {
353+
toolbar?.let {
354+
it.setNavigationIcon(com.duckduckgo.mobile.android.R.drawable.ic_arrow_left_24)
355+
it.setNavigationOnClickListener {
356+
requireActivity().onBackPressed()
357+
}
358+
it.setTitle(R.string.duck_chat_title)
347359
}
360+
duckChatOmnibar?.gone()
361+
}
362+
363+
private fun configureFullscreenOmnibar() {
364+
root.findViewById<View>(R.id.includeToolbar).gone()
365+
duckChatOmnibar?.show()
366+
367+
duckChatOmnibar?.setOmnibarItemPressedListener(
368+
object : DuckChatOmnibarLayout.ItemPressedListener {
369+
override fun onTabsButtonPressed() {
370+
Snackbar.make(root, "Tabs", Snackbar.LENGTH_SHORT).show()
371+
}
372+
373+
override fun onFireButtonPressed() {
374+
Snackbar.make(root, "Fire", Snackbar.LENGTH_SHORT).show()
375+
}
376+
377+
override fun onBrowserMenuPressed() {
378+
Snackbar.make(root, "Menu", Snackbar.LENGTH_SHORT).show()
379+
}
380+
},
381+
)
348382
}
349383

350384
data class FileChooserRequestedParams(

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,45 @@ import androidx.lifecycle.ViewModel
2020
import androidx.lifecycle.viewModelScope
2121
import com.duckduckgo.anvil.annotations.ContributesViewModel
2222
import com.duckduckgo.di.scopes.FragmentScope
23+
import com.duckduckgo.duckchat.impl.DuckChatInternal
24+
import com.duckduckgo.duckchat.impl.ui.settings.DuckChatSettingsViewModel.ViewState
2325
import com.duckduckgo.subscriptions.api.Subscriptions
2426
import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
2527
import kotlinx.coroutines.channels.Channel
28+
import kotlinx.coroutines.flow.SharingStarted
29+
import kotlinx.coroutines.flow.combine
2630
import kotlinx.coroutines.flow.distinctUntilChanged
2731
import kotlinx.coroutines.flow.launchIn
2832
import kotlinx.coroutines.flow.onEach
2933
import kotlinx.coroutines.flow.receiveAsFlow
34+
import kotlinx.coroutines.flow.stateIn
3035
import javax.inject.Inject
3136

3237
@ContributesViewModel(FragmentScope::class)
3338
class DuckChatWebViewViewModel @Inject constructor(
3439
private val subscriptions: Subscriptions,
40+
private val duckChat: DuckChatInternal,
3541
) : ViewModel() {
3642

3743
private val commandChannel = Channel<Command>(capacity = 1, onBufferOverflow = DROP_OLDEST)
3844
val commands = commandChannel.receiveAsFlow()
3945

46+
data class ViewState(
47+
val isDuckChatUserEnabled: Boolean = false,
48+
val isFullScreenModeEnabled: Boolean = false,
49+
)
50+
51+
val viewState =
52+
combine(
53+
duckChat.observeEnableDuckChatUserSetting(),
54+
duckChat.observeFullscreenModeUserSetting(),
55+
) { isDuckChatUserEnabled, isFullScreenModeEnabled ->
56+
ViewState(
57+
isDuckChatUserEnabled = isDuckChatUserEnabled,
58+
isFullScreenModeEnabled = isFullScreenModeEnabled,
59+
)
60+
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), ViewState())
61+
4062
sealed class Command {
4163
data object SendSubscriptionAuthUpdateEvent : Command()
4264
}

0 commit comments

Comments
 (0)