mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Grid items optimizations (#6641)
Use ConstraintLayout for ez size ratio calculation and merge cover-only view holder with compact's
This commit is contained in:
		@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.browse.source.browse
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.view.isVisible
 | 
			
		||||
import coil.clear
 | 
			
		||||
import coil.imageLoader
 | 
			
		||||
@@ -16,14 +15,14 @@ import eu.kanade.tachiyomi.widget.StateImageViewTarget
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
 | 
			
		||||
 * All the elements from the layout file "item_source_grid" are available in this class.
 | 
			
		||||
 *
 | 
			
		||||
 * @param view the inflated view for this holder.
 | 
			
		||||
 * @param binding the inflated view for this holder.
 | 
			
		||||
 * @param adapter the adapter handling this holder.
 | 
			
		||||
 * @constructor creates a new catalogue holder.
 | 
			
		||||
 */
 | 
			
		||||
class SourceComfortableGridHolder(private val view: View, private val adapter: FlexibleAdapter<*>) :
 | 
			
		||||
    SourceHolder<SourceComfortableGridItemBinding>(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    override val binding = SourceComfortableGridItemBinding.bind(view)
 | 
			
		||||
class SourceComfortableGridHolder(
 | 
			
		||||
    override val binding: SourceComfortableGridItemBinding,
 | 
			
		||||
    adapter: FlexibleAdapter<*>
 | 
			
		||||
) : SourceHolder<SourceComfortableGridItemBinding>(binding.root, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
 | 
			
		||||
@@ -49,15 +48,12 @@ class SourceComfortableGridHolder(private val view: View, private val adapter: F
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun setImage(manga: Manga) {
 | 
			
		||||
        // For rounded corners
 | 
			
		||||
        binding.card.clipToOutline = true
 | 
			
		||||
 | 
			
		||||
        binding.thumbnail.clear()
 | 
			
		||||
        if (!manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            val crossfadeDuration = view.context.imageLoader.defaults.transition.let {
 | 
			
		||||
            val crossfadeDuration = binding.root.context.imageLoader.defaults.transition.let {
 | 
			
		||||
                if (it is CrossfadeTransition) it.durationMillis else 0
 | 
			
		||||
            }
 | 
			
		||||
            val request = ImageRequest.Builder(view.context)
 | 
			
		||||
            val request = ImageRequest.Builder(binding.root.context)
 | 
			
		||||
                .data(manga)
 | 
			
		||||
                .setParameter(MangaCoverFetcher.USE_CUSTOM_COVER, false)
 | 
			
		||||
                .target(StateImageViewTarget(binding.thumbnail, binding.progress, crossfadeDuration))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.browse.source.browse
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.view.isVisible
 | 
			
		||||
import coil.clear
 | 
			
		||||
import coil.imageLoader
 | 
			
		||||
@@ -16,14 +15,14 @@ import eu.kanade.tachiyomi.widget.StateImageViewTarget
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
 | 
			
		||||
 * All the elements from the layout file "item_source_grid" are available in this class.
 | 
			
		||||
 *
 | 
			
		||||
 * @param view the inflated view for this holder.
 | 
			
		||||
 * @param binding the inflated view for this holder.
 | 
			
		||||
 * @param adapter the adapter handling this holder.
 | 
			
		||||
 * @constructor creates a new catalogue holder.
 | 
			
		||||
 */
 | 
			
		||||
open class SourceCompactGridHolder(private val view: View, private val adapter: FlexibleAdapter<*>) :
 | 
			
		||||
    SourceHolder<SourceCompactGridItemBinding>(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    override val binding = SourceCompactGridItemBinding.bind(view)
 | 
			
		||||
class SourceCompactGridHolder(
 | 
			
		||||
    override val binding: SourceCompactGridItemBinding,
 | 
			
		||||
    adapter: FlexibleAdapter<*>
 | 
			
		||||
) : SourceHolder<SourceCompactGridItemBinding>(binding.root, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
 | 
			
		||||
@@ -49,15 +48,12 @@ open class SourceCompactGridHolder(private val view: View, private val adapter:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun setImage(manga: Manga) {
 | 
			
		||||
        // For rounded corners
 | 
			
		||||
        binding.card.clipToOutline = true
 | 
			
		||||
 | 
			
		||||
        binding.thumbnail.clear()
 | 
			
		||||
        if (!manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            val crossfadeDuration = view.context.imageLoader.defaults.transition.let {
 | 
			
		||||
            val crossfadeDuration = binding.root.context.imageLoader.defaults.transition.let {
 | 
			
		||||
                if (it is CrossfadeTransition) it.durationMillis else 0
 | 
			
		||||
            }
 | 
			
		||||
            val request = ImageRequest.Builder(view.context)
 | 
			
		||||
            val request = ImageRequest.Builder(binding.root.context)
 | 
			
		||||
                .data(manga)
 | 
			
		||||
                .setParameter(MangaCoverFetcher.USE_CUSTOM_COVER, false)
 | 
			
		||||
                .target(StateImageViewTarget(binding.thumbnail, binding.progress, crossfadeDuration))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.browse.source.browse
 | 
			
		||||
 | 
			
		||||
import android.view.Gravity
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
 | 
			
		||||
import android.widget.FrameLayout
 | 
			
		||||
import androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import com.fredporciuncula.flow.preferences.Preference
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
@@ -15,16 +11,15 @@ import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.SourceCompactGridItemBinding
 | 
			
		||||
import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
 | 
			
		||||
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
 | 
			
		||||
 | 
			
		||||
class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayModeSetting>) :
 | 
			
		||||
    AbstractFlexibleItem<SourceHolder<*>>() {
 | 
			
		||||
 | 
			
		||||
    override fun getLayoutRes(): Int {
 | 
			
		||||
        return when (displayMode.get()) {
 | 
			
		||||
            DisplayModeSetting.LIST -> R.layout.source_list_item
 | 
			
		||||
            DisplayModeSetting.COMPACT_GRID, DisplayModeSetting.COVER_ONLY_GRID -> R.layout.source_compact_grid_item
 | 
			
		||||
            DisplayModeSetting.COMFORTABLE_GRID -> R.layout.source_comfortable_grid_item
 | 
			
		||||
            else -> R.layout.source_compact_grid_item
 | 
			
		||||
            DisplayModeSetting.LIST -> R.layout.source_list_item
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -33,37 +28,14 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
 | 
			
		||||
        adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
 | 
			
		||||
    ): SourceHolder<*> {
 | 
			
		||||
        return when (displayMode.get()) {
 | 
			
		||||
            DisplayModeSetting.LIST -> {
 | 
			
		||||
                SourceListHolder(view, adapter)
 | 
			
		||||
            DisplayModeSetting.COMPACT_GRID, DisplayModeSetting.COVER_ONLY_GRID -> {
 | 
			
		||||
                SourceCompactGridHolder(SourceCompactGridItemBinding.bind(view), adapter)
 | 
			
		||||
            }
 | 
			
		||||
            DisplayModeSetting.COMFORTABLE_GRID -> {
 | 
			
		||||
                val binding = SourceComfortableGridItemBinding.bind(view)
 | 
			
		||||
                val parent = adapter.recyclerView as AutofitRecyclerView
 | 
			
		||||
                val coverHeight = parent.itemWidth / 3 * 4
 | 
			
		||||
                view.apply {
 | 
			
		||||
                    binding.card.layoutParams = ConstraintLayout.LayoutParams(
 | 
			
		||||
                        MATCH_PARENT,
 | 
			
		||||
                        coverHeight
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                SourceComfortableGridHolder(view, adapter)
 | 
			
		||||
                SourceComfortableGridHolder(SourceComfortableGridItemBinding.bind(view), adapter)
 | 
			
		||||
            }
 | 
			
		||||
            else -> {
 | 
			
		||||
                val binding = SourceCompactGridItemBinding.bind(view)
 | 
			
		||||
                val parent = adapter.recyclerView as AutofitRecyclerView
 | 
			
		||||
                val coverHeight = parent.itemWidth / 3 * 4
 | 
			
		||||
                view.apply {
 | 
			
		||||
                    binding.card.layoutParams = FrameLayout.LayoutParams(
 | 
			
		||||
                        MATCH_PARENT,
 | 
			
		||||
                        coverHeight
 | 
			
		||||
                    )
 | 
			
		||||
                    binding.gradient.layoutParams = FrameLayout.LayoutParams(
 | 
			
		||||
                        MATCH_PARENT,
 | 
			
		||||
                        coverHeight / 2,
 | 
			
		||||
                        Gravity.BOTTOM
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                SourceCompactGridHolder(view, adapter)
 | 
			
		||||
            DisplayModeSetting.LIST -> {
 | 
			
		||||
                SourceListHolder(view, adapter)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.library
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.view.isVisible
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import coil.clear
 | 
			
		||||
@@ -13,17 +12,15 @@ import eu.kanade.tachiyomi.util.view.loadAnyAutoPause
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the library, like the cover or the title.
 | 
			
		||||
 * All the elements from the layout file "item_source_grid" are available in this class.
 | 
			
		||||
 *
 | 
			
		||||
 * @param view the inflated view for this holder.
 | 
			
		||||
 * @param binding the inflated view for this holder.
 | 
			
		||||
 * @param adapter the adapter handling this holder.
 | 
			
		||||
 * @param listener a listener to react to single tap and long tap events.
 | 
			
		||||
 * @constructor creates a new library holder.
 | 
			
		||||
 */
 | 
			
		||||
class LibraryComfortableGridHolder(
 | 
			
		||||
    private val view: View,
 | 
			
		||||
    override val binding: SourceComfortableGridItemBinding,
 | 
			
		||||
    adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
 | 
			
		||||
) : LibraryHolder<SourceComfortableGridItemBinding>(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    override val binding = SourceComfortableGridItemBinding.bind(view)
 | 
			
		||||
) : LibraryHolder<SourceComfortableGridItemBinding>(binding.root, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this
 | 
			
		||||
@@ -57,9 +54,6 @@ class LibraryComfortableGridHolder(
 | 
			
		||||
        // set local visibility if its local manga
 | 
			
		||||
        binding.badges.localText.isVisible = item.isLocal
 | 
			
		||||
 | 
			
		||||
        // For rounded corners
 | 
			
		||||
        binding.card.clipToOutline = true
 | 
			
		||||
 | 
			
		||||
        // Update the cover.
 | 
			
		||||
        binding.thumbnail.clear()
 | 
			
		||||
        binding.thumbnail.loadAnyAutoPause(item.manga)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.library
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.view.isVisible
 | 
			
		||||
import coil.clear
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
@@ -9,19 +8,18 @@ import eu.kanade.tachiyomi.util.view.loadAnyAutoPause
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class used to hold the displayed data of a manga in the library, like the cover or the title.
 | 
			
		||||
 * All the elements from the layout file "item_source_grid" are available in this class.
 | 
			
		||||
 * All the elements from the layout file "source_compact_grid_item" are available in this class.
 | 
			
		||||
 *
 | 
			
		||||
 * @param view the inflated view for this holder.
 | 
			
		||||
 * @param binding the inflated view for this holder.
 | 
			
		||||
 * @param adapter the adapter handling this holder.
 | 
			
		||||
 * @param listener a listener to react to single tap and long tap events.
 | 
			
		||||
 * @param coverOnly true if title should be hidden a.k.a cover only mode.
 | 
			
		||||
 * @constructor creates a new library holder.
 | 
			
		||||
 */
 | 
			
		||||
open class LibraryCompactGridHolder(
 | 
			
		||||
    private val view: View,
 | 
			
		||||
    private val adapter: FlexibleAdapter<*>
 | 
			
		||||
) : LibraryHolder<SourceCompactGridItemBinding>(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    override val binding = SourceCompactGridItemBinding.bind(view)
 | 
			
		||||
class LibraryCompactGridHolder(
 | 
			
		||||
    override val binding: SourceCompactGridItemBinding,
 | 
			
		||||
    adapter: FlexibleAdapter<*>,
 | 
			
		||||
    private val coverOnly: Boolean
 | 
			
		||||
) : LibraryHolder<SourceCompactGridItemBinding>(binding.root, adapter) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this
 | 
			
		||||
@@ -55,11 +53,20 @@ open class LibraryCompactGridHolder(
 | 
			
		||||
        // set local visibility if its local manga
 | 
			
		||||
        binding.badges.localText.isVisible = item.isLocal
 | 
			
		||||
 | 
			
		||||
        // For rounded corners
 | 
			
		||||
        binding.card.clipToOutline = true
 | 
			
		||||
 | 
			
		||||
        // Update the cover.
 | 
			
		||||
        binding.thumbnail.clear()
 | 
			
		||||
        binding.thumbnail.loadAnyAutoPause(item.manga)
 | 
			
		||||
        if (coverOnly) {
 | 
			
		||||
            // Cover only mode: Hides title text unless thumbnail is unavailable
 | 
			
		||||
            if (!item.manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
                binding.thumbnail.loadAnyAutoPause(item.manga)
 | 
			
		||||
                binding.title.isVisible = false
 | 
			
		||||
            } else {
 | 
			
		||||
                binding.title.text = item.manga.title
 | 
			
		||||
                binding.title.isVisible = true
 | 
			
		||||
            }
 | 
			
		||||
            binding.thumbnail.foreground = null
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.thumbnail.loadAnyAutoPause(item.manga)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,60 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.library
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.view.isVisible
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import coil.clear
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.SourceCoverOnlyGridItemBinding
 | 
			
		||||
import eu.kanade.tachiyomi.util.view.loadAnyAutoPause
 | 
			
		||||
 | 
			
		||||
class LibraryCoverOnlyGridHolder(
 | 
			
		||||
    view: View,
 | 
			
		||||
    adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
 | 
			
		||||
) : LibraryHolder<SourceCoverOnlyGridItemBinding>(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    override val binding = SourceCoverOnlyGridItemBinding.bind(view)
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this
 | 
			
		||||
     * holder with the given manga.
 | 
			
		||||
     *
 | 
			
		||||
     * @param item the manga item to bind.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onSetValues(item: LibraryItem) {
 | 
			
		||||
        // For rounded corners
 | 
			
		||||
        binding.badges.leftBadges.clipToOutline = true
 | 
			
		||||
        binding.badges.rightBadges.clipToOutline = true
 | 
			
		||||
 | 
			
		||||
        // Update the unread count and its visibility.
 | 
			
		||||
        with(binding.badges.unreadText) {
 | 
			
		||||
            isVisible = item.unreadCount > 0
 | 
			
		||||
            text = item.unreadCount.toString()
 | 
			
		||||
        }
 | 
			
		||||
        // Update the download count and its visibility.
 | 
			
		||||
        with(binding.badges.downloadText) {
 | 
			
		||||
            isVisible = item.downloadCount > 0
 | 
			
		||||
            text = item.downloadCount.toString()
 | 
			
		||||
        }
 | 
			
		||||
        // Update the source language and its visibility
 | 
			
		||||
        with(binding.badges.languageText) {
 | 
			
		||||
            isVisible = item.sourceLanguage.isNotEmpty()
 | 
			
		||||
            text = item.sourceLanguage
 | 
			
		||||
        }
 | 
			
		||||
        // set local visibility if its local manga
 | 
			
		||||
        binding.badges.localText.isVisible = item.isLocal
 | 
			
		||||
 | 
			
		||||
        // For rounded corners
 | 
			
		||||
        binding.card.clipToOutline = true
 | 
			
		||||
 | 
			
		||||
        // Update the cover.
 | 
			
		||||
        binding.thumbnail.clear()
 | 
			
		||||
        if (!item.manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            binding.thumbnail.loadAnyAutoPause(item.manga)
 | 
			
		||||
        } else {
 | 
			
		||||
            // Set manga title
 | 
			
		||||
            binding.title.text = item.manga.title
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.library
 | 
			
		||||
 | 
			
		||||
import android.view.Gravity
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
 | 
			
		||||
import android.widget.FrameLayout
 | 
			
		||||
import androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import com.fredporciuncula.flow.preferences.Preference
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
@@ -15,10 +11,8 @@ import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.LibraryManga
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.SourceCompactGridItemBinding
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.SourceCoverOnlyGridItemBinding
 | 
			
		||||
import eu.kanade.tachiyomi.source.SourceManager
 | 
			
		||||
import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
 | 
			
		||||
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
 | 
			
		||||
@@ -47,9 +41,8 @@ class LibraryItem(
 | 
			
		||||
 | 
			
		||||
    override fun getLayoutRes(): Int {
 | 
			
		||||
        return when (getDisplayMode()) {
 | 
			
		||||
            DisplayModeSetting.COMPACT_GRID -> R.layout.source_compact_grid_item
 | 
			
		||||
            DisplayModeSetting.COMPACT_GRID, DisplayModeSetting.COVER_ONLY_GRID -> R.layout.source_compact_grid_item
 | 
			
		||||
            DisplayModeSetting.COMFORTABLE_GRID -> R.layout.source_comfortable_grid_item
 | 
			
		||||
            DisplayModeSetting.COVER_ONLY_GRID -> R.layout.source_cover_only_grid_item
 | 
			
		||||
            DisplayModeSetting.LIST -> R.layout.source_list_item
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -57,42 +50,13 @@ class LibraryItem(
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): LibraryHolder<*> {
 | 
			
		||||
        return when (getDisplayMode()) {
 | 
			
		||||
            DisplayModeSetting.COMPACT_GRID -> {
 | 
			
		||||
                val binding = SourceCompactGridItemBinding.bind(view)
 | 
			
		||||
                val parent = adapter.recyclerView as AutofitRecyclerView
 | 
			
		||||
                val coverHeight = parent.itemWidth / 3 * 4
 | 
			
		||||
                view.apply {
 | 
			
		||||
                    binding.card.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, coverHeight)
 | 
			
		||||
                    binding.gradient.layoutParams = FrameLayout.LayoutParams(
 | 
			
		||||
                        MATCH_PARENT,
 | 
			
		||||
                        coverHeight / 2,
 | 
			
		||||
                        Gravity.BOTTOM
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                LibraryCompactGridHolder(view, adapter)
 | 
			
		||||
            }
 | 
			
		||||
            DisplayModeSetting.COMFORTABLE_GRID -> {
 | 
			
		||||
                val binding = SourceComfortableGridItemBinding.bind(view)
 | 
			
		||||
                val parent = adapter.recyclerView as AutofitRecyclerView
 | 
			
		||||
                val coverHeight = parent.itemWidth / 3 * 4
 | 
			
		||||
                view.apply {
 | 
			
		||||
                    binding.card.layoutParams = ConstraintLayout.LayoutParams(
 | 
			
		||||
                        MATCH_PARENT,
 | 
			
		||||
                        coverHeight
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                LibraryComfortableGridHolder(view, adapter)
 | 
			
		||||
                LibraryCompactGridHolder(SourceCompactGridItemBinding.bind(view), adapter, coverOnly = false)
 | 
			
		||||
            }
 | 
			
		||||
            DisplayModeSetting.COVER_ONLY_GRID -> {
 | 
			
		||||
                val binding = SourceCoverOnlyGridItemBinding.bind(view)
 | 
			
		||||
                val parent = adapter.recyclerView as AutofitRecyclerView
 | 
			
		||||
                val coverHeight = parent.itemWidth / 3 * 4
 | 
			
		||||
                view.apply {
 | 
			
		||||
                    binding.card.layoutParams = ConstraintLayout.LayoutParams(
 | 
			
		||||
                        MATCH_PARENT,
 | 
			
		||||
                        coverHeight
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                LibraryCoverOnlyGridHolder(view, adapter)
 | 
			
		||||
                LibraryCompactGridHolder(SourceCompactGridItemBinding.bind(view), adapter, coverOnly = true)
 | 
			
		||||
            }
 | 
			
		||||
            DisplayModeSetting.COMFORTABLE_GRID -> {
 | 
			
		||||
                LibraryComfortableGridHolder(SourceComfortableGridItemBinding.bind(view), adapter)
 | 
			
		||||
            }
 | 
			
		||||
            DisplayModeSetting.LIST -> {
 | 
			
		||||
                LibraryListHolder(view, adapter)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,9 @@
 | 
			
		||||
    <gradient
 | 
			
		||||
        android:angle="90"
 | 
			
		||||
        android:centerColor="#00000000"
 | 
			
		||||
        android:centerY="0.3"
 | 
			
		||||
        android:endColor="#00ffffff"
 | 
			
		||||
        android:startColor="#aa000000" />
 | 
			
		||||
 | 
			
		||||
    <corners android:radius="0dp" />
 | 
			
		||||
    <corners android:radius="@dimen/card_radius" />
 | 
			
		||||
</shape>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
@@ -9,57 +9,55 @@
 | 
			
		||||
    android:foreground="@drawable/library_item_selector_overlay"
 | 
			
		||||
    android:padding="4dp">
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
    <com.google.android.material.progressindicator.CircularProgressIndicator
 | 
			
		||||
        android:id="@+id/progress"
 | 
			
		||||
        style="@style/Widget.Tachiyomi.CircularProgressIndicator.Small"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:indeterminate="true"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.imageview.ShapeableImageView
 | 
			
		||||
        android:id="@+id/thumbnail"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:scaleType="centerCrop"
 | 
			
		||||
        app:layout_constraintDimensionRatio="w,3:2"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Cover"
 | 
			
		||||
        tools:ignore="ContentDescription"
 | 
			
		||||
        tools:src="@mipmap/ic_launcher" />
 | 
			
		||||
 | 
			
		||||
    <include
 | 
			
		||||
        android:id="@+id/badges"
 | 
			
		||||
        layout="@layout/source_grid_item_badges"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content">
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginHorizontal="4dp"
 | 
			
		||||
        android:layout_marginTop="4dp"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@+id/thumbnail" />
 | 
			
		||||
 | 
			
		||||
        <FrameLayout
 | 
			
		||||
            android:id="@+id/card"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="220dp"
 | 
			
		||||
            android:background="@drawable/rounded_rectangle"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent">
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/title"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:maxLines="2"
 | 
			
		||||
        android:padding="4dp"
 | 
			
		||||
        android:textAppearance="?attr/textAppearanceTitleSmall"
 | 
			
		||||
        android:textColor="@color/source_comfortable_item_title"
 | 
			
		||||
        android:textSize="12sp"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@+id/thumbnail"
 | 
			
		||||
        tools:text="Sample name" />
 | 
			
		||||
 | 
			
		||||
            <ImageView
 | 
			
		||||
                android:id="@+id/thumbnail"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="match_parent"
 | 
			
		||||
                android:background="?attr/colorSurface"
 | 
			
		||||
                android:scaleType="centerCrop"
 | 
			
		||||
                tools:ignore="ContentDescription"
 | 
			
		||||
                tools:src="@mipmap/ic_launcher" />
 | 
			
		||||
 | 
			
		||||
            <include
 | 
			
		||||
                android:id="@+id/badges"
 | 
			
		||||
                layout="@layout/source_grid_item_badges" />
 | 
			
		||||
 | 
			
		||||
            <com.google.android.material.progressindicator.CircularProgressIndicator
 | 
			
		||||
                android:id="@+id/progress"
 | 
			
		||||
                style="@style/Widget.Tachiyomi.CircularProgressIndicator.Small"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_gravity="center"
 | 
			
		||||
                android:indeterminate="true"
 | 
			
		||||
                android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
        </FrameLayout>
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/title"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:ellipsize="end"
 | 
			
		||||
            android:maxLines="2"
 | 
			
		||||
            android:padding="4dp"
 | 
			
		||||
            android:textAppearance="?attr/textAppearanceTitleSmall"
 | 
			
		||||
            android:textSize="12sp"
 | 
			
		||||
            android:textColor="@color/source_comfortable_item_title"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@+id/card"
 | 
			
		||||
            tools:text="Sample name" />
 | 
			
		||||
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
@@ -8,58 +9,64 @@
 | 
			
		||||
    android:foreground="@drawable/library_item_selector_overlay"
 | 
			
		||||
    android:padding="4dp">
 | 
			
		||||
 | 
			
		||||
    <FrameLayout
 | 
			
		||||
        android:id="@+id/card"
 | 
			
		||||
    <com.google.android.material.imageview.ShapeableImageView
 | 
			
		||||
        android:id="@+id/thumbnail"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:scaleType="centerCrop"
 | 
			
		||||
        android:foreground="@drawable/card_gradient_shape"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintDimensionRatio="w,2:3"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Cover"
 | 
			
		||||
        tools:ignore="ContentDescription"
 | 
			
		||||
        tools:src="@mipmap/ic_launcher" />
 | 
			
		||||
 | 
			
		||||
    <include
 | 
			
		||||
        android:id="@+id/badges"
 | 
			
		||||
        layout="@layout/source_grid_item_badges"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginHorizontal="4dp"
 | 
			
		||||
        android:layout_marginTop="4dp"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@+id/thumbnail" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/title"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_gravity="bottom"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:maxLines="2"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:shadowColor="@color/md_black_1000"
 | 
			
		||||
        android:shadowDx="0"
 | 
			
		||||
        android:shadowDy="0"
 | 
			
		||||
        android:shadowRadius="4"
 | 
			
		||||
        android:textAppearance="?attr/textAppearanceTitleSmall"
 | 
			
		||||
        android:textColor="@color/md_white_1000"
 | 
			
		||||
        android:textSize="12sp"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@+id/thumbnail"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        tools:text="Sample name" />
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.progressindicator.CircularProgressIndicator
 | 
			
		||||
        android:id="@+id/progress"
 | 
			
		||||
        style="@style/Widget.Tachiyomi.CircularProgressIndicator.Small"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="220dp"
 | 
			
		||||
        android:background="@drawable/rounded_rectangle">
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_gravity="center"
 | 
			
		||||
        android:indeterminate="true"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <ImageView
 | 
			
		||||
            android:id="@+id/thumbnail"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:background="?attr/colorSurface"
 | 
			
		||||
            android:scaleType="centerCrop"
 | 
			
		||||
            tools:ignore="ContentDescription"
 | 
			
		||||
            tools:src="@mipmap/ic_launcher" />
 | 
			
		||||
 | 
			
		||||
        <View
 | 
			
		||||
            android:id="@+id/gradient"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_gravity="bottom"
 | 
			
		||||
            android:background="@drawable/gradient_shape" />
 | 
			
		||||
 | 
			
		||||
        <include
 | 
			
		||||
            android:id="@+id/badges"
 | 
			
		||||
            layout="@layout/source_grid_item_badges" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/title"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_gravity="bottom"
 | 
			
		||||
            android:ellipsize="end"
 | 
			
		||||
            android:maxLines="2"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            android:shadowColor="@color/md_black_1000"
 | 
			
		||||
            android:shadowDx="0"
 | 
			
		||||
            android:shadowDy="0"
 | 
			
		||||
            android:shadowRadius="4"
 | 
			
		||||
            android:textAppearance="?attr/textAppearanceTitleSmall"
 | 
			
		||||
            android:textSize="12sp"
 | 
			
		||||
            android:textColor="@color/md_white_1000"
 | 
			
		||||
            tools:text="Sample name" />
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.progressindicator.CircularProgressIndicator
 | 
			
		||||
            android:id="@+id/progress"
 | 
			
		||||
            style="@style/Widget.Tachiyomi.CircularProgressIndicator.Small"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_gravity="center"
 | 
			
		||||
            android:indeterminate="true"
 | 
			
		||||
            android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
    </FrameLayout>
 | 
			
		||||
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,68 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:layout_margin="2dp"
 | 
			
		||||
    android:background="@drawable/library_item_selector"
 | 
			
		||||
    android:foreground="@drawable/library_item_selector_overlay"
 | 
			
		||||
    android:padding="4dp">
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
        <FrameLayout
 | 
			
		||||
            android:id="@+id/card"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="220dp"
 | 
			
		||||
            android:background="@drawable/rounded_rectangle"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent">
 | 
			
		||||
 | 
			
		||||
            <ImageView
 | 
			
		||||
                android:id="@+id/thumbnail"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="match_parent"
 | 
			
		||||
                android:background="?attr/colorSurface"
 | 
			
		||||
                android:scaleType="centerCrop"
 | 
			
		||||
                tools:ignore="ContentDescription"
 | 
			
		||||
                tools:src="@mipmap/ic_launcher" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/title"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_gravity="bottom"
 | 
			
		||||
                android:ellipsize="end"
 | 
			
		||||
                android:maxLines="2"
 | 
			
		||||
                android:padding="8dp"
 | 
			
		||||
                android:shadowColor="@color/md_black_1000"
 | 
			
		||||
                android:shadowDx="0"
 | 
			
		||||
                android:shadowDy="0"
 | 
			
		||||
                android:shadowRadius="4"
 | 
			
		||||
                android:textAppearance="?attr/textAppearanceTitleSmall"
 | 
			
		||||
                android:textSize="12sp"
 | 
			
		||||
                android:textColor="@color/md_white_1000"
 | 
			
		||||
                tools:text="Sample name" />
 | 
			
		||||
 | 
			
		||||
            <include
 | 
			
		||||
                android:id="@+id/badges"
 | 
			
		||||
                layout="@layout/source_grid_item_badges" />
 | 
			
		||||
 | 
			
		||||
            <com.google.android.material.progressindicator.CircularProgressIndicator
 | 
			
		||||
                android:id="@+id/progress"
 | 
			
		||||
                style="@style/Widget.Tachiyomi.CircularProgressIndicator.Small"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_gravity="center"
 | 
			
		||||
                android:indeterminate="true"
 | 
			
		||||
                android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
        </FrameLayout>
 | 
			
		||||
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
		Reference in New Issue
	
	Block a user