Merge pull request #1803 from czeidler/relative-date-time-formatter

Relative date time formatter #822
This commit is contained in:
Benoit Marty 2020-08-11 12:45:49 +02:00 committed by GitHub
commit 98aeee9c5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 1 deletions

View File

@ -9,6 +9,7 @@ Improvements 🙌:
Bugfix 🐛: Bugfix 🐛:
- Fix invisible toolbar (Status.im theme) (#1746) - Fix invisible toolbar (Status.im theme) (#1746)
- Fix relative date time formatting (#822)
Translations 🗣: Translations 🗣:
- Add PlayStore description resources in the Triple-T format, to let Weblate handle them - Add PlayStore description resources in the Triple-T format, to let Weblate handle them

View File

@ -21,8 +21,24 @@ import android.text.format.DateUtils
import im.vector.app.core.resources.LocaleProvider import im.vector.app.core.resources.LocaleProvider
import org.threeten.bp.LocalDateTime import org.threeten.bp.LocalDateTime
import org.threeten.bp.format.DateTimeFormatter import org.threeten.bp.format.DateTimeFormatter
import java.util.Calendar
import java.util.Date
import javax.inject.Inject import javax.inject.Inject
/**
* Returns the timestamp for the start of the day of the provided time.
* For example, for the time "Jul 21, 11:11" the start of the day: "Jul 21, 00:00" is returned.
*/
fun startOfDay(time: Long): Long {
val calendar = Calendar.getInstance()
calendar.time = Date(time)
calendar.set(Calendar.HOUR_OF_DAY, 0)
calendar.set(Calendar.MINUTE, 0)
calendar.set(Calendar.SECOND, 0)
calendar.set(Calendar.MILLISECOND, 0)
return calendar.time.time
}
class VectorDateFormatter @Inject constructor(private val context: Context, class VectorDateFormatter @Inject constructor(private val context: Context,
private val localeProvider: LocaleProvider) { private val localeProvider: LocaleProvider) {
@ -41,15 +57,23 @@ class VectorDateFormatter @Inject constructor(private val context: Context,
return messageDayFormatter.format(localDateTime) return messageDayFormatter.format(localDateTime)
} }
/**
* Formats a localized relative date time for the last 2 days, e.g, "Today, HH:MM", "Yesterday, HH:MM" or
* "2 days ago, HH:MM".
* For earlier timestamps the absolute date time is returned, e.g. "Month Day, HH:MM".
*
* @param time the absolute timestamp [ms] that should be formatted relative to now
*/
fun formatRelativeDateTime(time: Long?): String { fun formatRelativeDateTime(time: Long?): String {
if (time == null) { if (time == null) {
return "" return ""
} }
val now = System.currentTimeMillis()
return DateUtils.getRelativeDateTimeString( return DateUtils.getRelativeDateTimeString(
context, context,
time, time,
DateUtils.DAY_IN_MILLIS, DateUtils.DAY_IN_MILLIS,
2 * DateUtils.DAY_IN_MILLIS, now - startOfDay(now - 2 * DateUtils.DAY_IN_MILLIS),
DateUtils.FORMAT_SHOW_WEEKDAY or DateUtils.FORMAT_SHOW_TIME DateUtils.FORMAT_SHOW_WEEKDAY or DateUtils.FORMAT_SHOW_TIME
).toString() ).toString()
} }