diff --git a/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt b/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt index 18afc6a09..732e527bb 100644 --- a/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt +++ b/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt @@ -39,9 +39,9 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest +import kotlinx.datetime.TimeZone import org.junit.Rule import org.junit.Test -import java.time.ZoneId import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -199,7 +199,7 @@ class NiaAppStateTest { timeZoneMonitor = timeZoneMonitor, ) } - val changedTz = ZoneId.of("Europe/Prague") + val changedTz = TimeZone.of("Europe/Prague") backgroundScope.launch { state.currentTimeZone.collect() } timeZoneMonitor.setTimeZone(changedTz) assertEquals( diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt index 0bf45f125..afe3b51eb 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -47,7 +47,7 @@ import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand -import com.google.samples.apps.nowinandroid.core.ui.LocalZoneId +import com.google.samples.apps.nowinandroid.core.ui.LocalTimeZone import com.google.samples.apps.nowinandroid.ui.NiaApp import com.google.samples.apps.nowinandroid.ui.rememberNiaAppState import dagger.hilt.android.AndroidEntryPoint @@ -144,7 +144,7 @@ class MainActivity : ComponentActivity() { CompositionLocalProvider( LocalAnalyticsHelper provides analyticsHelper, - LocalZoneId provides currentZoneId, + LocalTimeZone provides currentZoneId, ) { NiaTheme( darkTheme = darkTheme, diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index ffd0c16ec..ec2be6511 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import java.time.ZoneId +import kotlinx.datetime.TimeZone @Composable fun rememberNiaAppState( @@ -140,11 +140,11 @@ class NiaAppState( initialValue = emptySet(), ) - val currentTimeZone = timeZoneMonitor.currentZoneId + val currentTimeZone = timeZoneMonitor.currentTimeZone .stateIn( coroutineScope, SharingStarted.WhileSubscribed(5_000), - ZoneId.systemDefault(), + TimeZone.currentSystemDefault(), ) /** diff --git a/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/DefaultZoneIdTimeZoneMonitor.kt b/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/DefaultZoneIdTimeZoneMonitor.kt index ee8fe97a3..5a21ae337 100644 --- a/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/DefaultZoneIdTimeZoneMonitor.kt +++ b/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/DefaultZoneIdTimeZoneMonitor.kt @@ -19,9 +19,9 @@ package com.google.samples.apps.nowinandroid.core.data.test import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf -import java.time.ZoneId +import kotlinx.datetime.TimeZone import javax.inject.Inject class DefaultZoneIdTimeZoneMonitor @Inject constructor() : TimeZoneMonitor { - override val currentZoneId: Flow = flowOf(ZoneId.of("Europe/Warsaw")) + override val currentTimeZone: Flow = flowOf(TimeZone.of("Europe/Warsaw")) } diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneMonitor.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneMonitor.kt index 99613d0f6..f7cc73565 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneMonitor.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/TimeZoneMonitor.kt @@ -34,10 +34,11 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.shareIn +import kotlinx.datetime.TimeZone import java.time.ZoneId -import java.util.TimeZone import javax.inject.Inject import javax.inject.Singleton @@ -46,7 +47,7 @@ import javax.inject.Singleton * It always emits at least once with default setting and then for each TZ change. */ interface TimeZoneMonitor { - val currentZoneId: Flow + val currentTimeZone: Flow } @Singleton @@ -56,10 +57,10 @@ internal class TimeZoneBroadcastMonitor @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, ) : TimeZoneMonitor { - override val currentZoneId: SharedFlow = - callbackFlow { + override val currentTimeZone: SharedFlow = + callbackFlow { // Send the default time zone first. - trySend(ZoneId.systemDefault()) + trySend(TimeZone.currentSystemDefault()) // Registers BroadcastReceiver for the TimeZone changes val receiver = object : BroadcastReceiver() { @@ -70,15 +71,15 @@ internal class TimeZoneBroadcastMonitor @Inject constructor( null } else { // Starting Android R we also get the new TimeZone. - intent.getStringExtra(Intent.EXTRA_TIMEZONE)?.let { zoneId -> + intent.getStringExtra(Intent.EXTRA_TIMEZONE)?.let { timeZoneId -> // We need to convert it from java.util.Timezone to java.time.ZoneId - ZoneId.of(zoneId, ZoneId.SHORT_IDS) - TimeZone.getTimeZone(zoneId).toZoneId() + val zoneId = ZoneId.of(timeZoneId, ZoneId.SHORT_IDS) + TimeZone.of(zoneId.id) } } // If there isn't a zoneId in the intent, fallback to the systemDefault, which should also reflect the change - trySend(zoneIdFromIntent ?: ZoneId.systemDefault()) + trySend(zoneIdFromIntent ?: TimeZone.currentSystemDefault()) } } diff --git a/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestTimeZoneMonitor.kt b/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestTimeZoneMonitor.kt index 1d7f21543..cc71ab2ca 100644 --- a/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestTimeZoneMonitor.kt +++ b/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestTimeZoneMonitor.kt @@ -19,22 +19,22 @@ package com.google.samples.apps.nowinandroid.core.testing.util import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import java.time.ZoneId +import kotlinx.datetime.TimeZone class TestTimeZoneMonitor : TimeZoneMonitor { private val timeZoneFlow = MutableStateFlow(defaultTimeZone) - override val currentZoneId: Flow = timeZoneFlow + override val currentTimeZone: Flow = timeZoneFlow /** * A test-only API to set the from tests. */ - fun setTimeZone(zoneId: ZoneId) { + fun setTimeZone(zoneId: TimeZone) { timeZoneFlow.value = zoneId } companion object { - val defaultTimeZone: ZoneId = ZoneId.of("Europe/Warsaw") + val defaultTimeZone: TimeZone = TimeZone.of("Europe/Warsaw") } } diff --git a/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/LocalZoneId.kt b/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/LocalTimeZone.kt similarity index 83% rename from core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/LocalZoneId.kt rename to core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/LocalTimeZone.kt index 54aa7931d..2d9948488 100644 --- a/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/LocalZoneId.kt +++ b/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/LocalTimeZone.kt @@ -17,10 +17,10 @@ package com.google.samples.apps.nowinandroid.core.ui import androidx.compose.runtime.compositionLocalOf -import java.time.ZoneId +import kotlinx.datetime.TimeZone /** - * ZoneId that can be provided with the TimeZoneMonitor. + * TimeZone that can be provided with the TimeZoneMonitor. * This way, it's not needed to pass every single composable the time zone to show in UI. */ -val LocalZoneId = compositionLocalOf { ZoneId.systemDefault() } +val LocalTimeZone = compositionLocalOf { TimeZone.currentSystemDefault() } diff --git a/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 9c4377b9d..2b22c7ea2 100644 --- a/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -69,6 +69,7 @@ import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource import kotlinx.datetime.Instant import kotlinx.datetime.toJavaInstant +import kotlinx.datetime.toJavaZoneId import java.time.format.DateTimeFormatter import java.time.format.FormatStyle import java.util.Locale @@ -244,7 +245,7 @@ fun NotificationDot( fun dateFormatted(publishDate: Instant): String = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.getDefault()) - .withZone(LocalZoneId.current) + .withZone(LocalTimeZone.current.toJavaZoneId()) .format(publishDate.toJavaInstant()) @Composable