From c493ada148e9ea487f026b567b843e60ce4ed0d6 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 25 Feb 2024 14:02:50 +0100 Subject: [PATCH] refactor: simplify scrolling logic --- .../libretube/ui/extensions/RecyclerView.kt | 9 +++++++ .../libretube/ui/fragments/ChannelFragment.kt | 7 +++-- .../ui/fragments/PlaylistFragment.kt | 26 ++++++++----------- .../ui/fragments/SubscriptionsFragment.kt | 21 +++++++-------- 4 files changed, 32 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/ui/extensions/RecyclerView.kt diff --git a/app/src/main/java/com/github/libretube/ui/extensions/RecyclerView.kt b/app/src/main/java/com/github/libretube/ui/extensions/RecyclerView.kt new file mode 100644 index 000000000..127abbbb6 --- /dev/null +++ b/app/src/main/java/com/github/libretube/ui/extensions/RecyclerView.kt @@ -0,0 +1,9 @@ +package com.github.libretube.ui.extensions + +import androidx.recyclerview.widget.RecyclerView + +fun RecyclerView.addOnBottomReachedListener(onBottomReached: () -> Unit) { + viewTreeObserver.addOnScrollChangedListener { + if (!canScrollVertically(1)) onBottomReached() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt index 0cd9dcafb..b36e86005 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt @@ -30,6 +30,7 @@ import com.github.libretube.ui.adapters.SearchChannelAdapter import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.base.DynamicLayoutManagerFragment import com.github.libretube.ui.dialogs.ShareDialog +import com.github.libretube.ui.extensions.addOnBottomReachedListener import com.github.libretube.ui.extensions.setupSubscriptionButton import com.github.libretube.ui.sheets.AddChannelToGroupSheet import com.github.libretube.util.deArrow @@ -102,10 +103,8 @@ class ChannelFragment : DynamicLayoutManagerFragment() { fetchChannel() } - binding.channelRecView.viewTreeObserver.addOnScrollChangedListener { - val binding = _binding ?: return@addOnScrollChangedListener - - if (binding.channelRecView.canScrollVertically(1) || isLoading) return@addOnScrollChangedListener + binding.channelRecView.addOnBottomReachedListener { + if (_binding == null || isLoading) return@addOnBottomReachedListener loadNextPage() } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt index 331516dc2..cbf00a3df 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt @@ -17,7 +17,6 @@ import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView -import com.github.libretube.NavDirections import com.github.libretube.R import com.github.libretube.api.PlaylistsHelper import com.github.libretube.api.RetrofitInstance @@ -31,15 +30,14 @@ import com.github.libretube.enums.PlaylistType import com.github.libretube.extensions.TAG import com.github.libretube.extensions.ceilHalf import com.github.libretube.extensions.dpToPx -import com.github.libretube.extensions.toID import com.github.libretube.extensions.toastFromMainDispatcher import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper import com.github.libretube.helpers.PreferenceHelper -import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.adapters.PlaylistAdapter import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.base.DynamicLayoutManagerFragment +import com.github.libretube.ui.extensions.addOnBottomReachedListener import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.sheets.BaseBottomSheet import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet @@ -312,18 +310,16 @@ class PlaylistFragment : DynamicLayoutManagerFragment() { } }) - binding.playlistRecView.viewTreeObserver.addOnScrollChangedListener { - if (_binding?.playlistRecView?.canScrollVertically(1) == false && - !isLoading - ) { - // append more playlists to the recycler view - if (playlistType != PlaylistType.PUBLIC) { - isLoading = true - playlistAdapter?.showMoreItems() - isLoading = false - } else { - fetchNextPage() - } + binding.playlistRecView.addOnBottomReachedListener { + if (isLoading) return@addOnBottomReachedListener + + // append more playlists to the recycler view + if (playlistType != PlaylistType.PUBLIC) { + isLoading = true + playlistAdapter?.showMoreItems() + isLoading = false + } else { + fetchNextPage() } } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt index e58df412a..d3ea1beb8 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt @@ -34,6 +34,7 @@ import com.github.libretube.ui.adapters.LegacySubscriptionAdapter import com.github.libretube.ui.adapters.SubscriptionChannelAdapter import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.base.DynamicLayoutManagerFragment +import com.github.libretube.ui.extensions.addOnBottomReachedListener import com.github.libretube.ui.models.EditChannelGroupsModel import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.SubscriptionsViewModel @@ -134,24 +135,20 @@ class SubscriptionsFragment : DynamicLayoutManagerFragment() { binding.subFeed.isGone = isCurrentTabSubChannels } - binding.subChannels.viewTreeObserver.addOnScrollChangedListener { - val binding = _binding - if (binding?.subChannels?.canScrollVertically(1) == false && - viewModel.subscriptions.value != null && // scroll view is at bottom - isCurrentTabSubChannels - ) { + binding.subChannels.addOnBottomReachedListener { + val binding = _binding ?: return@addOnBottomReachedListener + + if (viewModel.subscriptions.value != null && isCurrentTabSubChannels) { binding.subRefresh.isRefreshing = true channelsAdapter?.updateItems() binding.subRefresh.isRefreshing = false } } - binding.subFeed.viewTreeObserver.addOnScrollChangedListener { - val binding = _binding - if (binding?.subFeed?.canScrollVertically(1) == false && - viewModel.videoFeed.value != null && // scroll view is at bottom - !isCurrentTabSubChannels - ) { + binding.subFeed.addOnBottomReachedListener { + val binding = _binding ?: return@addOnBottomReachedListener + + if (viewModel.videoFeed.value != null && !isCurrentTabSubChannels) { binding.subRefresh.isRefreshing = true feedAdapter?.updateItems() binding.subRefresh.isRefreshing = false