Stat details: add tracking color/icon + source icon

Also remove card bg of mangaupdates and komga in settings
This commit is contained in:
Jays2Kings 2022-08-30 20:02:47 -04:00
parent 8897d5c7ef
commit e6c36a8144
13 changed files with 103 additions and 11 deletions

View file

@ -31,6 +31,8 @@ abstract class TrackService(val id: Int) {
@DrawableRes @DrawableRes
abstract fun getLogo(): Int abstract fun getLogo(): Int
abstract fun getTrackerColor(): Int
abstract fun getLogoColor(): Int abstract fun getLogoColor(): Int
abstract fun getStatusList(): List<Int> abstract fun getStatusList(): List<Int>

View file

@ -58,6 +58,8 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
override fun getLogo() = R.drawable.ic_tracker_anilist override fun getLogo() = R.drawable.ic_tracker_anilist
override fun getTrackerColor() = Color.rgb(2, 169, 255)
override fun getLogoColor() = Color.rgb(18, 25, 35) override fun getLogoColor() = Color.rgb(18, 25, 35)
override fun getStatusList() = listOf(READING, PLAN_TO_READ, COMPLETED, REREADING, PAUSED, DROPPED) override fun getStatusList() = listOf(READING, PLAN_TO_READ, COMPLETED, REREADING, PAUSED, DROPPED)

View file

@ -77,6 +77,8 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
override fun getLogo() = R.drawable.ic_tracker_bangumi override fun getLogo() = R.drawable.ic_tracker_bangumi
override fun getTrackerColor() = Color.rgb(240, 147, 155)
override fun getLogoColor() = Color.rgb(240, 145, 153) override fun getLogoColor() = Color.rgb(240, 145, 153)
override fun getStatusList(): List<Int> { override fun getStatusList(): List<Int> {

View file

@ -41,6 +41,8 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
override fun getLogo() = R.drawable.ic_tracker_kitsu override fun getLogo() = R.drawable.ic_tracker_kitsu
override fun getTrackerColor() = Color.rgb(253, 117, 92)
override fun getLogoColor() = Color.rgb(51, 37, 50) override fun getLogoColor() = Color.rgb(51, 37, 50)
override fun getStatusList(): List<Int> { override fun getStatusList(): List<Int> {

View file

@ -37,7 +37,9 @@ class Komga(private val context: Context, id: Int) : TrackService(id), EnhancedT
override fun getLogo() = R.drawable.ic_tracker_komga override fun getLogo() = R.drawable.ic_tracker_komga
override fun getLogoColor() = Color.rgb(51, 37, 50) override fun getTrackerColor() = Color.rgb(0, 94, 211)
override fun getLogoColor() = Color.argb(0, 51, 37, 50)
override fun getStatusList() = listOf(UNREAD, READING, COMPLETED) override fun getStatusList() = listOf(UNREAD, READING, COMPLETED)

View file

@ -34,7 +34,9 @@ class MangaUpdates(private val context: Context, id: Int) : TrackService(id) {
override fun getLogo(): Int = R.drawable.ic_tracker_manga_updates override fun getLogo(): Int = R.drawable.ic_tracker_manga_updates
override fun getLogoColor(): Int = Color.rgb(146, 160, 173) override fun getTrackerColor() = Color.rgb(251, 148, 46)
override fun getLogoColor() = Color.argb(0, 146, 160, 173)
override fun getStatusList(): List<Int> { override fun getStatusList(): List<Int> {
return listOf(READING_LIST, COMPLETE_LIST, ON_HOLD_LIST, UNFINISHED_LIST, WISH_LIST) return listOf(READING_LIST, COMPLETE_LIST, ON_HOLD_LIST, UNFINISHED_LIST, WISH_LIST)

View file

@ -27,7 +27,9 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
override fun getLogo() = R.drawable.ic_tracker_mal override fun getLogo() = R.drawable.ic_tracker_mal
override fun getLogoColor() = Color.rgb(46, 81, 162) override fun getTrackerColor() = getLogoColor()
override fun getLogoColor() = Color.rgb(46, 82, 162)
override fun getStatus(status: Int): String = with(context) { override fun getStatus(status: Int): String = with(context) {
when (status) { when (status) {

View file

@ -38,6 +38,8 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
override fun getLogo() = R.drawable.ic_tracker_shikimori override fun getLogo() = R.drawable.ic_tracker_shikimori
override fun getTrackerColor() = Color.rgb(218, 241, 255)
override fun getLogoColor() = Color.rgb(40, 40, 40) override fun getLogoColor() = Color.rgb(40, 40, 40)
override fun getStatusList(): List<Int> { override fun getStatusList(): List<Int> {

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.view.View import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.graphics.ColorUtils
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
@ -45,7 +46,8 @@ class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) {
fun bind(item: TrackItem) { fun bind(item: TrackItem) {
val track = item.track val track = item.track
binding.trackLogo.setImageResource(item.service.getLogo()) binding.trackLogo.setImageResource(item.service.getLogo())
binding.logoContainer.setBackgroundColor(item.service.getLogoColor()) val bgColor = ColorUtils.setAlphaComponent(item.service.getLogoColor(), 255)
binding.logoContainer.setBackgroundColor(bgColor)
binding.logoContainer.updateLayoutParams<ConstraintLayout.LayoutParams> { binding.logoContainer.updateLayoutParams<ConstraintLayout.LayoutParams> {
bottomToBottom = if (track != null) binding.divider.id else binding.trackDetails.id bottomToBottom = if (track != null) binding.divider.id else binding.trackDetails.id
} }

View file

@ -1,18 +1,21 @@
package eu.kanade.tachiyomi.ui.more.stats.details package eu.kanade.tachiyomi.ui.more.stats.details
import android.content.Context import android.content.Context
import android.graphics.Color
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.text.bold import androidx.core.text.bold
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.setPadding
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ListStatsDetailsBinding import eu.kanade.tachiyomi.databinding.ListStatsDetailsBinding
import eu.kanade.tachiyomi.ui.more.stats.StatsHelper.getReadDuration import eu.kanade.tachiyomi.ui.more.stats.StatsHelper.getReadDuration
import eu.kanade.tachiyomi.ui.more.stats.details.StatsDetailsPresenter.Stats import eu.kanade.tachiyomi.ui.more.stats.details.StatsDetailsPresenter.Stats
import eu.kanade.tachiyomi.ui.more.stats.details.StatsDetailsPresenter.StatsData import eu.kanade.tachiyomi.ui.more.stats.details.StatsDetailsPresenter.StatsData
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.roundToTwoDecimal import eu.kanade.tachiyomi.util.system.roundToTwoDecimal
@ -52,6 +55,16 @@ class StatsDetailsAdapter(
item.color ?: context.getResourceColor(R.attr.colorOnBackground), item.color ?: context.getResourceColor(R.attr.colorOnBackground),
) )
holder.statsLabelText.text = item.label holder.statsLabelText.text = item.label
if (item.iconRes != null) {
holder.statslogoContainer.isVisible = true
item.iconBGColor?.let { holder.statslogoContainer.setCardBackgroundColor(it) }
val padding =
if (Color.alpha(item.iconBGColor ?: Color.TRANSPARENT) == 0) 0 else 2.dpToPx
holder.statslogoIcon.setPadding(padding)
holder.statslogoIcon.setImageResource(item.iconRes!!)
} else {
holder.statslogoContainer.isVisible = false
}
holder.statsCountText.text = getCountText(item) holder.statsCountText.text = getCountText(item)
holder.statsCountPercentageText.text = getCountPercentageText(item) holder.statsCountPercentageText.text = getCountPercentageText(item)
holder.statsProgressText.text = getProgressText(item) holder.statsProgressText.text = getProgressText(item)
@ -93,6 +106,14 @@ class StatsDetailsAdapter(
item.color ?: context.getResourceColor(R.attr.colorOnBackground), item.color ?: context.getResourceColor(R.attr.colorOnBackground),
) )
holder.statsLabelText.text = item.label holder.statsLabelText.text = item.label
if (item.icon != null) {
holder.statslogoContainer.isVisible = true
holder.statslogoContainer.setCardBackgroundColor(Color.TRANSPARENT)
holder.statslogoIcon.setImageDrawable(item.icon!!)
holder.statslogoIcon.setPadding(0)
} else {
holder.statslogoContainer.isVisible = false
}
holder.statsCountText.text = getCountText(item) holder.statsCountText.text = getCountText(item)
holder.statsCountPercentageText.text = getCountPercentageText(item) holder.statsCountPercentageText.text = getCountPercentageText(item)
holder.statsProgressText.text = getProgressText(item) holder.statsProgressText.text = getProgressText(item)
@ -168,5 +189,7 @@ class StatsDetailsAdapter(
val statsDataLayout = binding.statsDataLayout val statsDataLayout = binding.statsDataLayout
val statsScoreStarImage = binding.statsScoreStarImage val statsScoreStarImage = binding.statsScoreStarImage
val statsSublabelText = binding.statsSublabelText val statsSublabelText = binding.statsSublabelText
val statslogoContainer = binding.logoContainer
val statslogoIcon = binding.logoIcon
} }
} }

View file

@ -1,5 +1,7 @@
package eu.kanade.tachiyomi.ui.more.stats.details package eu.kanade.tachiyomi.ui.more.stats.details
import android.graphics.drawable.Drawable
import androidx.annotation.DrawableRes
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Category
@ -13,6 +15,7 @@ import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.icon
import eu.kanade.tachiyomi.ui.more.stats.StatsHelper import eu.kanade.tachiyomi.ui.more.stats.StatsHelper
import eu.kanade.tachiyomi.util.isLocal import eu.kanade.tachiyomi.util.isLocal
import eu.kanade.tachiyomi.util.mapSeriesType import eu.kanade.tachiyomi.util.mapSeriesType
@ -230,12 +233,14 @@ class StatsDetailsPresenter(
val label = context.getString(service?.nameRes() ?: R.string.not_tracked) val label = context.getString(service?.nameRes() ?: R.string.not_tracked)
currentStats?.add( currentStats?.add(
StatsData( StatsData(
color = pieColorList[currentStats?.size!!], color = service?.getTrackerColor() ?: pieColorList.first(),
count = mangaAndTrack.count(), count = mangaAndTrack.count(),
meanScore = mangaAndTrack.map { it.second }.getMeanScoreByTracker()?.roundToTwoDecimal(), meanScore = mangaAndTrack.map { it.second }.getMeanScoreByTracker()?.roundToTwoDecimal(),
chaptersRead = mangaAndTrack.sumOf { it.first.read }, chaptersRead = mangaAndTrack.sumOf { it.first.read },
totalChapters = mangaAndTrack.sumOf { it.first.totalChapters }, totalChapters = mangaAndTrack.sumOf { it.first.totalChapters },
label = label.uppercase(), label = label.uppercase(),
iconRes = service?.getLogo(),
iconBGColor = service?.getLogoColor(),
readDuration = mangaAndTrack.map { it.first }.getReadDuration(), readDuration = mangaAndTrack.map { it.first }.getReadDuration(),
), ),
) )
@ -247,8 +252,9 @@ class StatsDetailsPresenter(
currentStats = ArrayList() currentStats = ArrayList()
val libraryFormat = mangasDistinct.filterByChip().groupBy { it.source } val libraryFormat = mangasDistinct.filterByChip().groupBy { it.source }
libraryFormat.forEach { (source, mangaList) -> libraryFormat.forEach { (sourceId, mangaList) ->
val sourceName = sources.find { it.id == source }?.toString() ?: source.toString() val source = sources.find { it.id == sourceId }
val sourceName = source?.toString() ?: sourceId.toString()
currentStats?.add( currentStats?.add(
StatsData( StatsData(
color = pieColorList[1], color = pieColorList[1],
@ -257,6 +263,7 @@ class StatsDetailsPresenter(
chaptersRead = mangaList.sumOf { it.read }, chaptersRead = mangaList.sumOf { it.read },
totalChapters = mangaList.sumOf { it.totalChapters }, totalChapters = mangaList.sumOf { it.totalChapters },
label = sourceName.uppercase(), label = sourceName.uppercase(),
icon = source?.icon(),
readDuration = mangaList.getReadDuration(), readDuration = mangaList.getReadDuration(),
), ),
) )
@ -273,7 +280,7 @@ class StatsDetailsPresenter(
val label = categories.find { it.id == category }?.name ?: context.getString(R.string.default_value) val label = categories.find { it.id == category }?.name ?: context.getString(R.string.default_value)
currentStats?.add( currentStats?.add(
StatsData( StatsData(
color = pieColorList[currentStats?.size!! % 12], color = pieColorList[currentStats?.size!! % pieColorList.size],
count = mangaList.count(), count = mangaList.count(),
meanScore = mangaList.getMeanScoreRounded(), meanScore = mangaList.getMeanScoreRounded(),
chaptersRead = mangaList.sumOf { it.read }, chaptersRead = mangaList.sumOf { it.read },
@ -582,6 +589,10 @@ class StatsDetailsPresenter(
val chaptersRead: Int = 0, val chaptersRead: Int = 0,
val totalChapters: Int = 0, val totalChapters: Int = 0,
var label: String? = null, var label: String? = null,
@DrawableRes
var iconRes: Int? = null,
var iconBGColor: Int? = null,
var icon: Drawable? = null,
var subLabel: String? = null, var subLabel: String? = null,
var readDuration: Long = 0, var readDuration: Long = 0,
) )

View file

@ -6,10 +6,12 @@ import android.util.AttributeSet
import android.widget.ImageView import android.widget.ImageView
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.setPadding
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder import androidx.preference.PreferenceViewHolder
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.system.dpToPx
class TrackerPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : class TrackerPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
Preference(context, attrs) { Preference(context, attrs) {
@ -25,6 +27,8 @@ class TrackerPreference @JvmOverloads constructor(context: Context, attrs: Attri
val checkedIcon = holder.findViewById(R.id.checked_icon) as ImageView val checkedIcon = holder.findViewById(R.id.checked_icon) as ImageView
logoContainer.setCardBackgroundColor(iconColor) logoContainer.setCardBackgroundColor(iconColor)
val padding = if (Color.alpha(iconColor) == 0) 0 else 4.dpToPx
holder.findViewById(android.R.id.icon).setPadding(padding)
checkedIcon.isVisible = !getPersistedString("").isNullOrEmpty() checkedIcon.isVisible = !getPersistedString("").isNullOrEmpty()
} }

View file

@ -53,16 +53,47 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/stats_label_sublayout" android:id="@+id/stats_label_sublayout"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:gravity="center_vertical"> android:gravity="center_vertical">
<com.google.android.material.card.MaterialCardView
android:id="@+id/logo_container"
android:layout_width="24sp"
android:layout_height="24sp"
android:layout_marginEnd="6dp"
android:visibility="gone"
tools:visibility="visible"
app:cardBackgroundColor="#2E51A2"
app:cardCornerRadius="4dp"
app:cardElevation="0dp"
app:layout_constraintEnd_toStartOf="@id/stats_label_text"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:strokeWidth="0dp">
<ImageView
android:id="@+id/logo_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:importantForAccessibility="no"
android:padding="2dp"
tools:src="@drawable/ic_tracker_mal" />
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/stats_label_text" android:id="@+id/stats_label_text"
style="?textAppearanceLabelLarge" style="?textAppearanceLabelLarge"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/logo_container"
app:layout_constraintBottom_toTopOf="@id/stats_sublabel_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
tools:text="MANGA" /> tools:text="MANGA" />
@ -70,11 +101,16 @@
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/stats_sublabel_text" android:id="@+id/stats_sublabel_text"
style="?textAppearanceLabelMedium" style="?textAppearanceLabelMedium"
android:layout_marginTop="5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@id/stats_label_text"
app:layout_constraintTop_toBottomOf="@id/stats_label_text"
tools:text="Mangadex (FR)" /> tools:text="Mangadex (FR)" />
</LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout> </LinearLayout>