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 345beb79a..b02ce9750 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 @@ -2,16 +2,14 @@ package org.koitharu.kotatsu.bookmarks.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -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.isLowRamDevice import org.koitharu.kotatsu.utils.ext.newImageRequest import org.koitharu.kotatsu.utils.ext.referer @@ -23,28 +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(isLowRamDevice(context)) - .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/bookmarks/ui/adapter/BookmarksGroupAD.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt index 3b8a0d061..b71d83662 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 @@ -4,8 +4,6 @@ import android.view.View import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader -import coil.request.Disposable -import coil.util.CoilUtils import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener @@ -33,7 +31,7 @@ fun bookmarksGroupAD( override fun onClick(v: View) = groupClickListener.onItemClick(item, v) override fun onLongClick(v: View) = groupClickListener.onItemLongClick(item, v) } - var imageRequest: Disposable? = null + val adapter = BookmarksAdapter(coil, lifecycleOwner, bookmarkClickListener) binding.recyclerView.setRecycledViewPool(sharedPool) binding.recyclerView.adapter = adapter @@ -48,22 +46,20 @@ fun bookmarksGroupAD( binding.recyclerView.addItemDecoration(spacingDecoration) selectionController.attachToRecyclerView(item.manga, binding.recyclerView) } - imageRequest = binding.imageViewCover.newImageRequest(item.manga.coverUrl) - .referer(item.manga.publicUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .allowRgb565(isLowRamDevice(context)) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.manga.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.textViewTitle.text = item.manga.title adapter.items = item.bookmarks } 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/core/ui/uiModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt index 2c4616f0d..8505ab567 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.Dispatchers import okhttp3.OkHttpClient import org.koin.android.ext.koin.androidContext import org.koin.dsl.module +import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.parser.favicon.FaviconFetcher import org.koitharu.kotatsu.local.data.CacheDir import org.koitharu.kotatsu.local.data.CbzFetcher @@ -38,7 +39,7 @@ val uiModule .decoderDispatcher(Dispatchers.Default) .transformationDispatcher(Dispatchers.Default) .diskCache(diskCacheFactory) - .logger(DebugLogger()) + .logger(if (BuildConfig.DEBUG) DebugLogger() else null) .allowRgb565(isLowRamDevice(androidContext())) .components( ComponentRegistry.Builder() 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 d36edf6ba..5599762ae 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 @@ -228,12 +228,13 @@ class DetailsFragment : CoilUtils.dispose(imageViewCover) return } - imageViewCover.newImageRequest(scrobbling.coverUrl) - .placeholder(R.drawable.ic_placeholder) - .fallback(R.drawable.ic_placeholder) - .error(R.drawable.ic_placeholder) - .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 f4ee8ecf6..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(isLowRamDevice(context)) - .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/explore/ui/adapter/ExploreAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt index e278a541b..aa9e6d84f 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 @@ -4,8 +4,6 @@ import android.view.View import androidx.core.view.isVisible 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 @@ -18,8 +16,9 @@ import org.koitharu.kotatsu.databinding.ItemExploreHeaderBinding import org.koitharu.kotatsu.databinding.ItemExploreSourceBinding import org.koitharu.kotatsu.explore.ui.model.ExploreItem import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener -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.setTextAndVisible import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable @@ -68,7 +67,6 @@ fun exploreSourceItemAD( on = { item, _, _ -> item is ExploreItem.Source } ) { - var imageRequest: Disposable? = null val eventListener = AdapterDelegateClickListenerAdapter(this, listener) binding.root.setOnClickListener(eventListener) @@ -77,20 +75,17 @@ fun exploreSourceItemAD( bind { binding.textViewTitle.text = item.source.title val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - imageRequest = ImageRequest.Builder(context) - .data(item.source.faviconUri()) - .target(binding.imageViewIcon) - .crossfade(context) - .fallback(fallbackIcon) - .placeholder(fallbackIcon) - .error(fallbackIcon) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewIcon.newImageRequest(item.source.faviconUri())?.run { + fallback(fallbackIcon) + placeholder(fallbackIcon) + error(fallbackIcon) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } } onViewRecycled { - imageRequest?.dispose() - imageRequest = null + binding.imageViewIcon.disposeImageRequest() } } 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 f4339c5f0..41f0f142a 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 @@ -11,8 +11,6 @@ import androidx.core.view.isVisible import androidx.core.widget.ImageViewCompat import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.util.CoilUtils import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.databinding.ItemCategoryBinding @@ -50,7 +48,6 @@ fun categoryAD( ColorStateList.valueOf(ColorUtils.setAlphaComponent(backgroundColor, 153)) val fallback = ColorDrawable(Color.TRANSPARENT) val coverViews = arrayOf(binding.imageViewCover1, binding.imageViewCover2, binding.imageViewCover3) - val imageRequests = arrayOfNulls(coverViews.size) val crossFadeDuration = (context.resources.getInteger(R.integer.config_defaultAnimTime) * context.animatorDurationScale).toInt() itemView.setOnClickListener(eventListener) @@ -62,7 +59,6 @@ fun categoryAD( if (payloads.isNotEmpty()) { return@bind } - imageRequests.forEach { it?.dispose() } binding.textViewTitle.text = item.category.title binding.textViewSubtitle.text = if (item.mangaCount == 0) { getString(R.string.empty) @@ -74,22 +70,21 @@ fun categoryAD( ) } repeat(coverViews.size) { i -> - imageRequests[i] = coverViews[i].newImageRequest(item.covers.getOrNull(i)) - .placeholder(R.drawable.ic_placeholder) - .fallback(fallback) - .error(R.drawable.ic_placeholder) - .allowRgb565(isLowRamDevice(context)) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + coverViews[i].newImageRequest(item.covers.getOrNull(i))?.run { + placeholder(R.drawable.ic_placeholder) + fallback(fallback) + crossfade(crossFadeDuration * (i + 1)) + error(R.drawable.ic_placeholder) + allowRgb565(true) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } } } onViewRecycled { - repeat(coverViews.size) { i -> - imageRequests[i]?.dispose() - imageRequests[i] = null - CoilUtils.dispose(coverViews[i]) - coverViews[i].setImageDrawable(null) + coverViews.forEach { + it.disposeImageRequest() } } } \ No newline at end of file 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 c6218e1d0..75676e5bf 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,8 +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.util.CoilUtils import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R @@ -15,8 +13,8 @@ import org.koitharu.kotatsu.list.ui.ItemSizeResolver 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.utils.ext.disposeImageRequest import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.isLowRamDevice 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,15 +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(isLowRamDevice(context)) - .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) } @@ -63,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 0e6c2136c..b5b94fbdf 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,8 +2,6 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.util.CoilUtils import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R @@ -23,7 +21,6 @@ fun mangaListDetailedItemAD( { inflater, parent -> ItemMangaListDetailsBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null var badge: BadgeDrawable? = null itemView.setOnClickListener { @@ -34,18 +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) - .allowRgb565(isLowRamDevice(context)) - .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) @@ -55,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 bcee267b9..8de5943b4 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,8 +2,6 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.util.CoilUtils import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R @@ -22,7 +20,6 @@ fun mangaListItemAD( { inflater, parent -> ItemMangaListBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null var badge: BadgeDrawable? = null itemView.setOnClickListener { @@ -33,26 +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) - .allowRgb565(isLowRamDevice(context)) - .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 802e731a0..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,16 +2,14 @@ package org.koitharu.kotatsu.scrobbling.ui.selector.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -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.isLowRamDevice import org.koitharu.kotatsu.utils.ext.newImageRequest import org.koitharu.kotatsu.utils.ext.textAndVisible @@ -23,29 +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) - .allowRgb565(isLowRamDevice(context)) - .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/SearchSuggestionSourceAD.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt index 1e911a94c..5367bcbc3 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 @@ -2,14 +2,14 @@ package org.koitharu.kotatsu.search.ui.suggestion.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable -import coil.request.ImageRequest import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.core.parser.favicon.faviconUri import org.koitharu.kotatsu.databinding.ItemSearchSuggestionSourceBinding import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener 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.image.FaviconFallbackDrawable fun searchSuggestionSourceAD( @@ -20,8 +20,6 @@ fun searchSuggestionSourceAD( { inflater, parent -> ItemSearchSuggestionSourceBinding.inflate(inflater, parent, false) } ) { - var imageRequest: Disposable? = null - binding.switchLocal.setOnCheckedChangeListener { _, isChecked -> listener.onSourceToggle(item.source, isChecked) } @@ -33,18 +31,16 @@ fun searchSuggestionSourceAD( binding.textViewTitle.text = item.source.title binding.switchLocal.isChecked = item.isEnabled val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - imageRequest = ImageRequest.Builder(context) - .data(item.source.faviconUri()) - .fallback(fallbackIcon) - .placeholder(fallbackIcon) - .error(fallbackIcon) - .target(binding.imageViewCover) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewCover.newImageRequest(item.source.faviconUri())?.run { + fallback(fallbackIcon) + placeholder(fallbackIcon) + error(fallbackIcon) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } } onViewRecycled { - imageRequest?.dispose() - imageRequest = 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 40d6cda53..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,8 +15,8 @@ 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.isLowRamDevice import org.koitharu.kotatsu.utils.ext.newImageRequest fun searchSuggestionMangaListAD( @@ -53,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(isLowRamDevice(context)) - .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 2f615ca0d..299f35ad7 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 @@ -17,9 +15,7 @@ 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.crossfade -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.textAndVisible +import org.koitharu.kotatsu.utils.ext.* import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable fun sourceConfigHeaderDelegate() = @@ -57,8 +53,6 @@ fun sourceConfigItemDelegate( on = { item, _, _ -> item is SourceConfigItem.SourceItem && !item.isDraggable } ) { - var imageRequest: Disposable? = null - binding.switchToggle.setOnCheckedChangeListener { _, isChecked -> listener.onItemEnabledChanged(item, isChecked) } @@ -68,20 +62,18 @@ fun sourceConfigItemDelegate( binding.switchToggle.isChecked = item.isEnabled binding.textViewDescription.textAndVisible = item.summary val fallbackIcon = FaviconFallbackDrawable(context, item.source.name) - imageRequest = ImageRequest.Builder(context) - .data(item.source.faviconUri()) - .target(binding.imageViewIcon) - .crossfade(context) - .error(fallbackIcon) - .placeholder(fallbackIcon) - .fallback(fallbackIcon) - .lifecycle(lifecycleOwner) - .enqueueWith(coil) + binding.imageViewIcon.newImageRequest(item.source.faviconUri())?.run { + crossfade(context) + error(fallbackIcon) + placeholder(fallbackIcon) + fallback(fallbackIcon) + 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 92dc9e7aa..9a69676a1 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,7 +2,6 @@ package org.koitharu.kotatsu.tracker.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import coil.request.Disposable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener @@ -10,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.isLowRamDevice import org.koitharu.kotatsu.utils.ext.newImageRequest @@ -22,21 +22,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(isLowRamDevice(context)) - .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(isLowRamDevice(context)) + lifecycle(lifecycleOwner) + enqueueWith(coil) + } binding.textViewTitle.text = item.title binding.textViewSummary.text = context.resources.getQuantityString( R.plurals.new_chapters, @@ -46,7 +44,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 f6aadcbcd..ac4c32a1c 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 @@ -8,15 +8,27 @@ 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.R 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(context) - .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(context) + .target(this) +} + +fun ImageView.disposeImageRequest() { + CoilUtils.dispose(this) + setImageDrawable(null) +} fun ImageRequest.Builder.enqueueWith(loader: ImageLoader) = loader.enqueue(build())