Bug 1879373 - Add nav bar to tab preview during swipe-switching

fenix/125.0
mike a 3 months ago committed by mergify[bot]
parent 3a9e1264f5
commit aa289bc448

@ -472,7 +472,7 @@ abstract class BaseBrowserFragment :
parent = binding.browserLayout,
androidToolbarView = if (isToolbarAtBottom) browserToolbar else null,
menuButton = menuButton,
browsingModeManager = activity.browsingModeManager,
isPrivateMode = activity.browsingModeManager.mode.isPrivate,
).also {
navbarIntegration.set(
feature = it.navbarIntegration,

@ -9,11 +9,12 @@ import android.util.AttributeSet
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import androidx.appcompat.content.res.AppCompatResources
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.doOnNextLayout
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import mozilla.components.browser.menu.view.MenuButton
import mozilla.components.browser.state.selector.getNormalOrPrivateTabs
import mozilla.components.browser.state.selector.selectedTab
import mozilla.components.browser.thumbnails.loader.ThumbnailLoader
@ -21,23 +22,30 @@ import mozilla.components.concept.base.images.ImageLoadRequest
import org.mozilla.fenix.R
import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature
import org.mozilla.fenix.components.toolbar.ToolbarPosition
import org.mozilla.fenix.components.toolbar.navbar.BottomToolbarContainerView
import org.mozilla.fenix.databinding.TabPreviewBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.theme.ThemeManager
import kotlin.math.min
/**
* A 'dummy' view of a tab used by [ToolbarGestureHandler] to support switching tabs by swiping the address bar.
*
* The view is responsible for showing the preview and a dummy toolbar of the inactive tab during swiping.
*/
class TabPreview @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0,
) : FrameLayout(context, attrs, defStyle) {
) : CoordinatorLayout(context, attrs, defStyle) {
private val binding = TabPreviewBinding.inflate(LayoutInflater.from(context), this)
private val thumbnailLoader = ThumbnailLoader(context.components.core.thumbnailStorage)
init {
if (context.settings().toolbarPosition == ToolbarPosition.TOP) {
val isToolbarAtTop = context.settings().toolbarPosition == ToolbarPosition.TOP
if (isToolbarAtTop) {
binding.fakeToolbar.updateLayoutParams<LayoutParams> {
gravity = Gravity.TOP
}
@ -52,6 +60,16 @@ class TabPreview @JvmOverloads constructor(
binding.tabButton.isVisible = !isNavBarEnabled
binding.menuButton.isVisible = !isNavBarEnabled
if (isNavBarEnabled) {
BottomToolbarContainerView(
context = context,
parent = this,
androidToolbarView = if (!isToolbarAtTop) binding.fakeToolbar else null,
menuButton = MenuButton(context),
)
removeView(binding.fakeToolbar)
}
// Change view properties to avoid confusing the UI tests
binding.tabButton.findViewById<View>(R.id.counter_box).id = View.NO_ID
binding.tabButton.findViewById<View>(R.id.counter_text).id = View.NO_ID

@ -22,7 +22,6 @@ import mozilla.components.lib.state.ext.observeAsState
import mozilla.components.ui.widgets.behavior.EngineViewScrollingBehavior
import mozilla.components.ui.widgets.behavior.ViewPosition
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import org.mozilla.fenix.compose.Divider
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.theme.FirefoxTheme
@ -35,7 +34,7 @@ import org.mozilla.fenix.theme.FirefoxTheme
* @param navigationItems A list of [ActionItem] objects representing the items to be displayed in the navigation bar.
* @param androidToolbarView An option toolbar view that will be added atop of the navigation bar.
* @param menuButton A [MenuButton] to be used for [ItemType.MENU].
* @param browsingModeManager A helper class that provides access to the current [BrowsingMode].
* @param isPrivateMode If browsing in [BrowsingMode.Private].
* @param customTabSessionId Custom tab session ID.
*
* Defaults to [NavigationItems.defaultItems] which provides a standard set of navigation items.
@ -46,7 +45,7 @@ class BottomToolbarContainerView(
navigationItems: List<ActionItem> = NavigationItems.defaultItems,
androidToolbarView: View? = null,
menuButton: MenuButton,
browsingModeManager: BrowsingModeManager,
isPrivateMode: Boolean = false,
customTabSessionId: String? = null,
) {
@ -57,9 +56,8 @@ class BottomToolbarContainerView(
init {
ComposeView(parent.context).apply {
setContent {
val isPrivate = browsingModeManager.mode.isPrivate
val tabCount = context.components.core.store.observeAsState(initialValue = 0) { browserState ->
if (isPrivate) {
if (isPrivateMode) {
browserState.privateTabs.size
} else {
browserState.normalTabs.size

@ -461,7 +461,7 @@ class HomeFragment : Fragment() {
parent = binding.homeLayout,
androidToolbarView = if (isToolbarAtBottom) binding.toolbarLayout else null,
menuButton = menuButton,
browsingModeManager = browsingModeManager,
isPrivateMode = activity.browsingModeManager.mode.isPrivate,
)
}

Loading…
Cancel
Save