ソースを参照

Use relative time in ChapterHolder (#5719)

* Use relative time in ChapterHolder

Similar to how J2K does it

* Use custom implementation for relative time

* Changes based on review comments
Andreas 3 年 前
コミット
57a5862840

+ 1 - 0
app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt

@@ -182,6 +182,7 @@ object PreferenceKeys {
 
     const val libraryDisplayMode = "pref_display_mode_library"
 
+    const val relativeTime: String = "relative_time"
     const val dateFormat = "app_date_format"
 
     const val defaultCategory = "default_category"

+ 2 - 0
app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt

@@ -208,6 +208,8 @@ class PreferencesHelper(val context: Context) {
 
     fun backupsDirectory() = flowPrefs.getString(Keys.backupDirectory, defaultBackupDir.toString())
 
+    fun relativeTime() = flowPrefs.getInt(Keys.relativeTime, 7)
+
     fun dateFormat(format: String = flowPrefs.getString(Keys.dateFormat, "").get()): DateFormat = when (format) {
         "" -> DateFormat.getDateInstance(DateFormat.SHORT)
         else -> SimpleDateFormat(format, Locale.getDefault())

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt

@@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.databinding.ChaptersItemBinding
 import eu.kanade.tachiyomi.source.LocalSource
 import eu.kanade.tachiyomi.ui.manga.chapter.base.BaseChapterHolder
+import eu.kanade.tachiyomi.util.lang.toRelativeString
 import java.util.Date
 
 class ChapterHolder(
@@ -56,7 +57,7 @@ class ChapterHolder(
         val descriptions = mutableListOf<CharSequence>()
 
         if (chapter.date_upload > 0) {
-            descriptions.add(adapter.dateFormat.format(Date(chapter.date_upload)))
+            descriptions.add(Date(chapter.date_upload).toRelativeString(itemView.context, adapter.relativeTime, adapter.dateFormat))
         }
         if (!chapter.read && chapter.last_page_read > 0) {
             val lastPageRead = buildSpannedString {

+ 1 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt

@@ -32,6 +32,7 @@ class ChaptersAdapter(
             .apply { decimalSeparator = '.' }
     )
 
+    val relativeTime: Int = preferences.relativeTime().get()
     val dateFormat: DateFormat = preferences.dateFormat()
 
     override fun updateDataSet(items: List<ChapterItem>?) {

+ 17 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt

@@ -21,6 +21,7 @@ import kotlinx.coroutines.flow.launchIn
 import java.util.Date
 import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
 import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values
+import androidx.preference.Preference
 
 class SettingsGeneralController : SettingsController() {
 
@@ -78,6 +79,22 @@ class SettingsGeneralController : SettingsController() {
                 }
             }
         }
+        intListPreference {
+            key = Keys.relativeTime
+            titleRes = R.string.pref_relative_format
+            val values = arrayOf("0", "2", "7")
+            entryValues = values
+            entries = values.map {
+                when (it) {
+                    "0" -> context.getString(R.string.off)
+                    "2" -> context.getString(R.string.pref_relative_time_short)
+                    else -> context.getString(R.string.pref_relative_time_long)
+                }
+            }.toTypedArray()
+            defaultValue = "7"
+            summary = "%s"
+        }
+
         listPreference {
             key = Keys.dateFormat
             titleRes = R.string.pref_date_format

+ 23 - 0
app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt

@@ -1,5 +1,7 @@
 package eu.kanade.tachiyomi.util.lang
 
+import android.content.Context
+import eu.kanade.tachiyomi.R
 import java.text.DateFormat
 import java.util.Calendar
 import java.util.Date
@@ -94,3 +96,24 @@ fun Long.toLocalCalendar(): Calendar? {
         )
     }
 }
+
+private const val MILLISECONDS_IN_DAY = 86_400_000.0
+
+fun Date.toRelativeString(
+    context: Context,
+    range: Int = 7,
+    dateFormat: DateFormat = DateFormat.getDateInstance(DateFormat.SHORT)
+): String {
+    val now = Date()
+    val difference = now.time - this.time
+    val days = difference / MILLISECONDS_IN_DAY
+    return when {
+        difference < 0 -> context.getString(R.string.recently)
+        difference < MILLISECONDS_IN_DAY.times(range) -> context.resources.getQuantityString(
+            R.plurals.relative_time,
+            days.toInt(),
+            days
+        )
+        else -> dateFormat.format(this)
+    }
+}

+ 10 - 0
app/src/main/res/values/strings.xml

@@ -186,6 +186,16 @@
     <string name="pref_label_nsfw_extension">Label in extensions list</string>
     <string name="parental_controls_info">This does not prevent unofficial or potentially incorrectly flagged extensions from surfacing NSFW (18+) content within the app.</string>
 
+    <string name="recently">Recently</string>
+    <plurals name="relative_time">
+        <item quantity="zero">Today</item>
+        <item quantity="one">Yesterday</item>
+        <item quantity="other">%1$.0f days ago</item>
+    </plurals>
+    <string name="pref_relative_format">Relative timestamps</string>
+    <string name="pref_relative_time_short">Short (Today, Yesterday)</string>
+    <string name="pref_relative_time_long">Long (Short+, n days ago)</string>
+
       <!-- Library section -->
     <string name="pref_category_display">Display</string>
     <string name="pref_library_columns">Items per row</string>