Skip to content

Commit da8f1e1

Browse files
Fix time formatting in toolbar, merge duplicate rememberCurrentTime implementations
1 parent cd57de5 commit da8f1e1

File tree

3 files changed

+32
-44
lines changed

3 files changed

+32
-44
lines changed

Diff for: app/src/main/java/org/jellyfin/androidtv/integration/dream/composable/DreamHeader.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.jellyfin.androidtv.integration.dream.composable
22

3-
import android.text.format.DateUtils
43
import androidx.compose.animation.AnimatedVisibility
54
import androidx.compose.animation.fadeIn
65
import androidx.compose.animation.fadeOut
@@ -11,9 +10,9 @@ import androidx.compose.foundation.layout.Spacer
1110
import androidx.compose.foundation.layout.fillMaxWidth
1211
import androidx.compose.foundation.layout.height
1312
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.getValue
1414
import androidx.compose.ui.Modifier
1515
import androidx.compose.ui.graphics.Color
16-
import androidx.compose.ui.platform.LocalContext
1716
import androidx.compose.ui.res.painterResource
1817
import androidx.compose.ui.res.stringResource
1918
import androidx.compose.ui.text.TextStyle
@@ -59,9 +58,9 @@ fun DreamHeader(
5958
enter = fadeIn(),
6059
exit = fadeOut(),
6160
) {
62-
val time = rememberCurrentTime()
61+
val currentTime by rememberCurrentTime()
6362
Text(
64-
text = DateUtils.formatDateTime(LocalContext.current, time, DateUtils.FORMAT_SHOW_TIME),
63+
text = currentTime,
6564
style = TextStyle(
6665
color = Color.White,
6766
fontSize = 20.sp
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,42 @@
11
package org.jellyfin.androidtv.ui.composable
22

3+
import android.text.format.DateFormat
34
import androidx.compose.runtime.Composable
45
import androidx.compose.runtime.LaunchedEffect
5-
import androidx.compose.runtime.getValue
6-
import androidx.compose.runtime.mutableLongStateOf
6+
import androidx.compose.runtime.State
7+
import androidx.compose.runtime.mutableStateOf
78
import androidx.compose.runtime.remember
8-
import androidx.compose.runtime.setValue
9+
import androidx.compose.ui.platform.LocalContext
910
import kotlinx.coroutines.delay
10-
import java.time.Instant
11-
import kotlin.time.Duration.Companion.seconds
11+
import org.jellyfin.androidtv.util.locale
12+
import java.util.Date
13+
import kotlin.time.Duration
14+
import kotlin.time.Duration.Companion.minutes
1215

13-
/**
14-
* A composable that returns the current time in milliseconds. Updates every second.
15-
*/
1616
@Composable
17-
fun rememberCurrentTime(): Long {
18-
var value by remember { mutableLongStateOf(Instant.now().toEpochMilli()) }
17+
fun rememberCurrentTime(
18+
format12: String = "h:mm",
19+
format24: String = "k:mm",
20+
updateFrequency: Duration = 1.minutes,
21+
): State<String> {
22+
val context = LocalContext.current
23+
val locale = context.locale
24+
val format = remember(context, locale) {
25+
when (DateFormat.is24HourFormat(context)) {
26+
true -> format24
27+
false -> format12
28+
}
29+
}
30+
val currentTime = remember { mutableStateOf(DateFormat.format(format, Date()).toString()) }
1931

20-
LaunchedEffect(Unit) {
32+
LaunchedEffect(format) {
2133
while (true) {
22-
value = Instant.now().toEpochMilli()
23-
delay(1.seconds)
34+
val now = Date()
35+
currentTime.value = DateFormat.format(format, now).toString()
36+
// Delay until next expected change in time based on updateFrequency
37+
delay(updateFrequency.inWholeMilliseconds - now.time % updateFrequency.inWholeMilliseconds)
2438
}
2539
}
2640

27-
return value
41+
return currentTime
2842
}

Diff for: app/src/main/java/org/jellyfin/androidtv/ui/shared/toolbar/Toolbar.kt

+1-26
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,20 @@ import androidx.compose.foundation.layout.fillMaxWidth
1212
import androidx.compose.foundation.layout.height
1313
import androidx.compose.foundation.layout.width
1414
import androidx.compose.runtime.Composable
15-
import androidx.compose.runtime.LaunchedEffect
16-
import androidx.compose.runtime.State
1715
import androidx.compose.runtime.getValue
18-
import androidx.compose.runtime.mutableStateOf
19-
import androidx.compose.runtime.remember
2016
import androidx.compose.ui.Alignment
2117
import androidx.compose.ui.Modifier
2218
import androidx.compose.ui.graphics.Color
23-
import androidx.compose.ui.platform.LocalContext
2419
import androidx.compose.ui.res.painterResource
2520
import androidx.compose.ui.res.stringResource
2621
import androidx.compose.ui.unit.dp
2722
import androidx.compose.ui.unit.sp
28-
import kotlinx.coroutines.delay
2923
import org.jellyfin.androidtv.R
3024
import org.jellyfin.androidtv.ui.base.JellyfinTheme
3125
import org.jellyfin.androidtv.ui.base.Text
3226
import org.jellyfin.androidtv.ui.base.modifier.childFocusRestorer
3327
import org.jellyfin.androidtv.ui.composable.modifier.overscan
34-
import org.jellyfin.androidtv.util.locale
35-
import java.text.DateFormat
36-
import java.util.Date
28+
import org.jellyfin.androidtv.ui.composable.rememberCurrentTime
3729

3830
@Composable
3931
fun Logo(modifier: Modifier = Modifier) {
@@ -97,20 +89,3 @@ fun BoxScope.ToolbarButtons(
9789
}
9890
}
9991
}
100-
101-
@Composable
102-
private fun rememberCurrentTime(): State<String> {
103-
val locale = LocalContext.current.locale
104-
val format = remember(locale) { DateFormat.getTimeInstance(DateFormat.SHORT, locale) }
105-
val currentTime = remember { mutableStateOf(format.format(Date())) }
106-
107-
LaunchedEffect(format) {
108-
while (true) {
109-
val now = Date()
110-
currentTime.value = format.format(now)
111-
delay(60_000 - now.time % 60_000)
112-
}
113-
}
114-
115-
return currentTime
116-
}

0 commit comments

Comments
 (0)