From 15193952673754bf3795be5847b015336d30b322 Mon Sep 17 00:00:00 2001 From: Carlos <2092019+CarlosEsco@users.noreply.github.com> Date: Thu, 23 Apr 2020 21:57:04 -0400 Subject: [PATCH] Chapter cleanup (#210) * clean up chapterholder and reader chapter item to use a helper class for colors * update gradle.properties to cache and have larger memory * fixed bug causing some chapters that were swiped to crash app * add relative date to chapter util reference colors instead of attrs in color.xml add a bookmarked and read alpha Co-authored-by: Jays2Kings --- .../tachiyomi/ui/manga/MangaDetailsAdapter.kt | 10 ++- .../tachiyomi/ui/manga/MangaHeaderItem.kt | 3 +- .../ui/manga/chapter/BaseChapterItem.kt | 3 +- .../ui/manga/chapter/ChapterHolder.kt | 70 ++++++++-------- .../tachiyomi/ui/reader/ReaderChapterItem.kt | 84 +++++++++---------- .../tachiyomi/util/chapter/ChapterUtil.kt | 29 +++++++ .../kanade/tachiyomi/util/system/HashCode.kt | 14 ++++ app/src/main/res/values/colors.xml | 6 +- gradle.properties | 2 + 9 files changed, 135 insertions(+), 86 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterUtil.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/util/system/HashCode.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsAdapter.kt index 901d0041c5..a89bc568a4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsAdapter.kt @@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.ui.manga.chapter.BaseChapterAdapter import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem -import eu.kanade.tachiyomi.util.system.getResourceColor +import eu.kanade.tachiyomi.util.chapter.ChapterUtil import uy.kohesive.injekt.injectLazy import java.text.DecimalFormat import java.text.DecimalFormatSymbols @@ -25,11 +25,13 @@ class MangaDetailsAdapter( val delegate: MangaDetailsInterface = controller val presenter = controller.presenter - val readColor = context.getResourceColor(android.R.attr.textColorHint) + val readColor = ChapterUtil.readColor(context) - val unreadColor = context.getResourceColor(android.R.attr.textColorPrimary) + val unreadColor = ChapterUtil.unreadColor(context) - val bookmarkedColor = context.getResourceColor(R.attr.colorAccent) + val bookmarkedColor = ChapterUtil.bookmarkedColor(context) + + val bookmarkedAndReadColor = ChapterUtil.bookmarkedAndReadColor(context) val decimalFormat = DecimalFormat("#.###", DecimalFormatSymbols() .apply { decimalSeparator = '.' }) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt index c569ec6b34..c9031950f4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt @@ -7,6 +7,7 @@ import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.util.system.HashCode class MangaHeaderItem(val manga: Manga, var startExpanded: Boolean) : AbstractFlexibleItem() { @@ -46,6 +47,6 @@ class MangaHeaderItem(val manga: Manga, var startExpanded: Boolean) : } override fun hashCode(): Int { - return manga.id!!.hashCode() + return HashCode.generate(manga.id, manga.title) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/BaseChapterItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/BaseChapterItem.kt index dece86fe00..6f3e01cfa8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/BaseChapterItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/BaseChapterItem.kt @@ -5,6 +5,7 @@ import eu.davidea.flexibleadapter.items.AbstractSectionableItem import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.util.system.HashCode abstract class BaseChapterItem>( val chapter: @@ -40,6 +41,6 @@ Chapter, } override fun hashCode(): Int { - return (chapter.id ?: 0L).hashCode() + return HashCode.generate(chapter.id ?: 0L, chapter.name) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt index e983ac855e..34c30a508f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt @@ -1,18 +1,17 @@ package eu.kanade.tachiyomi.ui.manga.chapter -import android.text.format.DateUtils import android.view.View -import androidx.core.content.ContextCompat 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.source.LocalSource import eu.kanade.tachiyomi.ui.manga.MangaDetailsAdapter +import eu.kanade.tachiyomi.util.chapter.ChapterUtil +import eu.kanade.tachiyomi.util.system.contextCompatDrawable import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.visibleIf import kotlinx.android.synthetic.main.chapters_item.* import kotlinx.android.synthetic.main.download_button.* -import java.util.Date class ChapterHolder( view: View, @@ -20,6 +19,7 @@ class ChapterHolder( ) : BaseChapterHolder(view, adapter) { private var localSource = false + init { download_button.setOnLongClickListener { adapter.delegate.startDownloadRange(adapterPosition) @@ -39,33 +39,32 @@ class ChapterHolder( } localSource = manga.source == LocalSource.ID - download_button.visibleIf(!localSource) + download_button.visibleIf(!localSource && !isLocked) - if (isLocked) download_button.gone() + var chapterColor = when { + isLocked -> adapter.unreadColor + chapter.bookmark && chapter.read -> adapter.bookmarkedAndReadColor + chapter.bookmark -> adapter.bookmarkedColor + chapter.read -> adapter.readColor + else -> adapter.unreadColor + } // Set correct text color - chapter_title.setTextColor( - if (chapter.read && !isLocked) adapter.readColor else adapter.unreadColor - ) - if (chapter.bookmark && !isLocked) chapter_title.setTextColor(adapter.bookmarkedColor) + chapter_title.setTextColor(chapterColor) val statuses = mutableListOf() - if (chapter.date_upload > 0) { - statuses.add( - DateUtils.getRelativeTimeSpanString( - chapter.date_upload, Date().time, DateUtils.HOUR_IN_MILLIS - ).toString() - ) - } + ChapterUtil.relativeDate(chapter)?.let { statuses.add(it) } - if (!chapter.read && chapter.last_page_read > 0 && chapter.pages_left > 0 && !isLocked) { + val showPagesLeft = !chapter.read && chapter.last_page_read > 0 && !isLocked + + if (showPagesLeft && chapter.pages_left > 0) { statuses.add( itemView.resources.getQuantityString( R.plurals.pages_left, chapter.pages_left, chapter.pages_left ) ) - } else if (!chapter.read && chapter.last_page_read > 0 && !isLocked) { + } else if (showPagesLeft) { statuses.add( itemView.context.getString( R.string.page_, chapter.last_page_read + 1 @@ -73,31 +72,36 @@ class ChapterHolder( ) } - if (!chapter.scanlator.isNullOrBlank()) { - statuses.add(chapter.scanlator!!) - } + chapter.scanlator?.isNotBlank()?.let { statuses.add(chapter.scanlator!!) } if (front_view.translationX == 0f) { read.setImageDrawable( - ContextCompat.getDrawable( - read.context, if (item.read) R.drawable.ic_eye_off_24dp - else R.drawable.ic_eye_24dp + read.context.contextCompatDrawable( + when (item.read) { + true -> R.drawable.ic_eye_off_24dp + false -> R.drawable.ic_eye_24dp + } ) ) bookmark.setImageDrawable( - ContextCompat.getDrawable( - read.context, if (item.bookmark) R.drawable.ic_bookmark_off_24dp - else R.drawable.ic_bookmark_24dp + read.context.contextCompatDrawable( + when (item.bookmark) { + true -> R.drawable.ic_bookmark_off_24dp + false -> R.drawable.ic_bookmark_24dp + } ) ) } - chapter_scanlator.setTextColor(if (chapter.read) adapter.readColor else adapter.unreadColor) + // this will color the scanlator the same bookmarks + chapter_scanlator.setTextColor(chapterColor) chapter_scanlator.text = statuses.joinToString(" • ") - notifyStatus( - if (adapter.isSelected(adapterPosition)) Download.CHECKED else item.status, - item.isLocked, - item.progress - ) + + val status = when (adapter.isSelected(adapterPosition)) { + true -> Download.CHECKED + false -> item.status + } + + notifyStatus(status, item.isLocked, item.progress) resetFrontView() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderChapterItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderChapterItem.kt index d57f6151df..d24f6ad0c2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderChapterItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderChapterItem.kt @@ -1,39 +1,33 @@ package eu.kanade.tachiyomi.ui.reader -import android.content.res.ColorStateList import android.graphics.Typeface -import android.text.format.DateUtils import android.view.View import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView +import androidx.core.graphics.drawable.DrawableCompat import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.items.AbstractItem import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.util.chapter.ChapterUtil import eu.kanade.tachiyomi.util.system.contextCompatDrawable -import eu.kanade.tachiyomi.util.system.getResourceColor import java.text.DecimalFormat import java.text.DecimalFormatSymbols -import java.util.Date class ReaderChapterItem(val chapter: Chapter, val manga: Manga, val isCurrent: Boolean) : AbstractItem () { - var name: String? = null - var description: String? = null val decimalFormat = DecimalFormat("#.###", DecimalFormatSymbols().apply { decimalSeparator = '.' }) /** defines the type defining this item. must be unique. preferably an id */ - override val type: Int - get() = R.id.reader_chapter_layout + override val type: Int = R.id.reader_chapter_layout /** defines the layout which will be used for this item in the list */ - override val layoutRes: Int - get() = R.layout.reader_chapter_item + override val layoutRes: Int = R.layout.reader_chapter_item override var identifier: Long get() = chapter.id!! @@ -49,9 +43,10 @@ class ReaderChapterItem(val chapter: Chapter, val manga: Manga, val isCurrent: B var bookmarkButton: FrameLayout = view.findViewById(R.id.bookmark_layout) var bookmarkImage: ImageView = view.findViewById(R.id.bookmark_image) - private var readColor = view.context.getResourceColor(android.R.attr.textColorHint) - private var unreadColor = view.context.getResourceColor(android.R.attr.textColorPrimary) - private var activeColor = view.context.getResourceColor(android.R.attr.colorAccent) + private var readColor = ChapterUtil.readColor(view.context) + private var unreadColor = ChapterUtil.unreadColor(view.context) + private var bookmarkColor = ChapterUtil.bookmarkedColor(view.context) + private var bookmarkReadColor = ChapterUtil.bookmarkedAndReadColor(view.context) private var unbookmark = view.context.contextCompatDrawable(R.drawable.ic_bookmark_border_24dp) private var bookmark = view.context.contextCompatDrawable(R.drawable.ic_bookmark_24dp) @@ -59,6 +54,15 @@ class ReaderChapterItem(val chapter: Chapter, val manga: Manga, val isCurrent: B override fun bindView(item: ReaderChapterItem, payloads: List) { val chapter = item.chapter val manga = item.manga + + var chapterColor = when { + chapter.bookmark && chapter.read -> bookmarkReadColor + chapter.bookmark -> bookmarkColor + chapter.read && !item.isCurrent -> readColor + else -> unreadColor + } + + chapterTitle.setTextColor(chapterColor) chapterTitle.text = when (manga.displayMode) { Manga.DISPLAY_NUMBER -> { val number = item.decimalFormat.format(chapter.chapter_number.toDouble()) @@ -66,47 +70,35 @@ class ReaderChapterItem(val chapter: Chapter, val manga: Manga, val isCurrent: B } else -> chapter.name } + val statuses = mutableListOf() - if (chapter.date_upload > 0) { - statuses.add( - DateUtils.getRelativeTimeSpanString( - chapter.date_upload, Date().time, DateUtils.HOUR_IN_MILLIS - ).toString() - ) - } - - if (!chapter.scanlator.isNullOrBlank()) { - statuses.add(chapter.scanlator!!) - } - - chapterTitle.setTextColor( - when { - chapter.bookmark -> activeColor - chapter.read && !item.isCurrent -> readColor - else -> unreadColor - } - ) + ChapterUtil.relativeDate(chapter)?.let { statuses.add(it) } + chapter.scanlator?.isNotBlank()?.let { statuses.add(chapter.scanlator!!) } if (item.isCurrent) { - chapterTitle.setTypeface(null, Typeface.BOLD) - chapterSubtitle.setTypeface(null, Typeface.BOLD) + chapterTitle.setTypeface(null, Typeface.BOLD_ITALIC) + chapterSubtitle.setTypeface(null, Typeface.BOLD_ITALIC) } else { chapterTitle.setTypeface(null, Typeface.NORMAL) chapterSubtitle.setTypeface(null, Typeface.NORMAL) } - chapterSubtitle.setTextColor( - when { - chapter.read -> readColor - else -> unreadColor - } - ) - bookmarkImage.setImageDrawable(if (chapter.bookmark) - bookmark - else unbookmark) - bookmarkImage.imageTintList = ColorStateList.valueOf(if (chapter.bookmark) - activeColor - else readColor) + // match color of the chapter title + chapterSubtitle.setTextColor(chapterColor) + + bookmarkImage.setImageDrawable(when (chapter.bookmark) { + true -> bookmark + false -> unbookmark + }) + + val drawableColor = when { + chapter.bookmark && chapter.read -> bookmarkReadColor + chapter.bookmark -> bookmarkColor + else -> readColor + } + + DrawableCompat.setTint(bookmarkImage.drawable, drawableColor) + chapterSubtitle.text = statuses.joinToString(" • ") } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterUtil.kt new file mode 100644 index 0000000000..4fa70017fe --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterUtil.kt @@ -0,0 +1,29 @@ +package eu.kanade.tachiyomi.util.chapter + +import android.content.Context +import android.text.format.DateUtils +import androidx.core.graphics.ColorUtils +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.database.models.Chapter +import eu.kanade.tachiyomi.util.system.contextCompatColor +import java.util.Date + +class ChapterUtil { + companion object { + + fun relativeDate(chapter: Chapter): String? { + return when (chapter.date_upload > 0) { + true -> DateUtils.getRelativeTimeSpanString(chapter.date_upload, Date().time, DateUtils.HOUR_IN_MILLIS).toString() + false -> null + } + } + + fun readColor(context: Context): Int = context.contextCompatColor(R.color.read_chapter) + + fun unreadColor(context: Context): Int = context.contextCompatColor(R.color.unread_chapter) + + fun bookmarkedColor(context: Context): Int = context.contextCompatColor(R.color.bookmarked_chapter) + + fun bookmarkedAndReadColor(context: Context): Int = ColorUtils.setAlphaComponent(context.contextCompatColor(R.color.bookmarked_chapter), 150) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/HashCode.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/HashCode.kt new file mode 100644 index 0000000000..5e66bd77eb --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/HashCode.kt @@ -0,0 +1,14 @@ +package eu.kanade.tachiyomi.util.system + +/**Generate a unique hash code*/ +class HashCode { + companion object { + fun generate(vararg thingsToHash: T): Int { + var hash = 17 + for (t in thingsToHash) { + hash = hash * 31 + t.hashCode() + } + return hash + } + } +} diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 719e21e1ff..a2c3af4969 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -16,6 +16,11 @@ @color/md_black_1000_38 #404040 + @color/textColorHint + @color/textColorPrimary + @color/colorAccent + @color/colorAccent + @color/colorAccent @color/md_white_1000 @color/pale_green @@ -23,7 +28,6 @@ @color/material_deep_purple_500 @color/md_white_1000 - @color/md_black_1000 @color/md_black_1000_87 diff --git a/gradle.properties b/gradle.properties index 48da317bc0..d47bc6cefc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,3 +20,5 @@ # AndroidX support android.enableJetifier=true android.useAndroidX=true +org.gradle.jvmargs=-Xmx2048M +org.gradle.caching=true \ No newline at end of file