1
0
Fork 0

No Issue - Moves from being a tabstray observer to overriding tab use cases

master
Jeff Boek 2020-06-09 14:14:45 -07:00
parent 2c418de0a3
commit f41ca2f424
3 changed files with 49 additions and 47 deletions

View File

@ -14,7 +14,6 @@ import androidx.core.view.updatePadding
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.component_tabstray.*
import kotlinx.android.synthetic.main.component_tabstray.view.*
import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.*
import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.view.*
@ -24,10 +23,11 @@ import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.concept.tabstray.Tab
import mozilla.components.feature.tabs.tabstray.TabsFeature
import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
@ -41,7 +41,7 @@ import org.mozilla.fenix.components.TabCollectionStorage
@SuppressWarnings("TooManyFunctions", "LargeClass")
class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
private var tabsFeature: TabsFeature? = null
private val tabsFeature = ViewBoundFeatureWrapper<TabsFeature>()
private var _tabTrayView: TabTrayView? = null
private val tabTrayView: TabTrayView
get() = _tabTrayView!!
@ -56,6 +56,30 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
}
}
private val selectTabUseCase = object : TabsUseCases.SelectTabUseCase {
override fun invoke(tabId: String) {
requireComponents.useCases.tabsUseCases.selectTab(tabId)
navigateToBrowser()
}
override fun invoke(session: Session) {
requireComponents.useCases.tabsUseCases.selectTab(session)
navigateToBrowser()
}
}
private val removeTabUseCase = object : TabsUseCases.RemoveTabUseCase {
override fun invoke(sessionId: String) {
showUndoSnackbarForTab(sessionId)
requireComponents.useCases.tabsUseCases.removeTab(sessionId)
}
override fun invoke(session: Session) {
showUndoSnackbarForTab(session.id)
requireComponents.useCases.tabsUseCases.removeTab(session)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.TabTrayDialogStyle)
@ -84,17 +108,21 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
this,
isPrivate,
requireContext().resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
) { tabsFeature!!.filterTabs(it) }
) { tabsFeature.get()?.filterTabs(it) }
tabsFeature =
tabsFeature.set(
TabsFeature(
tabTrayView.view.tabsTray,
view.context.components.core.store,
view.context.components.useCases.tabsUseCases,
selectTabUseCase,
removeTabUseCase,
view.context.components.useCases.thumbnailUseCases,
{ it.content.private == isPrivate },
{ }
)
),
owner = viewLifecycleOwner,
view = view
)
tabLayout.setOnClickListener {
dismissAllowingStateLoss()
@ -120,33 +148,15 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
}
}
override fun onDestroyView() {
_tabTrayView = null
tabsFeature = null
super.onDestroyView()
}
override fun onStart() {
super.onStart()
tabTrayView.tabsTray.register(tabTrayView, viewLifecycleOwner)
tabsFeature?.start()
}
override fun onStop() {
tabsFeature?.stop()
tabTrayView.tabsTray.unregister(tabTrayView)
super.onStop()
}
override fun onTabClosed(tab: Tab) {
private fun showUndoSnackbarForTab(sessionId: String) {
val sessionManager = view?.context?.components?.core?.sessionManager
val snapshot = sessionManager
?.findSessionById(tab.id)?.let {
?.findSessionById(sessionId)?.let {
sessionManager.createSessionSnapshot(it)
} ?: return
val state = snapshot.engineSession?.saveState()
val isSelected = tab.id == requireComponents.core.store.state.selectedTabId ?: false
val isSelected = sessionId == requireComponents.core.store.state.selectedTabId ?: false
val snackbarMessage = if (snapshot.session.private) {
getString(R.string.snackbar_private_tab_closed)
@ -168,7 +178,12 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
}
}
override fun onTabSelected(tab: Tab) {
override fun onDestroyView() {
_tabTrayView = null
super.onDestroyView()
}
fun navigateToBrowser() {
dismissAllowingStateLoss()
if (findNavController().currentDestination?.id == R.id.browserFragment) return
if (!findNavController().popBackStack(R.id.browserFragment, false)) {

View File

@ -14,7 +14,6 @@ import androidx.core.view.isVisible
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.tabs.TabLayout
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.component_tabstray.*
import kotlinx.android.synthetic.main.component_tabstray.view.*
import kotlinx.android.synthetic.main.component_tabstray_fab.view.*
import mozilla.components.browser.menu.BrowserMenuBuilder
@ -24,14 +23,10 @@ import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.tabstray.BrowserTabsTray
import mozilla.components.concept.tabstray.Tab
import mozilla.components.concept.tabstray.TabsTray
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
interface TabTrayInteractor {
fun onTabClosed(tab: Tab)
fun onTabSelected(tab: Tab)
fun onNewTabTapped(private: Boolean)
fun onTabTrayDismissed()
fun onShareTabsClicked(private: Boolean)
@ -47,7 +42,7 @@ class TabTrayView(
isPrivate: Boolean,
startingInLandscape: Boolean,
private val filterTabs: ((TabSessionState) -> Boolean) -> Unit
) : LayoutContainer, TabsTray.Observer, TabLayout.OnTabSelectedListener {
) : LayoutContainer, TabLayout.OnTabSelectedListener {
val fabView = LayoutInflater.from(container.context)
.inflate(R.layout.component_tabstray_fab, container, true)
@ -156,10 +151,6 @@ class TabTrayView(
behavior.state = BottomSheetBehavior.STATE_EXPANDED
}
override fun onTabSelected(tab: Tab) {
interactor.onTabSelected(tab)
}
override fun onTabSelected(tab: TabLayout.Tab?) {
// We need a better way to determine which tab was selected.
val filter: (TabSessionState) -> Boolean = when (tab?.position) {
@ -172,6 +163,8 @@ class TabTrayView(
updateState(view.context.components.core.store.state)
}
override fun onTabReselected(tab: TabLayout.Tab?) { /*noop*/ }
override fun onTabUnselected(tab: TabLayout.Tab?) { /*noop*/ }
fun updateState(state: BrowserState) {
view.let {
@ -195,13 +188,7 @@ class TabTrayView(
}
}
override fun onTabClosed(tab: Tab) {
interactor.onTabClosed(tab)
}
override fun onTabReselected(tab: TabLayout.Tab?) { /*noop*/ }
override fun onTabUnselected(tab: TabLayout.Tab?) { /*noop*/ }
fun toggleFabText(private: Boolean) {
private fun toggleFabText(private: Boolean) {
if (private) {
fabView.new_tab_button.extend()
fabView.new_tab_button.contentDescription = view.context.resources.getString(R.string.add_private_tab)

View File

@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
const val VERSION = "45.0.20200609161836"
const val VERSION = "45.0.20200609214036"
}