From 3107464dd248e47449007dcda3348a0369d47f5f Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 24 Oct 2021 11:03:24 -0600 Subject: [PATCH] home: make fab hide when fast scrolling Hide the FAB when fast scrolling. This is just a UX enhancement. --- .../main/java/org/oxycblt/auxio/home/HomeFragment.kt | 11 +++++++++++ .../main/java/org/oxycblt/auxio/home/HomeViewModel.kt | 11 +++++++++++ .../auxio/home/fastscroll/FastScrollRecyclerView.kt | 9 +++++++-- .../org/oxycblt/auxio/home/list/HomeListFragment.kt | 5 ++++- app/src/main/res/layout/fragment_home.xml | 1 - 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt index d152ed4c1..0cf230e62 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -205,6 +205,17 @@ class HomeFragment : Fragment() { // --- VIEWMODEL SETUP --- + // There is no way a fast scrolling event can continue across a re-create. Reset it. + homeModel.updateFastScrolling(false) + + homeModel.fastScrolling.observe(viewLifecycleOwner) { scrolling -> + if (scrolling) { + binding.homeFab.hide() + } else { + binding.homeFab.show() + } + } + homeModel.recreateTabs.observe(viewLifecycleOwner) { recreate -> // notifyDataSetChanged is not practical for recreating here since it will cache // the previous fragments. Just instantiate a whole new adapter. diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt index db79f8dcf..d911c0c45 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt @@ -61,6 +61,9 @@ class HomeViewModel : ViewModel(), SettingsManager.Callback { private val mCurTab = MutableLiveData(tabs[0]) val curTab: LiveData = mCurTab + private val mFastScrolling = MutableLiveData(false) + val fastScrolling: LiveData = mFastScrolling + /** * Marker to recreate all library tabs, usually initiated by a settings change. * When this flag is set, all tabs (and their respective viewpager fragments) will be @@ -123,6 +126,14 @@ class HomeViewModel : ViewModel(), SettingsManager.Callback { } } + /** + * Update the fast scroll state. This is used to control the FAB visibility whenever + * the user begins to fast scroll. + */ + fun updateFastScrolling(scrolling: Boolean) { + mFastScrolling.value = scrolling + } + // --- OVERRIDES --- override fun onLibTabsUpdate(libTabs: Array) { diff --git a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt index 6ef983cf2..15780a8bb 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt @@ -62,6 +62,7 @@ import kotlin.math.abs * - Track view is now only used for touch bounds * - Redundant functions have been merged * - Variable names are no longer prefixed with m + * - Added drag listener * - TODO: Added documentation * - TODO: Popup will center itself to the thumb when possible * @@ -72,7 +73,8 @@ class FastScrollRecyclerView @JvmOverloads constructor( attrs: AttributeSet? = null, defStyleAttr: Int = -1 ) : RecyclerView(context, attrs, defStyleAttr) { - private var popupProvider: ((Int) -> String)? = null + var popupProvider: ((Int) -> String)? = null + var onDragListener: ((Boolean) -> Unit)? = null private val minTouchTargetSize: Int = resources.getDimensionPixelSize(R.dimen.size_btn_small) private val touchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop @@ -191,7 +193,7 @@ class FastScrollRecyclerView @JvmOverloads constructor( }) } - fun setup(provider: (Int) -> String) { + fun addPopupProvider(provider: (Int) -> String) { popupProvider = provider } @@ -496,6 +498,7 @@ class FastScrollRecyclerView @JvmOverloads constructor( } this.dragging = dragging + if (this.dragging) { parent.requestDisallowInterceptTouchEvent(true) } @@ -511,6 +514,8 @@ class FastScrollRecyclerView @JvmOverloads constructor( postAutoHideScrollbar() hidePopup() } + + onDragListener?.invoke(dragging) } // --- SCROLLBAR APPEARANCE --- diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/HomeListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/HomeListFragment.kt index d9860baed..6d252fb3e 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/HomeListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/HomeListFragment.kt @@ -51,7 +51,10 @@ abstract class HomeListFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.homeRecycler.setup(popupProvider) + binding.homeRecycler.popupProvider = popupProvider + binding.homeRecycler.onDragListener = { dragging -> + homeModel.updateFastScrolling(dragging) + } } protected fun setupRecycler( diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 0bb4592eb..caa4ce4ee 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -8,7 +8,6 @@ android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" - android:animateLayoutChanges="true" android:orientation="vertical">