For #18515 - Adds FAB to TabsTray rewrite

upstream-sync
codrut.topliceanu 3 years ago committed by Jonathan Almeida
parent c31d507e19
commit d961d7ba38

@ -0,0 +1,29 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.tabstray
import androidx.navigation.NavController
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import org.mozilla.fenix.tabtray.TabTrayDialogFragmentDirections
interface TabsTrayController {
/**
* Called when user clicks the new tab button.
*/
fun onNewTabTapped(isPrivate: Boolean)
}
class DefaultTabsTrayController(
private val browsingModeManager: BrowsingModeManager,
private val navController: NavController
) : TabsTrayController {
override fun onNewTabTapped(isPrivate: Boolean) {
browsingModeManager.mode = BrowsingMode.fromBoolean(isPrivate)
navController.navigate(TabTrayDialogFragmentDirections.actionGlobalHome(focusOnAddressBar = true))
}
}

@ -17,6 +17,10 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
import kotlinx.android.synthetic.main.component_tabstray2.*
import kotlinx.android.synthetic.main.component_tabstray2.view.*
import kotlinx.android.synthetic.main.tabs_tray_tab_counter2.*
import kotlinx.android.synthetic.main.component_tabstray2.tab_layout
import kotlinx.android.synthetic.main.component_tabstray2.tabsTray
import kotlinx.android.synthetic.main.component_tabstray2.view.tab_wrapper
import kotlinx.android.synthetic.main.component_tabstray_fab.view.new_tab_button
import kotlinx.coroutines.ExperimentalCoroutinesApi
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.HomeActivity
@ -26,15 +30,19 @@ import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.home.HomeScreenViewModel
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.tabstray.browser.BrowserTrayInteractor
import org.mozilla.fenix.tabstray.browser.DefaultBrowserTrayInteractor
import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsInteractor
class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
private var fabView: View? = null
private lateinit var tabsTrayStore: TabsTrayStore
private lateinit var browserTrayInteractor: BrowserTrayInteractor
private lateinit var tabsTrayController: DefaultTabsTrayController
private lateinit var behavior: BottomSheetBehavior<ConstraintLayout>
private var hasAccessibilityEnabled: Boolean = false
private val tabLayoutMediator = ViewBoundFeatureWrapper<TabLayoutMediator>()
private val tabCounterBinding = ViewBoundFeatureWrapper<TabCounterBinding>()
@ -60,16 +68,27 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
tabsTrayStore = StoreProvider.get(this) { TabsTrayStore() }
fabView = LayoutInflater.from(containerView.context)
.inflate(R.layout.component_tabstray_fab, containerView, true)
return containerView
}
@ExperimentalCoroutinesApi
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val activity = activity as HomeActivity
hasAccessibilityEnabled = activity.settings().accessibilityServicesEnabled
tabsTrayController = DefaultTabsTrayController(
browsingModeManager = activity.browsingModeManager,
navController = findNavController()
)
val browserTrayInteractor = DefaultBrowserTrayInteractor(
tabsTrayStore,
this@TabsTrayFragment,
tabsTrayController,
requireComponents.useCases.tabsUseCases.selectTab,
requireComponents.settings,
requireComponents.analytics.metrics
@ -120,6 +139,7 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
override fun setCurrentTrayPosition(position: Int, smoothScroll: Boolean) {
tabsTray.setCurrentItem(position, smoothScroll)
setupNewTabButtons(tabsTray.currentItem)
}
override fun navigateToBrowser() {
@ -189,4 +209,42 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
findNavController().navigate(directions)
dismissAllowingStateLoss()
}
private fun setupNewTabButtons(currentPage: Int) {
fabView?.let { fabView ->
when (currentPage) {
NORMAL -> {
fabView.new_tab_button.shrink()
fabView.new_tab_button.show()
fabView.new_tab_button.setOnClickListener {
browserTrayInteractor.onFabClicked(false)
}
}
PRIVATE -> {
fabView.new_tab_button.text =
requireContext().resources.getText(R.string.tab_drawer_fab_content)
fabView.new_tab_button.extend()
fabView.new_tab_button.show()
fabView.new_tab_button.setOnClickListener {
browserTrayInteractor.onFabClicked(true)
}
}
SYNC -> {
fabView.new_tab_button.text =
requireContext().resources.getText(R.string.preferences_sync_now)
fabView.new_tab_button.extend()
fabView.new_tab_button.show()
fabView.new_tab_button.setOnClickListener {
}
}
}
}
}
companion object {
// TabsTray Pages
const val NORMAL = 0
const val PRIVATE = 1
const val SYNC = 2
}
}

@ -13,6 +13,7 @@ import mozilla.components.support.base.feature.UserInteractionHandler
import org.mozilla.fenix.selection.SelectionInteractor
import org.mozilla.fenix.tabstray.TabsTrayAction
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.tabstray.TabsTrayController
import org.mozilla.fenix.tabstray.TabsTrayInteractor
import org.mozilla.fenix.tabstray.TrayPagerAdapter
import org.mozilla.fenix.tabstray.ext.numberOfGridColumns
@ -35,6 +36,11 @@ interface BrowserTrayInteractor : SelectionInteractor<Tab>, UserInteractionHandl
* Returns the appropriate [RecyclerView.LayoutManager] to be used at [position].
*/
fun getLayoutManagerForPosition(context: Context, position: Int): RecyclerView.LayoutManager
/**
* TabTray's Floating Action Button clicked.
*/
fun onFabClicked(isPrivate: Boolean)
}
/**
@ -43,6 +49,7 @@ interface BrowserTrayInteractor : SelectionInteractor<Tab>, UserInteractionHandl
class DefaultBrowserTrayInteractor(
private val store: TabsTrayStore,
private val trayInteractor: TabsTrayInteractor,
private val controller: TabsTrayController,
private val selectTab: TabsUseCases.SelectTabUseCase,
private val settings: Settings,
private val metrics: MetricController
@ -121,4 +128,11 @@ class DefaultBrowserTrayInteractor(
return GridLayoutManager(context, numberOfColumns)
}
/**
* See [BrowserTrayInteractor.onFabClicked]
*/
override fun onFabClicked(isPrivate: Boolean) {
controller.onNewTabTapped(isPrivate)
}
}

Loading…
Cancel
Save