diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
index b2527049b..1eaf986eb 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
@@ -188,6 +188,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"
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
index 061fd3691..c1a8af731 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
@@ -212,6 +212,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())
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt
index c74edc84d..3d35936f9 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt
+++ b/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 exh.metadata.MetadataUtil
import exh.source.isEhBasedManga
import java.util.Date
@@ -61,7 +62,7 @@ class ChapterHolder(
// SY -->
if (manga.isEhBasedManga()) {
descriptions.add(MetadataUtil.EX_DATE_FORMAT.format(Date(chapter.date_upload)))
- } else /* SY <-- */ descriptions.add(adapter.dateFormat.format(Date(chapter.date_upload)))
+ } else /* SY <-- */ descriptions.add(Date(chapter.date_upload).toRelativeString(itemView.context, adapter.relativeTime, adapter.dateFormat))
}
if ((!chapter.read || (adapter.preserveReadingPosition && manga.isEhBasedManga())) && chapter.last_page_read > 0) {
val lastPageRead = buildSpannedString {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt
index 61c97d9b6..18bcc7483 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt
+++ b/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()
// SY -->
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt
index f27dbcaad..6d8aebcb0 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt
@@ -22,6 +22,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() {
@@ -93,6 +94,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
diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt
index 8f8682ede..f4614fcb9 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt
+++ b/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)
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2a2c6af4a..475151574 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -186,6 +186,16 @@
Label in extensions list
This does not prevent unofficial or potentially incorrectly flagged extensions from surfacing NSFW (18+) content within the app.
+ Recently
+
+ - Today
+ - Yesterday
+ - %1$.0f days ago
+
+ Relative timestamps
+ Short (Today, Yesterday)
+ Long (Short+, n days ago)
+
Display
Items per row