From 2deaed2067053e0c28c6c3d97534c453ff691296 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 13 Jul 2022 11:24:20 +0300 Subject: [PATCH] Optimize image loading in lists --- .../kotatsu/bookmarks/ui/BookmarkListAD.kt | 29 +++++++--------- .../kotatsu/details/ui/DetailsFragment.kt | 15 ++++----- .../kotatsu/download/ui/DownloadItemAD.kt | 15 +++++---- .../list/ui/adapter/MangaGridItemAD.kt | 29 +++++++--------- .../ui/adapter/MangaListDetailedItemAD.kt | 33 +++++++------------ .../list/ui/adapter/MangaListItemAD.kt | 33 +++++++------------ .../ui/selector/adapter/ShikimoriMangaAD.kt | 28 ++++++---------- .../adapter/SearchSuggestionsMangaListAD.kt | 23 ++++++------- .../adapter/SourceConfigAdapterDelegates.kt | 20 +++++------ .../kotatsu/tracker/ui/adapter/FeedItemAD.kt | 25 ++++++-------- .../org/koitharu/kotatsu/utils/ext/CoilExt.kt | 20 ++++++++--- 11 files changed, 113 insertions(+), 157 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarkListAD.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarkListAD.kt index f8aa0e638..38d749c10 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarkListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarkListAD.kt @@ -2,15 +2,13 @@ package org.koitharu.kotatsu.bookmarks.ui import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.size.Scale -import coil.util.CoilUtils import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.bookmarks.domain.Bookmark 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.referer @@ -23,29 +21,24 @@ fun bookmarkListAD( { inflater, parent -> ItemBookmarkBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null val listener = AdapterDelegateClickListenerAdapter(this, clickListener) binding.root.setOnClickListener(listener) binding.root.setOnLongClickListener(listener) bind { - imageRequest?.dispose() - imageRequest = binding.imageViewThumb.newImageRequest(item.imageUrl) - .referer(item.manga.publicUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .allowRgb565(true) - .scale(Scale.FILL) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewThumb.newImageRequest(item.imageUrl)?.run { + referer(item.manga.publicUrl) + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } } onViewRecycled { - imageRequest?.dispose() - imageRequest = null - CoilUtils.dispose(binding.imageViewThumb) - binding.imageViewThumb.setImageDrawable(null) + binding.imageViewThumb.disposeImageRequest() } } \ No newline at end of file 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 711ccdeb9..6b2b1afac 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 @@ -231,14 +231,13 @@ class DetailsFragment : CoilUtils.dispose(imageViewCover) return } - imageViewCover.newImageRequest(scrobbling.coverUrl) - .crossfade(true) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .scale(Scale.FILL) - .lifecycle(viewLifecycleOwner) - .enqueueWith(coil) + imageViewCover.newImageRequest(scrobbling.coverUrl)?.run { + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + lifecycle(viewLifecycleOwner) + enqueueWith(coil) + } textViewTitle.text = scrobbling.title textViewTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, scrobbling.scrobbler.iconResId, 0) ratingBar.rating = scrobbling.rating * ratingBar.numStars 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 1a86d0153..476f6efb6 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 @@ -27,13 +27,14 @@ fun downloadItemAD( bind { job?.cancel() job = item.progressAsFlow().onFirst { state -> - binding.imageViewCover.newImageRequest(state.manga.coverUrl) - .referer(state.manga.publicUrl) - .placeholder(state.cover) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .allowRgb565(true) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(state.manga.coverUrl)?.run { + referer(state.manga.publicUrl) + placeholder(state.cover) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + enqueueWith(coil) + } }.onEach { state -> binding.textViewTitle.text = state.manga.title when (state) { 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 8145e240e..82b77d11f 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 @@ -3,9 +3,6 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.core.view.updateLayoutParams import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.size.Scale -import coil.util.CoilUtils import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R @@ -16,6 +13,7 @@ import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaGridModel import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.search.ui.multi.adapter.ItemSizeResolver +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.referer @@ -29,7 +27,6 @@ fun mangaGridItemAD( { inflater, parent -> ItemMangaGridBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null var badge: BadgeDrawable? = null itemView.setOnClickListener { @@ -47,16 +44,15 @@ fun mangaGridItemAD( bind { payloads -> binding.textViewTitle.text = item.title binding.progressView.setPercent(item.progress, MangaListAdapter.PAYLOAD_PROGRESS in payloads) - imageRequest?.dispose() - imageRequest = binding.imageViewCover.newImageRequest(item.coverUrl) - .referer(item.manga.publicUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .allowRgb565(true) - .scale(Scale.FILL) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.coverUrl)?.run { + referer(item.manga.publicUrl) + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } badge = itemView.bindBadge(badge, item.counter) } @@ -64,9 +60,6 @@ fun mangaGridItemAD( itemView.clearBadge(badge) binding.progressView.percent = PROGRESS_NONE badge = null - imageRequest?.dispose() - imageRequest = null - CoilUtils.dispose(binding.imageViewCover) - binding.imageViewCover.setImageDrawable(null) + binding.imageViewCover.disposeImageRequest() } } \ No newline at end of file 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 583be4079..edf38d33a 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 @@ -2,9 +2,7 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.size.Scale -import coil.util.CoilUtils +import org.koitharu.kotatsu.utils.ext.* import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R @@ -14,10 +12,6 @@ import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaListDetailedModel import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.referer -import org.koitharu.kotatsu.utils.ext.textAndVisible fun mangaListDetailedItemAD( coil: ImageLoader, @@ -27,7 +21,6 @@ fun mangaListDetailedItemAD( { inflater, parent -> ItemMangaListDetailsBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null var badge: BadgeDrawable? = null itemView.setOnClickListener { @@ -38,19 +31,18 @@ fun mangaListDetailedItemAD( } bind { payloads -> - imageRequest?.dispose() binding.textViewTitle.text = item.title binding.textViewSubtitle.textAndVisible = item.subtitle binding.progressView.setPercent(item.progress, MangaListAdapter.PAYLOAD_PROGRESS in payloads) - imageRequest = binding.imageViewCover.newImageRequest(item.coverUrl) - .referer(item.manga.publicUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .scale(Scale.FILL) - .allowRgb565(true) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.coverUrl)?.run { + referer(item.manga.publicUrl) + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } binding.textViewRating.textAndVisible = item.rating binding.textViewTags.text = item.tags itemView.bindBadge(badge, item.counter) @@ -60,9 +52,6 @@ fun mangaListDetailedItemAD( itemView.clearBadge(badge) binding.progressView.percent = PROGRESS_NONE badge = null - imageRequest?.dispose() - imageRequest = null - CoilUtils.dispose(binding.imageViewCover) - binding.imageViewCover.setImageDrawable(null) + binding.imageViewCover.disposeImageRequest() } } \ No newline at end of file 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 5087baa3f..48c157ed1 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 @@ -2,9 +2,7 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.size.Scale -import coil.util.CoilUtils +import org.koitharu.kotatsu.utils.ext.* import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R @@ -13,10 +11,6 @@ import org.koitharu.kotatsu.databinding.ItemMangaListBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaListModel import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.referer -import org.koitharu.kotatsu.utils.ext.textAndVisible fun mangaListItemAD( coil: ImageLoader, @@ -26,7 +20,6 @@ fun mangaListItemAD( { inflater, parent -> ItemMangaListBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null var badge: BadgeDrawable? = null itemView.setOnClickListener { @@ -37,27 +30,23 @@ fun mangaListItemAD( } bind { - imageRequest?.dispose() binding.textViewTitle.text = item.title binding.textViewSubtitle.textAndVisible = item.subtitle - imageRequest = binding.imageViewCover.newImageRequest(item.coverUrl) - .referer(item.manga.publicUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .scale(Scale.FILL) - .allowRgb565(true) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.coverUrl)?.run { + referer(item.manga.publicUrl) + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } itemView.bindBadge(badge, item.counter) } onViewRecycled { itemView.clearBadge(badge) badge = null - imageRequest?.dispose() - imageRequest = null - CoilUtils.dispose(binding.imageViewCover) - binding.imageViewCover.setImageDrawable(null) + binding.imageViewCover.disposeImageRequest() } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/adapter/ShikimoriMangaAD.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/adapter/ShikimoriMangaAD.kt index f786b5d95..c9f76e965 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/adapter/ShikimoriMangaAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/adapter/ShikimoriMangaAD.kt @@ -2,15 +2,13 @@ package org.koitharu.kotatsu.scrobbling.ui.selector.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.size.Scale -import coil.util.CoilUtils import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.databinding.ItemMangaListBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.scrobbling.domain.model.ScrobblerManga +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.textAndVisible @@ -23,30 +21,24 @@ fun shikimoriMangaAD( { inflater, parent -> ItemMangaListBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null - itemView.setOnClickListener { clickListener.onItemClick(item, it) } bind { - imageRequest?.dispose() binding.textViewTitle.text = item.name binding.textViewSubtitle.textAndVisible = item.altName - imageRequest = binding.imageViewCover.newImageRequest(item.cover) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .scale(Scale.FILL) - .allowRgb565(true) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.cover)?.run { + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } } onViewRecycled { - imageRequest?.dispose() - imageRequest = null - CoilUtils.dispose(binding.imageViewCover) - binding.imageViewCover.setImageDrawable(null) + binding.imageViewCover.disposeImageRequest() } } \ No newline at end of file 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 fe5f3a177..7e35fa201 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 @@ -5,7 +5,6 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader -import coil.request.Disposable import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding @@ -16,6 +15,7 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem 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 @@ -52,27 +52,24 @@ private fun searchSuggestionMangaGridAD( { layoutInflater, parent -> ItemSearchSuggestionMangaGridBinding.inflate(layoutInflater, parent, false) } ) { - var imageRequest: Disposable? = null - itemView.setOnClickListener { listener.onMangaClick(item) } bind { - imageRequest?.dispose() - imageRequest = binding.imageViewCover.newImageRequest(item.coverUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .allowRgb565(true) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.coverUrl)?.run { + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } binding.textViewTitle.text = item.title } onViewRecycled { - imageRequest?.dispose() - binding.imageViewCover.setImageDrawable(null) + binding.imageViewCover.disposeImageRequest() } } 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 775da0f6e..946f84078 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 @@ -6,8 +6,6 @@ import android.view.View import android.widget.CompoundButton import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.request.ImageRequest import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R @@ -16,7 +14,9 @@ import org.koitharu.kotatsu.databinding.ItemFilterHeaderBinding import org.koitharu.kotatsu.databinding.ItemSourceConfigBinding import org.koitharu.kotatsu.databinding.ItemSourceConfigDraggableBinding import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem +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.textAndVisible fun sourceConfigHeaderDelegate() = @@ -54,8 +54,6 @@ fun sourceConfigItemDelegate( on = { item, _, _ -> item is SourceConfigItem.SourceItem && !item.isDraggable } ) { - var imageRequest: Disposable? = null - binding.switchToggle.setOnCheckedChangeListener { _, isChecked -> listener.onItemEnabledChanged(item, isChecked) } @@ -64,17 +62,15 @@ fun sourceConfigItemDelegate( binding.textViewTitle.text = item.source.title binding.switchToggle.isChecked = item.isEnabled binding.textViewDescription.textAndVisible = item.summary - imageRequest = ImageRequest.Builder(context) - .data(item.faviconUrl) - .error(R.drawable.ic_favicon_fallback) - .target(binding.imageViewIcon) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewIcon.newImageRequest(item.faviconUrl)?.run { + error(R.drawable.ic_favicon_fallback) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } } onViewRecycled { - imageRequest?.dispose() - imageRequest = null + binding.imageViewIcon.disposeImageRequest() } } diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt index 000ff5399..410017043 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt @@ -2,8 +2,6 @@ package org.koitharu.kotatsu.tracker.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.size.Scale import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener @@ -11,6 +9,7 @@ import org.koitharu.kotatsu.databinding.ItemFeedBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.tracker.ui.model.FeedItem +import org.koitharu.kotatsu.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest @@ -22,22 +21,19 @@ fun feedItemAD( { inflater, parent -> ItemFeedBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null - itemView.setOnClickListener { clickListener.onItemClick(item.manga, it) } bind { - imageRequest?.dispose() - imageRequest = binding.imageViewCover.newImageRequest(item.imageUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .allowRgb565(true) - .scale(Scale.FILL) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.imageUrl)?.run { + placeholder(R.drawable.ic_placeholder) + fallback(R.drawable.ic_placeholder) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } binding.textViewTitle.text = item.title binding.textViewSummary.text = context.resources.getQuantityString( R.plurals.new_chapters, @@ -47,7 +43,6 @@ fun feedItemAD( } onViewRecycled { - imageRequest?.dispose() - binding.imageViewCover.setImageDrawable(null) + binding.imageViewCover.disposeImageRequest() } } \ No newline at end of file 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 16416bf51..2fc05e365 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 @@ -7,14 +7,26 @@ import coil.request.ErrorResult import coil.request.ImageRequest import coil.request.ImageResult import coil.request.SuccessResult +import coil.util.CoilUtils import com.google.android.material.progressindicator.BaseProgressIndicator import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.utils.progress.ImageRequestIndicatorListener -fun ImageView.newImageRequest(url: String?) = ImageRequest.Builder(context) - .data(url) - .crossfade(true) - .target(this) +fun ImageView.newImageRequest(url: Any?): ImageRequest.Builder? { + val current = CoilUtils.result(this) + if (current != null && current.request.data == url) { + return null + } + return ImageRequest.Builder(context) + .data(url) + .crossfade(true) + .target(this) +} + +fun ImageView.disposeImageRequest() { + CoilUtils.dispose(this) + setImageDrawable(null) +} fun ImageRequest.Builder.enqueueWith(loader: ImageLoader) = loader.enqueue(build())