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, parent = binding.browserLayout,
androidToolbarView = if (isToolbarAtBottom) browserToolbar else null, androidToolbarView = if (isToolbarAtBottom) browserToolbar else null,
menuButton = menuButton, menuButton = menuButton,
browsingModeManager = activity.browsingModeManager, isPrivateMode = activity.browsingModeManager.mode.isPrivate,
).also { ).also {
navbarIntegration.set( navbarIntegration.set(
feature = it.navbarIntegration, feature = it.navbarIntegration,

@ -9,11 +9,12 @@ import android.util.AttributeSet
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.FrameLayout
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.doOnNextLayout import androidx.core.view.doOnNextLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams 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.getNormalOrPrivateTabs
import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.selector.selectedTab
import mozilla.components.browser.thumbnails.loader.ThumbnailLoader 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.R
import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature
import org.mozilla.fenix.components.toolbar.ToolbarPosition 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.databinding.TabPreviewBinding
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.theme.ThemeManager
import kotlin.math.min 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( class TabPreview @JvmOverloads constructor(
context: Context, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyle: Int = 0, defStyle: Int = 0,
) : FrameLayout(context, attrs, defStyle) { ) : CoordinatorLayout(context, attrs, defStyle) {
private val binding = TabPreviewBinding.inflate(LayoutInflater.from(context), this) private val binding = TabPreviewBinding.inflate(LayoutInflater.from(context), this)
private val thumbnailLoader = ThumbnailLoader(context.components.core.thumbnailStorage) private val thumbnailLoader = ThumbnailLoader(context.components.core.thumbnailStorage)
init { init {
if (context.settings().toolbarPosition == ToolbarPosition.TOP) { val isToolbarAtTop = context.settings().toolbarPosition == ToolbarPosition.TOP
if (isToolbarAtTop) {
binding.fakeToolbar.updateLayoutParams<LayoutParams> { binding.fakeToolbar.updateLayoutParams<LayoutParams> {
gravity = Gravity.TOP gravity = Gravity.TOP
} }
@ -52,6 +60,16 @@ class TabPreview @JvmOverloads constructor(
binding.tabButton.isVisible = !isNavBarEnabled binding.tabButton.isVisible = !isNavBarEnabled
binding.menuButton.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 // 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_box).id = View.NO_ID
binding.tabButton.findViewById<View>(R.id.counter_text).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.EngineViewScrollingBehavior
import mozilla.components.ui.widgets.behavior.ViewPosition import mozilla.components.ui.widgets.behavior.ViewPosition
import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import org.mozilla.fenix.compose.Divider import org.mozilla.fenix.compose.Divider
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.theme.FirefoxTheme 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 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 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 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. * @param customTabSessionId Custom tab session ID.
* *
* Defaults to [NavigationItems.defaultItems] which provides a standard set of navigation items. * Defaults to [NavigationItems.defaultItems] which provides a standard set of navigation items.
@ -46,7 +45,7 @@ class BottomToolbarContainerView(
navigationItems: List<ActionItem> = NavigationItems.defaultItems, navigationItems: List<ActionItem> = NavigationItems.defaultItems,
androidToolbarView: View? = null, androidToolbarView: View? = null,
menuButton: MenuButton, menuButton: MenuButton,
browsingModeManager: BrowsingModeManager, isPrivateMode: Boolean = false,
customTabSessionId: String? = null, customTabSessionId: String? = null,
) { ) {
@ -57,9 +56,8 @@ class BottomToolbarContainerView(
init { init {
ComposeView(parent.context).apply { ComposeView(parent.context).apply {
setContent { setContent {
val isPrivate = browsingModeManager.mode.isPrivate
val tabCount = context.components.core.store.observeAsState(initialValue = 0) { browserState -> val tabCount = context.components.core.store.observeAsState(initialValue = 0) { browserState ->
if (isPrivate) { if (isPrivateMode) {
browserState.privateTabs.size browserState.privateTabs.size
} else { } else {
browserState.normalTabs.size browserState.normalTabs.size

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

Loading…
Cancel
Save