From 749c2071af3fb65efd3dd88ca82f6d3461950907 Mon Sep 17 00:00:00 2001 From: arkon Date: Sat, 28 Nov 2020 15:24:40 -0500 Subject: [PATCH] Replace Kotlin synthetic views in viewholders --- .../ui/base/holder/BaseFlexibleViewHolder.kt | 16 -------- .../browse/extension/ExtensionGroupHolder.kt | 10 +++-- .../ui/browse/extension/ExtensionHolder.kt | 31 +++++++--------- .../ui/browse/migration/manga/MangaHolder.kt | 17 +++++---- .../migration/sources/SelectionHeader.kt | 11 ++++-- .../browse/migration/sources/SourceHolder.kt | 13 ++++--- .../tachiyomi/ui/browse/source/LangHolder.kt | 10 +++-- .../ui/browse/source/SourceHolder.kt | 34 ++++++++--------- .../browse/SourceComfortableGridHolder.kt | 17 ++++----- .../browse/source/browse/SourceGridHolder.kt | 17 ++++----- .../ui/browse/source/browse/SourceHolder.kt | 4 +- .../browse/source/browse/SourceListHolder.kt | 15 ++++---- .../globalsearch/GlobalSearchCardHolder.kt | 21 +++++------ .../source/globalsearch/GlobalSearchHolder.kt | 35 ++++++++---------- .../tachiyomi/ui/category/CategoryHolder.kt | 13 ++++--- .../tachiyomi/ui/download/DownloadHolder.kt | 37 +++++++++---------- .../library/LibraryComfortableGridHolder.kt | 26 ++++++------- .../ui/library/LibraryCompactGridHolder.kt | 26 ++++++------- .../tachiyomi/ui/library/LibraryHolder.kt | 4 +- .../tachiyomi/ui/library/LibraryListHolder.kt | 25 ++++++------- .../kanade/tachiyomi/ui/main/MainActivity.kt | 4 +- .../ui/manga/chapter/ChapterHolder.kt | 25 ++++++------- .../ui/recent/history/HistoryHolder.kt | 29 +++++++-------- .../ui/recent/updates/UpdatesHolder.kt | 31 ++++++++-------- .../ui/setting/search/SettingsSearchHolder.kt | 19 +++++----- 25 files changed, 227 insertions(+), 263 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/BaseFlexibleViewHolder.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/BaseFlexibleViewHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/BaseFlexibleViewHolder.kt deleted file mode 100644 index e85cb77095..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/BaseFlexibleViewHolder.kt +++ /dev/null @@ -1,16 +0,0 @@ -package eu.kanade.tachiyomi.ui.base.holder - -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.viewholders.FlexibleViewHolder -import kotlinx.android.extensions.LayoutContainer - -abstract class BaseFlexibleViewHolder( - view: View, - adapter: FlexibleAdapter<*>, - stickyHeader: Boolean = false -) : FlexibleViewHolder(view, adapter, stickyHeader), LayoutContainer { - - override val containerView: View? - get() = itemView -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionGroupHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionGroupHolder.kt index 2712a4ee17..fbe31cf8f2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionGroupHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionGroupHolder.kt @@ -3,11 +3,13 @@ package eu.kanade.tachiyomi.ui.browse.extension import android.annotation.SuppressLint import android.view.View import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.source_main_controller_card_header.title +import eu.davidea.viewholders.FlexibleViewHolder +import eu.kanade.tachiyomi.databinding.SourceMainControllerCardHeaderBinding class ExtensionGroupHolder(view: View, adapter: FlexibleAdapter<*>) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = SourceMainControllerCardHeaderBinding.bind(view) @SuppressLint("SetTextI18n") fun bind(item: ExtensionGroupItem) { @@ -16,6 +18,6 @@ class ExtensionGroupHolder(view: View, adapter: FlexibleAdapter<*>) : text += " (${item.size})" } - title.text = text + binding.title.text = text } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt index bd64e17445..1a56490b71 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt @@ -1,24 +1,21 @@ package eu.kanade.tachiyomi.ui.browse.extension import android.view.View +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.glide.GlideApp +import eu.kanade.tachiyomi.databinding.ExtensionCardItemBinding import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.InstallStep -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.util.system.LocaleHelper -import kotlinx.android.synthetic.main.extension_card_item.ext_button -import kotlinx.android.synthetic.main.extension_card_item.ext_title -import kotlinx.android.synthetic.main.extension_card_item.image -import kotlinx.android.synthetic.main.extension_card_item.lang -import kotlinx.android.synthetic.main.extension_card_item.version -import kotlinx.android.synthetic.main.extension_card_item.warning class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = ExtensionCardItemBinding.bind(view) init { - ext_button.setOnClickListener { + binding.extButton.setOnClickListener { adapter.buttonClickListener.onButtonClick(bindingAdapterPosition) } } @@ -26,10 +23,10 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : fun bind(item: ExtensionItem) { val extension = item.extension - ext_title.text = extension.name - version.text = extension.versionName - lang.text = LocaleHelper.getSourceDisplayName(extension.lang, itemView.context) - warning.text = when { + binding.extTitle.text = extension.name + binding.version.text = extension.versionName + binding.lang.text = LocaleHelper.getSourceDisplayName(extension.lang, itemView.context) + binding.warning.text = when { extension is Extension.Untrusted -> itemView.context.getString(R.string.ext_untrusted) extension is Extension.Installed && extension.isObsolete -> itemView.context.getString(R.string.ext_obsolete) extension is Extension.Installed && extension.isUnofficial -> itemView.context.getString(R.string.ext_unofficial) @@ -37,19 +34,19 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : else -> "" }.toUpperCase() - GlideApp.with(itemView.context).clear(image) + GlideApp.with(itemView.context).clear(binding.image) if (extension is Extension.Available) { GlideApp.with(itemView.context) .load(extension.iconUrl) - .into(image) + .into(binding.image) } else { - extension.getApplicationIcon(itemView.context)?.let { image.setImageDrawable(it) } + extension.getApplicationIcon(itemView.context)?.let { binding.image.setImageDrawable(it) } } bindButton(item) } @Suppress("ResourceType") - fun bindButton(item: ExtensionItem) = with(ext_button) { + fun bindButton(item: ExtensionItem) = with(binding.extButton) { isEnabled = true isClickable = true diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt index 0cc61d0556..47299a8bdf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt @@ -6,30 +6,31 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.source_list_item.thumbnail -import kotlinx.android.synthetic.main.source_list_item.title +import eu.kanade.tachiyomi.databinding.SourceListItemBinding class MangaHolder( view: View, adapter: FlexibleAdapter<*> -) : BaseFlexibleViewHolder(view, adapter) { +) : FlexibleViewHolder(view, adapter) { + + private val binding = SourceListItemBinding.bind(view) fun bind(item: MangaItem) { // Update the title of the manga. - title.text = item.manga.title + binding.title.text = item.manga.title // Create thumbnail onclick to simulate long click - thumbnail.setOnClickListener { + binding.thumbnail.setOnClickListener { // Simulate long click on this view to enter selection mode onLongClick(itemView) } // Update the cover. - GlideApp.with(itemView.context).clear(thumbnail) + GlideApp.with(itemView.context).clear(binding.thumbnail) val radius = itemView.context.resources.getDimensionPixelSize(R.dimen.card_radius) val requestOptions = RequestOptions().transform(CenterCrop(), RoundedCorners(radius)) @@ -38,6 +39,6 @@ class MangaHolder( .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .apply(requestOptions) .dontAnimate() - .into(thumbnail) + .into(binding.thumbnail) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt index f52fe466fb..15b506bd4a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt @@ -5,9 +5,9 @@ import androidx.recyclerview.widget.RecyclerView import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractHeaderItem import eu.davidea.flexibleadapter.items.IFlexible +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.source_main_controller_card_header.title +import eu.kanade.tachiyomi.databinding.SourceMainControllerCardHeaderBinding /** * Item that contains the selection header. @@ -43,9 +43,12 @@ class SelectionHeader : AbstractHeaderItem() { // Intentionally empty } - class Holder(view: View, adapter: FlexibleAdapter<*>) : BaseFlexibleViewHolder(view, adapter) { + class Holder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter) { + + private val binding = SourceMainControllerCardHeaderBinding.bind(view) + init { - title.text = view.context.getString(R.string.migration_selection_prompt) + binding.title.text = view.context.getString(R.string.migration_selection_prompt) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt index 6f77f1594d..6a0225c247 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt @@ -1,23 +1,24 @@ package eu.kanade.tachiyomi.ui.browse.migration.sources import android.view.View +import eu.davidea.viewholders.FlexibleViewHolder +import eu.kanade.tachiyomi.databinding.SourceMainControllerCardItemBinding import eu.kanade.tachiyomi.source.icon -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.source_main_controller_card_item.image -import kotlinx.android.synthetic.main.source_main_controller_card_item.title class SourceHolder(view: View, val adapter: SourceAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = SourceMainControllerCardItemBinding.bind(view) fun bind(item: SourceItem) { val source = item.source // Set source name - title.text = source.name + binding.title.text = source.name // Set source icon itemView.post { - image.setImageDrawable(source.icon()) + binding.image.setImageDrawable(source.icon()) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/LangHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/LangHolder.kt index d62ccd6014..edb50eaee9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/LangHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/LangHolder.kt @@ -2,14 +2,16 @@ package eu.kanade.tachiyomi.ui.browse.source import android.view.View import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import eu.davidea.viewholders.FlexibleViewHolder +import eu.kanade.tachiyomi.databinding.SourceMainControllerCardHeaderBinding import eu.kanade.tachiyomi.util.system.LocaleHelper -import kotlinx.android.synthetic.main.source_main_controller_card_header.title class LangHolder(view: View, adapter: FlexibleAdapter<*>) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = SourceMainControllerCardHeaderBinding.bind(view) fun bind(item: LangItem) { - title.text = LocaleHelper.getSourceDisplayName(item.code, itemView.context) + binding.title.text = LocaleHelper.getSourceDisplayName(item.code, itemView.context) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceHolder.kt index 0ce0ef4fe3..b4fb279a11 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceHolder.kt @@ -2,28 +2,26 @@ package eu.kanade.tachiyomi.ui.browse.source import android.view.View import androidx.core.view.isVisible +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.databinding.SourceMainControllerCardItemBinding import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.icon -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.view.setVectorCompat -import kotlinx.android.synthetic.main.source_main_controller_card_item.image -import kotlinx.android.synthetic.main.source_main_controller_card_item.pin -import kotlinx.android.synthetic.main.source_main_controller_card_item.source_latest -import kotlinx.android.synthetic.main.source_main_controller_card_item.subtitle -import kotlinx.android.synthetic.main.source_main_controller_card_item.title class SourceHolder(private val view: View, val adapter: SourceAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = SourceMainControllerCardItemBinding.bind(view) init { - source_latest.setOnClickListener { + binding.sourceLatest.setOnClickListener { adapter.clickListener.onLatestClick(bindingAdapterPosition) } - pin.setOnClickListener { + binding.pin.setOnClickListener { adapter.clickListener.onPinClick(bindingAdapterPosition) } } @@ -31,26 +29,26 @@ class SourceHolder(private val view: View, val adapter: SourceAdapter) : fun bind(item: SourceItem) { val source = item.source - title.text = source.name - subtitle.isVisible = source !is LocalSource - subtitle.text = LocaleHelper.getDisplayName(source.lang) + binding.title.text = source.name + binding.subtitle.isVisible = source !is LocalSource + binding.subtitle.text = LocaleHelper.getDisplayName(source.lang) // Set source icon itemView.post { val icon = source.icon() when { - icon != null -> image.setImageDrawable(icon) - item.source.id == LocalSource.ID -> image.setImageResource(R.mipmap.ic_local_source) + icon != null -> binding.image.setImageDrawable(icon) + item.source.id == LocalSource.ID -> binding.image.setImageResource(R.mipmap.ic_local_source) } } - source_latest.isVisible = source.supportsLatest + binding.sourceLatest.isVisible = source.supportsLatest - pin.isVisible = true + binding.pin.isVisible = true if (item.isPinned) { - pin.setVectorCompat(R.drawable.ic_push_pin_filled_24dp, view.context.getResourceColor(R.attr.colorAccent)) + binding.pin.setVectorCompat(R.drawable.ic_push_pin_filled_24dp, view.context.getResourceColor(R.attr.colorAccent)) } else { - pin.setVectorCompat(R.drawable.ic_push_pin_24dp, view.context.getResourceColor(android.R.attr.textColorHint)) + binding.pin.setVectorCompat(R.drawable.ic_push_pin_24dp, view.context.getResourceColor(android.R.attr.textColorHint)) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt index 11adf82db4..a4a9def833 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt @@ -6,11 +6,8 @@ import eu.davidea.flexibleadapter.FlexibleAdapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail +import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding import eu.kanade.tachiyomi.widget.StateImageViewTarget -import kotlinx.android.synthetic.main.source_comfortable_grid_item.card -import kotlinx.android.synthetic.main.source_comfortable_grid_item.progress -import kotlinx.android.synthetic.main.source_comfortable_grid_item.thumbnail -import kotlinx.android.synthetic.main.source_comfortable_grid_item.title /** * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title. @@ -23,6 +20,8 @@ import kotlinx.android.synthetic.main.source_comfortable_grid_item.title class SourceComfortableGridHolder(private val view: View, private val adapter: FlexibleAdapter<*>) : SourceGridHolder(view, adapter) { + private val binding = SourceComfortableGridItemBinding.bind(view) + /** * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this * holder with the given manga. @@ -31,26 +30,26 @@ class SourceComfortableGridHolder(private val view: View, private val adapter: F */ override fun onSetValues(manga: Manga) { // Set manga title - title.text = manga.title + binding.title.text = manga.title // Set alpha of thumbnail. - thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f + binding.thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f setImage(manga) } override fun setImage(manga: Manga) { // For rounded corners - card.clipToOutline = true + binding.card.clipToOutline = true - GlideApp.with(view.context).clear(thumbnail) + GlideApp.with(view.context).clear(binding.thumbnail) if (!manga.thumbnail_url.isNullOrEmpty()) { GlideApp.with(view.context) .load(manga.toMangaThumbnail()) .diskCacheStrategy(DiskCacheStrategy.DATA) .centerCrop() .placeholder(android.R.color.transparent) - .into(StateImageViewTarget(thumbnail, progress)) + .into(StateImageViewTarget(binding.thumbnail, binding.progress)) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceGridHolder.kt index ecff1e23d8..212b23f24c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceGridHolder.kt @@ -6,11 +6,8 @@ import eu.davidea.flexibleadapter.FlexibleAdapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail +import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding import eu.kanade.tachiyomi.widget.StateImageViewTarget -import kotlinx.android.synthetic.main.source_compact_grid_item.card -import kotlinx.android.synthetic.main.source_compact_grid_item.progress -import kotlinx.android.synthetic.main.source_compact_grid_item.thumbnail -import kotlinx.android.synthetic.main.source_compact_grid_item.title /** * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title. @@ -23,6 +20,8 @@ import kotlinx.android.synthetic.main.source_compact_grid_item.title open class SourceGridHolder(private val view: View, private val adapter: FlexibleAdapter<*>) : SourceHolder(view, adapter) { + private val binding = SourceComfortableGridItemBinding.bind(view) + /** * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this * holder with the given manga. @@ -31,26 +30,26 @@ open class SourceGridHolder(private val view: View, private val adapter: Flexibl */ override fun onSetValues(manga: Manga) { // Set manga title - title.text = manga.title + binding.title.text = manga.title // Set alpha of thumbnail. - thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f + binding.thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f setImage(manga) } override fun setImage(manga: Manga) { // For rounded corners - card.clipToOutline = true + binding.card.clipToOutline = true - GlideApp.with(view.context).clear(thumbnail) + GlideApp.with(view.context).clear(binding.thumbnail) if (!manga.thumbnail_url.isNullOrEmpty()) { GlideApp.with(view.context) .load(manga.toMangaThumbnail()) .diskCacheStrategy(DiskCacheStrategy.DATA) .centerCrop() .placeholder(android.R.color.transparent) - .into(StateImageViewTarget(thumbnail, progress)) + .into(StateImageViewTarget(binding.thumbnail, binding.progress)) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceHolder.kt index 90743afda4..07d46ad094 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceHolder.kt @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.browse.source.browse import android.view.View import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.data.database.models.Manga -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder /** * Generic class used to hold the displayed data of a manga in the catalogue. @@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder * @param adapter the adapter handling this holder. */ abstract class SourceHolder(view: View, adapter: FlexibleAdapter<*>) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { /** * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceListHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceListHolder.kt index 8df3a899bd..16e4e5b4f3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceListHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceListHolder.kt @@ -10,9 +10,8 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail +import eu.kanade.tachiyomi.databinding.SourceListItemBinding import eu.kanade.tachiyomi.util.system.getResourceColor -import kotlinx.android.synthetic.main.source_list_item.thumbnail -import kotlinx.android.synthetic.main.source_list_item.title /** * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title. @@ -25,6 +24,8 @@ import kotlinx.android.synthetic.main.source_list_item.title class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) : SourceHolder(view, adapter) { + private val binding = SourceListItemBinding.bind(view) + private val favoriteColor = view.context.getResourceColor(R.attr.colorOnSurface, 0.38f) private val unfavoriteColor = view.context.getResourceColor(R.attr.colorOnSurface) @@ -35,17 +36,17 @@ class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) : * @param manga the manga to bind. */ override fun onSetValues(manga: Manga) { - title.text = manga.title - title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor) + binding.title.text = manga.title + binding.title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor) // Set alpha of thumbnail. - thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f + binding.thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f setImage(manga) } override fun setImage(manga: Manga) { - GlideApp.with(view.context).clear(thumbnail) + GlideApp.with(view.context).clear(binding.thumbnail) if (!manga.thumbnail_url.isNullOrEmpty()) { val radius = view.context.resources.getDimensionPixelSize(R.dimen.card_radius) @@ -56,7 +57,7 @@ class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) : .apply(requestOptions) .dontAnimate() .placeholder(android.R.color.transparent) - .into(thumbnail) + .into(binding.thumbnail) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchCardHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchCardHolder.kt index 97d217b4c7..8b0310f1fe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchCardHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchCardHolder.kt @@ -2,18 +2,17 @@ package eu.kanade.tachiyomi.ui.browse.source.globalsearch import android.view.View import com.bumptech.glide.load.engine.DiskCacheStrategy +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import eu.kanade.tachiyomi.databinding.GlobalSearchControllerCardItemBinding import eu.kanade.tachiyomi.widget.StateImageViewTarget -import kotlinx.android.synthetic.main.global_search_controller_card_item.card -import kotlinx.android.synthetic.main.global_search_controller_card_item.cover -import kotlinx.android.synthetic.main.global_search_controller_card_item.progress -import kotlinx.android.synthetic.main.global_search_controller_card_item.title class GlobalSearchCardHolder(view: View, adapter: GlobalSearchCardAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = GlobalSearchControllerCardItemBinding.bind(view) init { // Call onMangaClickListener when item is pressed. @@ -33,17 +32,17 @@ class GlobalSearchCardHolder(view: View, adapter: GlobalSearchCardAdapter) : } fun bind(manga: Manga) { - card.clipToOutline = true + binding.card.clipToOutline = true - title.text = manga.title + binding.title.text = manga.title // Set alpha of thumbnail. - cover.alpha = if (manga.favorite) 0.3f else 1.0f + binding.cover.alpha = if (manga.favorite) 0.3f else 1.0f setImage(manga) } fun setImage(manga: Manga) { - GlideApp.with(itemView.context).clear(cover) + GlideApp.with(itemView.context).clear(binding.cover) if (!manga.thumbnail_url.isNullOrEmpty()) { GlideApp.with(itemView.context) .load(manga.toMangaThumbnail()) @@ -51,7 +50,7 @@ class GlobalSearchCardHolder(view: View, adapter: GlobalSearchCardAdapter) : .centerCrop() .skipMemoryCache(true) .placeholder(android.R.color.transparent) - .into(StateImageViewTarget(cover, progress)) + .into(StateImageViewTarget(binding.cover, binding.progress)) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchHolder.kt index 50a7244a98..c02b29d77e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchHolder.kt @@ -3,16 +3,11 @@ package eu.kanade.tachiyomi.ui.browse.source.globalsearch import android.view.View import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.databinding.GlobalSearchControllerCardBinding import eu.kanade.tachiyomi.source.LocalSource -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.util.system.LocaleHelper -import kotlinx.android.synthetic.main.global_search_controller_card.no_results_found -import kotlinx.android.synthetic.main.global_search_controller_card.progress -import kotlinx.android.synthetic.main.global_search_controller_card.recycler -import kotlinx.android.synthetic.main.global_search_controller_card.subtitle -import kotlinx.android.synthetic.main.global_search_controller_card.title -import kotlinx.android.synthetic.main.global_search_controller_card.title_wrapper /** * Holder that binds the [GlobalSearchItem] containing catalogue cards. @@ -21,7 +16,9 @@ import kotlinx.android.synthetic.main.global_search_controller_card.title_wrappe * @param adapter instance of [GlobalSearchAdapter] */ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = GlobalSearchControllerCardBinding.bind(view) /** * Adapter containing manga from search results. @@ -32,10 +29,10 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) : init { // Set layout horizontal. - recycler.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.HORIZONTAL, false) - recycler.adapter = mangaAdapter + binding.recycler.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.HORIZONTAL, false) + binding.recycler.adapter = mangaAdapter - title_wrapper.setOnClickListener { + binding.titleWrapper.setOnClickListener { adapter.getItem(bindingAdapterPosition)?.let { adapter.titleClickListener.onTitleClick(it.source) } @@ -53,21 +50,21 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) : val titlePrefix = if (item.highlighted) "▶ " else "" - title.text = titlePrefix + source.name - subtitle.isVisible = source !is LocalSource - subtitle.text = LocaleHelper.getDisplayName(source.lang) + binding.title.text = titlePrefix + source.name + binding.subtitle.isVisible = source !is LocalSource + binding.subtitle.text = LocaleHelper.getDisplayName(source.lang) when { results == null -> { - progress.isVisible = true + binding.progress.isVisible = true showResultsHolder() } results.isEmpty() -> { - progress.isVisible = false + binding.progress.isVisible = false showNoResults() } else -> { - progress.isVisible = false + binding.progress.isVisible = false showResultsHolder() } } @@ -104,10 +101,10 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) : } private fun showResultsHolder() { - no_results_found.isVisible = false + binding.noResultsFound.isVisible = false } private fun showNoResults() { - no_results_found.isVisible = true + binding.noResultsFound.isVisible = true } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryHolder.kt index 22adfbc0fa..98ad8306cf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryHolder.kt @@ -1,10 +1,9 @@ package eu.kanade.tachiyomi.ui.category import android.view.View +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.data.database.models.Category -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.categories_item.reorder -import kotlinx.android.synthetic.main.categories_item.title +import eu.kanade.tachiyomi.databinding.CategoriesItemBinding /** * Holder used to display category items. @@ -12,10 +11,12 @@ import kotlinx.android.synthetic.main.categories_item.title * @param view The view used by category items. * @param adapter The adapter containing this holder. */ -class CategoryHolder(view: View, val adapter: CategoryAdapter) : BaseFlexibleViewHolder(view, adapter) { +class CategoryHolder(view: View, val adapter: CategoryAdapter) : FlexibleViewHolder(view, adapter) { + + private val binding = CategoriesItemBinding.bind(view) init { - setDragHandleView(reorder) + setDragHandleView(binding.reorder) } /** @@ -24,7 +25,7 @@ class CategoryHolder(view: View, val adapter: CategoryAdapter) : BaseFlexibleVie * @param category The category to bind. */ fun bind(category: Category) { - title.text = category.name + binding.title.text = category.name } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadHolder.kt index 45fc79e699..9668a68eaa 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadHolder.kt @@ -1,16 +1,11 @@ package eu.kanade.tachiyomi.ui.download import android.view.View +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.model.Download -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import eu.kanade.tachiyomi.databinding.DownloadItemBinding import eu.kanade.tachiyomi.util.view.popupMenu -import kotlinx.android.synthetic.main.download_item.chapter_title -import kotlinx.android.synthetic.main.download_item.download_progress -import kotlinx.android.synthetic.main.download_item.download_progress_text -import kotlinx.android.synthetic.main.download_item.manga_full_title -import kotlinx.android.synthetic.main.download_item.menu -import kotlinx.android.synthetic.main.download_item.reorder /** * Class used to hold the data of a download. @@ -20,11 +15,13 @@ import kotlinx.android.synthetic.main.download_item.reorder * @constructor creates a new download holder. */ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = DownloadItemBinding.bind(view) init { - setDragHandleView(reorder) - menu.setOnClickListener { it.post { showPopupMenu(it) } } + setDragHandleView(binding.reorder) + binding.menu.setOnClickListener { it.post { showPopupMenu(it) } } } private lateinit var download: Download @@ -37,19 +34,19 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) : fun bind(download: Download) { this.download = download // Update the chapter name. - chapter_title.text = download.chapter.name + binding.chapterTitle.text = download.chapter.name // Update the manga title - manga_full_title.text = download.manga.title + binding.mangaFullTitle.text = download.manga.title // Update the progress bar and the number of downloaded pages val pages = download.pages if (pages == null) { - download_progress.progress = 0 - download_progress.max = 1 - download_progress_text.text = "" + binding.downloadProgress.progress = 0 + binding.downloadProgress.max = 1 + binding.downloadProgressText.text = "" } else { - download_progress.max = pages.size * 100 + binding.downloadProgress.max = pages.size * 100 notifyProgress() notifyDownloadedPages() } @@ -60,10 +57,10 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) : */ fun notifyProgress() { val pages = download.pages ?: return - if (download_progress.max == 1) { - download_progress.max = pages.size * 100 + if (binding.downloadProgress.max == 1) { + binding.downloadProgress.max = pages.size * 100 } - download_progress.progress = download.totalProgress + binding.downloadProgress.progress = download.totalProgress } /** @@ -71,7 +68,7 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) : */ fun notifyDownloadedPages() { val pages = download.pages ?: return - download_progress_text.text = "${download.downloadedImages}/${pages.size}" + binding.downloadProgressText.text = "${download.downloadedImages}/${pages.size}" } override fun onItemReleased(position: Int) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt index 33d06a9531..de861d42a1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt @@ -8,14 +8,8 @@ import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail +import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding import eu.kanade.tachiyomi.util.isLocal -import kotlinx.android.synthetic.main.source_comfortable_grid_item.badges -import kotlinx.android.synthetic.main.source_comfortable_grid_item.card -import kotlinx.android.synthetic.main.source_comfortable_grid_item.download_text -import kotlinx.android.synthetic.main.source_comfortable_grid_item.local_text -import kotlinx.android.synthetic.main.source_comfortable_grid_item.thumbnail -import kotlinx.android.synthetic.main.source_comfortable_grid_item.title -import kotlinx.android.synthetic.main.source_comfortable_grid_item.unread_text /** * Class used to hold the displayed data of a manga in the library, like the cover or the title. @@ -31,6 +25,8 @@ class LibraryComfortableGridHolder( adapter: FlexibleAdapter> ) : LibraryCompactGridHolder(view, adapter) { + private val binding = SourceComfortableGridItemBinding.bind(view) + /** * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this * holder with the given manga. @@ -39,34 +35,34 @@ class LibraryComfortableGridHolder( */ override fun onSetValues(item: LibraryItem) { // Update the title of the manga. - title.text = item.manga.title + binding.title.text = item.manga.title // For rounded corners - badges.clipToOutline = true + binding.badges.clipToOutline = true // Update the unread count and its visibility. - with(unread_text) { + with(binding.unreadText) { isVisible = item.unreadCount > 0 text = item.unreadCount.toString() } // Update the download count and its visibility. - with(download_text) { + with(binding.downloadText) { isVisible = item.downloadCount > 0 text = item.downloadCount.toString() } // set local visibility if its local manga - local_text.isVisible = item.manga.isLocal() + binding.localText.isVisible = item.manga.isLocal() // For rounded corners - card.clipToOutline = true + binding.card.clipToOutline = true // Update the cover. - GlideApp.with(view.context).clear(thumbnail) + GlideApp.with(view.context).clear(binding.thumbnail) GlideApp.with(view.context) .load(item.manga.toMangaThumbnail()) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .centerCrop() .dontAnimate() - .into(thumbnail) + .into(binding.thumbnail) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt index 4e8d3b298d..39718a9c15 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt @@ -6,14 +6,8 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import eu.davidea.flexibleadapter.FlexibleAdapter import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail +import eu.kanade.tachiyomi.databinding.SourceCompactGridItemBinding import eu.kanade.tachiyomi.util.isLocal -import kotlinx.android.synthetic.main.source_compact_grid_item.badges -import kotlinx.android.synthetic.main.source_compact_grid_item.card -import kotlinx.android.synthetic.main.source_compact_grid_item.download_text -import kotlinx.android.synthetic.main.source_compact_grid_item.local_text -import kotlinx.android.synthetic.main.source_compact_grid_item.thumbnail -import kotlinx.android.synthetic.main.source_compact_grid_item.title -import kotlinx.android.synthetic.main.source_compact_grid_item.unread_text /** * Class used to hold the displayed data of a manga in the library, like the cover or the title. @@ -29,6 +23,8 @@ open class LibraryCompactGridHolder( private val adapter: FlexibleAdapter<*> ) : LibraryHolder(view, adapter) { + private val binding = SourceCompactGridItemBinding.bind(view) + /** * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this * holder with the given manga. @@ -37,34 +33,34 @@ open class LibraryCompactGridHolder( */ override fun onSetValues(item: LibraryItem) { // Update the title of the manga. - title.text = item.manga.title + binding.title.text = item.manga.title // For rounded corners - badges.clipToOutline = true + binding.badges.clipToOutline = true // Update the unread count and its visibility. - with(unread_text) { + with(binding.unreadText) { isVisible = item.unreadCount > 0 text = item.unreadCount.toString() } // Update the download count and its visibility. - with(download_text) { + with(binding.downloadText) { isVisible = item.downloadCount > 0 text = item.downloadCount.toString() } // set local visibility if its local manga - local_text.isVisible = item.manga.isLocal() + binding.localText.isVisible = item.manga.isLocal() // For rounded corners - card.clipToOutline = true + binding.card.clipToOutline = true // Update the cover. - GlideApp.with(view.context).clear(thumbnail) + GlideApp.with(view.context).clear(binding.thumbnail) GlideApp.with(view.context) .load(item.manga.toMangaThumbnail()) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .centerCrop() .dontAnimate() - .into(thumbnail) + .into(binding.thumbnail) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt index b5715de236..c3b4621710 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt @@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.library import android.view.View import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import eu.davidea.viewholders.FlexibleViewHolder /** * Generic class used to hold the displayed data of a manga in the library. @@ -14,7 +14,7 @@ import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder abstract class LibraryHolder( view: View, adapter: FlexibleAdapter<*> -) : BaseFlexibleViewHolder(view, adapter) { +) : FlexibleViewHolder(view, adapter) { /** * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt index 3a45c45210..5d1f1155d9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt @@ -10,13 +10,8 @@ import eu.davidea.flexibleadapter.FlexibleAdapter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail +import eu.kanade.tachiyomi.databinding.SourceListItemBinding import eu.kanade.tachiyomi.util.isLocal -import kotlinx.android.synthetic.main.source_list_item.badges -import kotlinx.android.synthetic.main.source_list_item.download_text -import kotlinx.android.synthetic.main.source_list_item.local_text -import kotlinx.android.synthetic.main.source_list_item.thumbnail -import kotlinx.android.synthetic.main.source_list_item.title -import kotlinx.android.synthetic.main.source_list_item.unread_text /** * Class used to hold the displayed data of a manga in the library, like the cover or the title. @@ -33,6 +28,8 @@ class LibraryListHolder( private val adapter: FlexibleAdapter<*> ) : LibraryHolder(view, adapter) { + private val binding = SourceListItemBinding.bind(view) + /** * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this * holder with the given manga. @@ -41,32 +38,32 @@ class LibraryListHolder( */ override fun onSetValues(item: LibraryItem) { // Update the title of the manga. - title.text = item.manga.title + binding.title.text = item.manga.title // For rounded corners - badges.clipToOutline = true + binding.badges.clipToOutline = true // Update the unread count and its visibility. - with(unread_text) { + with(binding.unreadText) { isVisible = item.unreadCount > 0 text = item.unreadCount.toString() } // Update the download count and its visibility. - with(download_text) { + with(binding.downloadText) { isVisible = item.downloadCount > 0 text = "${item.downloadCount}" } // show local text badge if local manga - local_text.isVisible = item.manga.isLocal() + binding.localText.isVisible = item.manga.isLocal() // Create thumbnail onclick to simulate long click - thumbnail.setOnClickListener { + binding.thumbnail.setOnClickListener { // Simulate long click on this view to enter selection mode onLongClick(itemView) } // Update the cover. - GlideApp.with(itemView.context).clear(thumbnail) + GlideApp.with(itemView.context).clear(binding.thumbnail) val radius = view.context.resources.getDimensionPixelSize(R.dimen.card_radius) val requestOptions = RequestOptions().transform(CenterCrop(), RoundedCorners(radius)) @@ -75,6 +72,6 @@ class LibraryListHolder( .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .apply(requestOptions) .dontAnimate() - .into(thumbnail) + .into(binding.thumbnail) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 94d490f8b6..86f6c02833 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -415,8 +415,8 @@ class MainActivity : BaseActivity() { } /** - * Used to manually offset a view within the activity's child views that might be cut off due to the - * collapsing AppBarLayout. + * Used to manually offset a view within the activity's child views that might be cut off due to + * the collapsing AppBarLayout. */ fun fixViewToBottom(view: View) { binding.appbar.addOnOffsetChangedListener( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt index 428ef35109..7cf5e60358 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt @@ -5,25 +5,24 @@ import android.text.SpannableStringBuilder import android.text.style.ForegroundColorSpan import android.view.View import androidx.core.view.isVisible +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.download.model.Download -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.chapters_item.bookmark_icon -import kotlinx.android.synthetic.main.chapters_item.chapter_description -import kotlinx.android.synthetic.main.chapters_item.chapter_title -import kotlinx.android.synthetic.main.chapters_item.download_text +import eu.kanade.tachiyomi.databinding.ChaptersItemBinding import java.util.Date class ChapterHolder( view: View, private val adapter: ChaptersAdapter -) : BaseFlexibleViewHolder(view, adapter) { +) : FlexibleViewHolder(view, adapter) { + + private val binding = ChaptersItemBinding.bind(view) fun bind(item: ChapterItem, manga: Manga) { val chapter = item.chapter - chapter_title.text = when (manga.displayMode) { + binding.chapterTitle.text = when (manga.displayMode) { Manga.DISPLAY_NUMBER -> { val number = adapter.decimalFormat.format(chapter.chapter_number.toDouble()) itemView.context.getString(R.string.display_mode_chapter, number) @@ -37,16 +36,16 @@ class ChapterHolder( chapter.bookmark -> adapter.bookmarkedColor else -> adapter.unreadColor } - chapter_title.setTextColor(chapterTitleColor) + binding.chapterTitle.setTextColor(chapterTitleColor) val chapterDescriptionColor = when { chapter.read -> adapter.readColor chapter.bookmark -> adapter.bookmarkedColor else -> adapter.unreadColorSecondary } - chapter_description.setTextColor(chapterDescriptionColor) + binding.chapterDescription.setTextColor(chapterDescriptionColor) - bookmark_icon.isVisible = chapter.bookmark + binding.bookmarkIcon.isVisible = chapter.bookmark val descriptions = mutableListOf() @@ -64,15 +63,15 @@ class ChapterHolder( } if (descriptions.isNotEmpty()) { - chapter_description.text = descriptions.joinTo(SpannableStringBuilder(), " • ") + binding.chapterDescription.text = descriptions.joinTo(SpannableStringBuilder(), " • ") } else { - chapter_description.text = "" + binding.chapterDescription.text = "" } notifyStatus(item.status) } - fun notifyStatus(status: Int) = with(download_text) { + fun notifyStatus(status: Int) = with(binding.downloadText) { when (status) { Download.QUEUE -> setText(R.string.chapter_queued) Download.DOWNLOADING -> setText(R.string.chapter_downloading) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryHolder.kt index 595bf640ca..d96ab429d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryHolder.kt @@ -2,18 +2,13 @@ package eu.kanade.tachiyomi.ui.recent.history import android.view.View import com.bumptech.glide.load.engine.DiskCacheStrategy +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import eu.kanade.tachiyomi.databinding.HistoryItemBinding import eu.kanade.tachiyomi.util.lang.toTimestampString -import kotlinx.android.synthetic.main.history_item.cover -import kotlinx.android.synthetic.main.history_item.holder -import kotlinx.android.synthetic.main.history_item.manga_subtitle -import kotlinx.android.synthetic.main.history_item.manga_title -import kotlinx.android.synthetic.main.history_item.remove -import kotlinx.android.synthetic.main.history_item.resume import java.util.Date /** @@ -28,18 +23,20 @@ import java.util.Date class HistoryHolder( view: View, val adapter: HistoryAdapter -) : BaseFlexibleViewHolder(view, adapter) { +) : FlexibleViewHolder(view, adapter) { + + private val binding = HistoryItemBinding.bind(view) init { - holder.setOnClickListener { + binding.holder.setOnClickListener { adapter.itemClickListener.onItemClick(bindingAdapterPosition) } - remove.setOnClickListener { + binding.remove.setOnClickListener { adapter.removeClickListener.onRemoveClick(bindingAdapterPosition) } - resume.setOnClickListener { + binding.resume.setOnClickListener { adapter.resumeClickListener.onResumeClick(bindingAdapterPosition) } } @@ -54,26 +51,26 @@ class HistoryHolder( val (manga, chapter, history) = item // Set manga title - manga_title.text = manga.title + binding.mangaTitle.text = manga.title // Set chapter number + timestamp if (chapter.chapter_number > -1f) { val formattedNumber = adapter.decimalFormat.format(chapter.chapter_number.toDouble()) - manga_subtitle.text = itemView.context.getString( + binding.mangaSubtitle.text = itemView.context.getString( R.string.recent_manga_time, formattedNumber, Date(history.last_read).toTimestampString() ) } else { - manga_subtitle.text = Date(history.last_read).toTimestampString() + binding.mangaSubtitle.text = Date(history.last_read).toTimestampString() } // Set cover - GlideApp.with(itemView.context).clear(cover) + GlideApp.with(itemView.context).clear(binding.cover) GlideApp.with(itemView.context) .load(manga.toMangaThumbnail()) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .centerCrop() - .into(cover) + .into(binding.cover) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesHolder.kt index eb3e433b94..e94417ef74 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesHolder.kt @@ -5,16 +5,13 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions +import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import eu.kanade.tachiyomi.databinding.UpdatesItemBinding import eu.kanade.tachiyomi.util.system.getResourceColor -import kotlinx.android.synthetic.main.updates_item.chapter_title -import kotlinx.android.synthetic.main.updates_item.download_text -import kotlinx.android.synthetic.main.updates_item.manga_cover -import kotlinx.android.synthetic.main.updates_item.manga_title /** * Holder that contains chapter item @@ -27,7 +24,9 @@ import kotlinx.android.synthetic.main.updates_item.manga_title * @constructor creates a new recent chapter holder. */ class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = UpdatesItemBinding.bind(view) private var readColor = view.context.getResourceColor(R.attr.colorOnSurface, 0.38f) private var unreadColor = view.context.getResourceColor(R.attr.colorOnSurface) @@ -38,7 +37,7 @@ class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter) private var item: UpdatesItem? = null init { - manga_cover.setOnClickListener { + binding.mangaCover.setOnClickListener { adapter.coverClickListener.onCoverClick(bindingAdapterPosition) } } @@ -52,25 +51,25 @@ class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter) this.item = item // Set chapter title - chapter_title.text = item.chapter.name + binding.chapterTitle.text = item.chapter.name // Set manga title - manga_title.text = item.manga.title + binding.mangaTitle.text = item.manga.title // Check if chapter is read and set correct color if (item.chapter.read) { - chapter_title.setTextColor(readColor) - manga_title.setTextColor(readColor) + binding.chapterTitle.setTextColor(readColor) + binding.mangaTitle.setTextColor(readColor) } else { - chapter_title.setTextColor(unreadColor) - manga_title.setTextColor(unreadColor) + binding.chapterTitle.setTextColor(unreadColor) + binding.mangaTitle.setTextColor(unreadColor) } // Set chapter status notifyStatus(item.status) // Set cover - GlideApp.with(itemView.context).clear(manga_cover) + GlideApp.with(itemView.context).clear(binding.mangaCover) val radius = itemView.context.resources.getDimensionPixelSize(R.dimen.card_radius) val requestOptions = RequestOptions().transform(CenterCrop(), RoundedCorners(radius)) @@ -79,7 +78,7 @@ class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .apply(requestOptions) .dontAnimate() - .into(manga_cover) + .into(binding.mangaCover) } /** @@ -87,7 +86,7 @@ class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter) * * @param status download status */ - fun notifyStatus(status: Int) = with(download_text) { + fun notifyStatus(status: Int) = with(binding.downloadText) { when (status) { Download.QUEUE -> setText(R.string.chapter_queued) Download.DOWNLOADING -> setText(R.string.chapter_downloading) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/search/SettingsSearchHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/search/SettingsSearchHolder.kt index b63a15cd64..1dd79a22ca 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/search/SettingsSearchHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/search/SettingsSearchHolder.kt @@ -1,11 +1,8 @@ package eu.kanade.tachiyomi.ui.setting.search import android.view.View -import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.settings_search_controller_card.search_result_pref_breadcrumb -import kotlinx.android.synthetic.main.settings_search_controller_card.search_result_pref_summary -import kotlinx.android.synthetic.main.settings_search_controller_card.search_result_pref_title -import kotlinx.android.synthetic.main.settings_search_controller_card.title_wrapper +import eu.davidea.viewholders.FlexibleViewHolder +import eu.kanade.tachiyomi.databinding.SettingsSearchControllerCardBinding import kotlin.reflect.full.createInstance /** @@ -15,10 +12,12 @@ import kotlin.reflect.full.createInstance * @param adapter instance of [SettingsSearchAdapter] */ class SettingsSearchHolder(view: View, val adapter: SettingsSearchAdapter) : - BaseFlexibleViewHolder(view, adapter) { + FlexibleViewHolder(view, adapter) { + + private val binding = SettingsSearchControllerCardBinding.bind(view) init { - title_wrapper.setOnClickListener { + binding.titleWrapper.setOnClickListener { adapter.getItem(bindingAdapterPosition)?.let { val ctrl = it.settingsSearchResult.searchController::class.createInstance() ctrl.preferenceKey = it.settingsSearchResult.key @@ -35,8 +34,8 @@ class SettingsSearchHolder(view: View, val adapter: SettingsSearchAdapter) : * @param item item of card. */ fun bind(item: SettingsSearchItem) { - search_result_pref_title.text = item.settingsSearchResult.title - search_result_pref_summary.text = item.settingsSearchResult.summary - search_result_pref_breadcrumb.text = item.settingsSearchResult.breadcrumb + binding.searchResultPrefTitle.text = item.settingsSearchResult.title + binding.searchResultPrefSummary.text = item.settingsSearchResult.summary + binding.searchResultPrefBreadcrumb.text = item.settingsSearchResult.breadcrumb } }