diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt new file mode 100644 index 0000000000..adf327a4fc --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt @@ -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)) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index f81d1d16ee..d0f7c32203 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -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 + private var hasAccessibilityEnabled: Boolean = false private val tabLayoutMediator = ViewBoundFeatureWrapper() private val tabCounterBinding = ViewBoundFeatureWrapper() @@ -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 + } } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt index bf827ac0ce..5a85b77b57 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt @@ -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, 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, 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) + } }