mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
Stat details: add tracking color/icon + source icon
Also remove card bg of mangaupdates and komga in settings
This commit is contained in:
parent
8897d5c7ef
commit
e6c36a8144
13 changed files with 103 additions and 11 deletions
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue