Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d7f44d2da | ||
|
|
930d4dfd83 | ||
|
|
290cb652ee |
@@ -18,8 +18,8 @@ android {
|
||||
applicationId 'org.koitharu.kotatsu'
|
||||
minSdk = 21
|
||||
targetSdk = 35
|
||||
versionCode = 702
|
||||
versionName = '7.7.10'
|
||||
versionCode = 703
|
||||
versionName = '7.7.11'
|
||||
generatedDensities = []
|
||||
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
|
||||
ksp {
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
package org.koitharu.kotatsu.core.ui.model
|
||||
|
||||
import android.content.res.Resources
|
||||
import android.content.Context
|
||||
import android.text.format.DateUtils
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.util.ext.toMillis
|
||||
import java.time.LocalDate
|
||||
import java.time.format.DateTimeFormatter
|
||||
|
||||
sealed class DateTimeAgo {
|
||||
|
||||
abstract fun format(resources: Resources): String
|
||||
abstract fun format(context: Context): String
|
||||
|
||||
object JustNow : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
return resources.getString(R.string.just_now)
|
||||
override fun format(context: Context): String {
|
||||
return context.getString(R.string.just_now)
|
||||
}
|
||||
|
||||
override fun toString() = "just_now"
|
||||
@@ -20,24 +21,32 @@ sealed class DateTimeAgo {
|
||||
}
|
||||
|
||||
data class MinutesAgo(val minutes: Int) : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
return resources.getQuantityString(R.plurals.minutes_ago, minutes, minutes)
|
||||
override fun format(context: Context): String {
|
||||
return context.resources.getQuantityString(
|
||||
R.plurals.minutes_ago,
|
||||
minutes,
|
||||
minutes,
|
||||
)
|
||||
}
|
||||
|
||||
override fun toString() = "minutes_ago_$minutes"
|
||||
}
|
||||
|
||||
data class HoursAgo(val hours: Int) : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
return resources.getQuantityString(R.plurals.hours_ago, hours, hours)
|
||||
override fun format(context: Context): String {
|
||||
return context.resources.getQuantityString(
|
||||
R.plurals.hours_ago,
|
||||
hours,
|
||||
hours,
|
||||
)
|
||||
}
|
||||
|
||||
override fun toString() = "hours_ago_$hours"
|
||||
}
|
||||
|
||||
object Today : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
return resources.getString(R.string.today)
|
||||
override fun format(context: Context): String {
|
||||
return context.getString(R.string.today)
|
||||
}
|
||||
|
||||
override fun toString() = "today"
|
||||
@@ -46,8 +55,8 @@ sealed class DateTimeAgo {
|
||||
}
|
||||
|
||||
object Yesterday : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
return resources.getString(R.string.yesterday)
|
||||
override fun format(context: Context): String {
|
||||
return context.getString(R.string.yesterday)
|
||||
}
|
||||
|
||||
override fun toString() = "yesterday"
|
||||
@@ -56,44 +65,46 @@ sealed class DateTimeAgo {
|
||||
}
|
||||
|
||||
data class DaysAgo(val days: Int) : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
return resources.getQuantityString(R.plurals.days_ago, days, days)
|
||||
override fun format(context: Context): String {
|
||||
return context.resources.getQuantityString(R.plurals.days_ago, days, days)
|
||||
}
|
||||
|
||||
override fun toString() = "days_ago_$days"
|
||||
}
|
||||
|
||||
data class MonthsAgo(val months: Int) : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
override fun format(context: Context): String {
|
||||
return if (months == 0) {
|
||||
resources.getString(R.string.this_month)
|
||||
context.getString(R.string.this_month)
|
||||
} else {
|
||||
resources.getQuantityString(R.plurals.months_ago, months, months)
|
||||
context.resources.getQuantityString(
|
||||
R.plurals.months_ago,
|
||||
months,
|
||||
months,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class Absolute(private val date: LocalDate) : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
override fun format(context: Context): String {
|
||||
return if (date == EPOCH_DATE) {
|
||||
resources.getString(R.string.unknown)
|
||||
context.getString(R.string.unknown)
|
||||
} else {
|
||||
date.format(formatter)
|
||||
DateUtils.formatDateTime(context, date.toMillis(), DateUtils.FORMAT_SHOW_DATE)
|
||||
}
|
||||
}
|
||||
|
||||
override fun toString() = "abs_${date.toEpochDay()}"
|
||||
|
||||
companion object {
|
||||
// TODO: Use Java 9's LocalDate.EPOCH.
|
||||
private val EPOCH_DATE = LocalDate.of(1970, 1, 1)
|
||||
private val formatter = DateTimeFormatter.ofPattern("d MMMM")
|
||||
private companion object {
|
||||
val EPOCH_DATE: LocalDate = LocalDate.of(1970, 1, 1)
|
||||
}
|
||||
}
|
||||
|
||||
object LongAgo : DateTimeAgo() {
|
||||
override fun format(resources: Resources): String {
|
||||
return resources.getString(R.string.long_ago)
|
||||
override fun format(context: Context): String {
|
||||
return context.getString(R.string.long_ago)
|
||||
}
|
||||
|
||||
override fun toString() = "long_ago"
|
||||
|
||||
@@ -35,6 +35,7 @@ fun calculateTimeAgo(instant: Instant, showMonths: Boolean = false): DateTimeAgo
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("KotlinConstantConditions")
|
||||
fun Long.toInstantOrNull() = if (this == 0L) null else Instant.ofEpochMilli(this)
|
||||
|
||||
fun Resources.formatDurationShort(millis: Long): String? {
|
||||
@@ -50,3 +51,5 @@ fun Resources.formatDurationShort(millis: Long): String? {
|
||||
else -> getString(R.string.seconds_short, seconds)
|
||||
}
|
||||
}
|
||||
|
||||
fun LocalDate.toMillis(): Long = atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()
|
||||
|
||||
@@ -36,7 +36,7 @@ data class ListHeader private constructor(
|
||||
fun getText(context: Context): CharSequence? = when (textRaw) {
|
||||
is CharSequence -> textRaw
|
||||
is Int -> if (textRaw != 0) context.getString(textRaw) else null
|
||||
is DateTimeAgo -> textRaw.format(context.resources)
|
||||
is DateTimeAgo -> textRaw.format(context)
|
||||
else -> null
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ class MangaStatsSheet : BaseAdaptiveSheet<SheetStatsMangaBinding>(), View.OnClic
|
||||
binding.chartView.barColor = KotatsuColors.ofManga(binding.root.context, viewModel.manga)
|
||||
viewModel.stats.observe(viewLifecycleOwner, ::onStatsChanged)
|
||||
viewModel.startDate.observe(viewLifecycleOwner) {
|
||||
binding.textViewStart.textAndVisible = it?.format(resources)
|
||||
binding.textViewStart.textAndVisible = it?.format(binding.root.context)
|
||||
}
|
||||
viewModel.totalPagesRead.observe(viewLifecycleOwner) {
|
||||
binding.textViewPages.text = getString(R.string.pages_read_s, it.format())
|
||||
|
||||
@@ -67,7 +67,7 @@ abstract class TracksDao : MangaQueryBuilder.ConditionCallback {
|
||||
@Query("DELETE FROM tracks WHERE manga_id = :mangaId")
|
||||
abstract suspend fun delete(mangaId: Long)
|
||||
|
||||
@Query("DELETE FROM tracks WHERE manga_id NOT IN (SELECT manga_id FROM history UNION SELECT manga_id FROM favourites WHERE category_id IN (SELECT category_id FROM favourite_categories WHERE track = 1))")
|
||||
@Query("DELETE FROM tracks WHERE manga_id NOT IN (SELECT manga_id FROM history WHERE history.deleted_at = 0 UNION SELECT manga_id FROM favourites WHERE favourites.deleted_at = 0 AND category_id IN (SELECT category_id FROM favourite_categories WHERE favourite_categories.deleted_at = 0 AND track = 1))")
|
||||
abstract suspend fun gc()
|
||||
|
||||
@Upsert
|
||||
|
||||
@@ -31,7 +31,7 @@ material = "1.12.0"
|
||||
moshi = "1.15.2"
|
||||
okhttp = "4.12.0"
|
||||
okio = "3.9.1"
|
||||
parsers = "794a737b6d"
|
||||
parsers = "1.6"
|
||||
preference = "1.2.1"
|
||||
recyclerview = "1.3.2"
|
||||
room = "2.6.1"
|
||||
|
||||
Reference in New Issue
Block a user