Skip to content

Commit 61521a5

Browse files
committed
Manage 24 hour format on time picker
1 parent 5a9003a commit 61521a5

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,41 @@
11
package com.spendesk.grapes.compose.calendar
22

3+
import android.text.format.DateFormat
34
import androidx.compose.material3.ExperimentalMaterial3Api
45
import androidx.compose.material3.TimeInput
56
import androidx.compose.material3.TimePickerDefaults
7+
import androidx.compose.material3.TimePickerState
68
import androidx.compose.material3.rememberTimePickerState
79
import androidx.compose.runtime.Composable
810
import androidx.compose.runtime.LaunchedEffect
9-
import androidx.compose.runtime.getValue
10-
import androidx.compose.runtime.mutableStateOf
11-
import androidx.compose.runtime.remember
12-
import androidx.compose.runtime.setValue
1311
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.platform.LocalContext
1413
import androidx.compose.ui.tooling.preview.Preview
1514
import com.spendesk.grapes.compose.theme.GrapesTheme
16-
import java.util.Calendar
17-
import java.util.Date
18-
19-
/**
20-
* @author : dany
21-
* @since : 07/03/2023, Tue
22-
**/
15+
import java.time.LocalTime
2316

2417
/**
2518
* Grapes time picker which lets the user selects a specific time by providing the hour, minutes and the am/pm format.
2619
*
2720
* @param initialHour Initial hour to be displayed in the picker
2821
* @param initialMinute Initial minute to be displayed in the picker
2922
* @param modifier The [Modifier] to be applied to this time picker
30-
* @param onTimeSelected Callback when an hour or minute is changed in the picker
23+
* @param onTimeChange Callback when an hour or minute is changed in the picker
24+
* @param is24HourFormat Whether the picker should be in 24-hour format or not. Default to the device setting
3125
*/
32-
@OptIn(ExperimentalMaterial3Api::class)
3326
@Composable
27+
@OptIn(ExperimentalMaterial3Api::class)
3428
fun GrapesTimePicker(
3529
initialHour: Int,
3630
initialMinute: Int,
31+
onTimeChange: (LocalTime) -> Unit,
3732
modifier: Modifier = Modifier,
38-
onTimeSelected: ((Int, Int) -> Unit)? = null
33+
is24HourFormat: Boolean = DateFormat.is24HourFormat(LocalContext.current),
3934
) {
40-
val timerPickerState = rememberTimePickerState(
35+
val timerPickerState: TimePickerState = rememberTimePickerState(
4136
initialHour = initialHour,
4237
initialMinute = initialMinute,
43-
is24Hour = false
38+
is24Hour = is24HourFormat,
4439
)
4540

4641
TimeInput(
@@ -61,27 +56,38 @@ fun GrapesTimePicker(
6156
)
6257

6358
LaunchedEffect(timerPickerState.hour, timerPickerState.minute) {
64-
if (timerPickerState.hour != initialHour || timerPickerState.minute != initialMinute) {
65-
onTimeSelected?.invoke(timerPickerState.hour, timerPickerState.minute)
66-
}
59+
onTimeChange(LocalTime.of(timerPickerState.hour, timerPickerState.minute))
6760
}
6861
}
6962

63+
@Composable
7064
@Preview(showBackground = true)
65+
@Suppress("MagicNumber")
66+
private fun PreviewGrapesTimePicker24Hour() {
67+
val now = LocalTime.of(16, 44, 0)
68+
69+
GrapesTheme {
70+
GrapesTimePicker(
71+
initialHour = now.hour,
72+
initialMinute = now.minute,
73+
is24HourFormat = true,
74+
onTimeChange = {},
75+
)
76+
}
77+
}
78+
7179
@Composable
72-
private fun GrapesTimePickerPreview() {
73-
var itemHour by remember { mutableStateOf(Calendar.getInstance().apply { time = Date() }.get(Calendar.HOUR_OF_DAY)) }
74-
var itemMinutes by remember { mutableStateOf(Calendar.getInstance().apply { time = Date() }.get(Calendar.MINUTE)) }
80+
@Preview(showBackground = true)
81+
@Suppress("MagicNumber")
82+
private fun PreviewGrapesTimePicker12Hour() {
83+
val now = LocalTime.of(16, 44, 0)
7584

7685
GrapesTheme {
7786
GrapesTimePicker(
78-
initialHour = itemHour,
79-
initialMinute = itemMinutes,
80-
onTimeSelected = { hour, minute ->
81-
itemHour = hour
82-
itemMinutes = minute
83-
println("Selected hour: $hour and minute: $minute")
84-
}
87+
initialHour = now.hour,
88+
initialMinute = now.minute,
89+
is24HourFormat = false,
90+
onTimeChange = {},
8591
)
8692
}
8793
}

0 commit comments

Comments
 (0)