From c5fe5054ea9892fc301eafec94cf6ee6c89c6181 Mon Sep 17 00:00:00 2001 From: Ray Yuan Liu Date: Sun, 16 Jul 2023 13:36:39 +0800 Subject: [PATCH] Send the picker back to previous screen --- .../com/rayliu/gymnote/wearos/MainNavGraph.kt | 20 +++++++++-- .../java/com/rayliu/gymnote/wearos/WearApp.kt | 4 ++- .../wearos/addrecord/AddRecordScreen.kt | 13 ++++--- .../recordinput/AddTimeRecordScreen.kt | 6 ++-- .../gymnote/wearos/navigation/Screen.kt | 1 + .../wearos/timepicker/TimePickerScreen.kt | 35 ++++++++++++++++--- 6 files changed, 66 insertions(+), 13 deletions(-) diff --git a/wear/src/main/java/com/rayliu/gymnote/wearos/MainNavGraph.kt b/wear/src/main/java/com/rayliu/gymnote/wearos/MainNavGraph.kt index a2e1fae..1f60732 100644 --- a/wear/src/main/java/com/rayliu/gymnote/wearos/MainNavGraph.kt +++ b/wear/src/main/java/com/rayliu/gymnote/wearos/MainNavGraph.kt @@ -28,6 +28,7 @@ import com.rayliu.gymnote.wearos.navigation.CATEGORY_ID_NAV_ARGUMENT import com.rayliu.gymnote.wearos.navigation.DestinationScrollType import com.rayliu.gymnote.wearos.navigation.SCROLL_TYPE_NAV_ARGUMENT import com.rayliu.gymnote.wearos.navigation.Screen +import com.rayliu.gymnote.wearos.navigation.TIME_PICKER_RESULT_NAV_ARGUMENT import com.rayliu.gymnote.wearos.navigation.WORKOUT_ID_NAV_ARGUMENT import com.rayliu.gymnote.wearos.timepicker.TimePickerScreen import com.rayliu.gymnote.wearos.workout.WorkoutScreen @@ -158,7 +159,10 @@ fun NavGraphBuilder.mainNavGraph( val focusRequester = remember { FocusRequester() } val viewModel: AddRecordViewModel = koinNavViewModel() viewModel.performPreScreenTasks() + val recordTypes = viewModel.recordInputTypes.value + val userInputTimeRecord = it.savedStateHandle.get(TIME_PICKER_RESULT_NAV_ARGUMENT) + AddRecordScreen( recordTypes = recordTypes, focusRequester = focusRequester, @@ -170,7 +174,8 @@ fun NavGraphBuilder.mainNavGraph( }, onTimeAdjustButtonClicked = { navController.navigate(Screen.TimePickerScreen.route) - } + }, + userInputTimeRecord = userInputTimeRecord ) } composable( @@ -182,7 +187,18 @@ fun NavGraphBuilder.mainNavGraph( } ) ) { - TimePickerScreen() + val focusRequester = remember { FocusRequester() } + TimePickerScreen( + focusRequester = focusRequester, + onTimeConfirm = { + navController.previousBackStackEntry + ?.savedStateHandle + ?.set(TIME_PICKER_RESULT_NAV_ARGUMENT, it) + + navController.popBackStack() + } + ) + RequestFocusOnResume(focusRequester) } } diff --git a/wear/src/main/java/com/rayliu/gymnote/wearos/WearApp.kt b/wear/src/main/java/com/rayliu/gymnote/wearos/WearApp.kt index 9307b5b..169df37 100644 --- a/wear/src/main/java/com/rayliu/gymnote/wearos/WearApp.kt +++ b/wear/src/main/java/com/rayliu/gymnote/wearos/WearApp.kt @@ -53,7 +53,9 @@ fun WearApp( } key(backStackEntry.destination.route) { - TimeText(modifier = timeTextModifier ?: Modifier) + TimeText( + modifier = timeTextModifier ?: Modifier + ) } } }, diff --git a/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/AddRecordScreen.kt b/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/AddRecordScreen.kt index 03e505a..ade54d6 100644 --- a/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/AddRecordScreen.kt +++ b/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/AddRecordScreen.kt @@ -38,6 +38,7 @@ fun AddRecordScreen( onCancelButtonClicked: () -> Unit, onTimeAdjustButtonClicked: () -> Unit, onRequestFocus: @Composable (FocusRequester) -> Unit, + userInputTimeRecord: String?, modifier: Modifier = Modifier ) { Box( @@ -60,7 +61,8 @@ fun AddRecordScreen( ShowScreenByRecordType( focusRequester, recordType, - onTimeAdjustButtonClicked + onTimeAdjustButtonClicked, + userInputTimeRecord ) onRequestFocus(focusRequester) } @@ -95,7 +97,8 @@ fun AddRecordScreen( private fun ShowScreenByRecordType( focusRequester: FocusRequester, recordType: RecordType, - onTimeAdjustButtonClicked: () -> Unit + onTimeAdjustButtonClicked: () -> Unit, + userInputTimeRecord: String?, ) { when (recordType) { RecordType.WEIGHT -> { @@ -128,7 +131,8 @@ private fun ShowScreenByRecordType( AddTimeRecordScreen( onAdjustButtonClicked = onTimeAdjustButtonClicked, focusRequester = focusRequester, - modifier = Modifier + modifier = Modifier, + defaultText = userInputTimeRecord ) } @@ -173,7 +177,8 @@ private fun AddRecordScreenPreview() { focusRequester = FocusRequester(), onRequestFocus = {}, onCancelButtonClicked = {}, - onTimeAdjustButtonClicked = {} + onTimeAdjustButtonClicked = {}, + userInputTimeRecord = null ) } } diff --git a/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/recordinput/AddTimeRecordScreen.kt b/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/recordinput/AddTimeRecordScreen.kt index 48ec3dc..0f5c169 100644 --- a/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/recordinput/AddTimeRecordScreen.kt +++ b/wear/src/main/java/com/rayliu/gymnote/wearos/addrecord/recordinput/AddTimeRecordScreen.kt @@ -20,12 +20,14 @@ import com.rayliu.gymnote.R import com.rayliu.gymnote.wearos.theme.GymNoteTheme import com.rayliu.gymnote.wearos.theme.PreviewConstants +const val DEFAULT_TIME = "00:00:00" + @Composable fun AddTimeRecordScreen( focusRequester: FocusRequester, onAdjustButtonClicked: () -> Unit, modifier: Modifier = Modifier, - defaultText: String = "00:00:00" + defaultText: String? = DEFAULT_TIME ) { Row( verticalAlignment = Alignment.CenterVertically, @@ -38,7 +40,7 @@ fun AddTimeRecordScreen( horizontalAlignment = Alignment.CenterHorizontally, ) { Text( - defaultText, + defaultText ?: DEFAULT_TIME, fontSize = 22.sp ) CompactChip( diff --git a/wear/src/main/java/com/rayliu/gymnote/wearos/navigation/Screen.kt b/wear/src/main/java/com/rayliu/gymnote/wearos/navigation/Screen.kt index 850df6a..2abd7d3 100644 --- a/wear/src/main/java/com/rayliu/gymnote/wearos/navigation/Screen.kt +++ b/wear/src/main/java/com/rayliu/gymnote/wearos/navigation/Screen.kt @@ -3,6 +3,7 @@ package com.rayliu.gymnote.wearos.navigation const val SCROLL_TYPE_NAV_ARGUMENT = "scrollType" const val CATEGORY_ID_NAV_ARGUMENT = "categoryId" const val WORKOUT_ID_NAV_ARGUMENT = "workoutId" +const val TIME_PICKER_RESULT_NAV_ARGUMENT = "timePickerResult" sealed class Screen(val route: String) { object SportsCategory : Screen("sports_category") diff --git a/wear/src/main/java/com/rayliu/gymnote/wearos/timepicker/TimePickerScreen.kt b/wear/src/main/java/com/rayliu/gymnote/wearos/timepicker/TimePickerScreen.kt index bca2f62..8a3bf75 100644 --- a/wear/src/main/java/com/rayliu/gymnote/wearos/timepicker/TimePickerScreen.kt +++ b/wear/src/main/java/com/rayliu/gymnote/wearos/timepicker/TimePickerScreen.kt @@ -3,24 +3,48 @@ package com.rayliu.gymnote.wearos.timepicker import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.tooling.preview.Preview -import androidx.wear.compose.material.Text +import androidx.compose.ui.unit.dp +import com.google.android.horologist.composables.TimePicker +import com.rayliu.gymnote.wearos.addrecord.recordinput.DEFAULT_TIME import com.rayliu.gymnote.wearos.theme.GymNoteTheme import com.rayliu.gymnote.wearos.theme.PreviewConstants +import kotlinx.datetime.LocalTime +import kotlinx.datetime.toJavaLocalTime +import kotlinx.datetime.toLocalTime @Composable fun TimePickerScreen( - modifier: Modifier = Modifier + focusRequester: FocusRequester, + onTimeConfirm: (String) -> Unit, + modifier: Modifier = Modifier, + defaultTime: LocalTime? = null, ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, modifier = modifier.fillMaxSize() ) { - Text("TimePicker") + val localTime = + defaultTime?.toJavaLocalTime() ?: DEFAULT_TIME.toLocalTime().toJavaLocalTime() + TimePicker( + time = localTime, + onTimeConfirm = { + val hourText = "%02d".format(it.hour) + val minuteText = "%02d".format(it.minute) + val secondText = "%02d".format(it.second) + onTimeConfirm("$hourText:$minuteText:$secondText") + }, + modifier = Modifier + .padding(4.dp) + .focusRequester(focusRequester) + ) } } @@ -33,6 +57,9 @@ fun TimePickerScreen( @Composable fun TimePickerScreenPreview() { GymNoteTheme { - TimePickerScreen() + TimePickerScreen( + focusRequester = FocusRequester(), + onTimeConfirm = {} + ) } }