From c293fd61b18ebb597ac80ccb419c6d59fc5d187c Mon Sep 17 00:00:00 2001 From: Ivan Iskandar <12537387+ivaniskandar@users.noreply.github.com> Date: Sun, 13 Feb 2022 23:09:49 +0700 Subject: [PATCH] Grid items optimizations (#6641) Use ConstraintLayout for ez size ratio calculation and merge cover-only view holder with compact's (cherry picked from commit fad1449de34952e12e2c5464dccf500d49fa7fa1) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt # app/src/main/res/layout/source_comfortable_grid_item.xml # app/src/main/res/layout/source_compact_grid_item.xml --- .../process/MigrationProcessHolder.kt | 17 +- .../browse/SourceComfortableGridHolder.kt | 18 +- .../source/browse/SourceCompactGridHolder.kt | 18 +- .../ui/browse/source/browse/SourceItem.kt | 42 +---- .../library/LibraryComfortableGridHolder.kt | 12 +- .../ui/library/LibraryCompactGridHolder.kt | 49 +++--- .../ui/library/LibraryCoverOnlyGridHolder.kt | 60 ------- .../tachiyomi/ui/library/LibraryHolder.kt | 6 +- .../tachiyomi/ui/library/LibraryItem.kt | 48 +----- ...ient_shape.xml => card_gradient_shape.xml} | 3 +- .../main/res/layout/migration_manga_card.xml | 149 +++++++--------- .../layout/source_comfortable_grid_item.xml | 152 ++++++++--------- .../res/layout/source_compact_grid_item.xml | 160 +++++++++--------- .../layout/source_cover_only_grid_item.xml | 68 -------- 14 files changed, 280 insertions(+), 522 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCoverOnlyGridHolder.kt rename app/src/main/res/drawable/{gradient_shape.xml => card_gradient_shape.xml} (78%) delete mode 100644 app/src/main/res/layout/source_cover_only_grid_item.xml diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessHolder.kt index 713e53a8c..367abb4b8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessHolder.kt @@ -113,7 +113,7 @@ class MigrationProcessHolder( if (adapter.hideNotFound) { adapter.removeManga(bindingAdapterPosition) } else { - binding.migrationMangaCardTo.loadingGroup.isVisible = false + binding.migrationMangaCardTo.progress.isVisible = false binding.migrationMangaCardTo.title.text = view.context.applicationContext .getString(R.string.no_alternatives_found) } @@ -126,20 +126,18 @@ class MigrationProcessHolder( } private fun MigrationMangaCardBinding.resetManga() { - loadingGroup.isVisible = true + progress.isVisible = true thumbnail.clear() thumbnail.setImageDrawable(null) title.text = "" mangaSourceLabel.text = "" - mangaChapters.text = "" - mangaChapters.isVisible = false + badges.unreadText.text = "" + badges.unreadText.isVisible = false mangaLastChapterLabel.text = "" } private suspend fun MigrationMangaCardBinding.attachManga(manga: Manga, source: Source) { - loadingGroup.isVisible = false - // For rounded corners - card.clipToOutline = true + progress.isVisible = false thumbnail.loadAny(manga) title.text = if (manga.title.isBlank()) { @@ -148,7 +146,6 @@ class MigrationProcessHolder( manga.originalTitle } - gradient.isVisible = true mangaSourceLabel.text = if (source.id == MERGED_SOURCE_ID) { db.getMergedMangaReferences(manga.id!!).executeOnIO().map { sourceManager.getOrStub(it.mangaSourceId).toString() @@ -158,8 +155,8 @@ class MigrationProcessHolder( } val chapters = db.getChapters(manga).executeAsBlocking() - mangaChapters.isVisible = true - mangaChapters.text = chapters.size.toString() + badges.unreadText.isVisible = true + badges.unreadText.text = chapters.size.toString() val latestChapter = chapters.maxByOrNull { it.chapter_number }?.chapter_number ?: -1f if (latestChapter > 0f) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt index a108374ed..967ffc284 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceComfortableGridHolder.kt @@ -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 @@ -19,14 +18,14 @@ import exh.metadata.metadata.base.RaisedSearchMetadata * 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(view, adapter) { - - override val binding = SourceComfortableGridItemBinding.bind(view) +class SourceComfortableGridHolder( + override val binding: SourceComfortableGridItemBinding, + adapter: FlexibleAdapter<*> +) : SourceHolder(binding.root, adapter) { /** * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this @@ -67,15 +66,12 @@ class SourceComfortableGridHolder(private val view: View, private val adapter: F // SY <-- 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)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceCompactGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceCompactGridHolder.kt index 7c4681f1b..880b3a423 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceCompactGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceCompactGridHolder.kt @@ -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 @@ -19,14 +18,14 @@ import exh.metadata.metadata.base.RaisedSearchMetadata * 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(view, adapter) { - - override val binding = SourceCompactGridItemBinding.bind(view) +class SourceCompactGridHolder( + override val binding: SourceCompactGridItemBinding, + adapter: FlexibleAdapter<*> +) : SourceHolder(binding.root, adapter) { /** * Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this @@ -67,15 +66,12 @@ open class SourceCompactGridHolder(private val view: View, private val adapter: // SY <-- 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)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt index 83e270d6c..d6ecdbb98 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt @@ -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 @@ -16,7 +12,6 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper 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 import exh.metadata.metadata.base.RaisedSearchMetadata import exh.source.isEhBasedManga import uy.kohesive.injekt.injectLazy @@ -34,9 +29,9 @@ class SourceItem(val manga: Manga, private val displayMode: Preference 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 } } @@ -50,37 +45,14 @@ class SourceItem(val manga: Manga, private val displayMode: Preference { - 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) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt index 3b7b4980e..9671a25b0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt @@ -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 @@ -17,17 +16,15 @@ import reactivecircus.flowbinding.android.view.clicks * 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> -) : LibraryHolder(view, adapter) { - - override val binding = SourceComfortableGridItemBinding.bind(view) +) : LibraryHolder(binding.root, adapter) { // SY --> var manga: Manga? = null @@ -80,9 +77,6 @@ class LibraryComfortableGridHolder( binding.playLayout.isVisible = (item.manga.unreadCount > 0 && item.startReadingButton) // SY <-- - // For rounded corners - binding.card.clipToOutline = true - // Update the cover. binding.thumbnail.clear() binding.thumbnail.loadAnyAutoPause(item.manga) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt index 426f9ba47..48a088c73 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt @@ -1,17 +1,10 @@ package eu.kanade.tachiyomi.ui.library -import android.view.View -import android.widget.FrameLayout import androidx.core.view.isVisible -import androidx.core.view.updateLayoutParams -import androidx.core.view.updateMargins -import androidx.recyclerview.widget.RecyclerView import coil.clear import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.databinding.SourceCompactGridItemBinding -import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.view.loadAnyAutoPause import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -19,21 +12,18 @@ import reactivecircus.flowbinding.android.view.clicks /** * 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. */ class LibraryCompactGridHolder( - private val view: View, - // SY --> - adapter: FlexibleAdapter> - // SY <-- -) : LibraryHolder(view, adapter) { - - override val binding = SourceCompactGridItemBinding.bind(view) + override val binding: SourceCompactGridItemBinding, + adapter: FlexibleAdapter<*>, + private val coverOnly: Boolean +) : LibraryHolder(binding.root, adapter) { // SY --> var manga: Manga? = null @@ -83,23 +73,24 @@ class LibraryCompactGridHolder( binding.badges.localText.isVisible = item.isLocal // SY --> - val topMargin = if (item.sourceLanguage.isNotEmpty()) { - 16.dpToPx - } else { - 0.dpToPx - } - binding.playLayout.updateLayoutParams { - updateMargins(top = topMargin) - } binding.playLayout.isVisible = (item.manga.unreadCount > 0 && item.startReadingButton) // SY <-- - // 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) + } } // SY --> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCoverOnlyGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCoverOnlyGridHolder.kt deleted file mode 100644 index b99e38636..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCoverOnlyGridHolder.kt +++ /dev/null @@ -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> -) : LibraryHolder(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 - } - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt index 8e38b9d31..e9bb4d532 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt @@ -1,10 +1,8 @@ package eu.kanade.tachiyomi.ui.library import android.view.View -import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.viewholders.FlexibleViewHolder /** @@ -16,9 +14,7 @@ import eu.davidea.viewholders.FlexibleViewHolder abstract class LibraryHolder( view: View, - // SY --> - val adapter: FlexibleAdapter> - // SY <-- + val adapter: FlexibleAdapter<*> ) : FlexibleViewHolder(view, adapter) { abstract val binding: VB diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt index 9820cef1b..a79ecdb32 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt @@ -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 @@ -51,9 +45,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 } } @@ -61,42 +54,13 @@ class LibraryItem( override fun createViewHolder(view: View, adapter: FlexibleAdapter>): 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) diff --git a/app/src/main/res/drawable/gradient_shape.xml b/app/src/main/res/drawable/card_gradient_shape.xml similarity index 78% rename from app/src/main/res/drawable/gradient_shape.xml rename to app/src/main/res/drawable/card_gradient_shape.xml index 1ea15750d..ec22c54ed 100755 --- a/app/src/main/res/drawable/gradient_shape.xml +++ b/app/src/main/res/drawable/card_gradient_shape.xml @@ -5,8 +5,9 @@ - + diff --git a/app/src/main/res/layout/migration_manga_card.xml b/app/src/main/res/layout/migration_manga_card.xml index bc47510ab..67eba5662 100644 --- a/app/src/main/res/layout/migration_manga_card.xml +++ b/app/src/main/res/layout/migration_manga_card.xml @@ -4,95 +4,55 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/library_item_selector"> + android:layout_margin="2dp" + android:background="@drawable/library_item_selector" + android:foreground="@drawable/library_item_selector_overlay" + android:padding="4dp"> - + app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Cover" + tools:ignore="ContentDescription" + tools:src="@mipmap/ic_launcher" /> - + - - - - - - - - - - - - - - + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/thumbnail"> + android:textIsSelectable="false" /> + + diff --git a/app/src/main/res/layout/source_comfortable_grid_item.xml b/app/src/main/res/layout/source_comfortable_grid_item.xml index 6c81b0476..ce8578e58 100644 --- a/app/src/main/res/layout/source_comfortable_grid_item.xml +++ b/app/src/main/res/layout/source_comfortable_grid_item.xml @@ -1,5 +1,5 @@ - - + + + + + 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" /> - + - + + - + - - - - - - - - - - - - - - + diff --git a/app/src/main/res/layout/source_compact_grid_item.xml b/app/src/main/res/layout/source_compact_grid_item.xml index 2b21aff2e..f136789ec 100644 --- a/app/src/main/res/layout/source_compact_grid_item.xml +++ b/app/src/main/res/layout/source_compact_grid_item.xml @@ -1,5 +1,5 @@ - + + + + + android:id="@+id/play_layout" + android:layout_width="50dp" + android:layout_height="50dp" + android:layout_gravity="end" + android:clickable="true" + android:focusable="true" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="@id/thumbnail" + app:layout_constraintTop_toBottomOf="@+id/badges" + tools:visibility="visible"> - - - - - - - - - - - - - - + android:layout_marginStart="6dp" + android:layout_marginTop="6dp" + android:layout_marginEnd="6dp" + android:layout_marginBottom="6dp" + android:background="@drawable/round_play_background" + android:contentDescription="@string/action_start_reading" + android:padding="6dp" + android:src="@drawable/ic_start_reading_24dp" + app:tint="@android:color/white" /> - + + + + + diff --git a/app/src/main/res/layout/source_cover_only_grid_item.xml b/app/src/main/res/layout/source_cover_only_grid_item.xml deleted file mode 100644 index dafe66452..000000000 --- a/app/src/main/res/layout/source_cover_only_grid_item.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - -