diff --git a/app-android/src/test/java/io/github/droidkaigi/confsched2023/PreviewTest.kt b/app-android/src/test/java/io/github/droidkaigi/confsched2023/PreviewTest.kt index c7868b878..94ffa839d 100644 --- a/app-android/src/test/java/io/github/droidkaigi/confsched2023/PreviewTest.kt +++ b/app-android/src/test/java/io/github/droidkaigi/confsched2023/PreviewTest.kt @@ -14,6 +14,9 @@ import io.github.droidkaigi.confsched2023.designsystem.preview.MultiLanguagePrev import io.github.droidkaigi.confsched2023.designsystem.preview.MultiThemePreviewDefinition import io.github.droidkaigi.confsched2023.designsystem.preview.ShowkaseMultiplePreviewsWorkaround import io.github.droidkaigi.confsched2023.testing.category.ScreenshotTests +import io.github.droidkaigi.confsched2023.ui.compositionlocal.LocalClockProvider +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant import org.junit.Test import org.junit.experimental.categories.Category import org.junit.runner.RunWith @@ -70,7 +73,10 @@ class PreviewTest( val newConfiguration = appliers.fold(LocalConfiguration.current) { c, a -> c.apply(a) } - CompositionLocalProvider(LocalConfiguration provides newConfiguration) { + CompositionLocalProvider( + LocalConfiguration provides newConfiguration, + LocalClockProvider provides FakeClock, + ) { // Notify locale changes to lang() through the following invocation. LocaleList.setDefault(LocalConfiguration.current.locales) @@ -150,3 +156,7 @@ class PreviewTest( } } } + +private object FakeClock : Clock { + override fun now(): Instant = Instant.parse("2023-09-14T10:00:00.000Z") +} diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index a396e8521..48e34b842 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -18,6 +18,7 @@ kotlin { implementation(libs.kermit) api(projects.core.common) api(libs.composeImageLoader) + api(libs.kotlinxDatetime) } } } diff --git a/core/ui/src/androidMain/kotlin/io/github/droidkaigi/confsched2023/ui/compositionlocal/LocalClockProvider.kt b/core/ui/src/androidMain/kotlin/io/github/droidkaigi/confsched2023/ui/compositionlocal/LocalClockProvider.kt new file mode 100644 index 000000000..f55be1745 --- /dev/null +++ b/core/ui/src/androidMain/kotlin/io/github/droidkaigi/confsched2023/ui/compositionlocal/LocalClockProvider.kt @@ -0,0 +1,8 @@ +package io.github.droidkaigi.confsched2023.ui.compositionlocal + +import androidx.compose.runtime.compositionLocalOf +import kotlinx.datetime.Clock + +val LocalClockProvider = compositionLocalOf { + Clock.System +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt index 677b37d0b..b8040ad87 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -51,6 +52,7 @@ import io.github.droidkaigi.confsched2023.sessions.section.TimetableListUiState import io.github.droidkaigi.confsched2023.sessions.section.TimetableSheet import io.github.droidkaigi.confsched2023.sessions.section.TimetableSheetUiState import io.github.droidkaigi.confsched2023.ui.SnackbarMessageEffect +import io.github.droidkaigi.confsched2023.ui.compositionlocal.LocalClockProvider import kotlinx.collections.immutable.toPersistentMap import kotlinx.datetime.Clock import kotlinx.datetime.Instant @@ -251,35 +253,38 @@ private fun TimetableScreen( @MultiThemePreviews @Composable fun PreviewTimetableScreenDark() { - KaigiTheme { - TimetableScreen( - uiState = TimetableScreenUiState( - contentUiState = TimetableSheetUiState.ListTimetable( - timetableListUiStates = mapOf( - DroidKaigi2023Day.Day1 to TimetableListUiState( - mapOf>().toPersistentMap(), - Timetable(), - ), - DroidKaigi2023Day.Day2 to TimetableListUiState( - mapOf>().toPersistentMap(), - Timetable(), + CompositionLocalProvider( + LocalClockProvider provides object : Clock { + override fun now(): Instant = Instant.parse("2023-09-14T00:00:00Z") + } + ) { + KaigiTheme { + TimetableScreen( + uiState = TimetableScreenUiState( + contentUiState = TimetableSheetUiState.ListTimetable( + timetableListUiStates = mapOf( + DroidKaigi2023Day.Day1 to TimetableListUiState( + mapOf>().toPersistentMap(), + Timetable(), + ), + DroidKaigi2023Day.Day2 to TimetableListUiState( + mapOf>().toPersistentMap(), + Timetable(), + ), ), ), - clock = object : Clock { - override fun now(): Instant = Instant.parse("2023-09-14T00:00:00Z") - }, + timetableUiType = TimetableUiType.Grid, + onBookmarkIconClickStatus = false, ), - timetableUiType = TimetableUiType.Grid, - onBookmarkIconClickStatus = false, - ), - snackbarHostState = SnackbarHostState(), - onTimetableItemClick = {}, - onBookmarkClick = { _, _ -> }, - onBookmarkIconClick = {}, - onSearchClick = {}, - onTimetableUiChangeClick = {}, - onReachAnimationEnd = {}, - modifier = Modifier.statusBarsPadding(), - ) + snackbarHostState = SnackbarHostState(), + onTimetableItemClick = {}, + onBookmarkClick = { _, _ -> }, + onBookmarkIconClick = {}, + onSearchClick = {}, + onTimetableUiChangeClick = {}, + onReachAnimationEnd = {}, + modifier = Modifier.statusBarsPadding(), + ) + } } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreenViewModel.kt index a3393fb86..b9457d1f5 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreenViewModel.kt @@ -52,7 +52,7 @@ class TimetableScreenViewModel @Inject constructor( timetableUiTypeStateFlow, ) { sessionTimetable, uiType -> if (sessionTimetable.timetableItems.isEmpty()) { - return@buildUiState TimetableSheetUiState.Empty() + return@buildUiState TimetableSheetUiState.Empty } if (uiType == TimetableUiType.List) { TimetableSheetUiState.ListTimetable( diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/TimetableSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/TimetableSheet.kt index 0c00f3b07..c280c46b1 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/TimetableSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/TimetableSheet.kt @@ -36,26 +36,20 @@ import io.github.droidkaigi.confsched2023.sessions.component.rememberTimetableTa import io.github.droidkaigi.confsched2023.sessions.section.TimetableSheetUiState.Empty import io.github.droidkaigi.confsched2023.sessions.section.TimetableSheetUiState.GridTimetable import io.github.droidkaigi.confsched2023.sessions.section.TimetableSheetUiState.ListTimetable -import kotlinx.datetime.Clock +import io.github.droidkaigi.confsched2023.ui.compositionlocal.LocalClockProvider const val TimetableTabTestTag = "TimetableTab" sealed interface TimetableSheetUiState { - val clock: Clock - - data class Empty( - override val clock: Clock = Clock.System, - ) : TimetableSheetUiState + data object Empty : TimetableSheetUiState data class ListTimetable( val timetableListUiStates: Map, - override val clock: Clock = Clock.System, ) : TimetableSheetUiState data class GridTimetable( val timetableGridUiState: Map, - override val clock: Clock = Clock.System, ) : TimetableSheetUiState } @@ -68,7 +62,8 @@ fun TimetableSheet( contentPadding: PaddingValues, modifier: Modifier = Modifier, ) { - var selectedDay by rememberSaveable { mutableStateOf(DroidKaigi2023Day.initialSelectedDay(uiState.clock)) } + val clock = LocalClockProvider.current + var selectedDay by rememberSaveable { mutableStateOf(DroidKaigi2023Day.initialSelectedDay(clock)) } val corner by animateIntAsState( if (timetableScreenScrollState.isScreenLayoutCalculating || timetableScreenScrollState.isSheetExpandable) 40 else 0, label = "Timetable corner state",