Skip to content

Commit 1f3be7b

Browse files
committed
feat: Show hours and minutes in relative time strings
Closes #1702
1 parent ee13863 commit 1f3be7b

19 files changed

Lines changed: 156 additions & 43 deletions

File tree

app/src/main/java/eu/kanade/presentation/components/DateText.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import uy.kohesive.injekt.Injekt
1111
import uy.kohesive.injekt.api.get
1212
import java.time.Instant
1313
import java.time.LocalDate
14+
import java.time.LocalDateTime
1415
import java.time.ZoneId
1516

1617
@Composable
@@ -26,6 +27,19 @@ fun relativeDateText(
2627
)
2728
}
2829

30+
@Composable
31+
fun relativeDateTimeText(
32+
dateEpochMillis: Long,
33+
): String {
34+
return relativeDateTimeText(
35+
localDateTime = LocalDateTime.ofInstant(
36+
Instant.ofEpochMilli(dateEpochMillis),
37+
ZoneId.systemDefault(),
38+
)
39+
.takeIf { dateEpochMillis > 0L },
40+
)
41+
}
42+
2943
@Composable
3044
fun relativeDateText(
3145
localDate: LocalDate?,
@@ -43,3 +57,21 @@ fun relativeDateText(
4357
)
4458
?: stringResource(MR.strings.not_applicable)
4559
}
60+
61+
@Composable
62+
fun relativeDateTimeText(
63+
localDateTime: LocalDateTime?,
64+
): String {
65+
val context = LocalContext.current
66+
67+
val preferences = remember { Injekt.get<UiPreferences>() }
68+
val relativeTime = remember { preferences.relativeTime().get() }
69+
val dateFormat = remember { UiPreferences.dateFormat(preferences.dateFormat().get()) }
70+
71+
return localDateTime?.toRelativeString(
72+
context = context,
73+
relative = relativeTime,
74+
dateFormat = dateFormat,
75+
)
76+
?: stringResource(MR.strings.not_applicable)
77+
}

app/src/main/java/eu/kanade/presentation/entries/anime/AnimeScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import androidx.compose.ui.util.fastMap
5353
import cafe.adriel.voyager.navigator.LocalNavigator
5454
import cafe.adriel.voyager.navigator.currentOrThrow
5555
import eu.kanade.domain.entries.anime.model.episodesFiltered
56-
import eu.kanade.presentation.components.relativeDateText
56+
import eu.kanade.presentation.components.relativeDateTimeText
5757
import eu.kanade.presentation.entries.DownloadAction
5858
import eu.kanade.presentation.entries.EntryScreenItem
5959
import eu.kanade.presentation.entries.anime.components.AnimeActionRow
@@ -902,7 +902,7 @@ private fun LazyListScope.sharedEpisodeItems(
902902
} else {
903903
episodeItem.episode.name
904904
},
905-
date = relativeDateText(episodeItem.episode.dateUpload),
905+
date = relativeDateTimeText(episodeItem.episode.dateUpload),
906906
watchProgress = episodeItem.episode.lastSecondSeen
907907
.takeIf { !episodeItem.episode.seen && it > 0L }
908908
?.let {

app/src/main/java/eu/kanade/presentation/entries/manga/MangaScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import androidx.compose.ui.util.fastAny
4949
import androidx.compose.ui.util.fastMap
5050
import cafe.adriel.voyager.navigator.LocalNavigator
5151
import cafe.adriel.voyager.navigator.currentOrThrow
52-
import eu.kanade.presentation.components.relativeDateText
52+
import eu.kanade.presentation.components.relativeDateTimeText
5353
import eu.kanade.presentation.entries.DownloadAction
5454
import eu.kanade.presentation.entries.EntryScreenItem
5555
import eu.kanade.presentation.entries.components.EntryBottomActionMenu
@@ -803,7 +803,7 @@ private fun LazyListScope.sharedChapterItems(
803803
} else {
804804
item.chapter.name
805805
},
806-
date = relativeDateText(item.chapter.dateUpload),
806+
date = relativeDateTimeText(item.chapter.dateUpload),
807807
readProgress = item.chapter.lastPageRead
808808
.takeIf { !item.chapter.read && it > 0L }
809809
?.let {

app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreen.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import androidx.compose.runtime.Composable
99
import androidx.compose.ui.Modifier
1010
import androidx.compose.ui.tooling.preview.PreviewLightDark
1111
import androidx.compose.ui.tooling.preview.PreviewParameter
12-
import eu.kanade.presentation.components.relativeDateText
12+
import eu.kanade.presentation.components.relativeDateTimeText
1313
import eu.kanade.presentation.history.anime.components.AnimeHistoryItem
1414
import eu.kanade.presentation.theme.TachiyomiPreviewTheme
1515
import eu.kanade.tachiyomi.ui.history.anime.AnimeHistoryScreenModel
@@ -20,7 +20,7 @@ import tachiyomi.presentation.core.components.ListGroupHeader
2020
import tachiyomi.presentation.core.components.material.Scaffold
2121
import tachiyomi.presentation.core.screens.EmptyScreen
2222
import tachiyomi.presentation.core.screens.LoadingScreen
23-
import java.time.LocalDate
23+
import java.time.LocalDateTime
2424

2525
@Composable
2626
fun AnimeHistoryScreen(
@@ -85,7 +85,7 @@ private fun AnimeHistoryScreenContent(
8585
is AnimeHistoryUiModel.Header -> {
8686
ListGroupHeader(
8787
modifier = Modifier.animateItem(),
88-
text = relativeDateText(item.date),
88+
text = relativeDateTimeText(item.date),
8989
)
9090
}
9191
is AnimeHistoryUiModel.Item -> {
@@ -104,7 +104,7 @@ private fun AnimeHistoryScreenContent(
104104
}
105105

106106
sealed interface AnimeHistoryUiModel {
107-
data class Header(val date: LocalDate) : AnimeHistoryUiModel
107+
data class Header(val date: LocalDateTime) : AnimeHistoryUiModel
108108
data class Item(val item: AnimeHistoryWithRelations) : AnimeHistoryUiModel
109109
}
110110

app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreenModelStateProvider.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.ui.history.anime.AnimeHistoryScreenModel
55
import tachiyomi.domain.entries.anime.model.AnimeCover
66
import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations
77
import java.time.Instant
8-
import java.time.LocalDate
8+
import java.time.LocalDateTime
99
import java.time.temporal.ChronoUnit
1010
import java.util.Date
1111
import kotlin.random.Random
@@ -72,10 +72,10 @@ class AnimeHistoryScreenModelStateProvider : PreviewParameterProvider<AnimeHisto
7272
private object HistoryUiModelExamples {
7373
val headerToday = header()
7474
val headerTomorrow =
75-
AnimeHistoryUiModel.Header(LocalDate.now().plusDays(1))
75+
AnimeHistoryUiModel.Header(LocalDateTime.now().plusDays(1))
7676

7777
fun header(instantBuilder: (Instant) -> Instant = { it }) =
78-
AnimeHistoryUiModel.Header(LocalDate.from(instantBuilder(Instant.now())))
78+
AnimeHistoryUiModel.Header(LocalDateTime.from(instantBuilder(Instant.now())))
7979

8080
fun items() = sequence {
8181
var count = 1

app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreen.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import androidx.compose.runtime.Composable
99
import androidx.compose.ui.Modifier
1010
import androidx.compose.ui.tooling.preview.PreviewLightDark
1111
import androidx.compose.ui.tooling.preview.PreviewParameter
12-
import eu.kanade.presentation.components.relativeDateText
12+
import eu.kanade.presentation.components.relativeDateTimeText
1313
import eu.kanade.presentation.history.manga.components.MangaHistoryItem
1414
import eu.kanade.presentation.theme.TachiyomiPreviewTheme
1515
import eu.kanade.tachiyomi.ui.history.manga.MangaHistoryScreenModel
@@ -20,7 +20,7 @@ import tachiyomi.presentation.core.components.ListGroupHeader
2020
import tachiyomi.presentation.core.components.material.Scaffold
2121
import tachiyomi.presentation.core.screens.EmptyScreen
2222
import tachiyomi.presentation.core.screens.LoadingScreen
23-
import java.time.LocalDate
23+
import java.time.LocalDateTime
2424

2525
@Composable
2626
fun MangaHistoryScreen(
@@ -85,7 +85,7 @@ private fun MangaHistoryScreenContent(
8585
is MangaHistoryUiModel.Header -> {
8686
ListGroupHeader(
8787
modifier = Modifier.animateItem(),
88-
text = relativeDateText(item.date),
88+
text = relativeDateTimeText(item.date),
8989
)
9090
}
9191
is MangaHistoryUiModel.Item -> {
@@ -104,7 +104,7 @@ private fun MangaHistoryScreenContent(
104104
}
105105

106106
sealed interface MangaHistoryUiModel {
107-
data class Header(val date: LocalDate) : MangaHistoryUiModel
107+
data class Header(val date: LocalDateTime) : MangaHistoryUiModel
108108
data class Item(val item: MangaHistoryWithRelations) : MangaHistoryUiModel
109109
}
110110

app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreenModelStateProvider.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.ui.history.manga.MangaHistoryScreenModel
55
import tachiyomi.domain.entries.manga.model.MangaCover
66
import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations
77
import java.time.Instant
8-
import java.time.LocalDate
8+
import java.time.LocalDateTime
99
import java.time.temporal.ChronoUnit
1010
import java.util.Date
1111
import kotlin.random.Random
@@ -72,10 +72,10 @@ class MangaHistoryScreenModelStateProvider : PreviewParameterProvider<MangaHisto
7272
private object HistoryUiModelExamples {
7373
val headerToday = header()
7474
val headerTomorrow =
75-
MangaHistoryUiModel.Header(LocalDate.now().plusDays(1))
75+
MangaHistoryUiModel.Header(LocalDateTime.now().plusDays(1))
7676

7777
fun header(instantBuilder: (Instant) -> Instant = { it }) =
78-
MangaHistoryUiModel.Header(LocalDate.from(instantBuilder(Instant.now())))
78+
MangaHistoryUiModel.Header(LocalDateTime.from(instantBuilder(Instant.now())))
7979

8080
fun items() = sequence {
8181
var count = 1

app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import tachiyomi.presentation.core.screens.EmptyScreen
3030
import tachiyomi.presentation.core.screens.LoadingScreen
3131
import uy.kohesive.injekt.Injekt
3232
import uy.kohesive.injekt.api.get
33-
import java.time.LocalDate
33+
import java.time.LocalDateTime
3434
import kotlin.time.Duration.Companion.seconds
3535

3636
@Composable
@@ -153,6 +153,6 @@ private fun AnimeUpdatesBottomBar(
153153
}
154154

155155
sealed interface AnimeUpdatesUiModel {
156-
data class Header(val date: LocalDate) : AnimeUpdatesUiModel
156+
data class Header(val date: LocalDateTime) : AnimeUpdatesUiModel
157157
data class Item(val item: AnimeUpdatesItem) : AnimeUpdatesUiModel
158158
}

app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import androidx.compose.ui.platform.LocalHapticFeedback
3232
import androidx.compose.ui.text.font.FontStyle
3333
import androidx.compose.ui.text.style.TextOverflow
3434
import androidx.compose.ui.unit.dp
35-
import eu.kanade.presentation.components.relativeDateText
35+
import eu.kanade.presentation.components.relativeDateTimeText
3636
import eu.kanade.presentation.entries.anime.components.EpisodeDownloadAction
3737
import eu.kanade.presentation.entries.anime.components.EpisodeDownloadIndicator
3838
import eu.kanade.presentation.entries.components.DotSeparatorText
@@ -96,7 +96,7 @@ internal fun LazyListScope.animeUpdatesUiItems(
9696
is AnimeUpdatesUiModel.Header -> {
9797
ListGroupHeader(
9898
modifier = Modifier.animateItem(),
99-
text = relativeDateText(item.date),
99+
text = relativeDateTimeText(item.date),
100100
)
101101
}
102102
is AnimeUpdatesUiModel.Item -> {

app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import tachiyomi.presentation.core.components.material.PullRefresh
2727
import tachiyomi.presentation.core.components.material.Scaffold
2828
import tachiyomi.presentation.core.screens.EmptyScreen
2929
import tachiyomi.presentation.core.screens.LoadingScreen
30-
import java.time.LocalDate
30+
import java.time.LocalDateTime
3131
import kotlin.time.Duration.Companion.seconds
3232

3333
@Composable
@@ -141,6 +141,6 @@ private fun MangaUpdatesBottomBar(
141141
}
142142

143143
sealed interface MangaUpdatesUiModel {
144-
data class Header(val date: LocalDate) : MangaUpdatesUiModel
144+
data class Header(val date: LocalDateTime) : MangaUpdatesUiModel
145145
data class Item(val item: MangaUpdatesItem) : MangaUpdatesUiModel
146146
}

0 commit comments

Comments
 (0)