mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Add view caching to view holders
This commit is contained in:
		@@ -0,0 +1,15 @@
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.holder
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import android.view.View
 | 
			
		||||
import kotlinx.android.extensions.LayoutContainer
 | 
			
		||||
 | 
			
		||||
abstract class BaseViewHolder(view: View) : RecyclerView.ViewHolder(view), LayoutContainer {
 | 
			
		||||
 | 
			
		||||
    override val containerView: View?
 | 
			
		||||
        get() = itemView
 | 
			
		||||
}
 | 
			
		||||
@@ -2,15 +2,16 @@ package eu.kanade.tachiyomi.ui.catalogue
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_main_controller_card.view.*
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_main_controller_card.*
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
class LangHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter, true) {
 | 
			
		||||
class LangHolder(view: View, adapter: FlexibleAdapter<*>) :
 | 
			
		||||
        BaseFlexibleViewHolder(view, adapter, true) {
 | 
			
		||||
 | 
			
		||||
    fun bind(item: LangItem) {
 | 
			
		||||
        itemView.title.text = when {
 | 
			
		||||
        title.text = when {
 | 
			
		||||
            item.code == "" -> itemView.context.getString(R.string.other_source)
 | 
			
		||||
            else -> {
 | 
			
		||||
                val locale = Locale(item.code)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,53 +3,51 @@ package eu.kanade.tachiyomi.ui.catalogue
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.online.LoginSource
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.util.dpToPx
 | 
			
		||||
import eu.kanade.tachiyomi.util.getRound
 | 
			
		||||
import eu.kanade.tachiyomi.util.gone
 | 
			
		||||
import eu.kanade.tachiyomi.util.visible
 | 
			
		||||
import io.github.mthli.slice.Slice
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_main_controller_card_item.*
 | 
			
		||||
 | 
			
		||||
class SourceHolder(view: View, adapter: CatalogueAdapter) : FlexibleViewHolder(view, adapter) {
 | 
			
		||||
class SourceHolder(view: View, adapter: CatalogueAdapter) : BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    private val slice = Slice(itemView.card).apply {
 | 
			
		||||
    private val slice = Slice(card).apply {
 | 
			
		||||
        setColor(adapter.cardBackground)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        itemView.source_browse.setOnClickListener {
 | 
			
		||||
        source_browse.setOnClickListener {
 | 
			
		||||
            adapter.browseClickListener.onBrowseClick(adapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        itemView.source_latest.setOnClickListener {
 | 
			
		||||
        source_latest.setOnClickListener {
 | 
			
		||||
            adapter.latestClickListener.onLatestClick(adapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun bind(item: SourceItem) {
 | 
			
		||||
        val source = item.source
 | 
			
		||||
        with(itemView) {
 | 
			
		||||
            setCardEdges(item)
 | 
			
		||||
        setCardEdges(item)
 | 
			
		||||
 | 
			
		||||
            // Set source name
 | 
			
		||||
            title.text = source.name
 | 
			
		||||
        // Set source name
 | 
			
		||||
        title.text = source.name
 | 
			
		||||
 | 
			
		||||
            // Set circle letter image.
 | 
			
		||||
            post {
 | 
			
		||||
                image.setImageDrawable(image.getRound(source.name.take(1).toUpperCase(),false))
 | 
			
		||||
            }
 | 
			
		||||
        // Set circle letter image.
 | 
			
		||||
        itemView.post {
 | 
			
		||||
            image.setImageDrawable(image.getRound(source.name.take(1).toUpperCase(),false))
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            // If source is login, show only login option
 | 
			
		||||
            if (source is LoginSource && !source.isLogged()) {
 | 
			
		||||
                source_browse.setText(R.string.login)
 | 
			
		||||
                source_latest.gone()
 | 
			
		||||
            } else {
 | 
			
		||||
                source_browse.setText(R.string.browse)
 | 
			
		||||
                source_latest.visible()
 | 
			
		||||
            }
 | 
			
		||||
        // If source is login, show only login option
 | 
			
		||||
        if (source is LoginSource && !source.isLogged()) {
 | 
			
		||||
            source_browse.setText(R.string.login)
 | 
			
		||||
            source_latest.gone()
 | 
			
		||||
        } else {
 | 
			
		||||
            source_browse.setText(R.string.browse)
 | 
			
		||||
            source_latest.visible()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -94,7 +92,7 @@ class SourceHolder(view: View, adapter: CatalogueAdapter) : FlexibleViewHolder(v
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setMargins(left: Int, top: Int, right: Int, bottom: Int) {
 | 
			
		||||
        val v = itemView.card
 | 
			
		||||
        val v = card
 | 
			
		||||
        if (v.layoutParams is ViewGroup.MarginLayoutParams) {
 | 
			
		||||
            val p = v.layoutParams as ViewGroup.MarginLayoutParams
 | 
			
		||||
            p.setMargins(left, top, right, bottom)
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.widget.StateImageViewTarget
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_grid_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_grid_item.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
 | 
			
		||||
@@ -27,16 +27,16 @@ class CatalogueGridHolder(private val view: View, private val adapter: FlexibleA
 | 
			
		||||
     */
 | 
			
		||||
    override fun onSetValues(manga: Manga) {
 | 
			
		||||
        // Set manga title
 | 
			
		||||
        view.title.text = manga.title
 | 
			
		||||
        title.text = manga.title
 | 
			
		||||
 | 
			
		||||
        // Set alpha of thumbnail.
 | 
			
		||||
        view.thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f
 | 
			
		||||
        thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f
 | 
			
		||||
 | 
			
		||||
        setImage(manga)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun setImage(manga: Manga) {
 | 
			
		||||
        GlideApp.with(view.context).clear(view.thumbnail)
 | 
			
		||||
        GlideApp.with(view.context).clear(thumbnail)
 | 
			
		||||
        if (!manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            GlideApp.with(view.context)
 | 
			
		||||
                    .load(manga)
 | 
			
		||||
@@ -44,7 +44,7 @@ class CatalogueGridHolder(private val view: View, private val adapter: FlexibleA
 | 
			
		||||
                    .centerCrop()
 | 
			
		||||
                    .skipMemoryCache(true)
 | 
			
		||||
                    .placeholder(android.R.color.transparent)
 | 
			
		||||
                    .into(StateImageViewTarget(view.thumbnail, view.progress))
 | 
			
		||||
                    .into(StateImageViewTarget(thumbnail, progress))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.catalogue.browse
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generic class used to hold the displayed data of a manga in the catalogue.
 | 
			
		||||
@@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
 * @param adapter the adapter handling this holder.
 | 
			
		||||
 */
 | 
			
		||||
abstract class CatalogueHolder(view: View, adapter: FlexibleAdapter<*>) :
 | 
			
		||||
        FlexibleViewHolder(view, adapter) {
 | 
			
		||||
        BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.util.getResourceColor
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_list_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_list_item.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
 | 
			
		||||
@@ -29,14 +29,14 @@ class CatalogueListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
 | 
			
		||||
     * @param manga the manga to bind.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onSetValues(manga: Manga) {
 | 
			
		||||
        view.title.text = manga.title
 | 
			
		||||
        view.title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor)
 | 
			
		||||
        title.text = manga.title
 | 
			
		||||
        title.setTextColor(if (manga.favorite) favoriteColor else unfavoriteColor)
 | 
			
		||||
 | 
			
		||||
        setImage(manga)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun setImage(manga: Manga) {
 | 
			
		||||
        GlideApp.with(view.context).clear(view.thumbnail)
 | 
			
		||||
        GlideApp.with(view.context).clear(thumbnail)
 | 
			
		||||
        if (!manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            GlideApp.with(view.context)
 | 
			
		||||
                    .load(manga)
 | 
			
		||||
@@ -46,7 +46,7 @@ class CatalogueListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
 | 
			
		||||
                    .dontAnimate()
 | 
			
		||||
                    .skipMemoryCache(true)
 | 
			
		||||
                    .placeholder(android.R.color.transparent)
 | 
			
		||||
                    .into(view.thumbnail)
 | 
			
		||||
                    .into(thumbnail)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,14 +2,14 @@ package eu.kanade.tachiyomi.ui.catalogue.global_search
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.widget.StateImageViewTarget
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_global_search_controller_card_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_global_search_controller_card_item.*
 | 
			
		||||
 | 
			
		||||
class CatalogueSearchCardHolder(view: View, adapter: CatalogueSearchCardAdapter)
 | 
			
		||||
    : FlexibleViewHolder(view, adapter) {
 | 
			
		||||
    : BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        // Call onMangaClickListener when item is pressed.
 | 
			
		||||
@@ -22,13 +22,13 @@ class CatalogueSearchCardHolder(view: View, adapter: CatalogueSearchCardAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun bind(manga: Manga) {
 | 
			
		||||
        itemView.tvTitle.text = manga.title
 | 
			
		||||
        tvTitle.text = manga.title
 | 
			
		||||
 | 
			
		||||
        setImage(manga)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun setImage(manga: Manga) {
 | 
			
		||||
        GlideApp.with(itemView.context).clear(itemView.itemImage)
 | 
			
		||||
        GlideApp.with(itemView.context).clear(itemImage)
 | 
			
		||||
        if (!manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            GlideApp.with(itemView.context)
 | 
			
		||||
                    .load(manga)
 | 
			
		||||
@@ -36,7 +36,7 @@ class CatalogueSearchCardHolder(view: View, adapter: CatalogueSearchCardAdapter)
 | 
			
		||||
                    .centerCrop()
 | 
			
		||||
                    .skipMemoryCache(true)
 | 
			
		||||
                    .placeholder(android.R.color.transparent)
 | 
			
		||||
                    .into(StateImageViewTarget(itemView.itemImage, itemView.progress))
 | 
			
		||||
                    .into(StateImageViewTarget(itemImage, progress))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,14 +2,14 @@ package eu.kanade.tachiyomi.ui.catalogue.global_search
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.util.getResourceColor
 | 
			
		||||
import eu.kanade.tachiyomi.util.gone
 | 
			
		||||
import eu.kanade.tachiyomi.util.setVectorCompat
 | 
			
		||||
import eu.kanade.tachiyomi.util.visible
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_global_search_controller_card.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_global_search_controller_card.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Holder that binds the [CatalogueSearchItem] containing catalogue cards.
 | 
			
		||||
@@ -17,7 +17,8 @@ import kotlinx.android.synthetic.main.catalogue_global_search_controller_card.vi
 | 
			
		||||
 * @param view view of [CatalogueSearchItem]
 | 
			
		||||
 * @param adapter instance of [CatalogueSearchAdapter]
 | 
			
		||||
 */
 | 
			
		||||
class CatalogueSearchHolder(view: View, val adapter: CatalogueSearchAdapter) : FlexibleViewHolder(view, adapter) {
 | 
			
		||||
class CatalogueSearchHolder(view: View, val adapter: CatalogueSearchAdapter) :
 | 
			
		||||
        BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adapter containing manga from search results.
 | 
			
		||||
@@ -27,14 +28,12 @@ class CatalogueSearchHolder(view: View, val adapter: CatalogueSearchAdapter) : F
 | 
			
		||||
    private var lastBoundResults: List<CatalogueSearchCardItem>? = null
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        with(itemView) {
 | 
			
		||||
            // Set layout horizontal.
 | 
			
		||||
            recycler.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
 | 
			
		||||
            recycler.adapter = mangaAdapter
 | 
			
		||||
        // Set layout horizontal.
 | 
			
		||||
        recycler.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.HORIZONTAL, false)
 | 
			
		||||
        recycler.adapter = mangaAdapter
 | 
			
		||||
 | 
			
		||||
            nothing_found_icon.setVectorCompat(R.drawable.ic_search_black_112dp,
 | 
			
		||||
                    context.getResourceColor(android.R.attr.textColorHint))
 | 
			
		||||
        }
 | 
			
		||||
        nothing_found_icon.setVectorCompat(R.drawable.ic_search_black_112dp,
 | 
			
		||||
                view.context.getResourceColor(android.R.attr.textColorHint))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -46,28 +45,26 @@ class CatalogueSearchHolder(view: View, val adapter: CatalogueSearchAdapter) : F
 | 
			
		||||
        val source = item.source
 | 
			
		||||
        val results = item.results
 | 
			
		||||
 | 
			
		||||
        with(itemView) {
 | 
			
		||||
            // Set Title witch country code if available.
 | 
			
		||||
            title.text = if (!source.lang.isEmpty()) "${source.name} (${source.lang})" else source.name
 | 
			
		||||
        // Set Title witch country code if available.
 | 
			
		||||
        title.text = if (!source.lang.isEmpty()) "${source.name} (${source.lang})" else source.name
 | 
			
		||||
 | 
			
		||||
            when {
 | 
			
		||||
                results == null -> {
 | 
			
		||||
                    progress.visible()
 | 
			
		||||
                    nothing_found.gone()
 | 
			
		||||
                }
 | 
			
		||||
                results.isEmpty() -> {
 | 
			
		||||
                    progress.gone()
 | 
			
		||||
                    nothing_found.visible()
 | 
			
		||||
                }
 | 
			
		||||
                else -> {
 | 
			
		||||
                    progress.gone()
 | 
			
		||||
                    nothing_found.gone()
 | 
			
		||||
                }
 | 
			
		||||
        when {
 | 
			
		||||
            results == null -> {
 | 
			
		||||
                progress.visible()
 | 
			
		||||
                nothing_found.gone()
 | 
			
		||||
            }
 | 
			
		||||
            if (results !== lastBoundResults) {
 | 
			
		||||
                mangaAdapter.updateDataSet(results)
 | 
			
		||||
                lastBoundResults = results
 | 
			
		||||
            results.isEmpty() -> {
 | 
			
		||||
                progress.gone()
 | 
			
		||||
                nothing_found.visible()
 | 
			
		||||
            }
 | 
			
		||||
            else -> {
 | 
			
		||||
                progress.gone()
 | 
			
		||||
                nothing_found.gone()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (results !== lastBoundResults) {
 | 
			
		||||
            mangaAdapter.updateDataSet(results)
 | 
			
		||||
            lastBoundResults = results
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.category
 | 
			
		||||
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.graphics.Typeface
 | 
			
		||||
import android.view.View
 | 
			
		||||
import com.amulyakhare.textdrawable.TextDrawable
 | 
			
		||||
import com.amulyakhare.textdrawable.util.ColorGenerator
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.util.getRound
 | 
			
		||||
import kotlinx.android.synthetic.main.categories_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.categories_item.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Holder used to display category items.
 | 
			
		||||
@@ -16,16 +12,16 @@ import kotlinx.android.synthetic.main.categories_item.view.*
 | 
			
		||||
 * @param view The view used by category items.
 | 
			
		||||
 * @param adapter The adapter containing this holder.
 | 
			
		||||
 */
 | 
			
		||||
class CategoryHolder(view: View, val adapter: CategoryAdapter) : FlexibleViewHolder(view, adapter) {
 | 
			
		||||
class CategoryHolder(view: View, val adapter: CategoryAdapter) : BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        // Create round letter image onclick to simulate long click
 | 
			
		||||
        itemView.image.setOnClickListener {
 | 
			
		||||
        image.setOnClickListener {
 | 
			
		||||
            // Simulate long click on this view to enter selection mode
 | 
			
		||||
            onLongClick(view)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        setDragHandleView(itemView.reorder)
 | 
			
		||||
        setDragHandleView(reorder)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -35,11 +31,11 @@ class CategoryHolder(view: View, val adapter: CategoryAdapter) : FlexibleViewHol
 | 
			
		||||
     */
 | 
			
		||||
    fun bind(category: Category) {
 | 
			
		||||
        // Set capitalized title.
 | 
			
		||||
        itemView.title.text = category.name.capitalize()
 | 
			
		||||
        title.text = category.name.capitalize()
 | 
			
		||||
 | 
			
		||||
        // Update circle letter image.
 | 
			
		||||
        itemView.post {
 | 
			
		||||
            itemView.image.setImageDrawable(itemView.image.getRound(category.name.take(1).toUpperCase(),false))
 | 
			
		||||
            image.setImageDrawable(image.getRound(category.name.take(1).toUpperCase(),false))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.download
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseViewHolder
 | 
			
		||||
import kotlinx.android.synthetic.main.download_item.view.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -12,7 +12,7 @@ import kotlinx.android.synthetic.main.download_item.view.*
 | 
			
		||||
 * @param view the inflated view for this holder.
 | 
			
		||||
 * @constructor creates a new download holder.
 | 
			
		||||
 */
 | 
			
		||||
class DownloadHolder(private val view: View) : RecyclerView.ViewHolder(view) {
 | 
			
		||||
class DownloadHolder(private val view: View) : BaseViewHolder(view) {
 | 
			
		||||
 | 
			
		||||
    private lateinit var download: Download
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.source.LocalSource
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_grid_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_grid_item.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the library, like the cover or the title.
 | 
			
		||||
@@ -30,30 +30,28 @@ class LibraryGridHolder(
 | 
			
		||||
     */
 | 
			
		||||
    override fun onSetValues(item: LibraryItem) {
 | 
			
		||||
        // Update the title of the manga.
 | 
			
		||||
        view.title.text = item.manga.title
 | 
			
		||||
        title.text = item.manga.title
 | 
			
		||||
 | 
			
		||||
        // Update the unread count and its visibility.
 | 
			
		||||
        with(view.unread_text) {
 | 
			
		||||
        with(unread_text) {
 | 
			
		||||
            visibility = if (item.manga.unread > 0) View.VISIBLE else View.GONE
 | 
			
		||||
            text = item.manga.unread.toString()
 | 
			
		||||
        }
 | 
			
		||||
        // Update the download count and its visibility.
 | 
			
		||||
        with(view.download_text) {
 | 
			
		||||
        with(download_text) {
 | 
			
		||||
            visibility = if (item.downloadCount > 0) View.VISIBLE else View.GONE
 | 
			
		||||
            text = item.downloadCount.toString()
 | 
			
		||||
        }
 | 
			
		||||
        //set local visibility if its local manga
 | 
			
		||||
        with(view.local_text) {
 | 
			
		||||
            visibility = if(item.manga.source == LocalSource.ID) View.VISIBLE else View.GONE
 | 
			
		||||
        }
 | 
			
		||||
        local_text.visibility = if(item.manga.source == LocalSource.ID) View.VISIBLE else View.GONE
 | 
			
		||||
 | 
			
		||||
        // Update the cover.
 | 
			
		||||
        GlideApp.with(view.context).clear(view.thumbnail)
 | 
			
		||||
        GlideApp.with(view.context).clear(thumbnail)
 | 
			
		||||
        GlideApp.with(view.context)
 | 
			
		||||
                .load(item.manga)
 | 
			
		||||
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
 | 
			
		||||
                .centerCrop()
 | 
			
		||||
                .into(view.thumbnail)
 | 
			
		||||
                .into(thumbnail)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.library
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generic class used to hold the displayed data of a manga in the library.
 | 
			
		||||
@@ -14,7 +14,7 @@ import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
abstract class LibraryHolder(
 | 
			
		||||
        view: View,
 | 
			
		||||
        adapter: FlexibleAdapter<*>
 | 
			
		||||
) : FlexibleViewHolder(view, adapter) {
 | 
			
		||||
) : BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.source.LocalSource
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_list_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_list_item.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the library, like the cover or the title.
 | 
			
		||||
@@ -30,38 +30,36 @@ class LibraryListHolder(
 | 
			
		||||
     */
 | 
			
		||||
    override fun onSetValues(item: LibraryItem) {
 | 
			
		||||
        // Update the title of the manga.
 | 
			
		||||
        itemView.title.text = item.manga.title
 | 
			
		||||
        title.text = item.manga.title
 | 
			
		||||
 | 
			
		||||
        // Update the unread count and its visibility.
 | 
			
		||||
        with(itemView.unread_text) {
 | 
			
		||||
        with(unread_text) {
 | 
			
		||||
            visibility = if (item.manga.unread > 0) View.VISIBLE else View.GONE
 | 
			
		||||
            text = item.manga.unread.toString()
 | 
			
		||||
        }
 | 
			
		||||
        // Update the download count and its visibility.
 | 
			
		||||
        with(itemView.download_text) {
 | 
			
		||||
        with(download_text) {
 | 
			
		||||
            visibility = if (item.downloadCount > 0) View.VISIBLE else View.GONE
 | 
			
		||||
            text = "${item.downloadCount}"
 | 
			
		||||
        }
 | 
			
		||||
        //show local text badge if local manga
 | 
			
		||||
        with(itemView.local_text) {
 | 
			
		||||
            visibility = if (item.manga.source == LocalSource.ID) View.VISIBLE else View.GONE
 | 
			
		||||
        }
 | 
			
		||||
        local_text.visibility = if (item.manga.source == LocalSource.ID) View.VISIBLE else View.GONE
 | 
			
		||||
 | 
			
		||||
        // Create thumbnail onclick to simulate long click
 | 
			
		||||
        itemView.thumbnail.setOnClickListener {
 | 
			
		||||
        thumbnail.setOnClickListener {
 | 
			
		||||
            // Simulate long click on this view to enter selection mode
 | 
			
		||||
            onLongClick(itemView)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Update the cover.
 | 
			
		||||
        GlideApp.with(itemView.context).clear(itemView.thumbnail)
 | 
			
		||||
        GlideApp.with(itemView.context).clear(thumbnail)
 | 
			
		||||
        GlideApp.with(itemView.context)
 | 
			
		||||
                .load(item.manga)
 | 
			
		||||
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
 | 
			
		||||
                .centerCrop()
 | 
			
		||||
                .circleCrop()
 | 
			
		||||
                .dontAnimate()
 | 
			
		||||
                .into(itemView.thumbnail)
 | 
			
		||||
                .into(thumbnail)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,41 +2,41 @@ package eu.kanade.tachiyomi.ui.manga.chapter
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.PopupMenu
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.util.getResourceColor
 | 
			
		||||
import eu.kanade.tachiyomi.util.gone
 | 
			
		||||
import eu.kanade.tachiyomi.util.setVectorCompat
 | 
			
		||||
import kotlinx.android.synthetic.main.chapters_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.chapters_item.*
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
class ChapterHolder(
 | 
			
		||||
        private val view: View,
 | 
			
		||||
        private val adapter: ChaptersAdapter
 | 
			
		||||
) : FlexibleViewHolder(view, adapter) {
 | 
			
		||||
) : BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        // We need to post a Runnable to show the popup to make sure that the PopupMenu is
 | 
			
		||||
        // correctly positioned. The reason being that the view may change position before the
 | 
			
		||||
        // PopupMenu is shown.
 | 
			
		||||
        view.chapter_menu.setOnClickListener { it.post { showPopupMenu(it) } }
 | 
			
		||||
        chapter_menu.setOnClickListener { it.post { showPopupMenu(it) } }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun bind(item: ChapterItem, manga: Manga) = with(view) {
 | 
			
		||||
    fun bind(item: ChapterItem, manga: Manga) {
 | 
			
		||||
        val chapter = item.chapter
 | 
			
		||||
 | 
			
		||||
        chapter_title.text = when (manga.displayMode) {
 | 
			
		||||
            Manga.DISPLAY_NUMBER -> {
 | 
			
		||||
                val number = adapter.decimalFormat.format(chapter.chapter_number.toDouble())
 | 
			
		||||
                context.getString(R.string.display_mode_chapter, number)
 | 
			
		||||
                itemView.context.getString(R.string.display_mode_chapter, number)
 | 
			
		||||
            }
 | 
			
		||||
            else -> chapter.name
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Set the correct drawable for dropdown and update the tint to match theme.
 | 
			
		||||
        view.chapter_menu.setVectorCompat(R.drawable.ic_more_horiz_black_24dp, view.context.getResourceColor(R.attr.icon_color))
 | 
			
		||||
        chapter_menu.setVectorCompat(R.drawable.ic_more_horiz_black_24dp, view.context.getResourceColor(R.attr.icon_color))
 | 
			
		||||
 | 
			
		||||
        // Set correct text color
 | 
			
		||||
        chapter_title.setTextColor(if (chapter.read) adapter.readColor else adapter.unreadColor)
 | 
			
		||||
@@ -53,14 +53,14 @@ class ChapterHolder(
 | 
			
		||||
        chapter_scanlator.text = chapter.scanlator
 | 
			
		||||
        //allow longer titles if there is no scanlator (most sources)
 | 
			
		||||
        if (chapter_scanlator.text.isNullOrBlank()) {
 | 
			
		||||
            chapter_title.setMaxLines(2)
 | 
			
		||||
            chapter_title.maxLines = 2
 | 
			
		||||
            chapter_scanlator.gone()
 | 
			
		||||
        } else {
 | 
			
		||||
            chapter_title.setMaxLines(1)
 | 
			
		||||
            chapter_title.maxLines = 1
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        chapter_pages.text = if (!chapter.read && chapter.last_page_read > 0) {
 | 
			
		||||
            context.getString(R.string.chapter_progress, chapter.last_page_read + 1)
 | 
			
		||||
            itemView.context.getString(R.string.chapter_progress, chapter.last_page_read + 1)
 | 
			
		||||
        } else {
 | 
			
		||||
            ""
 | 
			
		||||
        }
 | 
			
		||||
@@ -68,7 +68,7 @@ class ChapterHolder(
 | 
			
		||||
        notifyStatus(item.status)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun notifyStatus(status: Int) = with(view.download_text) {
 | 
			
		||||
    fun notifyStatus(status: Int) = with(download_text) {
 | 
			
		||||
        when (status) {
 | 
			
		||||
            Download.QUEUE -> setText(R.string.chapter_queued)
 | 
			
		||||
            Download.DOWNLOADING -> setText(R.string.chapter_downloading)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,29 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.manga.track
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import kotlinx.android.synthetic.main.track_item.view.*
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseViewHolder
 | 
			
		||||
import kotlinx.android.synthetic.main.track_item.*
 | 
			
		||||
 | 
			
		||||
class TrackHolder(view: View, adapter: TrackAdapter) : RecyclerView.ViewHolder(view) {
 | 
			
		||||
class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) {
 | 
			
		||||
    
 | 
			
		||||
    init {
 | 
			
		||||
        val listener = adapter.rowClickListener
 | 
			
		||||
        view.title_container.setOnClickListener { listener.onTitleClick(adapterPosition) }
 | 
			
		||||
        view.status_container.setOnClickListener { listener.onStatusClick(adapterPosition) }
 | 
			
		||||
        view.chapters_container.setOnClickListener { listener.onChaptersClick(adapterPosition) }
 | 
			
		||||
        view.score_container.setOnClickListener { listener.onScoreClick(adapterPosition) }
 | 
			
		||||
        title_container.setOnClickListener { listener.onTitleClick(adapterPosition) }
 | 
			
		||||
        status_container.setOnClickListener { listener.onStatusClick(adapterPosition) }
 | 
			
		||||
        chapters_container.setOnClickListener { listener.onChaptersClick(adapterPosition) }
 | 
			
		||||
        score_container.setOnClickListener { listener.onScoreClick(adapterPosition) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressLint("SetTextI18n")
 | 
			
		||||
    @Suppress("DEPRECATION")
 | 
			
		||||
    fun bind(item: TrackItem) = with(itemView) {
 | 
			
		||||
    fun bind(item: TrackItem) {
 | 
			
		||||
        val track = item.track
 | 
			
		||||
        track_logo.setImageResource(item.service.getLogo())
 | 
			
		||||
        logo.setBackgroundColor(item.service.getLogoColor())
 | 
			
		||||
        if (track != null) {
 | 
			
		||||
            track_title.setTextAppearance(context, R.style.TextAppearance_Regular_Body1_Secondary)
 | 
			
		||||
            track_title.setTextAppearance(itemView.context, R.style.TextAppearance_Regular_Body1_Secondary)
 | 
			
		||||
            track_title.setAllCaps(false)
 | 
			
		||||
            track_title.text = track.title
 | 
			
		||||
            track_chapters.text = "${track.last_chapter_read}/" +
 | 
			
		||||
@@ -31,7 +31,7 @@ class TrackHolder(view: View, adapter: TrackAdapter) : RecyclerView.ViewHolder(v
 | 
			
		||||
            track_status.text = item.service.getStatus(track.status)
 | 
			
		||||
            track_score.text = if (track.score == 0f) "-" else item.service.displayScore(track)
 | 
			
		||||
        } else {
 | 
			
		||||
            track_title.setTextAppearance(context, R.style.TextAppearance_Medium_Button)
 | 
			
		||||
            track_title.setTextAppearance(itemView.context, R.style.TextAppearance_Medium_Button)
 | 
			
		||||
            track_title.setText(R.string.action_edit)
 | 
			
		||||
            track_chapters.text = ""
 | 
			
		||||
            track_score.text = ""
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader.viewer.webtoon
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import android.view.MotionEvent
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
@@ -11,10 +10,11 @@ import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
 | 
			
		||||
import com.hippo.unifile.UniFile
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Page
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.viewer.base.PageDecodeErrorLayout
 | 
			
		||||
import eu.kanade.tachiyomi.util.inflate
 | 
			
		||||
import kotlinx.android.synthetic.main.reader_webtoon_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.reader_webtoon_item.*
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import rx.Subscription
 | 
			
		||||
import rx.android.schedulers.AndroidSchedulers
 | 
			
		||||
@@ -31,7 +31,7 @@ import java.util.concurrent.TimeUnit
 | 
			
		||||
 * @constructor creates a new webtoon holder.
 | 
			
		||||
 */
 | 
			
		||||
class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter) :
 | 
			
		||||
        RecyclerView.ViewHolder(view) {
 | 
			
		||||
        BaseViewHolder(view) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Page of a chapter.
 | 
			
		||||
@@ -54,7 +54,7 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter)
 | 
			
		||||
    private var decodeErrorLayout: View? = null
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        with(view.image_view) {
 | 
			
		||||
        with(image_view) {
 | 
			
		||||
            setMaxTileSize(readerActivity.maxBitmapSize)
 | 
			
		||||
            setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED)
 | 
			
		||||
            setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE)
 | 
			
		||||
@@ -78,11 +78,11 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter)
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        view.progress_container.layoutParams = FrameLayout.LayoutParams(
 | 
			
		||||
        progress_container.layoutParams = FrameLayout.LayoutParams(
 | 
			
		||||
                MATCH_PARENT, webtoonReader.screenHeight)
 | 
			
		||||
 | 
			
		||||
        view.setOnTouchListener(adapter.touchListener)
 | 
			
		||||
        view.retry_button.setOnTouchListener { _, event ->
 | 
			
		||||
        retry_button.setOnTouchListener { _, event ->
 | 
			
		||||
            if (event.action == MotionEvent.ACTION_UP) {
 | 
			
		||||
                readerActivity.presenter.retryPage(page)
 | 
			
		||||
            }
 | 
			
		||||
@@ -111,9 +111,9 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter)
 | 
			
		||||
            (view as ViewGroup).removeView(it)
 | 
			
		||||
            decodeErrorLayout = null
 | 
			
		||||
        }
 | 
			
		||||
        view.image_view.recycle()
 | 
			
		||||
        view.image_view.visibility = View.GONE
 | 
			
		||||
        view.progress_container.visibility = View.VISIBLE
 | 
			
		||||
        image_view.recycle()
 | 
			
		||||
        image_view.visibility = View.GONE
 | 
			
		||||
        progress_container.visibility = View.VISIBLE
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -150,7 +150,7 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter)
 | 
			
		||||
                .onBackpressureLatest()
 | 
			
		||||
                .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
                .subscribe { progress ->
 | 
			
		||||
                    view.progress_text.text = if (progress > 0) {
 | 
			
		||||
                    progress_text.text = if (progress > 0) {
 | 
			
		||||
                        view.context.getString(R.string.download_progress, progress)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        view.context.getString(R.string.downloading)
 | 
			
		||||
@@ -279,14 +279,14 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter)
 | 
			
		||||
     * Called when the image is decoded and going to be displayed.
 | 
			
		||||
     */
 | 
			
		||||
    private fun onImageDecoded() {
 | 
			
		||||
        view.progress_container.visibility = View.GONE
 | 
			
		||||
        progress_container.visibility = View.GONE
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when the image fails to decode.
 | 
			
		||||
     */
 | 
			
		||||
    private fun onImageDecodeError() {
 | 
			
		||||
        view.progress_container.visibility = View.GONE
 | 
			
		||||
        progress_container.visibility = View.GONE
 | 
			
		||||
 | 
			
		||||
        val page = page ?: return
 | 
			
		||||
        if (decodeErrorLayout != null || !webtoonReader.isAdded) return
 | 
			
		||||
 
 | 
			
		||||
@@ -3,13 +3,13 @@ package eu.kanade.tachiyomi.ui.recent_updates
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.PopupMenu
 | 
			
		||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.util.getResourceColor
 | 
			
		||||
import eu.kanade.tachiyomi.util.setVectorCompat
 | 
			
		||||
import kotlinx.android.synthetic.main.recent_chapters_item.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.recent_chapters_item.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Holder that contains chapter item
 | 
			
		||||
@@ -22,7 +22,7 @@ import kotlinx.android.synthetic.main.recent_chapters_item.view.*
 | 
			
		||||
 * @constructor creates a new recent chapter holder.
 | 
			
		||||
 */
 | 
			
		||||
class RecentChapterHolder(private val view: View, private val adapter: RecentChaptersAdapter) :
 | 
			
		||||
        FlexibleViewHolder(view, adapter) {
 | 
			
		||||
        BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Color of read chapter
 | 
			
		||||
@@ -43,8 +43,8 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
 | 
			
		||||
        // We need to post a Runnable to show the popup to make sure that the PopupMenu is
 | 
			
		||||
        // correctly positioned. The reason being that the view may change position before the
 | 
			
		||||
        // PopupMenu is shown.
 | 
			
		||||
        view.chapter_menu.setOnClickListener { it.post { showPopupMenu(it) } }
 | 
			
		||||
        view.manga_cover.setOnClickListener {
 | 
			
		||||
        chapter_menu.setOnClickListener { it.post { showPopupMenu(it) } }
 | 
			
		||||
        manga_cover.setOnClickListener {
 | 
			
		||||
            adapter.coverClickListener.onCoverClick(adapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -58,31 +58,31 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
 | 
			
		||||
        this.item = item
 | 
			
		||||
 | 
			
		||||
        // Set chapter title
 | 
			
		||||
        view.chapter_title.text = item.chapter.name
 | 
			
		||||
        chapter_title.text = item.chapter.name
 | 
			
		||||
 | 
			
		||||
        // Set manga title
 | 
			
		||||
        view.manga_title.text = item.manga.title
 | 
			
		||||
        manga_title.text = item.manga.title
 | 
			
		||||
 | 
			
		||||
        // Set the correct drawable for dropdown and update the tint to match theme.
 | 
			
		||||
        view.chapter_menu_icon.setVectorCompat(R.drawable.ic_more_horiz_black_24dp, view.context.getResourceColor(R.attr.icon_color))
 | 
			
		||||
        chapter_menu_icon.setVectorCompat(R.drawable.ic_more_horiz_black_24dp, view.context.getResourceColor(R.attr.icon_color))
 | 
			
		||||
 | 
			
		||||
        // Set cover
 | 
			
		||||
        GlideApp.with(itemView.context).clear(itemView.manga_cover)
 | 
			
		||||
        GlideApp.with(itemView.context).clear(manga_cover)
 | 
			
		||||
        if (!item.manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            GlideApp.with(itemView.context)
 | 
			
		||||
                    .load(item.manga)
 | 
			
		||||
                    .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
 | 
			
		||||
                    .circleCrop()
 | 
			
		||||
                    .into(itemView.manga_cover)
 | 
			
		||||
                    .into(manga_cover)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check if chapter is read and set correct color
 | 
			
		||||
        if (item.chapter.read) {
 | 
			
		||||
            view.chapter_title.setTextColor(readColor)
 | 
			
		||||
            view.manga_title.setTextColor(readColor)
 | 
			
		||||
            chapter_title.setTextColor(readColor)
 | 
			
		||||
            manga_title.setTextColor(readColor)
 | 
			
		||||
        } else {
 | 
			
		||||
            view.chapter_title.setTextColor(unreadColor)
 | 
			
		||||
            view.manga_title.setTextColor(unreadColor)
 | 
			
		||||
            chapter_title.setTextColor(unreadColor)
 | 
			
		||||
            manga_title.setTextColor(unreadColor)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Set chapter status
 | 
			
		||||
@@ -94,7 +94,7 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
 | 
			
		||||
     *
 | 
			
		||||
     * @param status download status
 | 
			
		||||
     */
 | 
			
		||||
    fun notifyStatus(status: Int) = with(view.download_text) {
 | 
			
		||||
    fun notifyStatus(status: Int) = with(download_text) {
 | 
			
		||||
        when (status) {
 | 
			
		||||
            Download.QUEUE -> setText(R.string.chapter_queued)
 | 
			
		||||
            Download.DOWNLOADING -> setText(R.string.chapter_downloading)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.recently_read
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import kotlinx.android.synthetic.main.recently_read_item.view.*
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import kotlinx.android.synthetic.main.recently_read_item.*
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -21,18 +21,18 @@ import java.util.*
 | 
			
		||||
class RecentlyReadHolder(
 | 
			
		||||
        view: View,
 | 
			
		||||
        val adapter: RecentlyReadAdapter
 | 
			
		||||
) : FlexibleViewHolder(view, adapter) {
 | 
			
		||||
) : BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        itemView.remove.setOnClickListener {
 | 
			
		||||
        remove.setOnClickListener {
 | 
			
		||||
            adapter.removeClickListener.onRemoveClick(adapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        itemView.resume.setOnClickListener {
 | 
			
		||||
        resume.setOnClickListener {
 | 
			
		||||
            adapter.resumeClickListener.onResumeClick(adapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        itemView.cover.setOnClickListener {
 | 
			
		||||
        cover.setOnClickListener {
 | 
			
		||||
            adapter.coverClickListener.onCoverClick(adapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -47,24 +47,24 @@ class RecentlyReadHolder(
 | 
			
		||||
        val (manga, chapter, history) = item
 | 
			
		||||
 | 
			
		||||
        // Set manga title
 | 
			
		||||
        itemView.manga_title.text = manga.title
 | 
			
		||||
        manga_title.text = manga.title
 | 
			
		||||
 | 
			
		||||
        // Set source + chapter title
 | 
			
		||||
        val formattedNumber = adapter.decimalFormat.format(chapter.chapter_number.toDouble())
 | 
			
		||||
        itemView.manga_source.text = itemView.context.getString(R.string.recent_manga_source)
 | 
			
		||||
        manga_source.text = itemView.context.getString(R.string.recent_manga_source)
 | 
			
		||||
                .format(adapter.sourceManager.get(manga.source)?.toString(), formattedNumber)
 | 
			
		||||
 | 
			
		||||
        // Set last read timestamp title
 | 
			
		||||
        itemView.last_read.text = adapter.dateFormat.format(Date(history.last_read))
 | 
			
		||||
        last_read.text = adapter.dateFormat.format(Date(history.last_read))
 | 
			
		||||
 | 
			
		||||
        // Set cover
 | 
			
		||||
        GlideApp.with(itemView.context).clear(itemView.cover)
 | 
			
		||||
        GlideApp.with(itemView.context).clear(cover)
 | 
			
		||||
        if (!manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            GlideApp.with(itemView.context)
 | 
			
		||||
                    .load(manga)
 | 
			
		||||
                    .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
 | 
			
		||||
                    .centerCrop()
 | 
			
		||||
                    .into(itemView.cover)
 | 
			
		||||
                    .into(cover)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.setting
 | 
			
		||||
 | 
			
		||||
import android.app.Dialog
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.preference.PreferenceScreen
 | 
			
		||||
import android.view.View
 | 
			
		||||
@@ -22,8 +24,6 @@ import java.text.ParseException
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
import java.util.*
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SettingsAboutController : SettingsController() {
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,6 @@ package eu.kanade.tachiyomi.ui.setting
 | 
			
		||||
import android.graphics.drawable.Drawable
 | 
			
		||||
import android.support.v7.preference.PreferenceGroup
 | 
			
		||||
import android.support.v7.preference.PreferenceScreen
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeHandler
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeType
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
 | 
			
		||||
import eu.kanade.tachiyomi.source.SourceManager
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user