From 40771bc720ee92d12554b65b8925058f2b290e5f Mon Sep 17 00:00:00 2001 From: "Thomas W." Date: Mon, 3 Feb 2025 18:03:04 +0100 Subject: [PATCH] refactor: use DiffUtilCallback across all ListAdapters (#7063) --- .../ui/activities/VideoTagsAdapter.kt | 13 ++----------- .../ui/adapters/AddChannelToGroupAdapter.kt | 16 ++-------------- .../ui/adapters/CommentPagingAdapter.kt | 15 +++++---------- .../libretube/ui/adapters/DownloadsAdapter.kt | 17 ++--------------- .../libretube/ui/adapters/InstancesAdapter.kt | 13 ++----------- .../ui/adapters/LegacySubscriptionAdapter.kt | 15 +++------------ .../ui/adapters/PlaylistBookmarkAdapter.kt | 17 ++++++----------- .../libretube/ui/adapters/PlaylistsAdapter.kt | 15 ++++----------- .../ui/adapters/SearchChannelAdapter.kt | 9 +++++++-- .../ui/adapters/SearchHistoryAdapter.kt | 12 ++---------- .../ui/adapters/SearchResultsAdapter.kt | 9 +++++++-- .../ui/adapters/SearchSuggestionsAdapter.kt | 13 ++----------- .../ui/adapters/SubscriptionChannelAdapter.kt | 15 +++------------ .../SubscriptionGroupChannelsAdapter.kt | 12 ++---------- .../libretube/ui/adapters/VideosAdapter.kt | 12 ++---------- .../ui/adapters/WatchHistoryAdapter.kt | 15 +++------------ .../ui/adapters/callbacks/DiffUtilCallback.kt | 19 +++++++++++++++++++ .../ui/adapters/callbacks/SearchCallback.kt | 12 ------------ 18 files changed, 73 insertions(+), 176 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/ui/adapters/callbacks/DiffUtilCallback.kt delete mode 100644 app/src/main/java/com/github/libretube/ui/adapters/callbacks/SearchCallback.kt diff --git a/app/src/main/java/com/github/libretube/ui/activities/VideoTagsAdapter.kt b/app/src/main/java/com/github/libretube/ui/activities/VideoTagsAdapter.kt index a8f83e39b..91fe8c02b 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/VideoTagsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/VideoTagsAdapter.kt @@ -2,22 +2,13 @@ package com.github.libretube.ui.activities import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.databinding.VideoTagRowBinding +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.viewholders.VideoTagsViewHolder -class VideoTagsAdapter : - ListAdapter(object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: String, newItem: String): Boolean { - return oldItem == newItem - } +class VideoTagsAdapter : ListAdapter(DiffUtilItemCallback()) { - override fun areContentsTheSame(oldItem: String, newItem: String): Boolean { - return oldItem == newItem - } - - }) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideoTagsViewHolder { val binding = VideoTagRowBinding.inflate(LayoutInflater.from(parent.context)) return VideoTagsViewHolder(binding) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/AddChannelToGroupAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/AddChannelToGroupAdapter.kt index cf17828a3..e2c087835 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/AddChannelToGroupAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/AddChannelToGroupAdapter.kt @@ -2,27 +2,15 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.databinding.AddChannelToGroupRowBinding import com.github.libretube.db.obj.SubscriptionGroup +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.viewholders.AddChannelToGroupViewHolder class AddChannelToGroupAdapter( private val channelId: String -) : ListAdapter(object: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: SubscriptionGroup, newItem: SubscriptionGroup): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame( - oldItem: SubscriptionGroup, - newItem: SubscriptionGroup - ): Boolean { - return oldItem == newItem - } - -}) { +) : ListAdapter(DiffUtilItemCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddChannelToGroupViewHolder { val layoutInflater = LayoutInflater.from(parent.context) val binding = AddChannelToGroupRowBinding.inflate(layoutInflater, parent, false) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/CommentPagingAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/CommentPagingAdapter.kt index e74f344b1..49b9d30bd 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/CommentPagingAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/CommentPagingAdapter.kt @@ -15,7 +15,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.commit import androidx.fragment.app.replace import androidx.paging.PagingDataAdapter -import androidx.recyclerview.widget.DiffUtil import com.github.libretube.R import com.github.libretube.api.obj.Comment import com.github.libretube.constants.IntentData @@ -25,6 +24,7 @@ import com.github.libretube.helpers.ClipboardHelper import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper import com.github.libretube.helpers.ThemeHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.fragments.CommentsRepliesFragment import com.github.libretube.ui.viewholders.CommentsViewHolder import com.github.libretube.util.HtmlParser @@ -37,7 +37,10 @@ class CommentPagingAdapter( private val isRepliesAdapter: Boolean = false, private val handleLink: ((url: String) -> Unit)?, private val dismiss: () -> Unit -) : PagingDataAdapter(CommentCallback) { +) : PagingDataAdapter(DiffUtilItemCallback( + areItemsTheSame = { oldItem, newItem -> oldItem.commentId == newItem.commentId}, + areContentsTheSame = { _, _ -> true }, +)) { private var clickEventConsumedByLinkHandler = false private fun navigateToReplies(comment: Comment) { @@ -140,11 +143,3 @@ class CommentPagingAdapter( return CommentsViewHolder(binding) } } - -private object CommentCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Comment, newItem: Comment): Boolean { - return oldItem.commentId == newItem.commentId - } - - override fun areContentsTheSame(oldItem: Comment, newItem: Comment) = true -} diff --git a/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt index d7324589b..501b0cb64 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt @@ -9,7 +9,6 @@ import android.view.ViewGroup import androidx.core.os.bundleOf import androidx.core.view.isGone import androidx.core.view.isVisible -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.R import com.github.libretube.constants.IntentData @@ -21,6 +20,7 @@ import com.github.libretube.helpers.BackgroundHelper import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper import com.github.libretube.ui.activities.OfflinePlayerActivity +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.extensions.setWatchProgressLength import com.github.libretube.ui.fragments.DownloadTab @@ -39,20 +39,7 @@ class DownloadsAdapter( private val context: Context, private val downloadTab: DownloadTab, private val toggleDownload: (DownloadWithItems) -> Boolean -) : ListAdapter(object : - DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: DownloadWithItems, newItem: DownloadWithItems): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame( - oldItem: DownloadWithItems, - newItem: DownloadWithItems - ): Boolean { - return oldItem == newItem - } - -}) { +) : ListAdapter(DiffUtilItemCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DownloadsViewHolder { val binding = VideoRowBinding.inflate( LayoutInflater.from(parent.context), diff --git a/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt index 2327b0329..723a42a63 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt @@ -3,26 +3,17 @@ package com.github.libretube.ui.adapters import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.R import com.github.libretube.api.obj.PipedInstance import com.github.libretube.databinding.InstanceRowBinding +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.viewholders.InstancesViewHolder class InstancesAdapter( initialSelectionApiIndex: Int?, private val onSelectInstance: (index: Int) -> Unit -) : ListAdapter(object: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: PipedInstance, newItem: PipedInstance): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame(oldItem: PipedInstance, newItem: PipedInstance): Boolean { - return oldItem == newItem - } - -}) { +) : ListAdapter(DiffUtilItemCallback()) { private var selectedInstanceIndex = initialSelectionApiIndex?.takeIf { it >= 0 } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InstancesViewHolder { diff --git a/app/src/main/java/com/github/libretube/ui/adapters/LegacySubscriptionAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/LegacySubscriptionAdapter.kt index 2514de1a4..b6ffafff5 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/LegacySubscriptionAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/LegacySubscriptionAdapter.kt @@ -3,7 +3,6 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.os.bundleOf -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.api.obj.Subscription import com.github.libretube.constants.IntentData @@ -11,21 +10,13 @@ import com.github.libretube.databinding.LegacySubscriptionChannelBinding import com.github.libretube.extensions.toID import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.sheets.ChannelOptionsBottomSheet import com.github.libretube.ui.viewholders.LegacySubscriptionViewHolder -class LegacySubscriptionAdapter : ListAdapter(object : - DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Subscription, newItem: Subscription): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame(oldItem: Subscription, newItem: Subscription): Boolean { - return oldItem == newItem - } - -}) { +class LegacySubscriptionAdapter : + ListAdapter(DiffUtilItemCallback()) { override fun onCreateViewHolder( parent: ViewGroup, diff --git a/app/src/main/java/com/github/libretube/ui/adapters/PlaylistBookmarkAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/PlaylistBookmarkAdapter.kt index c4a85788e..cebac6b29 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/PlaylistBookmarkAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/PlaylistBookmarkAdapter.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.os.bundleOf import androidx.core.view.isVisible -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.R import com.github.libretube.constants.IntentData @@ -16,6 +15,7 @@ import com.github.libretube.db.obj.PlaylistBookmark import com.github.libretube.enums.PlaylistType import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet import com.github.libretube.ui.viewholders.PlaylistBookmarkViewHolder @@ -25,16 +25,11 @@ import kotlinx.coroutines.launch class PlaylistBookmarkAdapter( private val bookmarkMode: BookmarkMode = BookmarkMode.FRAGMENT -) : ListAdapter(object: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: PlaylistBookmark, newItem: PlaylistBookmark): Boolean { - return oldItem.playlistId == newItem.playlistId - } - - override fun areContentsTheSame(oldItem: PlaylistBookmark, newItem: PlaylistBookmark): Boolean { - return oldItem == newItem - } - -}) { +) : ListAdapter( + DiffUtilItemCallback( + areItemsTheSame = { oldItem, newItem -> oldItem.playlistId == newItem.playlistId } + ) +) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PlaylistBookmarkViewHolder { val layoutInflater = LayoutInflater.from(parent.context) return when (bookmarkMode) { diff --git a/app/src/main/java/com/github/libretube/ui/adapters/PlaylistsAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/PlaylistsAdapter.kt index 2dc17061f..065c5e1ba 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/PlaylistsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/PlaylistsAdapter.kt @@ -3,7 +3,6 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.os.bundleOf -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.R import com.github.libretube.api.obj.Playlists @@ -12,6 +11,7 @@ import com.github.libretube.databinding.PlaylistsRowBinding import com.github.libretube.enums.PlaylistType import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet.Companion.PLAYLIST_OPTIONS_REQUEST_KEY @@ -19,16 +19,9 @@ import com.github.libretube.ui.viewholders.PlaylistsViewHolder class PlaylistsAdapter( private val playlistType: PlaylistType -) : ListAdapter(object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Playlists, newItem: Playlists): Boolean { - return oldItem.id == newItem.id - } - - override fun areContentsTheSame(oldItem: Playlists, newItem: Playlists): Boolean { - return oldItem == newItem - } - -}) { +) : ListAdapter( + DiffUtilItemCallback(areItemsTheSame = { oldItem, newItem -> oldItem.id == newItem.id }) +) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PlaylistsViewHolder { val layoutInflater = LayoutInflater.from(parent.context) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SearchChannelAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SearchChannelAdapter.kt index 50902d637..141035a16 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SearchChannelAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SearchChannelAdapter.kt @@ -18,7 +18,7 @@ import com.github.libretube.extensions.formatShort import com.github.libretube.extensions.toID import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper -import com.github.libretube.ui.adapters.callbacks.SearchCallback +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.extensions.setFormattedDuration import com.github.libretube.ui.extensions.setWatchProgressLength @@ -31,7 +31,12 @@ import com.github.libretube.util.TextUtils import kotlinx.serialization.encodeToString // TODO: Replace with SearchResultsAdapter when migrating the channel fragment to use Paging as well -class SearchChannelAdapter : ListAdapter(SearchCallback) { +class SearchChannelAdapter : ListAdapter( + DiffUtilItemCallback( + areItemsTheSame = { oldItem, newItem -> oldItem.url == newItem.url }, + areContentsTheSame = { _, _ -> true }, + ) +) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchViewHolder { val layoutInflater = LayoutInflater.from(parent.context) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SearchHistoryAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SearchHistoryAdapter.kt index 79f0360c6..8ff0dba67 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SearchHistoryAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SearchHistoryAdapter.kt @@ -3,11 +3,11 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isVisible -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.databinding.SuggestionRowBinding import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.obj.SearchHistoryItem +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.viewholders.SuggestionsViewHolder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking @@ -15,16 +15,8 @@ import kotlinx.coroutines.runBlocking class SearchHistoryAdapter( private val onRootClickListener: (String) -> Unit, private val onArrowClickListener: (String) -> Unit, -) : ListAdapter(object: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: String, newItem: String): Boolean { - return oldItem == newItem - } +) : ListAdapter(DiffUtilItemCallback()) { - override fun areContentsTheSame(oldItem: String, newItem: String): Boolean { - return oldItem == newItem - } - -}) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SuggestionsViewHolder { val layoutInflater = LayoutInflater.from(parent.context) val binding = SuggestionRowBinding.inflate(layoutInflater, parent, false) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SearchResultsAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SearchResultsAdapter.kt index 45785b017..b17421726 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SearchResultsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SearchResultsAdapter.kt @@ -19,7 +19,7 @@ import com.github.libretube.extensions.formatShort import com.github.libretube.extensions.toID import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper -import com.github.libretube.ui.adapters.callbacks.SearchCallback +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.extensions.setFormattedDuration import com.github.libretube.ui.extensions.setWatchProgressLength @@ -37,7 +37,12 @@ import kotlinx.serialization.encodeToString class SearchResultsAdapter( private val timeStamp: Long = 0 -) : PagingDataAdapter(SearchCallback) { +) : PagingDataAdapter( + DiffUtilItemCallback( + areItemsTheSame = { oldItem, newItem -> oldItem.url == newItem.url }, + areContentsTheSame = { _, _ -> true }, + ) +) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchViewHolder { val layoutInflater = LayoutInflater.from(parent.context) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SearchSuggestionsAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SearchSuggestionsAdapter.kt index 6466155ce..e4187813e 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SearchSuggestionsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SearchSuggestionsAdapter.kt @@ -2,24 +2,15 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.databinding.SuggestionRowBinding +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.viewholders.SuggestionsViewHolder class SearchSuggestionsAdapter( private val onRootClickListener: (String) -> Unit, private val onArrowClickListener: (String) -> Unit, -) : ListAdapter(object: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: String, newItem: String): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame(oldItem: String, newItem: String): Boolean { - return oldItem == newItem - } - -}) { +) : ListAdapter(DiffUtilItemCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SuggestionsViewHolder { val layoutInflater = LayoutInflater.from(parent.context) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt index 460d582dd..33dc6451c 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt @@ -3,7 +3,6 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.os.bundleOf -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.api.obj.Subscription import com.github.libretube.constants.IntentData @@ -11,22 +10,14 @@ import com.github.libretube.databinding.ChannelSubscriptionRowBinding import com.github.libretube.extensions.toID import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.extensions.setupSubscriptionButton import com.github.libretube.ui.sheets.ChannelOptionsBottomSheet import com.github.libretube.ui.viewholders.SubscriptionChannelViewHolder -class SubscriptionChannelAdapter : ListAdapter(object : - DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Subscription, newItem: Subscription): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame(oldItem: Subscription, newItem: Subscription): Boolean { - return oldItem == newItem - } - -}) { +class SubscriptionChannelAdapter : + ListAdapter(DiffUtilItemCallback()) { private var visibleCount = 20 override fun getItemCount() = minOf(visibleCount, currentList.size) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionGroupChannelsAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionGroupChannelsAdapter.kt index 664b91abb..f9446d9cb 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionGroupChannelsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionGroupChannelsAdapter.kt @@ -2,7 +2,6 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.api.obj.Subscription import com.github.libretube.databinding.SubscriptionGroupChannelRowBinding @@ -10,21 +9,14 @@ import com.github.libretube.db.obj.SubscriptionGroup import com.github.libretube.extensions.toID import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.viewholders.SubscriptionGroupChannelRowViewHolder class SubscriptionGroupChannelsAdapter( private val group: SubscriptionGroup, private val onGroupChanged: (SubscriptionGroup) -> Unit -) : ListAdapter(object: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Subscription, newItem: Subscription): Boolean { - return oldItem == newItem - } +) : ListAdapter(DiffUtilItemCallback()) { - override fun areContentsTheSame(oldItem: Subscription, newItem: Subscription): Boolean { - return oldItem == newItem - } - -}) { override fun onCreateViewHolder( parent: ViewGroup, viewType: Int diff --git a/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt index 662c007db..fc9b4a994 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt @@ -8,7 +8,6 @@ import androidx.core.os.bundleOf import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.LayoutManager @@ -25,6 +24,7 @@ import com.github.libretube.extensions.toID import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper import com.github.libretube.helpers.PreferenceHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.extensions.setFormattedDuration import com.github.libretube.ui.extensions.setWatchProgressLength @@ -38,16 +38,8 @@ import kotlinx.coroutines.withContext class VideosAdapter( private val forceMode: LayoutMode = LayoutMode.RESPECT_PREF -) : ListAdapter(object: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: StreamItem, newItem: StreamItem): Boolean { - return oldItem == newItem - } +) : ListAdapter(DiffUtilItemCallback()) { - override fun areContentsTheSame(oldItem: StreamItem, newItem: StreamItem): Boolean { - return oldItem == newItem - } - -}) { override fun getItemViewType(position: Int): Int { return if (currentList[position].type == CAUGHT_UP_STREAM_TYPE) CAUGHT_UP_TYPE else NORMAL_TYPE } diff --git a/app/src/main/java/com/github/libretube/ui/adapters/WatchHistoryAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/WatchHistoryAdapter.kt index 3796dde6f..34c7bc069 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/WatchHistoryAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/WatchHistoryAdapter.kt @@ -5,7 +5,6 @@ import android.view.ViewGroup import androidx.core.os.bundleOf import androidx.core.view.isGone import androidx.core.view.isVisible -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.github.libretube.constants.IntentData import com.github.libretube.databinding.VideoRowBinding @@ -13,6 +12,7 @@ import com.github.libretube.db.DatabaseHolder import com.github.libretube.db.obj.WatchHistoryItem import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.NavigationHelper +import com.github.libretube.ui.adapters.callbacks.DiffUtilItemCallback import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.extensions.setFormattedDuration import com.github.libretube.ui.extensions.setWatchProgressLength @@ -25,17 +25,8 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext -class WatchHistoryAdapter : ListAdapter(object : - DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: WatchHistoryItem, newItem: WatchHistoryItem): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame(oldItem: WatchHistoryItem, newItem: WatchHistoryItem): Boolean { - return oldItem == newItem - } - -}) { +class WatchHistoryAdapter : + ListAdapter(DiffUtilItemCallback()) { fun removeFromWatchHistory(position: Int) { val history = getItem(position) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/callbacks/DiffUtilCallback.kt b/app/src/main/java/com/github/libretube/ui/adapters/callbacks/DiffUtilCallback.kt new file mode 100644 index 000000000..b71f056f3 --- /dev/null +++ b/app/src/main/java/com/github/libretube/ui/adapters/callbacks/DiffUtilCallback.kt @@ -0,0 +1,19 @@ +package com.github.libretube.ui.adapters.callbacks + +import androidx.recyclerview.widget.DiffUtil + + +@Suppress("FunctionName") +fun DiffUtilItemCallback( + areItemsTheSame: (T, T) -> Boolean = ::equals, + areContentsTheSame: (T, T) -> Boolean = ::equals, +) = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: T & Any, newItem: T & Any): Boolean { + return areItemsTheSame(oldItem, newItem) + } + + override fun areContentsTheSame(oldItem: T & Any, newItem: T & Any) = + areContentsTheSame(oldItem, newItem) +} + +private fun equals(first: T, second: T) = first == second \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/ui/adapters/callbacks/SearchCallback.kt b/app/src/main/java/com/github/libretube/ui/adapters/callbacks/SearchCallback.kt deleted file mode 100644 index 3c0653d29..000000000 --- a/app/src/main/java/com/github/libretube/ui/adapters/callbacks/SearchCallback.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.libretube.ui.adapters.callbacks - -import androidx.recyclerview.widget.DiffUtil -import com.github.libretube.api.obj.ContentItem - -object SearchCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: ContentItem, newItem: ContentItem): Boolean { - return oldItem.url == newItem.url - } - - override fun areContentsTheSame(oldItem: ContentItem, newItem: ContentItem) = true -}