From 68de689ca573ac9c70d7462b604b9c2c43002353 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 22 Mar 2025 00:25:20 -0500 Subject: [PATCH] Set firstDayOfWeek with Unicode extensions --- .../activities/DateAndTimePickerActivity.kt | 1 + .../tasks/compose/pickers/CustomRecurrence.kt | 10 +++ .../tasks/compose/pickers/DatePickerDialog.kt | 75 ++++++++++++++++--- .../tasks/repeats/CustomRecurrenceActivity.kt | 3 +- 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt index d9bb1b26d..bb9fbe871 100644 --- a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt +++ b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt @@ -66,6 +66,7 @@ class DateAndTimePickerActivity : AppCompatActivity() { ) }, displayMode = remember { preferences.calendarDisplayMode }, + firstDayOfWeek = remember { preferences.firstDayOfWeek }, setDisplayMode = { preferences.calendarDisplayMode = it }, diff --git a/app/src/main/java/org/tasks/compose/pickers/CustomRecurrence.kt b/app/src/main/java/org/tasks/compose/pickers/CustomRecurrence.kt index 572677cfc..5ec1186a4 100644 --- a/app/src/main/java/org/tasks/compose/pickers/CustomRecurrence.kt +++ b/app/src/main/java/org/tasks/compose/pickers/CustomRecurrence.kt @@ -79,6 +79,7 @@ fun CustomRecurrence( setMonthSelection: (Int) -> Unit, calendarDisplayMode: DisplayMode, setDisplayMode: (DisplayMode) -> Unit, + firstDayOfWeek: Int, ) { BackHandler { save() @@ -190,6 +191,7 @@ fun CustomRecurrence( setOccurrences = setOccurrences, calendarDisplayMode = calendarDisplayMode, setDisplayMode = setDisplayMode, + firstDayOfWeek = firstDayOfWeek, ) } } @@ -330,6 +332,7 @@ private fun EndsPicker( selection: Int, endDate: Long, endOccurrences: Int, + firstDayOfWeek: Int, calendarDisplayMode: DisplayMode, setDisplayMode: (DisplayMode) -> Unit, setOccurrences: (Int) -> Unit, @@ -361,6 +364,7 @@ private fun EndsPicker( DatePickerDialog( initialDate = endDate, displayMode = calendarDisplayMode, + firstDayOfWeek = firstDayOfWeek, setDisplayMode = setDisplayMode, selected = { setEndDate(it) @@ -446,6 +450,7 @@ fun WeeklyPreview() { setMonthSelection = {}, calendarDisplayMode = DisplayMode.Picker, setDisplayMode = {}, + firstDayOfWeek = 0, ) } } @@ -469,6 +474,7 @@ fun MonthlyPreview() { setMonthSelection = {}, calendarDisplayMode = DisplayMode.Picker, setDisplayMode = {}, + firstDayOfWeek = 0, ) } } @@ -492,6 +498,7 @@ fun MinutelyPreview() { setMonthSelection = {}, calendarDisplayMode = DisplayMode.Picker, setDisplayMode = {}, + firstDayOfWeek = 0, ) } } @@ -515,6 +522,7 @@ fun HourlyPreview() { setMonthSelection = {}, calendarDisplayMode = DisplayMode.Picker, setDisplayMode = {}, + firstDayOfWeek = 0, ) } } @@ -538,6 +546,7 @@ fun DailyPreview() { setMonthSelection = {}, calendarDisplayMode = DisplayMode.Picker, setDisplayMode = {}, + firstDayOfWeek = 0, ) } } @@ -561,6 +570,7 @@ fun YearlyPreview() { setMonthSelection = {}, calendarDisplayMode = DisplayMode.Picker, setDisplayMode = {}, + firstDayOfWeek = 0, ) } } diff --git a/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt b/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt index f9c35151c..cad29c0a5 100644 --- a/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt +++ b/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt @@ -1,6 +1,7 @@ package org.tasks.compose.pickers import android.content.res.Configuration +import android.os.LocaleList import androidx.compose.material3.DatePicker import androidx.compose.material3.DisplayMode import androidx.compose.material3.ExperimentalMaterial3Api @@ -8,22 +9,26 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberDatePickerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import org.tasks.R import org.tasks.themes.TasksTheme import org.tasks.time.DateTime import timber.log.Timber +import java.util.Locale @OptIn(ExperimentalMaterial3Api::class) @Composable fun DatePickerDialog( initialDate: Long, displayMode: DisplayMode, + firstDayOfWeek: Int, setDisplayMode: (DisplayMode) -> Unit, selected: (Long) -> Unit, dismiss: () -> Unit, @@ -48,23 +53,51 @@ fun DatePickerDialog( androidx.compose.material3.DatePickerDialog( onDismissRequest = { dismiss() }, dismissButton = { - TextButton(onClick = dismiss) { - Text(text = stringResource(id = R.string.cancel)) - } + TextButton(onClick = dismiss) { + Text(text = stringResource(id = R.string.cancel)) + } }, confirmButton = { - TextButton( - onClick = { - datePickerState - .selectedDateMillis - ?.let { selected(it - DateTime(it).offset) } - } - ) { - Text(text = stringResource(id = R.string.ok)) + TextButton( + onClick = { + datePickerState + .selectedDateMillis + ?.let { selected(it - DateTime(it).offset) } } + ) { + Text(text = stringResource(id = R.string.ok)) } + } ) { - DatePicker(state = datePickerState) + val currentLocale = LocalConfiguration.current.locales[0] + val customLocale = remember(currentLocale) { + if (firstDayOfWeek == 0) { + currentLocale + } else { + Locale.Builder() + .setLocale(currentLocale) + .setUnicodeLocaleKeyword( + "fw", + when (firstDayOfWeek) { + 2 -> "mon" + 3 -> "tue" + 4 -> "wed" + 5 -> "thu" + 6 -> "fri" + 7 -> "sat" + else -> "sun" + } + ) + .build() + } + } + CompositionLocalProvider( + LocalConfiguration provides Configuration(LocalConfiguration.current).apply { + setLocales(LocaleList(customLocale)) + } + ) { + DatePicker(state = datePickerState) + } } } @@ -77,6 +110,7 @@ fun DatePickerPreview() { DatePickerDialog( initialDate = DateTime().plusDays(1).millis, displayMode = DisplayMode.Picker, + firstDayOfWeek = 0, setDisplayMode = {}, selected = {}, dismiss = {} @@ -93,6 +127,23 @@ fun DatePickerPreviewInput() { DatePickerDialog( initialDate = DateTime().plusDays(1).millis, displayMode = DisplayMode.Input, + firstDayOfWeek = 0, + setDisplayMode = {}, + selected = {}, + dismiss = {} + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Preview(showBackground = true) +@Composable +fun DatePickerPreviewOverrideFirstDay() { + TasksTheme { + DatePickerDialog( + initialDate = DateTime().plusDays(1).millis, + displayMode = DisplayMode.Picker, + firstDayOfWeek = 2, setDisplayMode = {}, selected = {}, dismiss = {} diff --git a/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt b/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt index 55e2c1022..33a6391f4 100644 --- a/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt +++ b/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt @@ -43,7 +43,8 @@ class CustomRecurrenceActivity : FragmentActivity() { toggleDay = { viewModel.toggleDay(it) }, setMonthSelection = { viewModel.setMonthSelection(it) }, calendarDisplayMode = remember { preferences.calendarDisplayMode }, - setDisplayMode = { preferences.calendarDisplayMode = it } + setDisplayMode = { preferences.calendarDisplayMode = it }, + firstDayOfWeek = remember { preferences.firstDayOfWeek }, ) } }