Replace Kotlin synthetic views in viewholders

(cherry picked from commit 749c2071af3fb65efd3dd88ca82f6d3461950907)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceGridHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceListHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt
This commit is contained in:
arkon 2020-11-28 15:24:40 -05:00 committed by Jobobby04
parent 6f9edb7903
commit c9c808a782
35 changed files with 307 additions and 356 deletions

View File

@ -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
}

View File

@ -3,11 +3,13 @@ package eu.kanade.tachiyomi.ui.browse.extension
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.View import android.view.View
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import kotlinx.android.synthetic.main.source_main_controller_card_header.title import eu.kanade.tachiyomi.databinding.SourceMainControllerCardHeaderBinding
class ExtensionGroupHolder(view: View, adapter: FlexibleAdapter<*>) : class ExtensionGroupHolder(view: View, adapter: FlexibleAdapter<*>) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = SourceMainControllerCardHeaderBinding.bind(view)
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
fun bind(item: ExtensionGroupItem) { fun bind(item: ExtensionGroupItem) {
@ -16,6 +18,6 @@ class ExtensionGroupHolder(view: View, adapter: FlexibleAdapter<*>) :
text += " (${item.size})" text += " (${item.size})"
} }
title.text = text binding.title.text = text
} }
} }

View File

@ -2,26 +2,23 @@ package eu.kanade.tachiyomi.ui.browse.extension
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.View import android.view.View
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.glide.GlideApp 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.Extension
import eu.kanade.tachiyomi.extension.model.InstallStep import eu.kanade.tachiyomi.extension.model.InstallStep
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.util.system.LocaleHelper 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
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = ExtensionCardItemBinding.bind(view)
init { init {
ext_button.setOnClickListener { binding.extButton.setOnClickListener {
adapter.buttonClickListener.onButtonClick(bindingAdapterPosition) adapter.buttonClickListener.onButtonClick(bindingAdapterPosition)
} }
} }
@ -29,10 +26,10 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
fun bind(item: ExtensionItem) { fun bind(item: ExtensionItem) {
val extension = item.extension val extension = item.extension
ext_title.text = extension.name binding.extTitle.text = extension.name
version.text = extension.versionName binding.version.text = extension.versionName
lang.text = LocaleHelper.getSourceDisplayName(extension.lang, itemView.context) binding.lang.text = LocaleHelper.getSourceDisplayName(extension.lang, itemView.context)
warning.text = when { binding.warning.text = when {
extension is Extension.Untrusted -> itemView.context.getString(R.string.ext_untrusted) 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.isObsolete -> itemView.context.getString(R.string.ext_obsolete)
extension is Extension.Installed && extension.isUnofficial -> itemView.context.getString(R.string.ext_unofficial) extension is Extension.Installed && extension.isUnofficial -> itemView.context.getString(R.string.ext_unofficial)
@ -43,19 +40,19 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
else -> "" else -> ""
}.toUpperCase() }.toUpperCase()
GlideApp.with(itemView.context).clear(image) GlideApp.with(itemView.context).clear(binding.image)
if (extension is Extension.Available) { if (extension is Extension.Available) {
GlideApp.with(itemView.context) GlideApp.with(itemView.context)
.load(extension.iconUrl) .load(extension.iconUrl)
.into(image) .into(binding.image)
} else { } else {
extension.getApplicationIcon(itemView.context)?.let { image.setImageDrawable(it) } extension.getApplicationIcon(itemView.context)?.let { binding.image.setImageDrawable(it) }
} }
bindButton(item) bindButton(item)
} }
@Suppress("ResourceType") @Suppress("ResourceType")
fun bindButton(item: ExtensionItem) = with(ext_button) { fun bindButton(item: ExtensionItem) = with(binding.extButton) {
isEnabled = true isEnabled = true
isClickable = true isClickable = true

View File

@ -2,18 +2,17 @@ package eu.kanade.tachiyomi.ui.browse.latest
import android.view.View import android.view.View
import com.bumptech.glide.load.engine.DiskCacheStrategy 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.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail 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 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 LatestCardHolder(view: View, adapter: LatestCardAdapter) : class LatestCardHolder(view: View, adapter: LatestCardAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = GlobalSearchControllerCardItemBinding.bind(view)
init { init {
// Call onMangaClickListener when item is pressed. // Call onMangaClickListener when item is pressed.
@ -33,17 +32,17 @@ class LatestCardHolder(view: View, adapter: LatestCardAdapter) :
} }
fun bind(manga: Manga) { fun bind(manga: Manga) {
card.clipToOutline = true binding.card.clipToOutline = true
title.text = manga.title binding.title.text = manga.title
// Set alpha of thumbnail. // 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) setImage(manga)
} }
fun setImage(manga: Manga) { fun setImage(manga: Manga) {
GlideApp.with(itemView.context).clear(cover) GlideApp.with(itemView.context).clear(binding.cover)
if (!manga.thumbnail_url.isNullOrEmpty()) { if (!manga.thumbnail_url.isNullOrEmpty()) {
GlideApp.with(itemView.context) GlideApp.with(itemView.context)
.load(manga.toMangaThumbnail()) .load(manga.toMangaThumbnail())
@ -51,7 +50,7 @@ class LatestCardHolder(view: View, adapter: LatestCardAdapter) :
.centerCrop() .centerCrop()
.skipMemoryCache(true) .skipMemoryCache(true)
.placeholder(android.R.color.transparent) .placeholder(android.R.color.transparent)
.into(StateImageViewTarget(cover, progress)) .into(StateImageViewTarget(binding.cover, binding.progress))
} }
} }
} }

View File

@ -3,15 +3,10 @@ package eu.kanade.tachiyomi.ui.browse.latest
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.databinding.LatestControllerCardBinding
import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.LocaleHelper
import kotlinx.android.synthetic.main.latest_controller_card.no_results_found
import kotlinx.android.synthetic.main.latest_controller_card.progress
import kotlinx.android.synthetic.main.latest_controller_card.recycler
import kotlinx.android.synthetic.main.latest_controller_card.subtitle
import kotlinx.android.synthetic.main.latest_controller_card.title
import kotlinx.android.synthetic.main.latest_controller_card.title_wrapper
/** /**
* Holder that binds the [LatestItem] containing catalogue cards. * Holder that binds the [LatestItem] containing catalogue cards.
@ -20,7 +15,9 @@ import kotlinx.android.synthetic.main.latest_controller_card.title_wrapper
* @param adapter instance of [LatestAdapter] * @param adapter instance of [LatestAdapter]
*/ */
class LatestHolder(view: View, val adapter: LatestAdapter) : class LatestHolder(view: View, val adapter: LatestAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = LatestControllerCardBinding.bind(view)
/** /**
* Adapter containing manga from search results. * Adapter containing manga from search results.
@ -31,10 +28,10 @@ class LatestHolder(view: View, val adapter: LatestAdapter) :
init { init {
// Set layout horizontal. // Set layout horizontal.
recycler.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.HORIZONTAL, false) binding.recycler.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.HORIZONTAL, false)
recycler.adapter = mangaAdapter binding.recycler.adapter = mangaAdapter
title_wrapper.setOnClickListener { binding.titleWrapper.setOnClickListener {
adapter.getItem(bindingAdapterPosition)?.let { adapter.getItem(bindingAdapterPosition)?.let {
adapter.titleClickListener.onTitleClick(it.source) adapter.titleClickListener.onTitleClick(it.source)
} }
@ -52,21 +49,21 @@ class LatestHolder(view: View, val adapter: LatestAdapter) :
val titlePrefix = if (item.highlighted) "" else "" val titlePrefix = if (item.highlighted) "" else ""
title.text = titlePrefix + source.name binding.title.text = titlePrefix + source.name
subtitle.isVisible = true binding.subtitle.isVisible = true
subtitle.text = LocaleHelper.getDisplayName(source.lang) binding.subtitle.text = LocaleHelper.getDisplayName(source.lang)
when { when {
results == null -> { results == null -> {
progress.isVisible = true binding.progress.isVisible = true
showResultsHolder() showResultsHolder()
} }
results.isEmpty() -> { results.isEmpty() -> {
progress.isVisible = false binding.progress.isVisible = false
showNoResults() showNoResults()
} }
else -> { else -> {
progress.isVisible = false binding.progress.isVisible = false
showResultsHolder() showResultsHolder()
} }
} }
@ -103,10 +100,10 @@ class LatestHolder(view: View, val adapter: LatestAdapter) :
} }
private fun showResultsHolder() { private fun showResultsHolder() {
no_results_found.isVisible = false binding.noResultsFound.isVisible = false
} }
private fun showNoResults() { private fun showNoResults() {
no_results_found.isVisible = true binding.noResultsFound.isVisible = true
} }
} }

View File

@ -2,15 +2,15 @@ package eu.kanade.tachiyomi.ui.browse.migration.advanced.design
import android.graphics.Paint.STRIKE_THRU_TEXT_FLAG import android.graphics.Paint.STRIKE_THRU_TEXT_FLAG
import android.view.View import android.view.View
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.MigrationSourceItemBinding import eu.kanade.tachiyomi.databinding.MigrationSourceItemBinding
import eu.kanade.tachiyomi.source.icon import eu.kanade.tachiyomi.source.icon
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
class MigrationSourceHolder(view: View, val adapter: MigrationSourceAdapter) : class MigrationSourceHolder(view: View, val adapter: MigrationSourceAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
val binding = MigrationSourceItemBinding.bind(view) val binding = MigrationSourceItemBinding.bind(view)
init { init {
setDragHandleView(binding.reorder) setDragHandleView(binding.reorder)

View File

@ -5,6 +5,7 @@ import android.widget.PopupMenu
import androidx.core.view.isInvisible import androidx.core.view.isInvisible
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
@ -15,7 +16,6 @@ import eu.kanade.tachiyomi.databinding.MigrationProcessItemBinding
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.lang.await import eu.kanade.tachiyomi.util.lang.await
import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.launchUI
@ -36,7 +36,7 @@ import java.text.DecimalFormat
class MigrationProcessHolder( class MigrationProcessHolder(
private val view: View, private val view: View,
private val adapter: MigrationProcessAdapter private val adapter: MigrationProcessAdapter
) : BaseFlexibleViewHolder(view, adapter) { ) : FlexibleViewHolder(view, adapter) {
private val db: DatabaseHelper by injectLazy() private val db: DatabaseHelper by injectLazy()
private val sourceManager: SourceManager by injectLazy() private val sourceManager: SourceManager by injectLazy()

View File

@ -6,18 +6,18 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceListItemBinding import eu.kanade.tachiyomi.databinding.SourceListItemBinding
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
class MangaHolder( class MangaHolder(
view: View, view: View,
adapter: FlexibleAdapter<*> adapter: FlexibleAdapter<*>
) : BaseFlexibleViewHolder(view, adapter) { ) : FlexibleViewHolder(view, adapter) {
val binding = SourceListItemBinding.bind(view) private val binding = SourceListItemBinding.bind(view)
fun bind(item: MangaItem) { fun bind(item: MangaItem) {
// Update the title of the manga. // Update the title of the manga.

View File

@ -5,9 +5,9 @@ import androidx.recyclerview.widget.RecyclerView
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractHeaderItem import eu.davidea.flexibleadapter.items.AbstractHeaderItem
import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.flexibleadapter.items.IFlexible
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.SourceMainControllerCardHeaderBinding import eu.kanade.tachiyomi.databinding.SourceMainControllerCardHeaderBinding
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
/** /**
* Item that contains the selection header. * Item that contains the selection header.
@ -45,8 +45,9 @@ class SelectionHeader : AbstractHeaderItem<SelectionHeader.Holder>() {
// Intentionally empty // Intentionally empty
} }
class Holder(view: View, adapter: FlexibleAdapter</* SY --> */ IFlexible<RecyclerView.ViewHolder> /* SY <-- */>) : BaseFlexibleViewHolder(view, adapter) { class Holder(view: View, adapter: FlexibleAdapter</* SY --> */ IFlexible<RecyclerView.ViewHolder> /* SY <-- */>) : FlexibleViewHolder(view, adapter) {
val binding = SourceMainControllerCardHeaderBinding.bind(view) private val binding = SourceMainControllerCardHeaderBinding.bind(view)
init { init {
binding.title.text = view.context.getString(/* SY --> */ R.string.select_a_source_to_migrate_from /* SY <-- */) binding.title.text = view.context.getString(/* SY --> */ R.string.select_a_source_to_migrate_from /* SY <-- */)
} }

View File

@ -2,15 +2,15 @@ package eu.kanade.tachiyomi.ui.browse.migration.sources
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.SourceMainControllerCardItemBinding import eu.kanade.tachiyomi.databinding.SourceMainControllerCardItemBinding
import eu.kanade.tachiyomi.source.icon import eu.kanade.tachiyomi.source.icon
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
class SourceHolder(view: View, val adapter: SourceAdapter) : class SourceHolder(view: View, val adapter: SourceAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
val binding = SourceMainControllerCardItemBinding.bind(view) private val binding = SourceMainControllerCardItemBinding.bind(view)
// SY --> // SY -->
init { init {

View File

@ -2,14 +2,16 @@ package eu.kanade.tachiyomi.ui.browse.source
import android.view.View import android.view.View
import eu.davidea.flexibleadapter.FlexibleAdapter 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 eu.kanade.tachiyomi.util.system.LocaleHelper
import kotlinx.android.synthetic.main.source_main_controller_card_header.title
class LangHolder(view: View, adapter: FlexibleAdapter<*>) : class LangHolder(view: View, adapter: FlexibleAdapter<*>) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = SourceMainControllerCardHeaderBinding.bind(view)
fun bind(item: LangItem) { fun bind(item: LangItem) {
title.text = LocaleHelper.getSourceDisplayName(item.code, itemView.context) binding.title.text = LocaleHelper.getSourceDisplayName(item.code, itemView.context)
} }
} }

View File

@ -2,34 +2,32 @@ package eu.kanade.tachiyomi.ui.browse.source
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.SourceMainControllerCardItemBinding
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.source.icon 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.LocaleHelper
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.view.setVectorCompat 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 /* SY --> */, private val showLatest: Boolean, private val showPins: Boolean /* SY <-- */) : class SourceHolder(private val view: View, val adapter: SourceAdapter /* SY --> */, private val showLatest: Boolean, private val showPins: Boolean /* SY <-- */) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = SourceMainControllerCardItemBinding.bind(view)
init { init {
source_latest.setOnClickListener { binding.sourceLatest.setOnClickListener {
adapter.clickListener.onLatestClick(bindingAdapterPosition) adapter.clickListener.onLatestClick(bindingAdapterPosition)
} }
pin.setOnClickListener { binding.pin.setOnClickListener {
adapter.clickListener.onPinClick(bindingAdapterPosition) adapter.clickListener.onPinClick(bindingAdapterPosition)
} }
// SY --> // SY -->
if (!showLatest) { if (!showLatest) {
source_latest.isVisible = false binding.sourceLatest.isVisible = false
} }
// SY <-- // SY <--
} }
@ -37,26 +35,26 @@ class SourceHolder(private val view: View, val adapter: SourceAdapter /* SY -->
fun bind(item: SourceItem) { fun bind(item: SourceItem) {
val source = item.source val source = item.source
title.text = source.name binding.title.text = source.name
subtitle.isVisible = source !is LocalSource binding.subtitle.isVisible = source !is LocalSource
subtitle.text = LocaleHelper.getDisplayName(source.lang) binding.subtitle.text = LocaleHelper.getDisplayName(source.lang)
// Set source icon // Set source icon
itemView.post { itemView.post {
val icon = source.icon() val icon = source.icon()
when { when {
icon != null -> image.setImageDrawable(icon) icon != null -> binding.image.setImageDrawable(icon)
item.source.id == LocalSource.ID -> image.setImageResource(R.mipmap.ic_local_source) item.source.id == LocalSource.ID -> binding.image.setImageResource(R.mipmap.ic_local_source)
} }
} }
source_latest.isVisible = source.supportsLatest/* SY --> */ && showLatest /* SY <-- */ binding.sourceLatest.isVisible = source.supportsLatest/* SY --> */ && showLatest /* SY <-- */
pin.isVisible = showPins binding.pin.isVisible = showPins
if (item.isPinned) { 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 { } 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))
} }
} }
} }

View File

@ -8,14 +8,10 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding
import eu.kanade.tachiyomi.widget.StateImageViewTarget import eu.kanade.tachiyomi.widget.StateImageViewTarget
import exh.metadata.metadata.MangaDexSearchMetadata import exh.metadata.metadata.MangaDexSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.android.synthetic.main.source_comfortable_grid_item.card
import kotlinx.android.synthetic.main.source_comfortable_grid_item.local_text
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. * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
@ -28,6 +24,8 @@ import kotlinx.android.synthetic.main.source_comfortable_grid_item.title
class SourceComfortableGridHolder(private val view: View, private val adapter: FlexibleAdapter<*> /* SY --> */, private val hasTitle: Boolean /* SY <-- */) : class SourceComfortableGridHolder(private val view: View, private val adapter: FlexibleAdapter<*> /* SY --> */, private val hasTitle: Boolean /* SY <-- */) :
SourceGridHolder(view, adapter) { SourceGridHolder(view, adapter) {
private val binding = SourceComfortableGridItemBinding.bind(view)
/** /**
* Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
* holder with the given manga. * holder with the given manga.
@ -36,13 +34,13 @@ class SourceComfortableGridHolder(private val view: View, private val adapter: F
*/ */
override fun onSetValues(manga: Manga) { override fun onSetValues(manga: Manga) {
// Set manga title // Set manga title
title.text = manga.title binding.title.text = manga.title
// SY --> // SY -->
title.isVisible = hasTitle binding.title.isVisible = hasTitle
// SY <-- // SY <--
// Set alpha of thumbnail. // 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) setImage(manga)
} }
@ -51,8 +49,8 @@ class SourceComfortableGridHolder(private val view: View, private val adapter: F
override fun onSetMetadataValues(manga: Manga, metadata: RaisedSearchMetadata) { override fun onSetMetadataValues(manga: Manga, metadata: RaisedSearchMetadata) {
if (metadata is MangaDexSearchMetadata) { if (metadata is MangaDexSearchMetadata) {
metadata.follow_status?.let { metadata.follow_status?.let {
local_text.text = itemView.context.resources.getStringArray(R.array.md_follows_options).asList()[it] binding.localText.text = itemView.context.resources.getStringArray(R.array.md_follows_options).asList()[it]
local_text.isVisible = true binding.localText.isVisible = true
} }
} }
} }
@ -60,16 +58,16 @@ class SourceComfortableGridHolder(private val view: View, private val adapter: F
override fun setImage(manga: Manga) { override fun setImage(manga: Manga) {
// For rounded corners // 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()) { if (!manga.thumbnail_url.isNullOrEmpty()) {
GlideApp.with(view.context) GlideApp.with(view.context)
.load(manga.toMangaThumbnail()) .load(manga.toMangaThumbnail())
.diskCacheStrategy(DiskCacheStrategy.DATA) .diskCacheStrategy(DiskCacheStrategy.DATA)
.centerCrop() .centerCrop()
.placeholder(android.R.color.transparent) .placeholder(android.R.color.transparent)
.into(StateImageViewTarget(thumbnail, progress)) .into(StateImageViewTarget(binding.thumbnail, binding.progress))
} }
} }
} }

View File

@ -11,18 +11,12 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceEnhancedEhentaiListItemBinding
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import exh.metadata.MetadataUtil import exh.metadata.MetadataUtil
import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.util.SourceTagsUtil import exh.util.SourceTagsUtil
import kotlinx.android.synthetic.main.source_enhanced_ehentai_list_item.date_posted
import kotlinx.android.synthetic.main.source_enhanced_ehentai_list_item.genre
import kotlinx.android.synthetic.main.source_enhanced_ehentai_list_item.language
import kotlinx.android.synthetic.main.source_enhanced_ehentai_list_item.rating_bar
import kotlinx.android.synthetic.main.source_enhanced_ehentai_list_item.thumbnail
import kotlinx.android.synthetic.main.source_enhanced_ehentai_list_item.title
import kotlinx.android.synthetic.main.source_enhanced_ehentai_list_item.uploader
import java.util.Date import java.util.Date
/** /**
@ -36,6 +30,8 @@ import java.util.Date
class SourceEnhancedEHentaiListHolder(private val view: View, adapter: FlexibleAdapter<*>) : class SourceEnhancedEHentaiListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
SourceHolder(view, adapter) { SourceHolder(view, adapter) {
private val binding = SourceEnhancedEhentaiListItemBinding.bind(view)
private val favoriteColor = view.context.getResourceColor(R.attr.colorOnSurface, 0.38f) private val favoriteColor = view.context.getResourceColor(R.attr.colorOnSurface, 0.38f)
private val unfavoriteColor = view.context.getResourceColor(R.attr.colorOnSurface) private val unfavoriteColor = view.context.getResourceColor(R.attr.colorOnSurface)
@ -46,11 +42,11 @@ class SourceEnhancedEHentaiListHolder(private val view: View, adapter: FlexibleA
* @param manga the manga to bind. * @param manga the manga to bind.
*/ */
override fun onSetValues(manga: Manga) { override fun onSetValues(manga: Manga) {
title.text = manga.title binding.title.text = manga.title
title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor) binding.title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor)
// Set alpha of thumbnail. // 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) setImage(manga)
} }
@ -59,7 +55,7 @@ class SourceEnhancedEHentaiListHolder(private val view: View, adapter: FlexibleA
if (metadata !is EHentaiSearchMetadata) return if (metadata !is EHentaiSearchMetadata) return
if (metadata.uploader != null) { if (metadata.uploader != null) {
uploader.text = metadata.uploader binding.uploader.text = metadata.uploader
} }
val pair = when (metadata.genre) { val pair = when (metadata.genre) {
@ -77,18 +73,18 @@ class SourceEnhancedEHentaiListHolder(private val view: View, adapter: FlexibleA
} }
if (pair.first.isNotBlank()) { if (pair.first.isNotBlank()) {
genre.setBackgroundColor(Color.parseColor(pair.first)) binding.genre.setBackgroundColor(Color.parseColor(pair.first))
genre.text = view.context.getString(pair.second) binding.genre.text = view.context.getString(pair.second)
} else genre.text = metadata.genre } else binding.genre.text = metadata.genre
metadata.datePosted?.let { date_posted.text = MetadataUtil.EX_DATE_FORMAT.format(Date(it)) } metadata.datePosted?.let { binding.datePosted.text = MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }
metadata.averageRating?.let { rating_bar.rating = it.toFloat() } metadata.averageRating?.let { binding.ratingBar.rating = it.toFloat() }
val locale = SourceTagsUtil.getLocaleSourceUtil(metadata.tags.firstOrNull { it.namespace == "language" }?.name) val locale = SourceTagsUtil.getLocaleSourceUtil(metadata.tags.firstOrNull { it.namespace == "language" }?.name)
val pageCount = metadata.length val pageCount = metadata.length
language.text = if (locale != null && pageCount != null) { binding.language.text = if (locale != null && pageCount != null) {
view.resources.getQuantityString(R.plurals.browse_language_and_pages, pageCount, pageCount, locale.toLanguageTag().toUpperCase()) view.resources.getQuantityString(R.plurals.browse_language_and_pages, pageCount, pageCount, locale.toLanguageTag().toUpperCase())
} else if (pageCount != null) { } else if (pageCount != null) {
view.resources.getQuantityString(R.plurals.num_pages, pageCount, pageCount) view.resources.getQuantityString(R.plurals.num_pages, pageCount, pageCount)
@ -96,7 +92,7 @@ class SourceEnhancedEHentaiListHolder(private val view: View, adapter: FlexibleA
} }
override fun setImage(manga: Manga) { override fun setImage(manga: Manga) {
GlideApp.with(view.context).clear(thumbnail) GlideApp.with(view.context).clear(binding.thumbnail)
if (!manga.thumbnail_url.isNullOrEmpty()) { if (!manga.thumbnail_url.isNullOrEmpty()) {
val radius = view.context.resources.getDimensionPixelSize(R.dimen.card_radius) val radius = view.context.resources.getDimensionPixelSize(R.dimen.card_radius)
@ -107,7 +103,7 @@ class SourceEnhancedEHentaiListHolder(private val view: View, adapter: FlexibleA
.apply(requestOptions) .apply(requestOptions)
.dontAnimate() .dontAnimate()
.placeholder(android.R.color.transparent) .placeholder(android.R.color.transparent)
.into(thumbnail) .into(binding.thumbnail)
} }
} }
} }

View File

@ -8,14 +8,10 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding
import eu.kanade.tachiyomi.widget.StateImageViewTarget import eu.kanade.tachiyomi.widget.StateImageViewTarget
import exh.metadata.metadata.MangaDexSearchMetadata import exh.metadata.metadata.MangaDexSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.android.synthetic.main.source_compact_grid_item.card
import kotlinx.android.synthetic.main.source_compact_grid_item.local_text
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. * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
@ -28,6 +24,8 @@ import kotlinx.android.synthetic.main.source_compact_grid_item.title
open class SourceGridHolder(private val view: View, private val adapter: FlexibleAdapter<*>) : open class SourceGridHolder(private val view: View, private val adapter: FlexibleAdapter<*>) :
SourceHolder(view, adapter) { SourceHolder(view, adapter) {
private val binding = SourceComfortableGridItemBinding.bind(view)
/** /**
* Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
* holder with the given manga. * holder with the given manga.
@ -36,10 +34,10 @@ open class SourceGridHolder(private val view: View, private val adapter: Flexibl
*/ */
override fun onSetValues(manga: Manga) { override fun onSetValues(manga: Manga) {
// Set manga title // Set manga title
title.text = manga.title binding.title.text = manga.title
// Set alpha of thumbnail. // 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) setImage(manga)
} }
@ -48,8 +46,8 @@ open class SourceGridHolder(private val view: View, private val adapter: Flexibl
override fun onSetMetadataValues(manga: Manga, metadata: RaisedSearchMetadata) { override fun onSetMetadataValues(manga: Manga, metadata: RaisedSearchMetadata) {
if (metadata is MangaDexSearchMetadata) { if (metadata is MangaDexSearchMetadata) {
metadata.follow_status?.let { metadata.follow_status?.let {
local_text.text = itemView.context.resources.getStringArray(R.array.md_follows_options).asList()[it] binding.localText.text = itemView.context.resources.getStringArray(R.array.md_follows_options).asList()[it]
local_text.isVisible = true binding.localText.isVisible = true
} }
} }
} }
@ -57,16 +55,16 @@ open class SourceGridHolder(private val view: View, private val adapter: Flexibl
override fun setImage(manga: Manga) { override fun setImage(manga: Manga) {
// For rounded corners // 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()) { if (!manga.thumbnail_url.isNullOrEmpty()) {
GlideApp.with(view.context) GlideApp.with(view.context)
.load(manga.toMangaThumbnail()) .load(manga.toMangaThumbnail())
.diskCacheStrategy(DiskCacheStrategy.DATA) .diskCacheStrategy(DiskCacheStrategy.DATA)
.centerCrop() .centerCrop()
.placeholder(android.R.color.transparent) .placeholder(android.R.color.transparent)
.into(StateImageViewTarget(thumbnail, progress)) .into(StateImageViewTarget(binding.thumbnail, binding.progress))
} }
} }
} }

View File

@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.browse.source.browse
import android.view.View import android.view.View
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata
/** /**
@ -13,7 +13,7 @@ import exh.metadata.metadata.base.RaisedSearchMetadata
* @param adapter the adapter handling this holder. * @param adapter the adapter handling this holder.
*/ */
abstract class SourceHolder(view: View, adapter: FlexibleAdapter<*>) : abstract class SourceHolder(view: View, adapter: FlexibleAdapter<*>) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
/** /**
* Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this

View File

@ -11,12 +11,10 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceListItemBinding
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import exh.metadata.metadata.MangaDexSearchMetadata import exh.metadata.metadata.MangaDexSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata
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
/** /**
* Class used to hold the displayed data of a manga in the catalogue, like the cover or the title. * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
@ -29,6 +27,8 @@ import kotlinx.android.synthetic.main.source_list_item.title
class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) : class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
SourceHolder(view, adapter) { SourceHolder(view, adapter) {
private val binding = SourceListItemBinding.bind(view)
private val favoriteColor = view.context.getResourceColor(R.attr.colorOnSurface, 0.38f) private val favoriteColor = view.context.getResourceColor(R.attr.colorOnSurface, 0.38f)
private val unfavoriteColor = view.context.getResourceColor(R.attr.colorOnSurface) private val unfavoriteColor = view.context.getResourceColor(R.attr.colorOnSurface)
@ -39,11 +39,11 @@ class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
* @param manga the manga to bind. * @param manga the manga to bind.
*/ */
override fun onSetValues(manga: Manga) { override fun onSetValues(manga: Manga) {
title.text = manga.title binding.title.text = manga.title
title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor) binding.title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor)
// Set alpha of thumbnail. // 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) setImage(manga)
} }
@ -52,15 +52,15 @@ class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
override fun onSetMetadataValues(manga: Manga, metadata: RaisedSearchMetadata) { override fun onSetMetadataValues(manga: Manga, metadata: RaisedSearchMetadata) {
if (metadata is MangaDexSearchMetadata) { if (metadata is MangaDexSearchMetadata) {
metadata.follow_status?.let { metadata.follow_status?.let {
local_text.text = itemView.context.resources.getStringArray(R.array.md_follows_options).asList()[it] binding.localText.text = itemView.context.resources.getStringArray(R.array.md_follows_options).asList()[it]
local_text.isVisible = true binding.localText.isVisible = true
} }
} }
} }
// SY <-- // SY <--
override fun setImage(manga: Manga) { override fun setImage(manga: Manga) {
GlideApp.with(view.context).clear(thumbnail) GlideApp.with(view.context).clear(binding.thumbnail)
if (!manga.thumbnail_url.isNullOrEmpty()) { if (!manga.thumbnail_url.isNullOrEmpty()) {
val radius = view.context.resources.getDimensionPixelSize(R.dimen.card_radius) val radius = view.context.resources.getDimensionPixelSize(R.dimen.card_radius)
@ -71,7 +71,7 @@ class SourceListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
.apply(requestOptions) .apply(requestOptions)
.dontAnimate() .dontAnimate()
.placeholder(android.R.color.transparent) .placeholder(android.R.color.transparent)
.into(thumbnail) .into(binding.thumbnail)
} }
} }
} }

View File

@ -2,18 +2,17 @@ package eu.kanade.tachiyomi.ui.browse.source.globalsearch
import android.view.View import android.view.View
import com.bumptech.glide.load.engine.DiskCacheStrategy 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.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail 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 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) : class GlobalSearchCardHolder(view: View, adapter: GlobalSearchCardAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = GlobalSearchControllerCardItemBinding.bind(view)
init { init {
// Call onMangaClickListener when item is pressed. // Call onMangaClickListener when item is pressed.
@ -33,17 +32,17 @@ class GlobalSearchCardHolder(view: View, adapter: GlobalSearchCardAdapter) :
} }
fun bind(manga: Manga) { fun bind(manga: Manga) {
card.clipToOutline = true binding.card.clipToOutline = true
title.text = manga.title binding.title.text = manga.title
// Set alpha of thumbnail. // 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) setImage(manga)
} }
fun setImage(manga: Manga) { fun setImage(manga: Manga) {
GlideApp.with(itemView.context).clear(cover) GlideApp.with(itemView.context).clear(binding.cover)
if (!manga.thumbnail_url.isNullOrEmpty()) { if (!manga.thumbnail_url.isNullOrEmpty()) {
GlideApp.with(itemView.context) GlideApp.with(itemView.context)
.load(manga.toMangaThumbnail()) .load(manga.toMangaThumbnail())
@ -51,7 +50,7 @@ class GlobalSearchCardHolder(view: View, adapter: GlobalSearchCardAdapter) :
.centerCrop() .centerCrop()
.skipMemoryCache(true) .skipMemoryCache(true)
.placeholder(android.R.color.transparent) .placeholder(android.R.color.transparent)
.into(StateImageViewTarget(cover, progress)) .into(StateImageViewTarget(binding.cover, binding.progress))
} }
} }
} }

View File

@ -3,16 +3,11 @@ package eu.kanade.tachiyomi.ui.browse.source.globalsearch
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.databinding.GlobalSearchControllerCardBinding
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.util.system.LocaleHelper 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. * 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] * @param adapter instance of [GlobalSearchAdapter]
*/ */
class GlobalSearchHolder(view: View, val adapter: 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. * Adapter containing manga from search results.
@ -32,10 +29,10 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
init { init {
// Set layout horizontal. // Set layout horizontal.
recycler.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.HORIZONTAL, false) binding.recycler.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.HORIZONTAL, false)
recycler.adapter = mangaAdapter binding.recycler.adapter = mangaAdapter
title_wrapper.setOnClickListener { binding.titleWrapper.setOnClickListener {
adapter.getItem(bindingAdapterPosition)?.let { adapter.getItem(bindingAdapterPosition)?.let {
adapter.titleClickListener.onTitleClick(it.source) adapter.titleClickListener.onTitleClick(it.source)
} }
@ -53,21 +50,21 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
val titlePrefix = if (item.highlighted) "" else "" val titlePrefix = if (item.highlighted) "" else ""
title.text = titlePrefix + source.name binding.title.text = titlePrefix + source.name
subtitle.isVisible = source !is LocalSource binding.subtitle.isVisible = source !is LocalSource
subtitle.text = LocaleHelper.getDisplayName(source.lang) binding.subtitle.text = LocaleHelper.getDisplayName(source.lang)
when { when {
results == null -> { results == null -> {
progress.isVisible = true binding.progress.isVisible = true
showResultsHolder() showResultsHolder()
} }
results.isEmpty() -> { results.isEmpty() -> {
progress.isVisible = false binding.progress.isVisible = false
showNoResults() showNoResults()
} }
else -> { else -> {
progress.isVisible = false binding.progress.isVisible = false
showResultsHolder() showResultsHolder()
} }
} }
@ -104,10 +101,10 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
} }
private fun showResultsHolder() { private fun showResultsHolder() {
no_results_found.isVisible = false binding.noResultsFound.isVisible = false
} }
private fun showNoResults() { private fun showNoResults() {
no_results_found.isVisible = true binding.noResultsFound.isVisible = true
} }
} }

View File

@ -2,18 +2,17 @@ package eu.kanade.tachiyomi.ui.browse.source.index
import android.view.View import android.view.View
import com.bumptech.glide.load.engine.DiskCacheStrategy 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.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail 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 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 IndexCardHolder(view: View, adapter: IndexCardAdapter) : class IndexCardHolder(view: View, adapter: IndexCardAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = GlobalSearchControllerCardItemBinding.bind(view)
init { init {
// Call onMangaClickListener when item is pressed. // Call onMangaClickListener when item is pressed.
@ -33,17 +32,17 @@ class IndexCardHolder(view: View, adapter: IndexCardAdapter) :
} }
fun bind(manga: Manga) { fun bind(manga: Manga) {
card.clipToOutline = true binding.card.clipToOutline = true
title.text = manga.title binding.title.text = manga.title
// Set alpha of thumbnail. // 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) setImage(manga)
} }
fun setImage(manga: Manga) { fun setImage(manga: Manga) {
GlideApp.with(itemView.context).clear(cover) GlideApp.with(itemView.context).clear(binding.cover)
if (!manga.thumbnail_url.isNullOrEmpty()) { if (!manga.thumbnail_url.isNullOrEmpty()) {
GlideApp.with(itemView.context) GlideApp.with(itemView.context)
.load(manga.toMangaThumbnail()) .load(manga.toMangaThumbnail())
@ -51,7 +50,7 @@ class IndexCardHolder(view: View, adapter: IndexCardAdapter) :
.centerCrop() .centerCrop()
.skipMemoryCache(true) .skipMemoryCache(true)
.placeholder(android.R.color.transparent) .placeholder(android.R.color.transparent)
.into(StateImageViewTarget(cover, progress)) .into(StateImageViewTarget(binding.cover, binding.progress))
} }
} }
} }

View File

@ -1,10 +1,9 @@
package eu.kanade.tachiyomi.ui.category package eu.kanade.tachiyomi.ui.category
import android.view.View import android.view.View
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.databinding.CategoriesItemBinding
import kotlinx.android.synthetic.main.categories_item.reorder
import kotlinx.android.synthetic.main.categories_item.title
/** /**
* Holder used to display category items. * 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 view The view used by category items.
* @param adapter The adapter containing this holder. * @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 { init {
setDragHandleView(reorder) setDragHandleView(binding.reorder)
} }
/** /**
@ -24,7 +25,7 @@ class CategoryHolder(view: View, val adapter: CategoryAdapter) : BaseFlexibleVie
* @param category The category to bind. * @param category The category to bind.
*/ */
fun bind(category: Category) { fun bind(category: Category) {
title.text = category.name binding.title.text = category.name
} }
/** /**

View File

@ -2,9 +2,8 @@ package eu.kanade.tachiyomi.ui.category.biometric
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import kotlinx.android.synthetic.main.categories_item.reorder import eu.kanade.tachiyomi.databinding.CategoriesItemBinding
import kotlinx.android.synthetic.main.categories_item.title
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
/** /**
@ -13,7 +12,10 @@ import kotlin.time.ExperimentalTime
* @param view The view used by category items. * @param view The view used by category items.
* @param adapter The adapter containing this holder. * @param adapter The adapter containing this holder.
*/ */
class BiometricTimesHolder(view: View, val adapter: BiometricTimesAdapter) : BaseFlexibleViewHolder(view, adapter) { class BiometricTimesHolder(view: View, val adapter: BiometricTimesAdapter) : FlexibleViewHolder(view, adapter) {
private val binding = CategoriesItemBinding.bind(view)
/** /**
* Binds this holder with the given category. * Binds this holder with the given category.
* *
@ -22,7 +24,7 @@ class BiometricTimesHolder(view: View, val adapter: BiometricTimesAdapter) : Bas
@OptIn(ExperimentalTime::class) @OptIn(ExperimentalTime::class)
fun bind(timeRange: TimeRange) { fun bind(timeRange: TimeRange) {
// Set capitalized title. // Set capitalized title.
title.text = timeRange.getFormattedString(itemView.context) binding.title.text = timeRange.getFormattedString(itemView.context)
reorder.isVisible = false binding.reorder.isVisible = false
} }
} }

View File

@ -1,9 +1,8 @@
package eu.kanade.tachiyomi.ui.category.genre package eu.kanade.tachiyomi.ui.category.genre
import android.view.View import android.view.View
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import kotlinx.android.synthetic.main.categories_item.reorder import eu.kanade.tachiyomi.databinding.CategoriesItemBinding
import kotlinx.android.synthetic.main.categories_item.title
/** /**
* Holder used to display category items. * Holder used to display category items.
@ -11,10 +10,12 @@ import kotlinx.android.synthetic.main.categories_item.title
* @param view The view used by category items. * @param view The view used by category items.
* @param adapter The adapter containing this holder. * @param adapter The adapter containing this holder.
*/ */
class SortTagHolder(view: View, val adapter: SortTagAdapter) : BaseFlexibleViewHolder(view, adapter) { class SortTagHolder(view: View, val adapter: SortTagAdapter) : FlexibleViewHolder(view, adapter) {
private val binding = CategoriesItemBinding.bind(view)
init { init {
setDragHandleView(reorder) setDragHandleView(binding.reorder)
} }
/** /**
@ -23,7 +24,7 @@ class SortTagHolder(view: View, val adapter: SortTagAdapter) : BaseFlexibleViewH
* @param tag The tag to bind. * @param tag The tag to bind.
*/ */
fun bind(tag: String) { fun bind(tag: String) {
title.text = tag binding.title.text = tag
} }
/** /**

View File

@ -2,9 +2,8 @@ package eu.kanade.tachiyomi.ui.category.sources
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import kotlinx.android.synthetic.main.categories_item.reorder import eu.kanade.tachiyomi.databinding.CategoriesItemBinding
import kotlinx.android.synthetic.main.categories_item.title
/** /**
* Holder used to display category items. * Holder used to display category items.
@ -12,7 +11,10 @@ import kotlinx.android.synthetic.main.categories_item.title
* @param view The view used by category items. * @param view The view used by category items.
* @param adapter The adapter containing this holder. * @param adapter The adapter containing this holder.
*/ */
class SourceCategoryHolder(view: View, val adapter: SourceCategoryAdapter) : BaseFlexibleViewHolder(view, adapter) { class SourceCategoryHolder(view: View, val adapter: SourceCategoryAdapter) : FlexibleViewHolder(view, adapter) {
private val binding = CategoriesItemBinding.bind(view)
/** /**
* Binds this holder with the given category. * Binds this holder with the given category.
* *
@ -20,7 +22,7 @@ class SourceCategoryHolder(view: View, val adapter: SourceCategoryAdapter) : Bas
*/ */
fun bind(category: String) { fun bind(category: String) {
// Set capitalized title. // Set capitalized title.
title.text = category binding.title.text = category
reorder.isVisible = false binding.reorder.isVisible = false
} }
} }

View File

@ -1,16 +1,11 @@
package eu.kanade.tachiyomi.ui.download package eu.kanade.tachiyomi.ui.download
import android.view.View import android.view.View
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.model.Download 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 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. * 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. * @constructor creates a new download holder.
*/ */
class DownloadHolder(private val view: View, val adapter: DownloadAdapter) : class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = DownloadItemBinding.bind(view)
init { init {
setDragHandleView(reorder) setDragHandleView(binding.reorder)
menu.setOnClickListener { it.post { showPopupMenu(it) } } binding.menu.setOnClickListener { it.post { showPopupMenu(it) } }
} }
private lateinit var download: Download private lateinit var download: Download
@ -37,19 +34,19 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
fun bind(download: Download) { fun bind(download: Download) {
this.download = download this.download = download
// Update the chapter name. // Update the chapter name.
chapter_title.text = download.chapter.name binding.chapterTitle.text = download.chapter.name
// Update the manga title // 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 // Update the progress bar and the number of downloaded pages
val pages = download.pages val pages = download.pages
if (pages == null) { if (pages == null) {
download_progress.progress = 0 binding.downloadProgress.progress = 0
download_progress.max = 1 binding.downloadProgress.max = 1
download_progress_text.text = "" binding.downloadProgressText.text = ""
} else { } else {
download_progress.max = pages.size * 100 binding.downloadProgress.max = pages.size * 100
notifyProgress() notifyProgress()
notifyDownloadedPages() notifyDownloadedPages()
} }
@ -60,10 +57,10 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
*/ */
fun notifyProgress() { fun notifyProgress() {
val pages = download.pages ?: return val pages = download.pages ?: return
if (download_progress.max == 1) { if (binding.downloadProgress.max == 1) {
download_progress.max = pages.size * 100 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() { fun notifyDownloadedPages() {
val pages = download.pages ?: return 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) { override fun onItemReleased(position: Int) {

View File

@ -8,15 +8,8 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding
import eu.kanade.tachiyomi.util.isLocal 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.play_layout
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
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.android.view.clicks import reactivecircus.flowbinding.android.view.clicks
@ -38,9 +31,11 @@ class LibraryComfortableGridHolder(
// SY <-- // SY <--
) : LibraryCompactGridHolder(view, adapter) { ) : LibraryCompactGridHolder(view, adapter) {
private val binding = SourceComfortableGridItemBinding.bind(view)
// SY --> // SY -->
init { init {
play_layout.clicks() binding.playLayout.clicks()
.onEach { .onEach {
playButtonClicked() playButtonClicked()
} }
@ -59,41 +54,41 @@ class LibraryComfortableGridHolder(
manga = item.manga manga = item.manga
// SY <-- // SY <--
// Update the title of the manga. // Update the title of the manga.
title.text = item.manga.title binding.title.text = item.manga.title
// SY --> // SY -->
title.isVisible = hasTitle binding.title.isVisible = hasTitle
// SY <-- // SY <--
// For rounded corners // For rounded corners
badges.clipToOutline = true binding.badges.clipToOutline = true
// Update the unread count and its visibility. // Update the unread count and its visibility.
with(unread_text) { with(binding.unreadText) {
isVisible = item.unreadCount > 0 isVisible = item.unreadCount > 0
text = item.unreadCount.toString() text = item.unreadCount.toString()
} }
// Update the download count and its visibility. // Update the download count and its visibility.
with(download_text) { with(binding.downloadText) {
isVisible = item.downloadCount > 0 isVisible = item.downloadCount > 0
text = item.downloadCount.toString() text = item.downloadCount.toString()
} }
// set local visibility if its local manga // set local visibility if its local manga
local_text.isVisible = item.manga.isLocal() binding.localText.isVisible = item.manga.isLocal()
// SY --> // SY -->
play_layout.isVisible = (item.manga.unread > 0 && item.startReadingButton) binding.playLayout.isVisible = (item.manga.unread > 0 && item.startReadingButton)
// SY <-- // SY <--
// For rounded corners // For rounded corners
card.clipToOutline = true binding.card.clipToOutline = true
// Update the cover. // Update the cover.
GlideApp.with(view.context).clear(thumbnail) GlideApp.with(view.context).clear(binding.thumbnail)
GlideApp.with(view.context) GlideApp.with(view.context)
.load(item.manga.toMangaThumbnail()) .load(item.manga.toMangaThumbnail())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.centerCrop() .centerCrop()
.dontAnimate() .dontAnimate()
.into(thumbnail) .into(binding.thumbnail)
} }
} }

View File

@ -9,15 +9,8 @@ import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding
import eu.kanade.tachiyomi.util.isLocal 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.play_layout
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
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.android.view.clicks import reactivecircus.flowbinding.android.view.clicks
@ -38,11 +31,13 @@ open class LibraryCompactGridHolder(
// SY <-- // SY <--
) : LibraryHolder(view, adapter) { ) : LibraryHolder(view, adapter) {
private val binding = SourceComfortableGridItemBinding.bind(view)
var manga: Manga? = null var manga: Manga? = null
// SY --> // SY -->
init { init {
play_layout.clicks() binding.playLayout.clicks()
.onEach { .onEach {
playButtonClicked() playButtonClicked()
} }
@ -61,39 +56,39 @@ open class LibraryCompactGridHolder(
manga = item.manga manga = item.manga
// SY <-- // SY <--
// Update the title of the manga. // Update the title of the manga.
title.text = item.manga.title binding.title.text = item.manga.title
// For rounded corners // For rounded corners
badges.clipToOutline = true binding.badges.clipToOutline = true
// Update the unread count and its visibility. // Update the unread count and its visibility.
with(unread_text) { with(binding.unreadText) {
isVisible = item.unreadCount > 0 isVisible = item.unreadCount > 0
text = item.unreadCount.toString() text = item.unreadCount.toString()
} }
// Update the download count and its visibility. // Update the download count and its visibility.
with(download_text) { with(binding.downloadText) {
isVisible = item.downloadCount > 0 isVisible = item.downloadCount > 0
text = item.downloadCount.toString() text = item.downloadCount.toString()
} }
// set local visibility if its local manga // set local visibility if its local manga
local_text.isVisible = item.manga.isLocal() binding.localText.isVisible = item.manga.isLocal()
// SY --> // SY -->
play_layout.isVisible = (item.manga.unread > 0 && item.startReadingButton) binding.playLayout.isVisible = (item.manga.unread > 0 && item.startReadingButton)
// SY <-- // SY <--
// For rounded corners // For rounded corners
card.clipToOutline = true binding.card.clipToOutline = true
// Update the cover. // Update the cover.
GlideApp.with(view.context).clear(thumbnail) GlideApp.with(view.context).clear(binding.thumbnail)
GlideApp.with(view.context) GlideApp.with(view.context)
.load(item.manga.toMangaThumbnail()) .load(item.manga.toMangaThumbnail())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.centerCrop() .centerCrop()
.dontAnimate() .dontAnimate()
.into(thumbnail) .into(binding.thumbnail)
} }
// SY --> // SY -->

View File

@ -4,7 +4,7 @@ import android.view.View
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.flexibleadapter.items.IFlexible
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. * Generic class used to hold the displayed data of a manga in the library.
@ -18,7 +18,7 @@ abstract class LibraryHolder(
// SY --> // SY -->
val adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>> val adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
// SY <-- // SY <--
) : BaseFlexibleViewHolder(view, adapter) { ) : FlexibleViewHolder(view, adapter) {
/** /**
* Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this

View File

@ -12,13 +12,8 @@ import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.SourceListItemBinding
import eu.kanade.tachiyomi.util.isLocal 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. * Class used to hold the displayed data of a manga in the library, like the cover or the title.
@ -37,6 +32,8 @@ class LibraryListHolder(
// SY <-- // SY <--
) : LibraryHolder(view, adapter) { ) : LibraryHolder(view, adapter) {
private val binding = SourceListItemBinding.bind(view)
/** /**
* Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this
* holder with the given manga. * holder with the given manga.
@ -45,32 +42,32 @@ class LibraryListHolder(
*/ */
override fun onSetValues(item: LibraryItem) { override fun onSetValues(item: LibraryItem) {
// Update the title of the manga. // Update the title of the manga.
title.text = item.manga.title binding.title.text = item.manga.title
// For rounded corners // For rounded corners
badges.clipToOutline = true binding.badges.clipToOutline = true
// Update the unread count and its visibility. // Update the unread count and its visibility.
with(unread_text) { with(binding.unreadText) {
isVisible = item.unreadCount > 0 isVisible = item.unreadCount > 0
text = item.unreadCount.toString() text = item.unreadCount.toString()
} }
// Update the download count and its visibility. // Update the download count and its visibility.
with(download_text) { with(binding.downloadText) {
isVisible = item.downloadCount > 0 isVisible = item.downloadCount > 0
text = "${item.downloadCount}" text = "${item.downloadCount}"
} }
// show local text badge if local manga // 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 // Create thumbnail onclick to simulate long click
thumbnail.setOnClickListener { binding.thumbnail.setOnClickListener {
// Simulate long click on this view to enter selection mode // Simulate long click on this view to enter selection mode
onLongClick(itemView) onLongClick(itemView)
} }
// Update the cover. // 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 radius = view.context.resources.getDimensionPixelSize(R.dimen.card_radius)
val requestOptions = RequestOptions().transform(CenterCrop(), RoundedCorners(radius)) val requestOptions = RequestOptions().transform(CenterCrop(), RoundedCorners(radius))
@ -79,6 +76,6 @@ class LibraryListHolder(
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.apply(requestOptions) .apply(requestOptions)
.dontAnimate() .dontAnimate()
.into(thumbnail) .into(binding.thumbnail)
} }
} }

View File

@ -480,8 +480,8 @@ class MainActivity : BaseActivity<MainActivityBinding>() {
} }
/** /**
* Used to manually offset a view within the activity's child views that might be cut off due to the * Used to manually offset a view within the activity's child views that might be cut off due to
* collapsing AppBarLayout. * the collapsing AppBarLayout.
*/ */
fun fixViewToBottom(view: View) { fun fixViewToBottom(view: View) {
binding.appbar.addOnOffsetChangedListener( binding.appbar.addOnOffsetChangedListener(

View File

@ -5,28 +5,27 @@ import android.text.SpannableStringBuilder
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.databinding.ChaptersItemBinding
import exh.EH_SOURCE_ID import exh.EH_SOURCE_ID
import exh.EXH_SOURCE_ID import exh.EXH_SOURCE_ID
import exh.metadata.MetadataUtil import exh.metadata.MetadataUtil
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 java.util.Date import java.util.Date
class ChapterHolder( class ChapterHolder(
view: View, view: View,
private val adapter: ChaptersAdapter private val adapter: ChaptersAdapter
) : BaseFlexibleViewHolder(view, adapter) { ) : FlexibleViewHolder(view, adapter) {
private val binding = ChaptersItemBinding.bind(view)
fun bind(item: ChapterItem, manga: Manga) { fun bind(item: ChapterItem, manga: Manga) {
val chapter = item.chapter val chapter = item.chapter
chapter_title.text = when (manga.displayMode) { binding.chapterTitle.text = when (manga.displayMode) {
Manga.DISPLAY_NUMBER -> { Manga.DISPLAY_NUMBER -> {
val number = adapter.decimalFormat.format(chapter.chapter_number.toDouble()) val number = adapter.decimalFormat.format(chapter.chapter_number.toDouble())
itemView.context.getString(R.string.display_mode_chapter, number) itemView.context.getString(R.string.display_mode_chapter, number)
@ -40,16 +39,16 @@ class ChapterHolder(
chapter.bookmark -> adapter.bookmarkedColor chapter.bookmark -> adapter.bookmarkedColor
else -> adapter.unreadColor else -> adapter.unreadColor
} }
chapter_title.setTextColor(chapterTitleColor) binding.chapterTitle.setTextColor(chapterTitleColor)
val chapterDescriptionColor = when { val chapterDescriptionColor = when {
chapter.read -> adapter.readColor chapter.read -> adapter.readColor
chapter.bookmark -> adapter.bookmarkedColor chapter.bookmark -> adapter.bookmarkedColor
else -> adapter.unreadColorSecondary else -> adapter.unreadColorSecondary
} }
chapter_description.setTextColor(chapterDescriptionColor) binding.chapterDescription.setTextColor(chapterDescriptionColor)
bookmark_icon.isVisible = chapter.bookmark binding.bookmarkIcon.isVisible = chapter.bookmark
val descriptions = mutableListOf<CharSequence>() val descriptions = mutableListOf<CharSequence>()
@ -70,15 +69,15 @@ class ChapterHolder(
} }
if (descriptions.isNotEmpty()) { if (descriptions.isNotEmpty()) {
chapter_description.text = descriptions.joinTo(SpannableStringBuilder(), "") binding.chapterDescription.text = descriptions.joinTo(SpannableStringBuilder(), "")
} else { } else {
chapter_description.text = "" binding.chapterDescription.text = ""
} }
notifyStatus(item.status) notifyStatus(item.status)
} }
fun notifyStatus(status: Int) = with(download_text) { fun notifyStatus(status: Int) = with(binding.downloadText) {
when (status) { when (status) {
Download.QUEUE -> setText(R.string.chapter_queued) Download.QUEUE -> setText(R.string.chapter_queued)
Download.DOWNLOADING -> setText(R.string.chapter_downloading) Download.DOWNLOADING -> setText(R.string.chapter_downloading)

View File

@ -2,18 +2,18 @@ package eu.kanade.tachiyomi.ui.manga.merged
import android.view.View import android.view.View
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.data.glide.toMangaThumbnail
import eu.kanade.tachiyomi.databinding.EditMergedSettingsItemBinding import eu.kanade.tachiyomi.databinding.EditMergedSettingsItemBinding
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import exh.merged.sql.models.MergedMangaReference import exh.merged.sql.models.MergedMangaReference
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
class EditMergedMangaHolder(view: View, val adapter: EditMergedMangaAdapter) : BaseFlexibleViewHolder(view, adapter) { class EditMergedMangaHolder(view: View, val adapter: EditMergedMangaAdapter) : FlexibleViewHolder(view, adapter) {
lateinit var reference: MergedMangaReference lateinit var reference: MergedMangaReference
var binding = EditMergedSettingsItemBinding.bind(view) var binding = EditMergedSettingsItemBinding.bind(view)

View File

@ -2,18 +2,13 @@ package eu.kanade.tachiyomi.ui.recent.history
import android.view.View import android.view.View
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail 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 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 import java.util.Date
/** /**
@ -28,18 +23,20 @@ import java.util.Date
class HistoryHolder( class HistoryHolder(
view: View, view: View,
val adapter: HistoryAdapter val adapter: HistoryAdapter
) : BaseFlexibleViewHolder(view, adapter) { ) : FlexibleViewHolder(view, adapter) {
private val binding = HistoryItemBinding.bind(view)
init { init {
holder.setOnClickListener { binding.holder.setOnClickListener {
adapter.itemClickListener.onItemClick(bindingAdapterPosition) adapter.itemClickListener.onItemClick(bindingAdapterPosition)
} }
remove.setOnClickListener { binding.remove.setOnClickListener {
adapter.removeClickListener.onRemoveClick(bindingAdapterPosition) adapter.removeClickListener.onRemoveClick(bindingAdapterPosition)
} }
resume.setOnClickListener { binding.resume.setOnClickListener {
adapter.resumeClickListener.onResumeClick(bindingAdapterPosition) adapter.resumeClickListener.onResumeClick(bindingAdapterPosition)
} }
} }
@ -54,26 +51,26 @@ class HistoryHolder(
val (manga, chapter, history) = item val (manga, chapter, history) = item
// Set manga title // Set manga title
manga_title.text = manga.title binding.mangaTitle.text = manga.title
// Set chapter number + timestamp // Set chapter number + timestamp
if (chapter.chapter_number > -1f) { if (chapter.chapter_number > -1f) {
val formattedNumber = adapter.decimalFormat.format(chapter.chapter_number.toDouble()) 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, R.string.recent_manga_time,
formattedNumber, formattedNumber,
Date(history.last_read).toTimestampString() Date(history.last_read).toTimestampString()
) )
} else { } else {
manga_subtitle.text = Date(history.last_read).toTimestampString() binding.mangaSubtitle.text = Date(history.last_read).toTimestampString()
} }
// Set cover // Set cover
GlideApp.with(itemView.context).clear(cover) GlideApp.with(itemView.context).clear(binding.cover)
GlideApp.with(itemView.context) GlideApp.with(itemView.context)
.load(manga.toMangaThumbnail()) .load(manga.toMangaThumbnail())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.centerCrop() .centerCrop()
.into(cover) .into(binding.cover)
} }
} }

View File

@ -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.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.data.glide.toMangaThumbnail 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 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 * 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. * @constructor creates a new recent chapter holder.
*/ */
class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter) : 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 readColor = view.context.getResourceColor(R.attr.colorOnSurface, 0.38f)
private var unreadColor = view.context.getResourceColor(R.attr.colorOnSurface) 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 private var item: UpdatesItem? = null
init { init {
manga_cover.setOnClickListener { binding.mangaCover.setOnClickListener {
adapter.coverClickListener.onCoverClick(bindingAdapterPosition) adapter.coverClickListener.onCoverClick(bindingAdapterPosition)
} }
} }
@ -52,25 +51,25 @@ class UpdatesHolder(private val view: View, private val adapter: UpdatesAdapter)
this.item = item this.item = item
// Set chapter title // Set chapter title
chapter_title.text = item.chapter.name binding.chapterTitle.text = item.chapter.name
// Set manga title // Set manga title
manga_title.text = item.manga.title binding.mangaTitle.text = item.manga.title
// Check if chapter is read and set correct color // Check if chapter is read and set correct color
if (item.chapter.read) { if (item.chapter.read) {
chapter_title.setTextColor(readColor) binding.chapterTitle.setTextColor(readColor)
manga_title.setTextColor(readColor) binding.mangaTitle.setTextColor(readColor)
} else { } else {
chapter_title.setTextColor(unreadColor) binding.chapterTitle.setTextColor(unreadColor)
manga_title.setTextColor(unreadColor) binding.mangaTitle.setTextColor(unreadColor)
} }
// Set chapter status // Set chapter status
notifyStatus(item.status) notifyStatus(item.status)
// Set cover // 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 radius = itemView.context.resources.getDimensionPixelSize(R.dimen.card_radius)
val requestOptions = RequestOptions().transform(CenterCrop(), RoundedCorners(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) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.apply(requestOptions) .apply(requestOptions)
.dontAnimate() .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 * @param status download status
*/ */
fun notifyStatus(status: Int) = with(download_text) { fun notifyStatus(status: Int) = with(binding.downloadText) {
when (status) { when (status) {
Download.QUEUE -> setText(R.string.chapter_queued) Download.QUEUE -> setText(R.string.chapter_queued)
Download.DOWNLOADING -> setText(R.string.chapter_downloading) Download.DOWNLOADING -> setText(R.string.chapter_downloading)

View File

@ -1,11 +1,8 @@
package eu.kanade.tachiyomi.ui.setting.search package eu.kanade.tachiyomi.ui.setting.search
import android.view.View import android.view.View
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import kotlinx.android.synthetic.main.settings_search_controller_card.search_result_pref_breadcrumb import eu.kanade.tachiyomi.databinding.SettingsSearchControllerCardBinding
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 kotlin.reflect.full.createInstance import kotlin.reflect.full.createInstance
/** /**
@ -15,10 +12,12 @@ import kotlin.reflect.full.createInstance
* @param adapter instance of [SettingsSearchAdapter] * @param adapter instance of [SettingsSearchAdapter]
*/ */
class SettingsSearchHolder(view: View, val adapter: SettingsSearchAdapter) : class SettingsSearchHolder(view: View, val adapter: SettingsSearchAdapter) :
BaseFlexibleViewHolder(view, adapter) { FlexibleViewHolder(view, adapter) {
private val binding = SettingsSearchControllerCardBinding.bind(view)
init { init {
title_wrapper.setOnClickListener { binding.titleWrapper.setOnClickListener {
adapter.getItem(bindingAdapterPosition)?.let { adapter.getItem(bindingAdapterPosition)?.let {
val ctrl = it.settingsSearchResult.searchController::class.createInstance() val ctrl = it.settingsSearchResult.searchController::class.createInstance()
ctrl.preferenceKey = it.settingsSearchResult.key ctrl.preferenceKey = it.settingsSearchResult.key
@ -35,8 +34,8 @@ class SettingsSearchHolder(view: View, val adapter: SettingsSearchAdapter) :
* @param item item of card. * @param item item of card.
*/ */
fun bind(item: SettingsSearchItem) { fun bind(item: SettingsSearchItem) {
search_result_pref_title.text = item.settingsSearchResult.title binding.searchResultPrefTitle.text = item.settingsSearchResult.title
search_result_pref_summary.text = item.settingsSearchResult.summary binding.searchResultPrefSummary.text = item.settingsSearchResult.summary
search_result_pref_breadcrumb.text = item.settingsSearchResult.breadcrumb binding.searchResultPrefBreadcrumb.text = item.settingsSearchResult.breadcrumb
} }
} }