No Issue - Moves from being a tabstray observer to overriding tab use cases
parent
2c418de0a3
commit
f41ca2f424
|
@ -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)) {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue