diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 0f237666e..1add7a940 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -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, diff --git a/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt b/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt index 43145c296..e16afc387 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt @@ -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 { 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(R.id.counter_box).id = View.NO_ID binding.tabButton.findViewById(R.id.counter_text).id = View.NO_ID diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/navbar/BottomToolbarContainerView.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/navbar/BottomToolbarContainerView.kt index f65d9c710..6d20f170a 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/navbar/BottomToolbarContainerView.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/navbar/BottomToolbarContainerView.kt @@ -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 = 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 diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index cb31a951e..df62b5456 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -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, ) }