Skip to content

Commit

Permalink
add local clock provider
Browse files Browse the repository at this point in the history
  • Loading branch information
tkhs0604 committed Sep 16, 2023
1 parent a7e7792 commit c39834b
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -150,3 +156,7 @@ class PreviewTest(
}
}
}

private object FakeClock : Clock {
override fun now(): Instant = Instant.parse("2023-09-14T10:00:00.000Z")
}
1 change: 1 addition & 0 deletions core/ui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ kotlin {
implementation(libs.kermit)
api(projects.core.common)
api(libs.composeImageLoader)
api(libs.kotlinxDatetime)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.github.droidkaigi.confsched2023.ui.compositionlocal

import androidx.compose.runtime.compositionLocalOf
import kotlinx.datetime.Clock

val LocalClockProvider = compositionLocalOf<Clock> {
Clock.System
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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<String, List<TimetableItem>>().toPersistentMap(),
Timetable(),
),
DroidKaigi2023Day.Day2 to TimetableListUiState(
mapOf<String, List<TimetableItem>>().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<String, List<TimetableItem>>().toPersistentMap(),
Timetable(),
),
DroidKaigi2023Day.Day2 to TimetableListUiState(
mapOf<String, List<TimetableItem>>().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(),
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<DroidKaigi2023Day, TimetableListUiState>,
override val clock: Clock = Clock.System,
) : TimetableSheetUiState

data class GridTimetable(
val timetableGridUiState: Map<DroidKaigi2023Day, TimetableGridUiState>,
override val clock: Clock = Clock.System,
) : TimetableSheetUiState
}

Expand All @@ -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",
Expand Down

0 comments on commit c39834b

Please sign in to comment.