Fix time desync

This commit is contained in:
MM20 2024-04-06 21:16:21 +02:00
parent da291180c8
commit efc50eb0a8
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389

View File

@ -13,7 +13,7 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@ -33,27 +33,44 @@ fun ProvideCurrentTime(content: @Composable () -> Unit) {
val context = LocalContext.current val context = LocalContext.current
var time by remember { mutableStateOf(System.currentTimeMillis()) } var time by remember { mutableLongStateOf(System.currentTimeMillis()) }
val secondsAnimation = remember { Animatable(0f) } val secondsAnimation = remember { Animatable(0f) }
LaunchedEffect(time) { LaunchedEffect(time) {
val currentSeconds = Instant.ofEpochMilli(time).atZone(ZoneId.systemDefault()).second val currentTime = System.currentTimeMillis()
secondsAnimation.animateTo(currentSeconds.toFloat(), snap()) val seconds = Instant
.ofEpochMilli(currentTime)
.atZone(ZoneId.systemDefault()).second
val millis = (currentTime % 1000).toInt()
secondsAnimation.animateTo(seconds.toFloat() + millis / 1000f, snap())
secondsAnimation.animateTo( secondsAnimation.animateTo(
60f, 60f,
tween((60 - currentSeconds) * 1000, easing = LinearEasing) tween(
(60 - seconds) * 1000 - millis,
delayMillis = millis,
easing = LinearEasing
)
) )
} }
val lifecycleOwner = LocalLifecycleOwner.current val lifecycleOwner = LocalLifecycleOwner.current
LaunchedEffect(null) { LaunchedEffect(null) {
lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) { lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
time = System.currentTimeMillis() val dateTime = Instant.ofEpochMilli(System.currentTimeMillis())
.atZone(ZoneId.systemDefault())
.withSecond(0)
.withNano(0)
time = dateTime.toEpochSecond() * 1000
val receiver = object : BroadcastReceiver() { val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { override fun onReceive(context: Context?, intent: Intent?) {
time = System.currentTimeMillis() val dt = Instant.ofEpochMilli(System.currentTimeMillis())
.atZone(ZoneId.systemDefault())
.withSecond(0)
.withNano(0)
time = dt.toEpochSecond() * 1000
} }
} }