diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt index 87ee3cbfc..8bbd70ba5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt @@ -11,6 +11,7 @@ import org.koitharu.kotatsu.databinding.ItemBookmarkBinding import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source fun bookmarkListAD( coil: ImageLoader, @@ -25,12 +26,12 @@ fun bookmarkListAD( binding.root.setOnLongClickListener(listener) bind { - binding.imageViewThumb.newImageRequest(item.imageUrl, item.manga.source)?.run { + binding.imageViewThumb.newImageRequest(lifecycleOwner, item.imageUrl)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) + source(item.manga.source) enqueueWith(coil) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt index 47f7dd04a..e4e32fa93 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt @@ -18,6 +18,7 @@ import org.koitharu.kotatsu.utils.ext.clearItemDecorations import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source fun bookmarksGroupAD( coil: ImageLoader, @@ -48,12 +49,12 @@ fun bookmarksGroupAD( binding.recyclerView.addItemDecoration(spacingDecoration) selectionController.attachToRecyclerView(item.manga, binding.recyclerView) } - binding.imageViewCover.newImageRequest(item.manga.coverUrl, item.manga.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.manga.coverUrl)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) + source(item.manga.source) enqueueWith(coil) } binding.textViewTitle.text = item.manga.title diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt index e241c8d17..a73d0a0c1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt @@ -5,14 +5,18 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import kotlin.jvm.internal.Intrinsics import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.ui.model.BookmarksGroup -import org.koitharu.kotatsu.list.ui.adapter.* +import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener +import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD +import org.koitharu.kotatsu.list.ui.adapter.errorStateListAD +import org.koitharu.kotatsu.list.ui.adapter.loadingFooterAD +import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga +import kotlin.jvm.internal.Intrinsics class BookmarksGroupAdapter( coil: ImageLoader, @@ -38,7 +42,7 @@ class BookmarksGroupAdapter( ) .addDelegate(loadingStateAD()) .addDelegate(loadingFooterAD()) - .addDelegate(emptyStateListAD(coil, listener)) + .addDelegate(emptyStateListAD(coil, lifecycleOwner, listener)) .addDelegate(errorStateListAD(listener)) } @@ -49,6 +53,7 @@ class BookmarksGroupAdapter( oldItem is BookmarksGroup && newItem is BookmarksGroup -> { oldItem.manga.id == newItem.manga.id } + else -> oldItem.javaClass == newItem.javaClass } } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 0461182fd..36356f73f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -345,7 +345,7 @@ class DetailsFragment : .size(CoverSizeResolver(binding.imageViewCover)) .data(imageUrl) .tag(manga.source) - .crossfade(context) + .crossfade(requireContext()) .lifecycle(viewLifecycleOwner) .placeholderMemoryCacheKey(manga.coverUrl) val previousDrawable = lastResult?.drawable diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt index f5edffbd2..93f32add9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt @@ -23,11 +23,10 @@ fun scrobblingInfoAD( } bind { - binding.imageViewCover.newImageRequest(item.coverUrl /* TODO */, null)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.coverUrl)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) - lifecycle(lifecycleOwner) enqueueWith(coil) } binding.textViewTitle.text = item.title diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt index 802b6e817..dfaae62fd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt @@ -123,8 +123,7 @@ class ScrobblingInfoBottomSheet : binding.spinnerStatus.setSelection(scrobbling.status?.ordinal ?: -1) binding.imageViewLogo.contentDescription = getString(scrobbling.scrobbler.titleResId) binding.imageViewLogo.setImageResource(scrobbling.scrobbler.iconResId) - binding.imageViewCover.newImageRequest(scrobbling.coverUrl)?.apply { - lifecycle(viewLifecycleOwner) + binding.imageViewCover.newImageRequest(viewLifecycleOwner, scrobbling.coverUrl)?.apply { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt index 27feeb00f..2afba0b27 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadItemAD.kt @@ -2,9 +2,10 @@ package org.koitharu.kotatsu.download.ui import android.view.View import androidx.core.view.isVisible +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -17,9 +18,10 @@ import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.getDisplayMessage import org.koitharu.kotatsu.utils.ext.newImageRequest import org.koitharu.kotatsu.utils.ext.onFirst +import org.koitharu.kotatsu.utils.ext.source fun downloadItemAD( - scope: CoroutineScope, + lifecycleOwner: LifecycleOwner, coil: ImageLoader, ) = adapterDelegateViewBinding( { inflater, parent -> ItemDownloadBinding.inflate(inflater, parent, false) }, @@ -43,10 +45,11 @@ fun downloadItemAD( bind { job?.cancel() job = item.progressAsFlow().onFirst { state -> - binding.imageViewCover.newImageRequest(state.manga.coverUrl, state.manga.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, state.manga.coverUrl)?.run { placeholder(state.cover) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) + source(state.manga.source) allowRgb565(true) enqueueWith(coil) } @@ -127,7 +130,7 @@ fun downloadItemAD( binding.buttonResume.isVisible = false } } - }.launchIn(scope) + }.launchIn(lifecycleOwner.lifecycleScope) } onViewRecycled { diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt index 6fb479251..7b0872910 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt @@ -6,7 +6,6 @@ import android.os.Bundle import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.core.view.updatePadding -import androidx.lifecycle.lifecycleScope import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R @@ -27,7 +26,7 @@ class DownloadsActivity : BaseActivity() { super.onCreate(savedInstanceState) setContentView(ActivityDownloadsBinding.inflate(layoutInflater)) supportActionBar?.setDisplayHomeAsUpEnabled(true) - val adapter = DownloadsAdapter(lifecycleScope, coil) + val adapter = DownloadsAdapter(this, coil) val spacing = resources.getDimensionPixelOffset(R.dimen.list_spacing) binding.recyclerView.addItemDecoration(SpacingItemDecoration(spacing)) binding.recyclerView.setHasFixedSize(true) diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt index de75277bf..5962220c3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsAdapter.kt @@ -1,21 +1,21 @@ package org.koitharu.kotatsu.download.ui +import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import kotlinx.coroutines.CoroutineScope import org.koitharu.kotatsu.download.domain.DownloadState import org.koitharu.kotatsu.utils.progress.PausingProgressJob typealias DownloadItem = PausingProgressJob class DownloadsAdapter( - scope: CoroutineScope, + lifecycleOwner: LifecycleOwner, coil: ImageLoader, ) : AsyncListDifferDelegationAdapter(DiffCallback()) { init { - delegatesManager.addDelegate(downloadItemAD(scope, coil)) + delegatesManager.addDelegate(downloadItemAD(lifecycleOwner, coil)) setHasStableIds(true) } diff --git a/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt index 0c9712fcd..a502d6931 100644 --- a/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt @@ -21,6 +21,7 @@ import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest import org.koitharu.kotatsu.utils.ext.setTextAndVisible +import org.koitharu.kotatsu.utils.ext.source import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable fun exploreButtonsAD( @@ -76,11 +77,11 @@ fun exploreSourceListItemAD( bind { binding.textViewTitle.text = item.source.title val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - binding.imageViewIcon.newImageRequest(item.source.faviconUri(), item.source)?.run { + binding.imageViewIcon.newImageRequest(lifecycleOwner, item.source.faviconUri())?.run { fallback(fallbackIcon) placeholder(fallbackIcon) error(fallbackIcon) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } } @@ -107,11 +108,11 @@ fun exploreSourceGridItemAD( bind { binding.textViewTitle.text = item.source.title val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - binding.imageViewIcon.newImageRequest(item.source.faviconUri())?.run { + binding.imageViewIcon.newImageRequest(lifecycleOwner, item.source.faviconUri())?.run { fallback(fallbackIcon) placeholder(fallbackIcon) error(fallbackIcon) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt index f7ba8a348..741faa08a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt @@ -4,12 +4,12 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import kotlin.jvm.internal.Intrinsics import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesListListener import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD import org.koitharu.kotatsu.list.ui.model.ListModel +import kotlin.jvm.internal.Intrinsics class CategoriesAdapter( coil: ImageLoader, @@ -20,7 +20,7 @@ class CategoriesAdapter( init { delegatesManager.addDelegate(categoryAD(coil, lifecycleOwner, onItemClickListener)) - .addDelegate(emptyStateListAD(coil, listListener)) + .addDelegate(emptyStateListAD(coil, lifecycleOwner, listListener)) .addDelegate(loadingStateAD()) } @@ -31,6 +31,7 @@ class CategoriesAdapter( oldItem is CategoryListModel && newItem is CategoryListModel -> { oldItem.category.id == newItem.category.id } + else -> oldItem.javaClass == newItem.javaClass } } @@ -52,6 +53,7 @@ class CategoriesAdapter( super.getChangePayload(oldItem, newItem) } } + else -> super.getChangePayload(oldItem, newItem) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt index 8c633bcfb..d69ea5ec1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt @@ -77,13 +77,12 @@ fun categoryAD( ) } repeat(coverViews.size) { i -> - coverViews[i].newImageRequest(item.covers.getOrNull(i))?.run { + coverViews[i].newImageRequest(lifecycleOwner, item.covers.getOrNull(i))?.run { placeholder(R.drawable.ic_placeholder) fallback(fallback) crossfade(crossFadeDuration * (i + 1)) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) enqueueWith(coil) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt index 23da29efe..29a4b1dbb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.list.ui.adapter +import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.databinding.ItemEmptyStateBinding @@ -12,6 +13,7 @@ import org.koitharu.kotatsu.utils.ext.setTextAndVisible fun emptyStateListAD( coil: ImageLoader, + lifecycleOwner: LifecycleOwner, listener: ListStateHolderListener?, ) = adapterDelegateViewBinding( { inflater, parent -> ItemEmptyStateBinding.inflate(inflater, parent, false) }, @@ -22,7 +24,7 @@ fun emptyStateListAD( } bind { - binding.icon.newImageRequest(item.icon)?.enqueueWith(coil) + binding.icon.newImageRequest(lifecycleOwner, item.icon)?.enqueueWith(coil) binding.textPrimary.setText(item.textPrimary) binding.textSecondary.setTextAndVisible(item.textSecondary) if (listener != null) { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt index dd63900c0..98859c239 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt @@ -15,6 +15,7 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source import org.koitharu.kotatsu.utils.image.CoverSizeResolver fun mangaGridItemAD( @@ -38,13 +39,13 @@ fun mangaGridItemAD( bind { payloads -> binding.textViewTitle.text = item.title binding.progressView.setPercent(item.progress, MangaListAdapter.PAYLOAD_PROGRESS in payloads) - binding.imageViewCover.newImageRequest(item.coverUrl, item.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.coverUrl)?.run { size(CoverSizeResolver(binding.imageViewCover)) placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } badge = itemView.bindBadge(badge, item.counter) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt index ca86b5050..1be69ef00 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt @@ -4,9 +4,15 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import kotlin.jvm.internal.Intrinsics import org.koitharu.kotatsu.core.ui.DateTimeAgo -import org.koitharu.kotatsu.list.ui.model.* +import org.koitharu.kotatsu.list.ui.model.ListHeader +import org.koitharu.kotatsu.list.ui.model.ListHeader2 +import org.koitharu.kotatsu.list.ui.model.ListModel +import org.koitharu.kotatsu.list.ui.model.MangaGridModel +import org.koitharu.kotatsu.list.ui.model.MangaItemModel +import org.koitharu.kotatsu.list.ui.model.MangaListDetailedModel +import org.koitharu.kotatsu.list.ui.model.MangaListModel +import kotlin.jvm.internal.Intrinsics open class MangaListAdapter( coil: ImageLoader, @@ -24,7 +30,7 @@ open class MangaListAdapter( .addDelegate(ITEM_TYPE_DATE, relatedDateItemAD()) .addDelegate(ITEM_TYPE_ERROR_STATE, errorStateListAD(listener)) .addDelegate(ITEM_TYPE_ERROR_FOOTER, errorFooterAD(listener)) - .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(coil, listener)) + .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(coil, lifecycleOwner, listener)) .addDelegate(ITEM_TYPE_HEADER, listHeaderAD(listener)) .addDelegate(ITEM_TYPE_HEADER_2, listHeader2AD(listener)) } @@ -35,20 +41,25 @@ open class MangaListAdapter( oldItem is MangaListModel && newItem is MangaListModel -> { oldItem.id == newItem.id } + oldItem is MangaListDetailedModel && newItem is MangaListDetailedModel -> { oldItem.id == newItem.id } + oldItem is MangaGridModel && newItem is MangaGridModel -> { oldItem.id == newItem.id } + oldItem is DateTimeAgo && newItem is DateTimeAgo -> { oldItem == newItem } + oldItem is ListHeader && newItem is ListHeader -> { oldItem.textRes == newItem.textRes && oldItem.text == newItem.text && oldItem.dateTimeAgo == newItem.dateTimeAgo } + else -> oldItem.javaClass == newItem.javaClass } @@ -65,6 +76,7 @@ open class MangaListAdapter( } else { } } + is ListHeader2 -> Unit else -> super.getChangePayload(oldItem, newItem) } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt index 14c06c6ec..bc6ff17ef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt @@ -17,6 +17,7 @@ import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source import org.koitharu.kotatsu.utils.ext.textAndVisible import org.koitharu.kotatsu.utils.image.CoverSizeResolver @@ -51,13 +52,13 @@ fun mangaListDetailedItemAD( binding.textViewTitle.text = item.title binding.textViewSubtitle.textAndVisible = item.subtitle binding.progressView.setPercent(item.progress, MangaListAdapter.PAYLOAD_PROGRESS in payloads) - binding.imageViewCover.newImageRequest(item.coverUrl, item.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.coverUrl)?.run { size(CoverSizeResolver(binding.imageViewCover)) placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } binding.chipsTags.setChips(item.tags) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt index d2e5c9530..48904c2c4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt @@ -13,6 +13,7 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source import org.koitharu.kotatsu.utils.ext.textAndVisible fun mangaListItemAD( @@ -34,12 +35,12 @@ fun mangaListItemAD( bind { binding.textViewTitle.text = item.title binding.textViewSubtitle.textAndVisible = item.subtitle - binding.imageViewCover.newImageRequest(item.coverUrl, item.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.coverUrl)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } badge = itemView.bindBadge(badge, item.counter) diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt index 00fa4d423..34e3aeef2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt @@ -125,7 +125,7 @@ class ScrobblerConfigActivity : BaseActivity(), return } binding.imageViewAvatar.isVisible = true - binding.imageViewAvatar.newImageRequest(user.avatar, null) + binding.imageViewAvatar.newImageRequest(this, user.avatar) ?.enqueueWith(coil) } diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt index fb04299f4..04c978f66 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt @@ -25,11 +25,10 @@ fun scrobblingMangaAD( itemView.setOnClickListener(clickListenerAdapter) bind { - binding.imageViewCover.newImageRequest(item.coverUrl, null)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.coverUrl)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) - lifecycle(lifecycleOwner) enqueueWith(coil) } binding.textViewTitle.text = item.title diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt index 301836728..b33887675 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt @@ -20,7 +20,7 @@ class ScrobblingMangaAdapter( init { delegatesManager.addDelegate(scrobblingMangaAD(clickListener, coil, lifecycleOwner)) .addDelegate(scrobblingHeaderAD()) - .addDelegate(emptyStateListAD(coil, null)) + .addDelegate(emptyStateListAD(coil, lifecycleOwner, null)) } private class DiffCallback : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt index d56427fbd..79487a484 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt @@ -27,12 +27,11 @@ fun scrobblingMangaAD( bind { binding.textViewTitle.text = item.name binding.textViewSubtitle.textAndVisible = item.altName - binding.imageViewCover.newImageRequest(item.cover)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.cover)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) enqueueWith(coil) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt index d483ed4db..179957661 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt @@ -5,13 +5,17 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import kotlin.jvm.internal.Intrinsics import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.list.ui.ItemSizeResolver import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration -import org.koitharu.kotatsu.list.ui.adapter.* +import org.koitharu.kotatsu.list.ui.adapter.MangaListListener +import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD +import org.koitharu.kotatsu.list.ui.adapter.errorStateListAD +import org.koitharu.kotatsu.list.ui.adapter.loadingFooterAD +import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.search.ui.multi.MultiSearchListModel +import kotlin.jvm.internal.Intrinsics class MultiSearchAdapter( lifecycleOwner: LifecycleOwner, @@ -38,7 +42,7 @@ class MultiSearchAdapter( ) .addDelegate(loadingStateAD()) .addDelegate(loadingFooterAD()) - .addDelegate(emptyStateListAD(coil, listener)) + .addDelegate(emptyStateListAD(coil, lifecycleOwner, listener)) .addDelegate(errorStateListAD(listener)) } @@ -49,6 +53,7 @@ class MultiSearchAdapter( oldItem is MultiSearchListModel && newItem is MultiSearchListModel -> { oldItem.source == newItem.source } + else -> oldItem.javaClass == newItem.javaClass } } @@ -57,4 +62,4 @@ class MultiSearchAdapter( return Intrinsics.areEqual(oldItem, newItem) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt index 086d52f39..5d713a300 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt @@ -10,6 +10,7 @@ import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable fun searchSuggestionSourceAD( @@ -31,11 +32,11 @@ fun searchSuggestionSourceAD( binding.textViewTitle.text = item.source.title binding.switchLocal.isChecked = item.isEnabled val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - binding.imageViewCover.newImageRequest(item.source.faviconUri(), item.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.source.faviconUri())?.run { fallback(fallbackIcon) placeholder(fallbackIcon) error(fallbackIcon) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt index b451a7997..992ebfd9b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt @@ -18,6 +18,7 @@ import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source fun searchSuggestionMangaListAD( coil: ImageLoader, @@ -55,12 +56,12 @@ private fun searchSuggestionMangaGridAD( } bind { - binding.imageViewCover.newImageRequest(item.coverUrl, item.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.coverUrl)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } binding.textViewTitle.text = item.title diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt index 7fff494bd..1f3aa5253 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt @@ -20,6 +20,7 @@ import org.koitharu.kotatsu.utils.ext.crossfade import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source import org.koitharu.kotatsu.utils.ext.textAndVisible import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable @@ -66,12 +67,12 @@ fun sourceConfigItemCheckableDelegate( binding.switchToggle.isChecked = item.isEnabled binding.textViewDescription.textAndVisible = item.summary val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - binding.imageViewIcon.newImageRequest(item.source.faviconUri(), item.source)?.run { + binding.imageViewIcon.newImageRequest(lifecycleOwner, item.source.faviconUri())?.run { crossfade(context) error(fallbackIcon) placeholder(fallbackIcon) fallback(fallbackIcon) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } } @@ -107,12 +108,12 @@ fun sourceConfigItemDelegate2( binding.imageViewConfig.isVisible = item.isEnabled binding.textViewDescription.textAndVisible = item.summary val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - binding.imageViewIcon.newImageRequest(item.source.faviconUri(), item.source)?.run { + binding.imageViewIcon.newImageRequest(lifecycleOwner, item.source.faviconUri())?.run { crossfade(context) error(fallbackIcon) placeholder(fallbackIcon) fallback(fallbackIcon) - lifecycle(lifecycleOwner) + source(item.source) enqueueWith(coil) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt index 1a19dbb17..0c3347cf1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt @@ -42,7 +42,7 @@ class ShelfAdapter( .addDelegate(loadingStateAD()) .addDelegate(loadingFooterAD()) .addDelegate(emptyHintAD(listener)) - .addDelegate(emptyStateListAD(coil, listener)) + .addDelegate(emptyStateListAD(coil, lifecycleOwner, listener)) .addDelegate(errorStateListAD(listener)) } diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt index 3737e3242..b35158c6e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt @@ -29,7 +29,7 @@ class FeedAdapter( .addDelegate(ITEM_TYPE_LOADING_STATE, loadingStateAD()) .addDelegate(ITEM_TYPE_ERROR_FOOTER, errorFooterAD(listener)) .addDelegate(ITEM_TYPE_ERROR_STATE, errorStateListAD(listener)) - .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(coil, listener)) + .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(coil, lifecycleOwner, listener)) .addDelegate(ITEM_TYPE_DATE_HEADER, relatedDateItemAD()) } diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt index 901e4573a..ce123e0b2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt @@ -13,6 +13,7 @@ import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.isBold import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.source fun feedItemAD( coil: ImageLoader, @@ -28,12 +29,12 @@ fun feedItemAD( bind { binding.textViewTitle.isBold = item.isNew binding.textViewSummary.isBold = item.isNew - binding.imageViewCover.newImageRequest(item.imageUrl, item.manga.source)?.run { + binding.imageViewCover.newImageRequest(lifecycleOwner, item.imageUrl)?.run { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) allowRgb565(true) - lifecycle(lifecycleOwner) + source(item.manga.source) enqueueWith(coil) } binding.textViewTitle.text = item.title diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt index fb2109524..4aa630e2f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.utils.ext import android.content.Context import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap +import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import coil.request.ErrorResult import coil.request.ImageRequest @@ -15,14 +16,14 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.utils.image.RegionBitmapDecoder import org.koitharu.kotatsu.utils.progress.ImageRequestIndicatorListener -fun ImageView.newImageRequest(url: Any?, mangaSource: MangaSource? = null): ImageRequest.Builder? { +fun ImageView.newImageRequest(lifecycleOwner: LifecycleOwner, data: Any?): ImageRequest.Builder? { val current = CoilUtils.result(this) - if (current != null && current.request.data == url) { + if (current != null && current.request.data == data) { return null } return ImageRequest.Builder(context) - .data(url) - .tag(mangaSource) + .data(data) + .lifecycle(lifecycleOwner) .crossfade(context) .target(this) } @@ -58,11 +59,11 @@ fun ImageRequest.Builder.decodeRegion(): ImageRequest.Builder { } @Suppress("SpellCheckingInspection") -fun ImageRequest.Builder.crossfade(context: Context?): ImageRequest.Builder { - if (context == null) { - crossfade(true) - return this - } +fun ImageRequest.Builder.crossfade(context: Context): ImageRequest.Builder { val duration = context.resources.getInteger(R.integer.config_defaultAnimTime) * context.animatorDurationScale return crossfade(duration.toInt()) } + +fun ImageRequest.Builder.source(source: MangaSource?): ImageRequest.Builder { + return tag(MangaSource::class.java, source) +}