diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabLayoutMediator.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabLayoutMediator.kt index 25f1d6b62..fb41c0235 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabLayoutMediator.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabLayoutMediator.kt @@ -57,8 +57,19 @@ class TabLayoutMediator( internal class TabLayoutObserver( private val interactor: TabsTrayInteractor ) : TabLayout.OnTabSelectedListener { + + private var initialScroll = true + override fun onTabSelected(tab: TabLayout.Tab) { - interactor.setCurrentTrayPosition(tab.position) + // Do not animate the initial scroll when opening the tabs tray. + val animate = if (initialScroll) { + initialScroll = false + false + } else { + true + } + + interactor.setCurrentTrayPosition(tab.position, animate) } override fun onTabUnselected(tab: TabLayout.Tab) = Unit 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 a2dea00ae..5ceead5e4 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -104,8 +104,8 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor { } } - override fun setCurrentTrayPosition(position: Int) { - tabsTray.currentItem = position + override fun setCurrentTrayPosition(position: Int, smoothScroll: Boolean) { + tabsTray.setCurrentItem(position, smoothScroll) } override fun navigateToBrowser() { diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt index 2544d66a3..9fd950a6b 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt @@ -7,8 +7,11 @@ package org.mozilla.fenix.tabstray interface TabsTrayInteractor { /** * Set the current tray item to the clamped [position]. + * + * @param position The position on the tray to focus. + * @param smoothScroll If true, animate the scrolling from the current tab to [position]. */ - fun setCurrentTrayPosition(position: Int) + fun setCurrentTrayPosition(position: Int, smoothScroll: Boolean) /** * Dismisses the tabs tray and navigates to the browser. diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/TabLayoutObserverTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/TabLayoutObserverTest.kt index 4ee3645ae..ba14eea72 100644 --- a/app/src/test/java/org/mozilla/fenix/tabstray/TabLayoutObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabstray/TabLayoutObserverTest.kt @@ -21,6 +21,21 @@ class TabLayoutObserverTest { observer.onTabSelected(tab) - verify { interactor.setCurrentTrayPosition(1) } + verify { interactor.setCurrentTrayPosition(1, false) } + } + + @Test + fun `WHEN observer is first started THEN do not smooth scroll`() { + val observer = TabLayoutObserver(interactor) + val tab = mockk() + every { tab.position } returns 1 + + observer.onTabSelected(tab) + + verify { interactor.setCurrentTrayPosition(1, false) } + + observer.onTabSelected(tab) + + verify { interactor.setCurrentTrayPosition(1, true) } } }