diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index d405d2434..06ba0013d 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -15,6 +15,7 @@ import androidx.annotation.CallSuper import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.net.toUri import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.appbar.AppBarLayout @@ -84,6 +85,7 @@ import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.sessionsOfType import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.home.SharedViewModel import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.wifi.SitePermissionsWifiIntegration @@ -130,6 +132,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session // We need this so we don't accidentally remove all external sessions on back press private var sessionRemoved = false + private val sharedViewModel: SharedViewModel by activityViewModels() + @CallSuper override fun onCreateView( inflater: LayoutInflater, @@ -206,7 +210,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session bookmarkTapped = { lifecycleScope.launch { bookmarkTapped(it) } }, scope = lifecycleScope, tabCollectionStorage = requireComponents.core.tabCollectionStorage, - topSiteStorage = requireComponents.core.topSiteStorage + topSiteStorage = requireComponents.core.topSiteStorage, + sharedViewModel = sharedViewModel ) _browserInteractor = BrowserInteractor( diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index ecd6a74d0..7f01d04d4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -37,6 +37,7 @@ import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.home.SharedViewModel import org.mozilla.fenix.lib.Do import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit @@ -70,7 +71,8 @@ class DefaultBrowserToolbarController( private val bookmarkTapped: (Session) -> Unit, private val scope: CoroutineScope, private val tabCollectionStorage: TabCollectionStorage, - private val topSiteStorage: TopSiteStorage + private val topSiteStorage: TopSiteStorage, + private val sharedViewModel: SharedViewModel ) : BrowserToolbarController { private val currentSession @@ -119,6 +121,7 @@ class DefaultBrowserToolbarController( } override fun handleTabCounterClick() { + sharedViewModel.shouldScrollToSelectedTab = true animateTabAndNavigateHome() } @@ -128,7 +131,8 @@ class DefaultBrowserToolbarController( ToolbarMenu.Item.AddToHomeScreen -> activity.settings().installPwaOpened = true is ToolbarMenu.Item.ReaderMode -> activity.settings().readerModeOpened = true ToolbarMenu.Item.OpenInApp -> activity.settings().openInAppOpened = true - else -> {} + else -> { + } } } } @@ -302,10 +306,14 @@ class DefaultBrowserToolbarController( // Delay for a short amount of time so the browser has time to start animating out // before we transition the fragment. This makes the animation feel smoother delay(ANIMATION_DELAY) - val directions = BrowserFragmentDirections.actionBrowserFragmentToHomeFragmentPopUp( - shouldScrollToSelectedTab = true - ) - navController.navigate(directions) + if (!navController.popBackStack(R.id.homeFragment, false)) { + val directions = BrowserFragmentDirections.actionBrowserFragmentToHomeFragment() + navController.nav( + R.id.browserFragment, + directions, + null + ) + } } } diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index a21090373..ee3d3eb41 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -37,7 +37,6 @@ import androidx.lifecycle.OnLifecycleEvent import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE @@ -116,6 +115,8 @@ class HomeFragment : Fragment() { ViewModelProvider.AndroidViewModelFactory(requireActivity().application) } + private val sharedViewModel: SharedViewModel by activityViewModels() + private val snackbarAnchorView: View? get() { return if (requireContext().settings().shouldUseBottomToolbar) { @@ -510,10 +511,9 @@ class HomeFragment : Fragment() { activity?.window?.setBackgroundDrawableResource(R.drawable.private_home_background_gradient) } hideToolbar() - val safeArguments = arguments?.let { navArgs().value } - val shouldScrollToSelectedTab = safeArguments?.shouldScrollToSelectedTab ?: false - if (shouldScrollToSelectedTab) { + if (sharedViewModel.shouldScrollToSelectedTab) { scrollToSelectedTab() + sharedViewModel.shouldScrollToSelectedTab = false } } diff --git a/app/src/main/java/org/mozilla/fenix/home/SharedViewModel.kt b/app/src/main/java/org/mozilla/fenix/home/SharedViewModel.kt new file mode 100644 index 000000000..9b3f9bf9f --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/SharedViewModel.kt @@ -0,0 +1,15 @@ +/* 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.home + +import androidx.lifecycle.ViewModel + +class SharedViewModel : ViewModel() { + + /** + * Used to remember if we need to scroll to the selected tab in the homeFragment's recycleView see #7356 + * */ + var shouldScrollToSelectedTab: Boolean = false +} diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 2aa3ad269..636cf9f88 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -63,10 +63,6 @@ android:id="@+id/homeFragment" android:name="org.mozilla.fenix.home.HomeFragment" tools:layout="@layout/fragment_home"> - @@ -185,9 +181,8 @@ app:exitAnim="@anim/fade_out" tools:layout="@layout/fragment_browser"> + android:id="@+id/action_browserFragment_to_homeFragment" + app:destination="@id/homeFragment" />