git.iko.soy/opencode-android
on 2794fda help sign in
41 lines 1.8 kB history raw
1package soy.iko.opencode.ui.components
3import java.util.concurrent.TimeUnit
5/**
6 * The time unit + count resolved from a delta, before locale-specific formatting. Kept as a
7 * pure value so unit tests can verify the boundary logic without a [android.content.Context]
8 * (string-resource resolution is Android-only and stubs to null under `isReturnDefaultValues`).
9 */
10sealed class RelativeTimeUnit {
11 data class Now(val count: Int = 0) : RelativeTimeUnit()
12 data class Minutes(val count: Long) : RelativeTimeUnit()
13 data class Hours(val count: Long) : RelativeTimeUnit()
14 data class Days(val count: Long) : RelativeTimeUnit()
15 data class Weeks(val count: Long) : RelativeTimeUnit()
16 data class Months(val count: Long) : RelativeTimeUnit()
17 data class Years(val count: Long) : RelativeTimeUnit()
20/**
21 * Resolves the [RelativeTimeUnit] for a delta without any locale-specific formatting, so the
22 * boundary logic is unit-testable on the JVM without a [android.content.Context].
23 */
24fun relativeTimeUnit(epochMillis: Long?): RelativeTimeUnit? {
25 if (epochMillis == null || epochMillis <= 0) return null
26 val now = System.currentTimeMillis()
27 val diff = now - epochMillis
28 if (diff < 0) return RelativeTimeUnit.Now()
29 val minutes = TimeUnit.MILLISECONDS.toMinutes(diff)
30 if (minutes < 1) return RelativeTimeUnit.Now()
31 if (minutes < 60) return RelativeTimeUnit.Minutes(minutes)
32 val hours = TimeUnit.MILLISECONDS.toHours(diff)
33 if (hours < 24) return RelativeTimeUnit.Hours(hours)
34 val days = TimeUnit.MILLISECONDS.toDays(diff)
35 if (days < 7) return RelativeTimeUnit.Days(days)
36 val weeks = days / 7
37 if (weeks < 5) return RelativeTimeUnit.Weeks(weeks)
38 if (days < 365) return RelativeTimeUnit.Months(days / 30)
39 val years = days / 365
40 return RelativeTimeUnit.Years(years)