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
abstract fun getLogo(): Int
abstract fun getTrackerColor(): Int
abstract fun getLogoColor(): 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 getTrackerColor() = Color.rgb(2, 169, 255)
override fun getLogoColor() = Color.rgb(18, 25, 35)
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 getTrackerColor() = Color.rgb(240, 147, 155)
override fun getLogoColor() = Color.rgb(240, 145, 153)
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 getTrackerColor() = Color.rgb(253, 117, 92)
override fun getLogoColor() = Color.rgb(51, 37, 50)
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 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)

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 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> {
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 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) {
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 getTrackerColor() = Color.rgb(218, 241, 255)
override fun getLogoColor() = Color.rgb(40, 40, 40)
override fun getStatusList(): List<Int> {

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.graphics.ColorUtils
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.widget.TextViewCompat
@ -45,7 +46,8 @@ class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) {
fun bind(item: TrackItem) {
val track = item.track
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> {
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
import android.content.Context
import android.graphics.Color
import android.text.SpannableStringBuilder
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.text.bold
import androidx.core.view.isVisible
import androidx.core.view.setPadding
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ListStatsDetailsBinding
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.StatsData
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.roundToTwoDecimal
@ -52,6 +55,16 @@ class StatsDetailsAdapter(
item.color ?: context.getResourceColor(R.attr.colorOnBackground),
)
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.statsCountPercentageText.text = getCountPercentageText(item)
holder.statsProgressText.text = getProgressText(item)
@ -93,6 +106,14 @@ class StatsDetailsAdapter(
item.color ?: context.getResourceColor(R.attr.colorOnBackground),
)
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.statsCountPercentageText.text = getCountPercentageText(item)
holder.statsProgressText.text = getProgressText(item)
@ -168,5 +189,7 @@ class StatsDetailsAdapter(
val statsDataLayout = binding.statsDataLayout
val statsScoreStarImage = binding.statsScoreStarImage
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
import android.graphics.drawable.Drawable
import androidx.annotation.DrawableRes
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
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.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.icon
import eu.kanade.tachiyomi.ui.more.stats.StatsHelper
import eu.kanade.tachiyomi.util.isLocal
import eu.kanade.tachiyomi.util.mapSeriesType
@ -230,12 +233,14 @@ class StatsDetailsPresenter(
val label = context.getString(service?.nameRes() ?: R.string.not_tracked)
currentStats?.add(
StatsData(
color = pieColorList[currentStats?.size!!],
color = service?.getTrackerColor() ?: pieColorList.first(),
count = mangaAndTrack.count(),
meanScore = mangaAndTrack.map { it.second }.getMeanScoreByTracker()?.roundToTwoDecimal(),
chaptersRead = mangaAndTrack.sumOf { it.first.read },
totalChapters = mangaAndTrack.sumOf { it.first.totalChapters },
label = label.uppercase(),
iconRes = service?.getLogo(),
iconBGColor = service?.getLogoColor(),
readDuration = mangaAndTrack.map { it.first }.getReadDuration(),
),
)
@ -247,8 +252,9 @@ class StatsDetailsPresenter(
currentStats = ArrayList()
val libraryFormat = mangasDistinct.filterByChip().groupBy { it.source }
libraryFormat.forEach { (source, mangaList) ->
val sourceName = sources.find { it.id == source }?.toString() ?: source.toString()
libraryFormat.forEach { (sourceId, mangaList) ->
val source = sources.find { it.id == sourceId }
val sourceName = source?.toString() ?: sourceId.toString()
currentStats?.add(
StatsData(
color = pieColorList[1],
@ -257,6 +263,7 @@ class StatsDetailsPresenter(
chaptersRead = mangaList.sumOf { it.read },
totalChapters = mangaList.sumOf { it.totalChapters },
label = sourceName.uppercase(),
icon = source?.icon(),
readDuration = mangaList.getReadDuration(),
),
)
@ -273,7 +280,7 @@ class StatsDetailsPresenter(
val label = categories.find { it.id == category }?.name ?: context.getString(R.string.default_value)
currentStats?.add(
StatsData(
color = pieColorList[currentStats?.size!! % 12],
color = pieColorList[currentStats?.size!! % pieColorList.size],
count = mangaList.count(),
meanScore = mangaList.getMeanScoreRounded(),
chaptersRead = mangaList.sumOf { it.read },
@ -582,6 +589,10 @@ class StatsDetailsPresenter(
val chaptersRead: Int = 0,
val totalChapters: Int = 0,
var label: String? = null,
@DrawableRes
var iconRes: Int? = null,
var iconBGColor: Int? = null,
var icon: Drawable? = null,
var subLabel: String? = null,
var readDuration: Long = 0,
)

View file

@ -6,10 +6,12 @@ import android.util.AttributeSet
import android.widget.ImageView
import androidx.annotation.ColorInt
import androidx.core.view.isVisible
import androidx.core.view.setPadding
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
import com.google.android.material.card.MaterialCardView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.system.dpToPx
class TrackerPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
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
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()
}

View file

@ -53,16 +53,47 @@
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/stats_label_sublayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="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
android:id="@+id/stats_label_text"
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_height="wrap_content"
tools:text="MANGA" />
@ -70,11 +101,16 @@
<com.google.android.material.textview.MaterialTextView
android:id="@+id/stats_sublabel_text"
style="?textAppearanceLabelMedium"
android:layout_marginTop="5dp"
android:layout_width="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)" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>