diff --git a/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/settings/SettingsEvent.kt b/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/settings/SettingsEvent.kt new file mode 100644 index 00000000..f50c9fee --- /dev/null +++ b/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/settings/SettingsEvent.kt @@ -0,0 +1,5 @@ +package xyz.ksharma.krail.trip.planner.ui.state.settings + +sealed interface SettingsEvent { + data object A : SettingsEvent +} diff --git a/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/settings/SettingsState.kt b/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/settings/SettingsState.kt new file mode 100644 index 00000000..12a13271 --- /dev/null +++ b/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/settings/SettingsState.kt @@ -0,0 +1,3 @@ +package xyz.ksharma.krail.trip.planner.ui.state.settings + +data class SettingsState(val x: Int = 0) diff --git a/feature/trip-planner/ui/src/commonMain/composeResources/drawable/ic_settings.xml b/feature/trip-planner/ui/src/commonMain/composeResources/drawable/ic_settings.xml new file mode 100644 index 00000000..7abde109 --- /dev/null +++ b/feature/trip-planner/ui/src/commonMain/composeResources/drawable/ic_settings.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/navigation/TripPlannerDestinations.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/navigation/TripPlannerDestinations.kt index 7c64272b..c1eed5ea 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/navigation/TripPlannerDestinations.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/navigation/TripPlannerDestinations.kt @@ -7,6 +7,7 @@ import kotlinx.serialization.Serializable import xyz.ksharma.krail.trip.planner.ui.alerts.alertsDestination import xyz.ksharma.krail.trip.planner.ui.savedtrips.savedTripsDestination import xyz.ksharma.krail.trip.planner.ui.searchstop.searchStopDestination +import xyz.ksharma.krail.trip.planner.ui.settings.settingsDestination import xyz.ksharma.krail.trip.planner.ui.timetable.timeTableDestination import xyz.ksharma.krail.trip.planner.ui.usualride.usualRideDestination @@ -28,6 +29,8 @@ fun NavGraphBuilder.tripPlannerDestinations( usualRideDestination(navController) alertsDestination(navController) + + settingsDestination(navController) } } @@ -74,3 +77,6 @@ data object UsualRideRoute internal data class ServiceAlertRoute( val alertsJsonList: List, ) + +@Serializable +data object SettingsRoute diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt index 36d07467..89178138 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt @@ -14,6 +14,7 @@ import org.koin.compose.viewmodel.koinViewModel import xyz.ksharma.krail.trip.planner.ui.navigation.SavedTripsRoute import xyz.ksharma.krail.trip.planner.ui.navigation.SearchStopFieldType import xyz.ksharma.krail.trip.planner.ui.navigation.SearchStopRoute +import xyz.ksharma.krail.trip.planner.ui.navigation.SettingsRoute import xyz.ksharma.krail.trip.planner.ui.navigation.TimeTableRoute import xyz.ksharma.krail.trip.planner.ui.state.savedtrip.SavedTripUiEvent import xyz.ksharma.krail.trip.planner.ui.state.searchstop.model.StopItem @@ -104,6 +105,12 @@ internal fun NavGraphBuilder.savedTripsDestination(navController: NavHostControl // Timber.e("Select both stops") } }, + onSettingsButtonClick = { + navController.navigate( + route = SettingsRoute, + navOptions = NavOptions.Builder().setLaunchSingleTop(true).build(), + ) + }, onEvent = { event -> viewModel.onEvent(event) }, ) } diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt index a4c1961a..b6487307 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt @@ -1,5 +1,6 @@ package xyz.ksharma.krail.trip.planner.ui.savedtrips +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -8,6 +9,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -15,6 +17,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.unit.dp import xyz.ksharma.krail.taj.LocalThemeContentColor import xyz.ksharma.krail.taj.components.Text @@ -27,9 +30,10 @@ import xyz.ksharma.krail.trip.planner.ui.state.savedtrip.SavedTripUiEvent import xyz.ksharma.krail.trip.planner.ui.state.savedtrip.SavedTripsState import xyz.ksharma.krail.trip.planner.ui.state.searchstop.model.StopItem import krail.feature.trip_planner.ui.generated.resources.Res -import krail.feature.trip_planner.ui.generated.resources.ic_reverse +import krail.feature.trip_planner.ui.generated.resources.ic_settings import org.jetbrains.compose.resources.painterResource - +import xyz.ksharma.krail.taj.LocalOnContentColor +import xyz.ksharma.krail.taj.components.RoundIconButton @Composable fun SavedTripsScreen( @@ -41,21 +45,22 @@ fun SavedTripsScreen( toButtonClick: () -> Unit = {}, onReverseButtonClick: () -> Unit = {}, onSearchButtonClick: (StopItem?, StopItem?) -> Unit = { _, _ -> }, + onSettingsButtonClick: () -> Unit = {}, onEvent: (SavedTripUiEvent) -> Unit = {}, ) { val themeContentColor by LocalThemeContentColor.current // TODO - handle colors of status bar -/* DisposableEffect(themeContentColor) { - context.getActivityOrNull()?.let { activity -> - (activity as ComponentActivity).enableEdgeToEdge( - navigationBarStyle = SystemBarStyle.auto( - lightScrim = themeContentColor.hexToComposeColor().toArgb(), - darkScrim = themeContentColor.hexToComposeColor().toArgb(), - ), - ) - } - onDispose {} - }*/ + /* DisposableEffect(themeContentColor) { + context.getActivityOrNull()?.let { activity -> + (activity as ComponentActivity).enableEdgeToEdge( + navigationBarStyle = SystemBarStyle.auto( + lightScrim = themeContentColor.hexToComposeColor().toArgb(), + darkScrim = themeContentColor.hexToComposeColor().toArgb(), + ), + ) + } + onDispose {} + }*/ Box( modifier = modifier @@ -64,9 +69,23 @@ fun SavedTripsScreen( .statusBarsPadding(), ) { Column { - TitleBar(title = { - Text(text = "Saved Trips") - }) + TitleBar( + title = { + Text(text = "Saved Trips") + }, + actions = { + RoundIconButton( + onClick = onSettingsButtonClick, + ) { + Image( + painter = painterResource(Res.drawable.ic_settings), + contentDescription = "Settings", + colorFilter = ColorFilter.tint(LocalOnContentColor.current), + modifier = Modifier.size(24.dp), + ) + } + } + ) LazyColumn( contentPadding = PaddingValues(bottom = 300.dp), diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsDestination.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsDestination.kt new file mode 100644 index 00000000..05812fc3 --- /dev/null +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsDestination.kt @@ -0,0 +1,26 @@ +package xyz.ksharma.krail.trip.planner.ui.settings + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable +import xyz.ksharma.krail.trip.planner.ui.navigation.SettingsRoute +import xyz.ksharma.krail.trip.planner.ui.navigation.UsualRideRoute + +internal fun NavGraphBuilder.settingsDestination(navController: NavHostController) { + composable { +// val viewModel: SettingsViewModel = koinViewModel() + + SettingsScreen( + onChangeThemeClick = { + navController.navigate( + route = UsualRideRoute, + navOptions = NavOptions.Builder().setLaunchSingleTop(true).build(), + ) + }, + onBackClick = { + navController.popBackStack() + }, + ) + } +} diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsScreen.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsScreen.kt new file mode 100644 index 00000000..fc4987b7 --- /dev/null +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsScreen.kt @@ -0,0 +1,78 @@ +package xyz.ksharma.krail.trip.planner.ui.settings + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.unit.dp +import xyz.ksharma.krail.taj.components.Divider +import xyz.ksharma.krail.taj.components.Text +import xyz.ksharma.krail.taj.components.TitleBar +import xyz.ksharma.krail.taj.theme.KrailTheme +import xyz.ksharma.krail.trip.planner.ui.timetable.ActionButton + +@Composable +fun SettingsScreen( + modifier: Modifier = Modifier, + onBackClick: () -> Unit = {}, + onChangeThemeClick: () -> Unit = {}, +) { + Column( + modifier = modifier + .fillMaxSize() + .background(color = KrailTheme.colors.surface) + .statusBarsPadding(), + ) { + Column(modifier = Modifier.fillMaxWidth()) { + TitleBar( + modifier = Modifier.fillMaxWidth(), + navAction = { + ActionButton( + onClick = onBackClick, + contentDescription = "Back", + ) { + Image( + imageVector = Icons.AutoMirrored.Filled.ArrowBack, + contentDescription = null, + colorFilter = ColorFilter.tint(KrailTheme.colors.onSurface), + modifier = Modifier.size(24.dp), + ) + } + }, + title = { Text(text = "Settings") }, + ) + } + + LazyColumn( + modifier = Modifier, + contentPadding = PaddingValues(top = 20.dp, bottom = 104.dp), + ) { + item { + Text( + text = "Change Theme", + style = KrailTheme.typography.title, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp, horizontal = 16.dp) + .clickable { + onChangeThemeClick() + } + ) + Divider() + } + + } + } +} diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsViewModel.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsViewModel.kt new file mode 100644 index 00000000..ddc16346 --- /dev/null +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/settings/SettingsViewModel.kt @@ -0,0 +1,18 @@ +package xyz.ksharma.krail.trip.planner.ui.settings + +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import xyz.ksharma.krail.trip.planner.ui.state.settings.SettingsEvent +import xyz.ksharma.krail.trip.planner.ui.state.settings.SettingsState + +class SettingsViewModel() : ViewModel() { + + private val _uiState: MutableStateFlow = MutableStateFlow(SettingsState()) + val uiState: StateFlow = _uiState + +/* fun onEvent(event: SettingsEvent) { + when (event) { + } + }*/ +} diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideDestination.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideDestination.kt index 19ce8d44..b59c671a 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideDestination.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideDestination.kt @@ -45,7 +45,7 @@ internal fun NavGraphBuilder.usualRideDestination(navController: NavHostControll route = SavedTripsRoute, navOptions = NavOptions.Builder() .setLaunchSingleTop(true) - .setPopUpTo(inclusive = true) + .setPopUpTo(inclusive = false) .build(), ) }, diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideViewModel.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideViewModel.kt index a5edb147..7b101646 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideViewModel.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/usualride/UsualRideViewModel.kt @@ -24,6 +24,7 @@ class UsualRideViewModel(private val sandook: Sandook) : ViewModel() { private fun onTransportModeSelected(productClass: Int) { viewModelScope.launch(Dispatchers.IO) { + sandook.clearTheme() // Only one entry should exist at a time sandook.insertOrReplaceTheme(productClass.toLong()) } }