diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt index 6c04d7f98..dad123c1c 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt @@ -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() 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)) { diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt index c8aecaeb7..5f87c3fc2 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt @@ -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) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index ff5cd2702..cf2314f6f 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -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" }