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 4b63ce263..e0e62356a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.Observer @@ -95,6 +96,10 @@ import kotlin.math.min @ExperimentalCoroutinesApi @SuppressWarnings("TooManyFunctions", "LargeClass") class HomeFragment : Fragment() { + private val homeViewModel: HomeScreenViewModel by viewModels { + ViewModelProvider.AndroidViewModelFactory(requireActivity().application) + } + private val snackbarAnchorView: View? get() { return if (requireContext().settings().shouldUseBottomToolbar) { @@ -206,7 +211,8 @@ class HomeFragment : Fragment() { setOffset(view) sessionControlView = SessionControlView( homeFragmentStore, - view.sessionControlRecyclerView, sessionControlInteractor + view.sessionControlRecyclerView, sessionControlInteractor, + homeViewModel ) activity.themeManager.applyStatusBarTheme(activity) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeScreenViewModel.kt b/app/src/main/java/org/mozilla/fenix/home/HomeScreenViewModel.kt index 5e8bba10f..db1fed214 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeScreenViewModel.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeScreenViewModel.kt @@ -10,4 +10,9 @@ import androidx.lifecycle.ViewModel class HomeScreenViewModel : ViewModel() { var layoutManagerState: Parcelable? = null var motionLayoutProgress = 0F + + /** + * Used to remember if we need to scroll to top of the homeFragment's recycleView (top sites) see #8561 + * */ + var shouldScrollToTopSites: Boolean = true } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt index d8d6f9922..a81931ba3 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt @@ -18,6 +18,7 @@ import mozilla.components.lib.state.ext.consumeFrom import org.mozilla.fenix.R import org.mozilla.fenix.home.HomeFragmentState import org.mozilla.fenix.home.HomeFragmentStore +import org.mozilla.fenix.home.HomeScreenViewModel import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.OnboardingState import org.mozilla.fenix.home.Tab @@ -163,7 +164,8 @@ private fun collectionTabItems(collection: TabCollection) = collection.tabs.mapI class SessionControlView( private val homeFragmentStore: HomeFragmentStore, override val containerView: View?, - interactor: SessionControlInteractor + interactor: SessionControlInteractor, + private var homeScreenViewModel: HomeScreenViewModel ) : LayoutContainer { val view: RecyclerView = containerView as RecyclerView @@ -193,6 +195,22 @@ class SessionControlView( if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { sessionControlAdapter.submitList(null) } - sessionControlAdapter.submitList(state.toAdapterList()) + + val stateAdapterList = state.toAdapterList() + + if (homeScreenViewModel.shouldScrollToTopSites) { + sessionControlAdapter.submitList(stateAdapterList) { + + val loadedTopSites = stateAdapterList.find { adapterItem -> + adapterItem is AdapterItem.TopSiteList && adapterItem.topSites.isNotEmpty() + } + loadedTopSites?.run { + homeScreenViewModel.shouldScrollToTopSites = false + view.scrollToPosition(stateAdapterList.indexOf(this)) + } + } + } else { + sessionControlAdapter.submitList(stateAdapterList) + } } }