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 c3c7e3a85..f1776d33a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.home +import android.animation.Animator import android.content.Context import android.content.DialogInterface import android.content.res.Resources @@ -28,6 +29,7 @@ import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import mozilla.components.browser.menu.BrowserMenu @@ -68,6 +70,7 @@ import org.mozilla.fenix.home.sessioncontrol.SessionControlViewModel import org.mozilla.fenix.home.sessioncontrol.Tab import org.mozilla.fenix.home.sessioncontrol.TabAction import org.mozilla.fenix.home.sessioncontrol.TabCollection +import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder import org.mozilla.fenix.lib.Do import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.getAutoDisposeObservable @@ -458,6 +461,10 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver { action.collection.tabs.forEach { requireComponents.useCases.tabsUseCases.addTab.invoke(it.url) } + launch { + delay(ANIM_SCROLL_DELAY) + sessionControlComponent.view.smoothScrollToPosition(0) + } } is CollectionAction.ShareTabs -> { val shareTabs = action.collection.tabs.map { ShareTab(it.url, it.title) } @@ -709,10 +716,48 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver { emitAccountChanges() } + private fun scrollToCollections(addedTabsSize: Int) { + launch { + delay(ANIM_SCROLL_DELAY) + val tabsSize = requireComponents.core.sessionManager.sessions.filter { + (activity as HomeActivity).browsingModeManager.isPrivate == it.private + }.size + sessionControlComponent.view.smoothScrollToPosition(tabsSize + NON_TAB_ITEM_NUM) + delay(ANIM_SNACKBAR_DELAY) + showSavedSnackbar(addedTabsSize) + } + } + + private fun animateTopCollection() { + launch { + delay(ANIM_SCROLL_DELAY) + val tabsSize = requireComponents.core.sessionManager.sessions.filter { + (activity as HomeActivity).browsingModeManager.isPrivate == it.private + }.size + val topCollectionPosition = tabsSize + NON_TAB_ITEM_NUM + sessionControlComponent.view.smoothScrollToPosition(topCollectionPosition) + val viewHolder = sessionControlComponent.view.findViewHolderForAdapterPosition(topCollectionPosition) + val border = (viewHolder as? CollectionViewHolder)?.view?.findViewById(R.id.selected_border) + val listener = object : Animator.AnimatorListener { + override fun onAnimationCancel(animation: Animator?) {} + override fun onAnimationStart(animation: Animator?) {} + override fun onAnimationRepeat(animation: Animator?) {} + override fun onAnimationEnd(animation: Animator?) { + border?.animate()?.alpha(0.0F)?.setDuration(FADE_ANIM_DURATION) + ?.setStartDelay(ANIM_ON_SCREEN_DELAY) + ?.start() + } + } + delay(ANIM_ON_SCREEN_DELAY) + border?.animate()?.alpha(1.0F)?.setDuration(FADE_ANIM_DURATION)?.setListener(listener)?.start() + } + } + private val collectionStorageObserver = object : TabCollectionStorage.Observer { override fun onCollectionCreated(title: String, sessions: List) { super.onCollectionCreated(title, sessions) - showSavedSnackbar(sessions.size) + scrollToCollections(sessions.size) + animateTopCollection() } override fun onTabsAdded( @@ -720,7 +765,7 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver { sessions: List ) { super.onTabsAdded(tabCollection, sessions) - showSavedSnackbar(sessions.size) + scrollToCollections(sessions.size) } override fun onCollectionRenamed( @@ -755,6 +800,11 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver { } companion object { + private const val NON_TAB_ITEM_NUM = 3 + private const val ANIM_SCROLL_DELAY = 100L + private const val ANIM_ON_SCREEN_DELAY = 200L + private const val FADE_ANIM_DURATION = 150L + private const val ANIM_SNACKBAR_DELAY = 500L private const val SHARED_TRANSITION_MS = 200L private const val TAB_ITEM_TRANSITION_NAME = "tab_item" private const val toolbarPaddingDp = 12f diff --git a/app/src/main/res/layout/collection_home_list_row.xml b/app/src/main/res/layout/collection_home_list_row.xml index 09425fb25..333d1bb68 100644 --- a/app/src/main/res/layout/collection_home_list_row.xml +++ b/app/src/main/res/layout/collection_home_list_row.xml @@ -18,14 +18,14 @@ + android:layout_height="wrap_content"> + +