For #8561 - Scroll to topSites on app cold start

fennec/beta
codrut.topliceanu 4 years ago committed by Jeff Boek
parent cc8f34b68b
commit 030bd38631

@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
@ -95,6 +96,10 @@ import kotlin.math.min
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
@SuppressWarnings("TooManyFunctions", "LargeClass") @SuppressWarnings("TooManyFunctions", "LargeClass")
class HomeFragment : Fragment() { class HomeFragment : Fragment() {
private val homeViewModel: HomeScreenViewModel by viewModels {
ViewModelProvider.AndroidViewModelFactory(requireActivity().application)
}
private val snackbarAnchorView: View? private val snackbarAnchorView: View?
get() { get() {
return if (requireContext().settings().shouldUseBottomToolbar) { return if (requireContext().settings().shouldUseBottomToolbar) {
@ -206,7 +211,8 @@ class HomeFragment : Fragment() {
setOffset(view) setOffset(view)
sessionControlView = SessionControlView( sessionControlView = SessionControlView(
homeFragmentStore, homeFragmentStore,
view.sessionControlRecyclerView, sessionControlInteractor view.sessionControlRecyclerView, sessionControlInteractor,
homeViewModel
) )
activity.themeManager.applyStatusBarTheme(activity) activity.themeManager.applyStatusBarTheme(activity)

@ -10,4 +10,9 @@ import androidx.lifecycle.ViewModel
class HomeScreenViewModel : ViewModel() { class HomeScreenViewModel : ViewModel() {
var layoutManagerState: Parcelable? = null var layoutManagerState: Parcelable? = null
var motionLayoutProgress = 0F 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
} }

@ -18,6 +18,7 @@ import mozilla.components.lib.state.ext.consumeFrom
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.home.HomeFragmentState import org.mozilla.fenix.home.HomeFragmentState
import org.mozilla.fenix.home.HomeFragmentStore import org.mozilla.fenix.home.HomeFragmentStore
import org.mozilla.fenix.home.HomeScreenViewModel
import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.Mode
import org.mozilla.fenix.home.OnboardingState import org.mozilla.fenix.home.OnboardingState
import org.mozilla.fenix.home.Tab import org.mozilla.fenix.home.Tab
@ -163,7 +164,8 @@ private fun collectionTabItems(collection: TabCollection) = collection.tabs.mapI
class SessionControlView( class SessionControlView(
private val homeFragmentStore: HomeFragmentStore, private val homeFragmentStore: HomeFragmentStore,
override val containerView: View?, override val containerView: View?,
interactor: SessionControlInteractor interactor: SessionControlInteractor,
private var homeScreenViewModel: HomeScreenViewModel
) : LayoutContainer { ) : LayoutContainer {
val view: RecyclerView = containerView as RecyclerView val view: RecyclerView = containerView as RecyclerView
@ -193,6 +195,22 @@ class SessionControlView(
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
sessionControlAdapter.submitList(null) 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)
}
} }
} }

Loading…
Cancel
Save