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.fragment.app.FragmentManager
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.fragment.findNavController
|
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.component_tabstray.view.*
|
||||||
import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.*
|
import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.*
|
||||||
import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.view.*
|
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.selector.privateTabs
|
||||||
import mozilla.components.browser.state.state.BrowserState
|
import mozilla.components.browser.state.state.BrowserState
|
||||||
import mozilla.components.concept.engine.prompt.ShareData
|
import mozilla.components.concept.engine.prompt.ShareData
|
||||||
import mozilla.components.concept.tabstray.Tab
|
|
||||||
import mozilla.components.feature.tabs.tabstray.TabsFeature
|
import mozilla.components.feature.tabs.tabstray.TabsFeature
|
||||||
import mozilla.components.feature.tab.collections.TabCollection
|
import mozilla.components.feature.tab.collections.TabCollection
|
||||||
|
import mozilla.components.feature.tabs.TabsUseCases
|
||||||
import mozilla.components.lib.state.ext.consumeFrom
|
import mozilla.components.lib.state.ext.consumeFrom
|
||||||
|
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
|
||||||
import org.mozilla.fenix.HomeActivity
|
import org.mozilla.fenix.HomeActivity
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
||||||
|
@ -41,7 +41,7 @@ import org.mozilla.fenix.components.TabCollectionStorage
|
||||||
|
|
||||||
@SuppressWarnings("TooManyFunctions", "LargeClass")
|
@SuppressWarnings("TooManyFunctions", "LargeClass")
|
||||||
class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
|
class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
|
||||||
private var tabsFeature: TabsFeature? = null
|
private val tabsFeature = ViewBoundFeatureWrapper<TabsFeature>()
|
||||||
private var _tabTrayView: TabTrayView? = null
|
private var _tabTrayView: TabTrayView? = null
|
||||||
private val tabTrayView: TabTrayView
|
private val tabTrayView: TabTrayView
|
||||||
get() = _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?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setStyle(STYLE_NO_TITLE, R.style.TabTrayDialogStyle)
|
setStyle(STYLE_NO_TITLE, R.style.TabTrayDialogStyle)
|
||||||
|
@ -84,17 +108,21 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
|
||||||
this,
|
this,
|
||||||
isPrivate,
|
isPrivate,
|
||||||
requireContext().resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
requireContext().resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||||
) { tabsFeature!!.filterTabs(it) }
|
) { tabsFeature.get()?.filterTabs(it) }
|
||||||
|
|
||||||
tabsFeature =
|
tabsFeature.set(
|
||||||
TabsFeature(
|
TabsFeature(
|
||||||
tabTrayView.view.tabsTray,
|
tabTrayView.view.tabsTray,
|
||||||
view.context.components.core.store,
|
view.context.components.core.store,
|
||||||
view.context.components.useCases.tabsUseCases,
|
selectTabUseCase,
|
||||||
|
removeTabUseCase,
|
||||||
view.context.components.useCases.thumbnailUseCases,
|
view.context.components.useCases.thumbnailUseCases,
|
||||||
{ it.content.private == isPrivate },
|
{ it.content.private == isPrivate },
|
||||||
{ }
|
{ }
|
||||||
)
|
),
|
||||||
|
owner = viewLifecycleOwner,
|
||||||
|
view = view
|
||||||
|
)
|
||||||
|
|
||||||
tabLayout.setOnClickListener {
|
tabLayout.setOnClickListener {
|
||||||
dismissAllowingStateLoss()
|
dismissAllowingStateLoss()
|
||||||
|
@ -120,33 +148,15 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
private fun showUndoSnackbarForTab(sessionId: String) {
|
||||||
_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) {
|
|
||||||
val sessionManager = view?.context?.components?.core?.sessionManager
|
val sessionManager = view?.context?.components?.core?.sessionManager
|
||||||
val snapshot = sessionManager
|
val snapshot = sessionManager
|
||||||
?.findSessionById(tab.id)?.let {
|
?.findSessionById(sessionId)?.let {
|
||||||
sessionManager.createSessionSnapshot(it)
|
sessionManager.createSessionSnapshot(it)
|
||||||
} ?: return
|
} ?: return
|
||||||
|
|
||||||
val state = snapshot.engineSession?.saveState()
|
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) {
|
val snackbarMessage = if (snapshot.session.private) {
|
||||||
getString(R.string.snackbar_private_tab_closed)
|
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()
|
dismissAllowingStateLoss()
|
||||||
if (findNavController().currentDestination?.id == R.id.browserFragment) return
|
if (findNavController().currentDestination?.id == R.id.browserFragment) return
|
||||||
if (!findNavController().popBackStack(R.id.browserFragment, false)) {
|
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.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.tabs.TabLayout
|
import com.google.android.material.tabs.TabLayout
|
||||||
import kotlinx.android.extensions.LayoutContainer
|
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.view.*
|
||||||
import kotlinx.android.synthetic.main.component_tabstray_fab.view.*
|
import kotlinx.android.synthetic.main.component_tabstray_fab.view.*
|
||||||
import mozilla.components.browser.menu.BrowserMenuBuilder
|
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.BrowserState
|
||||||
import mozilla.components.browser.state.state.TabSessionState
|
import mozilla.components.browser.state.state.TabSessionState
|
||||||
import mozilla.components.browser.tabstray.BrowserTabsTray
|
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.R
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
|
|
||||||
interface TabTrayInteractor {
|
interface TabTrayInteractor {
|
||||||
fun onTabClosed(tab: Tab)
|
|
||||||
fun onTabSelected(tab: Tab)
|
|
||||||
fun onNewTabTapped(private: Boolean)
|
fun onNewTabTapped(private: Boolean)
|
||||||
fun onTabTrayDismissed()
|
fun onTabTrayDismissed()
|
||||||
fun onShareTabsClicked(private: Boolean)
|
fun onShareTabsClicked(private: Boolean)
|
||||||
|
@ -47,7 +42,7 @@ class TabTrayView(
|
||||||
isPrivate: Boolean,
|
isPrivate: Boolean,
|
||||||
startingInLandscape: Boolean,
|
startingInLandscape: Boolean,
|
||||||
private val filterTabs: ((TabSessionState) -> Boolean) -> Unit
|
private val filterTabs: ((TabSessionState) -> Boolean) -> Unit
|
||||||
) : LayoutContainer, TabsTray.Observer, TabLayout.OnTabSelectedListener {
|
) : LayoutContainer, TabLayout.OnTabSelectedListener {
|
||||||
val fabView = LayoutInflater.from(container.context)
|
val fabView = LayoutInflater.from(container.context)
|
||||||
.inflate(R.layout.component_tabstray_fab, container, true)
|
.inflate(R.layout.component_tabstray_fab, container, true)
|
||||||
|
|
||||||
|
@ -156,10 +151,6 @@ class TabTrayView(
|
||||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onTabSelected(tab: Tab) {
|
|
||||||
interactor.onTabSelected(tab)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onTabSelected(tab: TabLayout.Tab?) {
|
override fun onTabSelected(tab: TabLayout.Tab?) {
|
||||||
// We need a better way to determine which tab was selected.
|
// We need a better way to determine which tab was selected.
|
||||||
val filter: (TabSessionState) -> Boolean = when (tab?.position) {
|
val filter: (TabSessionState) -> Boolean = when (tab?.position) {
|
||||||
|
@ -172,6 +163,8 @@ class TabTrayView(
|
||||||
|
|
||||||
updateState(view.context.components.core.store.state)
|
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) {
|
fun updateState(state: BrowserState) {
|
||||||
view.let {
|
view.let {
|
||||||
|
@ -195,13 +188,7 @@ class TabTrayView(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onTabClosed(tab: Tab) {
|
private fun toggleFabText(private: Boolean) {
|
||||||
interactor.onTabClosed(tab)
|
|
||||||
}
|
|
||||||
override fun onTabReselected(tab: TabLayout.Tab?) { /*noop*/ }
|
|
||||||
override fun onTabUnselected(tab: TabLayout.Tab?) { /*noop*/ }
|
|
||||||
|
|
||||||
fun toggleFabText(private: Boolean) {
|
|
||||||
if (private) {
|
if (private) {
|
||||||
fabView.new_tab_button.extend()
|
fabView.new_tab_button.extend()
|
||||||
fabView.new_tab_button.contentDescription = view.context.resources.getString(R.string.add_private_tab)
|
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/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
object AndroidComponents {
|
object AndroidComponents {
|
||||||
const val VERSION = "45.0.20200609161836"
|
const val VERSION = "45.0.20200609214036"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue