From eb9dd40103b80c2bc62a1accd2b32d419fc7248d Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 21 Mar 2025 03:35:55 -0500 Subject: [PATCH] Material date time pickers everywhere Also remove calendar and clock style preferences. App will keep track of what type of input you use when you switch --- .../todoroo/astrid/ui/ReminderControlSet.kt | 3 +- .../activities/DateAndTimePickerActivity.kt | 143 ++++++++---------- .../tasks/compose/pickers/CustomRecurrence.kt | 33 +++- .../compose/pickers/DatePickerBottomSheet.kt | 27 ++++ .../tasks/compose/pickers/DatePickerDialog.kt | 54 +++++-- .../tasks/compose/pickers/TimePickerDialog.kt | 19 ++- .../java/org/tasks/dialogs/DateTimePicker.kt | 9 +- .../org/tasks/dialogs/MyDatePickerDialog.kt | 81 ---------- .../org/tasks/dialogs/MyTimePickerDialog.kt | 106 +++++-------- .../java/org/tasks/dialogs/StartDatePicker.kt | 9 +- .../java/org/tasks/preferences/Preferences.kt | 18 +++ .../org/tasks/reminders/SnoozeActivity.kt | 3 +- .../tasks/repeats/CustomRecurrenceActivity.kt | 7 + app/src/main/res/values-ar/strings.xml | 5 - app/src/main/res/values-bg-rBG/strings.xml | 5 - app/src/main/res/values-cs/strings.xml | 5 - app/src/main/res/values-da/strings.xml | 5 - app/src/main/res/values-de/strings.xml | 5 - app/src/main/res/values-eo/strings.xml | 5 - app/src/main/res/values-es/strings.xml | 5 - app/src/main/res/values-et/strings.xml | 5 - app/src/main/res/values-eu/strings.xml | 5 - app/src/main/res/values-fi/strings.xml | 5 - app/src/main/res/values-fr/strings.xml | 5 - app/src/main/res/values-gl/strings.xml | 5 - app/src/main/res/values-hr/strings.xml | 5 - app/src/main/res/values-hu/strings.xml | 5 - app/src/main/res/values-id/strings.xml | 5 - app/src/main/res/values-it/strings.xml | 5 - app/src/main/res/values-iw/strings.xml | 5 - app/src/main/res/values-ja/strings.xml | 5 - app/src/main/res/values-ko/strings.xml | 5 - app/src/main/res/values-lt/strings.xml | 5 - app/src/main/res/values-nb/strings.xml | 5 - app/src/main/res/values-nl/strings.xml | 5 - app/src/main/res/values-or/strings.xml | 2 - app/src/main/res/values-pl/strings.xml | 5 - app/src/main/res/values-pt-rBR/strings.xml | 5 - app/src/main/res/values-pt/strings.xml | 5 - app/src/main/res/values-ro/strings.xml | 5 - app/src/main/res/values-ru/strings.xml | 5 - app/src/main/res/values-si/strings.xml | 5 - app/src/main/res/values-sk/strings.xml | 5 - app/src/main/res/values-sv/strings.xml | 5 - app/src/main/res/values-th/strings.xml | 5 - app/src/main/res/values-tr/strings.xml | 5 - app/src/main/res/values-uk/strings.xml | 5 - app/src/main/res/values-vi/strings.xml | 5 - app/src/main/res/values-zh-rCN/strings.xml | 5 - app/src/main/res/values-zh-rTW/strings.xml | 5 - app/src/main/res/values/arrays.xml | 10 -- app/src/main/res/values/strings.xml | 5 - .../res/xml/preferences_date_and_time.xml | 17 --- 53 files changed, 253 insertions(+), 473 deletions(-) delete mode 100644 app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt diff --git a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt index cd01bed70..46ccc0019 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt @@ -27,7 +27,6 @@ import org.tasks.data.entity.Alarm import org.tasks.data.entity.Alarm.Companion.TYPE_DATE_TIME import org.tasks.date.DateTimeUtils import org.tasks.dialogs.DialogBuilder -import org.tasks.dialogs.MyTimePickerDialog import org.tasks.extensions.Context.openReminderSettings import org.tasks.scheduling.NotificationSchedulerIntentService import org.tasks.ui.TaskEditControlFragment @@ -75,7 +74,7 @@ class ReminderControlSet : TaskEditControlFragment() { if (result.resultCode != RESULT_OK) return@rememberLauncherForActivityResult val data = result.data ?: return@rememberLauncherForActivityResult val timestamp = - data.getLongExtra(MyTimePickerDialog.EXTRA_TIMESTAMP, 0L) + data.getLongExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, 0L) val replace: Alarm? = data.getParcelableExtra(EXTRA_REPLACE) replace?.let { viewModel.removeAlarm(it) } viewModel.addAlarm(Alarm(time = timestamp, type = TYPE_DATE_TIME)) diff --git a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt index b6d0f6046..d9bb1b26d 100644 --- a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt +++ b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt @@ -2,16 +2,22 @@ package org.tasks.activities import android.content.Intent import android.os.Bundle +import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity -import com.google.android.material.datepicker.MaterialDatePicker -import com.google.android.material.timepicker.MaterialTimePicker +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import dagger.hilt.android.AndroidEntryPoint -import org.tasks.dialogs.MyDatePickerDialog.Companion.dateInputMode -import org.tasks.dialogs.MyDatePickerDialog.Companion.newDatePicker -import org.tasks.dialogs.MyTimePickerDialog -import org.tasks.dialogs.MyTimePickerDialog.Companion.newTimePicker -import org.tasks.dialogs.MyTimePickerDialog.Companion.timeInputMode +import org.tasks.compose.pickers.DatePickerDialog +import org.tasks.compose.pickers.TimePickerDialog +import org.tasks.extensions.Context.is24HourFormat import org.tasks.preferences.Preferences +import org.tasks.themes.TasksTheme +import org.tasks.themes.Theme import org.tasks.time.DateTime import org.tasks.time.DateTimeUtils2.currentTimeMillis import javax.inject.Inject @@ -19,89 +25,64 @@ import javax.inject.Inject @AndroidEntryPoint class DateAndTimePickerActivity : AppCompatActivity() { @Inject lateinit var preferences: Preferences + @Inject lateinit var theme: Theme - private var initial: DateTime? = null - private var dateSelected: DateTime? = null - + @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - initial = DateTime(intent.getLongExtra(EXTRA_TIMESTAMP, currentTimeMillis())) - dateSelected = - savedInstanceState - ?.getLong(EXTRA_DATE_SELECTED) - ?.takeIf { it > 0 } - ?.let { DateTime(it, DateTime.UTC) } - if (dateSelected != null) { - showTimePicker() - } else { - showDatePicker(initial ?: DateTime()) - } - } - - private fun showDatePicker(date: DateTime) { - dateSelected = null - val picker = - supportFragmentManager - .findFragmentByTag(FRAG_TAG_DATE_PICKER) as? MaterialDatePicker - ?: newDatePicker(date.millis, preferences.dateInputMode).apply { - show(supportFragmentManager, FRAG_TAG_DATE_PICKER) + setContent { + TasksTheme( + theme = theme.themeBase.index, + primary = theme.themeColor.primaryColor, + ) { + var dateSelected by rememberSaveable { + mutableLongStateOf(intent.getLongExtra(EXTRA_TIMESTAMP, currentTimeMillis())) + } + var showTimePicker by rememberSaveable { mutableStateOf(false) } + if (showTimePicker) { + TimePickerDialog( + millisOfDay = 0, + is24Hour = is24HourFormat, + initialDisplayMode = remember { preferences.timeDisplayMode }, + setDisplayMode = { preferences.timeDisplayMode = it }, + selected = { + val data = Intent() + data.putExtras(intent) + data.putExtra( + EXTRA_TIMESTAMP, + DateTime(dateSelected).withMillisOfDay(it).millis + ) + setResult(RESULT_OK, data) + finish() + }, + dismiss = { showTimePicker = false }, + ) + } else { + DatePickerDialog( + initialDate = remember { + intent.getLongExtra( + EXTRA_TIMESTAMP, + currentTimeMillis() + ) + }, + displayMode = remember { preferences.calendarDisplayMode }, + setDisplayMode = { + preferences.calendarDisplayMode = it + }, + selected = { + dateSelected = it + showTimePicker = true + }, + dismiss = { + finish() + }, + ) } - picker.apply { - addOnPositiveButtonClickListener { - dateSelected = DateTime(selection!!, DateTime.UTC) - showTimePicker() - } - addOnCancelListener { finish() } - addOnNegativeButtonClickListener { finish() } - } - } - - private fun showTimePicker() { - val fragmentManager = supportFragmentManager - val picker = - fragmentManager - .findFragmentByTag(FRAG_TAG_TIME_PICKER) as? MaterialTimePicker - ?: newTimePicker( - this, - DateTime(dateSelected!!.year, dateSelected!!.monthOfYear, dateSelected!!.dayOfMonth) - .withMillisOfDay(initial!!.millisOfDay).millis, - preferences.timeInputMode - ).apply { show(fragmentManager, FRAG_TAG_TIME_PICKER) } - picker.apply { - addOnCancelListener { - dateSelected?.let { showDatePicker(it) } ?: finish() - } - addOnNegativeButtonClickListener { - dateSelected?.let { showDatePicker(it) } ?: finish() - } - addOnPositiveButtonClickListener { - val data = Intent() - data.putExtras(intent) - data.putExtra( - MyTimePickerDialog.EXTRA_TIMESTAMP, - DateTime( - dateSelected!!.year, - dateSelected!!.monthOfYear, - dateSelected!!.dayOfMonth, - hour, - minute - ).millis - ) - setResult(RESULT_OK, data) - finish() } } } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - dateSelected?.let { outState.putLong(EXTRA_DATE_SELECTED, it.millis) } - } - companion object { const val EXTRA_TIMESTAMP = "extra_timestamp" - private const val FRAG_TAG_DATE_PICKER = "frag_tag_date_picker" - private const val FRAG_TAG_TIME_PICKER = "frag_tag_time_picker" - private const val EXTRA_DATE_SELECTED = "extra_date_selected" } } \ No newline at end of file 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 83e618438..572677cfc 100644 --- a/app/src/main/java/org/tasks/compose/pickers/CustomRecurrence.kt +++ b/app/src/main/java/org/tasks/compose/pickers/CustomRecurrence.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ArrowBack +import androidx.compose.material3.DisplayMode import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -76,6 +77,8 @@ fun CustomRecurrence( setOccurrences: (Int) -> Unit, toggleDay: (DayOfWeek) -> Unit, setMonthSelection: (Int) -> Unit, + calendarDisplayMode: DisplayMode, + setDisplayMode: (DisplayMode) -> Unit, ) { BackHandler { save() @@ -185,6 +188,8 @@ fun CustomRecurrence( setEndDate = setEndDate, setSelection = setSelectedEndType, setOccurrences = setOccurrences, + calendarDisplayMode = calendarDisplayMode, + setDisplayMode = setDisplayMode, ) } } @@ -319,11 +324,14 @@ private fun MonthlyPicker( } } +@OptIn(ExperimentalMaterial3Api::class) @Composable private fun EndsPicker( selection: Int, endDate: Long, endOccurrences: Int, + calendarDisplayMode: DisplayMode, + setDisplayMode: (DisplayMode) -> Unit, setOccurrences: (Int) -> Unit, setEndDate: (Long) -> Unit, setSelection: (Int) -> Unit, @@ -352,7 +360,12 @@ private fun EndsPicker( if (showDatePicker) { DatePickerDialog( initialDate = endDate, - selected = { setEndDate(it) }, + displayMode = calendarDisplayMode, + setDisplayMode = setDisplayMode, + selected = { + setEndDate(it) + showDatePicker = false + }, dismiss = { showDatePicker = false }, ) } @@ -414,6 +427,7 @@ private val Recur.Frequency.plural: Int else -> throw RuntimeException() } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -430,10 +444,13 @@ fun WeeklyPreview() { setOccurrences = {}, toggleDay = {}, setMonthSelection = {}, + calendarDisplayMode = DisplayMode.Picker, + setDisplayMode = {}, ) } } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -450,10 +467,13 @@ fun MonthlyPreview() { setOccurrences = {}, toggleDay = {}, setMonthSelection = {}, + calendarDisplayMode = DisplayMode.Picker, + setDisplayMode = {}, ) } } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -470,10 +490,13 @@ fun MinutelyPreview() { setOccurrences = {}, toggleDay = {}, setMonthSelection = {}, + calendarDisplayMode = DisplayMode.Picker, + setDisplayMode = {}, ) } } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -490,10 +513,13 @@ fun HourlyPreview() { setOccurrences = {}, toggleDay = {}, setMonthSelection = {}, + calendarDisplayMode = DisplayMode.Picker, + setDisplayMode = {}, ) } } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -510,10 +536,13 @@ fun DailyPreview() { setOccurrences = {}, toggleDay = {}, setMonthSelection = {}, + calendarDisplayMode = DisplayMode.Picker, + setDisplayMode = {}, ) } } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -530,6 +559,8 @@ fun YearlyPreview() { setOccurrences = {}, toggleDay = {}, setMonthSelection = {}, + calendarDisplayMode = DisplayMode.Picker, + setDisplayMode = {}, ) } } diff --git a/app/src/main/java/org/tasks/compose/pickers/DatePickerBottomSheet.kt b/app/src/main/java/org/tasks/compose/pickers/DatePickerBottomSheet.kt index 9f5ba874c..73edf04a1 100644 --- a/app/src/main/java/org/tasks/compose/pickers/DatePickerBottomSheet.kt +++ b/app/src/main/java/org/tasks/compose/pickers/DatePickerBottomSheet.kt @@ -13,10 +13,16 @@ import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.CalendarMonth +import androidx.compose.material.icons.outlined.Keyboard import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePickerDefaults import androidx.compose.material3.DatePickerState +import androidx.compose.material3.DisplayMode import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Surface @@ -36,6 +42,7 @@ fun DatePickerBottomSheet( showButtons: Boolean, dismiss: () -> Unit, accept: () -> Unit, + setDisplayMode: (DisplayMode) -> Unit, dateShortcuts: @Composable ColumnScope.() -> Unit, timeShortcuts: @Composable ColumnScope.() -> Unit, state: DatePickerState, @@ -88,6 +95,26 @@ fun DatePickerBottomSheet( horizontalArrangement = Arrangement.End, verticalAlignment = Alignment.CenterVertically, ) { + IconButton( + onClick = { + state.displayMode = if (state.displayMode == DisplayMode.Input) { + DisplayMode.Picker + } else { + DisplayMode.Input + } + setDisplayMode(state.displayMode) + }, + ) { + Icon( + imageVector = if (state.displayMode == DisplayMode.Input) { + Icons.Outlined.CalendarMonth + } else { + Icons.Outlined.Keyboard + }, + contentDescription = null + ) + } + Spacer(modifier = Modifier.weight(1f)) TextButton( onClick = { dismiss() } ) { 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 94e173a15..f9c35151c 100644 --- a/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt +++ b/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt @@ -2,11 +2,13 @@ package org.tasks.compose.pickers import android.content.res.Configuration import androidx.compose.material3.DatePicker +import androidx.compose.material3.DisplayMode import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberDatePickerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -15,11 +17,14 @@ 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 @OptIn(ExperimentalMaterial3Api::class) @Composable fun DatePickerDialog( initialDate: Long, + displayMode: DisplayMode, + setDisplayMode: (DisplayMode) -> Unit, selected: (Long) -> Unit, dismiss: () -> Unit, ) { @@ -34,31 +39,36 @@ fun DatePickerDialog( } val datePickerState = rememberDatePickerState( initialSelectedDateMillis = initialDateUTC, + initialDisplayMode = displayMode, ) + LaunchedEffect(datePickerState.displayMode) { + Timber.d("Set display mode to ${datePickerState.displayMode}") + setDisplayMode(datePickerState.displayMode) + } 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) } - dismiss() + TextButton( + onClick = { + datePickerState + .selectedDateMillis + ?.let { selected(it - DateTime(it).offset) } + } + ) { + Text(text = stringResource(id = R.string.ok)) } - ) { - Text(text = stringResource(id = R.string.ok)) } - } ) { DatePicker(state = datePickerState) } } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -66,8 +76,26 @@ fun DatePickerPreview() { TasksTheme { DatePickerDialog( initialDate = DateTime().plusDays(1).millis, + displayMode = DisplayMode.Picker, + setDisplayMode = {}, selected = {}, dismiss = {} ) } -} \ No newline at end of file +} + +@OptIn(ExperimentalMaterial3Api::class) +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun DatePickerPreviewInput() { + TasksTheme { + DatePickerDialog( + initialDate = DateTime().plusDays(1).millis, + displayMode = DisplayMode.Input, + setDisplayMode = {}, + selected = {}, + dismiss = {} + ) + } +} diff --git a/app/src/main/java/org/tasks/compose/pickers/TimePickerDialog.kt b/app/src/main/java/org/tasks/compose/pickers/TimePickerDialog.kt index 166cee1d5..c40f379f6 100644 --- a/app/src/main/java/org/tasks/compose/pickers/TimePickerDialog.kt +++ b/app/src/main/java/org/tasks/compose/pickers/TimePickerDialog.kt @@ -12,6 +12,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Keyboard import androidx.compose.material.icons.outlined.Schedule import androidx.compose.material3.BasicAlertDialog +import androidx.compose.material3.DisplayMode import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -42,7 +43,8 @@ import org.tasks.R fun TimePickerDialog( millisOfDay: Int, is24Hour: Boolean, - textInput: Boolean, + initialDisplayMode: DisplayMode, + setDisplayMode: (DisplayMode) -> Unit, selected: (Int) -> Unit, dismiss: () -> Unit, ) { @@ -51,7 +53,7 @@ fun TimePickerDialog( initialMinute = (millisOfDay / (60_000)) % 60, is24Hour = is24Hour ) - var showingTextInput by remember { mutableStateOf(textInput) } + var displayMode by remember { mutableStateOf(initialDisplayMode) } val layoutType = with(LocalConfiguration.current) { if (screenHeightDp < screenWidthDp) { TimePickerLayoutType.Horizontal @@ -80,7 +82,7 @@ fun TimePickerDialog( .weight(1f, fill = false), contentAlignment = Alignment.Center, ) { - if (showingTextInput) { + if (displayMode == DisplayMode.Input) { TimeInput( state = state, colors = TimePickerDefaults.colors( @@ -108,10 +110,17 @@ fun TimePickerDialog( verticalAlignment = Alignment.CenterVertically, ) { IconButton( - onClick = { showingTextInput = !showingTextInput }, + onClick = { + displayMode = if (displayMode == DisplayMode.Input) { + DisplayMode.Picker + } else { + DisplayMode.Input + } + setDisplayMode(displayMode) + }, ) { Icon( - imageVector = if (showingTextInput) { + imageVector = if (displayMode == DisplayMode.Input) { Icons.Outlined.Schedule } else { Icons.Outlined.Keyboard diff --git a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt index b6e517f8f..56ad13115 100644 --- a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt +++ b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt @@ -31,7 +31,6 @@ import org.tasks.data.createDueDate import org.tasks.data.entity.Task import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.toDateTime -import org.tasks.dialogs.MyTimePickerDialog.Companion.timeInputMode import org.tasks.extensions.Context.is24HourFormat import org.tasks.notifications.NotificationManager import org.tasks.themes.TasksTheme @@ -117,10 +116,13 @@ class DateTimePicker : BaseDateTimePicker() { savedInstanceState: Bundle?, ) = content { TasksTheme(theme = theme.themeBase.index) { - val state = rememberDatePickerState() + val state = rememberDatePickerState( + initialDisplayMode = remember { preferences.calendarDisplayMode }, + ) DatePickerBottomSheet( state = state, showButtons = !autoclose, + setDisplayMode = { preferences.calendarDisplayMode = it }, dismiss = { onDismissHandler?.onDismiss() ?: dismiss() }, accept = { sendSelected() }, dateShortcuts = { @@ -160,7 +162,8 @@ class DateTimePicker : BaseDateTimePicker() { TimePickerDialog( millisOfDay = time, is24Hour = remember { requireContext().is24HourFormat }, - textInput = remember { preferences.timeInputMode == 1 }, + initialDisplayMode = remember { preferences.timeDisplayMode }, + setDisplayMode = { preferences.timeDisplayMode = it }, selected = { returnSelectedTime(it + 1000) }, dismiss = { showTimePicker = false }, ) diff --git a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt b/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt deleted file mode 100644 index c7312b011..000000000 --- a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt +++ /dev/null @@ -1,81 +0,0 @@ -package org.tasks.dialogs - -import android.app.Activity.RESULT_CANCELED -import android.app.Activity.RESULT_OK -import android.content.Intent -import android.os.Bundle -import androidx.fragment.app.DialogFragment -import com.google.android.material.datepicker.MaterialDatePicker -import com.google.android.material.datepicker.MaterialDatePicker.INPUT_MODE_CALENDAR -import com.google.android.material.datepicker.MaterialDatePicker.INPUT_MODE_TEXT -import dagger.hilt.android.AndroidEntryPoint -import org.tasks.R -import org.tasks.preferences.Preferences -import org.tasks.time.DateTime -import org.tasks.time.DateTimeUtils2.currentTimeMillis -import org.tasks.time.startOfDay -import javax.inject.Inject - -@AndroidEntryPoint -class MyDatePickerDialog : DialogFragment() { - - @Inject lateinit var preferences: Preferences - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val fragment = - (childFragmentManager.findFragmentByTag(FRAG_TAG_DATE_PICKER) as? MaterialDatePicker) - ?: newDatePicker(initial, preferences.dateInputMode) - .let { - childFragmentManager - .beginTransaction() - .add(it, FRAG_TAG_DATE_PICKER) - .commit() - it - } - with(fragment) { - addOnPositiveButtonClickListener { - val dt = DateTime(it, DateTime.UTC) - selected(dt.year, dt.monthOfYear, dt.dayOfMonth) - } - addOnCancelListener { cancel() } - addOnNegativeButtonClickListener { cancel() } - } - } - - private val initial: Long - get() = arguments?.getLong(MyTimePickerDialog.EXTRA_TIMESTAMP) ?: currentTimeMillis().startOfDay() - - private fun selected(year: Int, month: Int, day: Int) { - targetFragment?.onActivityResult( - targetRequestCode, - RESULT_OK, - Intent().putExtra(EXTRA_TIMESTAMP, DateTime(year, month, day).millis) - ) - dismiss() - } - - private fun cancel() { - targetFragment?.onActivityResult(targetRequestCode, RESULT_CANCELED, null) - dismiss() - } - - companion object { - const val FRAG_TAG_DATE_PICKER = "frag_date_picker" - const val EXTRA_TIMESTAMP = "extra_timestamp" - - @JvmStatic - fun newDatePicker(initial: Long, inputMode: Int) = - MaterialDatePicker.Builder.datePicker() - // TODO: figure out hack for first day of week - .setInputMode(inputMode) - .setSelection(if (initial > 0) initial else currentTimeMillis()) - .build() - - val Preferences.dateInputMode: Int - get() = when (getIntegerFromString(R.string.p_picker_mode_date, 0)) { - 1 -> INPUT_MODE_TEXT - else -> INPUT_MODE_CALENDAR - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt b/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt index 388234ca3..715b52b1d 100644 --- a/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt +++ b/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt @@ -1,78 +1,65 @@ package org.tasks.dialogs import android.app.Activity -import android.app.Activity.RESULT_CANCELED -import android.content.Context import android.content.Intent import android.os.Bundle -import android.text.format.DateFormat.is24HourFormat +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.remember import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment -import com.google.android.material.timepicker.MaterialTimePicker -import com.google.android.material.timepicker.MaterialTimePicker.INPUT_MODE_CLOCK -import com.google.android.material.timepicker.MaterialTimePicker.INPUT_MODE_KEYBOARD -import com.google.android.material.timepicker.TimeFormat.CLOCK_12H -import com.google.android.material.timepicker.TimeFormat.CLOCK_24H +import androidx.fragment.compose.content import dagger.hilt.android.AndroidEntryPoint -import org.tasks.R -import org.tasks.date.DateTimeUtils.toDateTime +import org.tasks.compose.pickers.TimePickerDialog +import org.tasks.extensions.Context.is24HourFormat import org.tasks.preferences.Preferences -import org.tasks.time.DateTime +import org.tasks.themes.TasksTheme +import org.tasks.themes.Theme import org.tasks.time.DateTimeUtils2.currentTimeMillis +import org.tasks.time.millisOfDay import org.tasks.time.startOfDay +import org.tasks.time.withMillisOfDay import javax.inject.Inject @AndroidEntryPoint class MyTimePickerDialog : DialogFragment() { @Inject lateinit var preferences: Preferences + @Inject lateinit var theme: Theme - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val fragment = - (childFragmentManager.findFragmentByTag(FRAG_TAG_TIME_PICKER) as? MaterialTimePicker) - ?: newTimePicker(requireContext(), initial, preferences.timeInputMode) - .let { - childFragmentManager - .beginTransaction() - .add(it, FRAG_TAG_TIME_PICKER) - .commit() - it - } - with(fragment) { - addOnPositiveButtonClickListener { selected(hour, minute) } - addOnNegativeButtonClickListener { cancel() } - addOnCancelListener { cancel() } + @OptIn(ExperimentalMaterial3Api::class) + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ) = content { + TasksTheme( + theme = theme.themeBase.index, + primary = theme.themeColor.primaryColor, + ) { + TimePickerDialog( + millisOfDay = remember { initial.millisOfDay }, + is24Hour = remember { requireContext().is24HourFormat }, + initialDisplayMode = remember { preferences.timeDisplayMode }, + setDisplayMode = { preferences.timeDisplayMode = it }, + selected = { + targetFragment?.onActivityResult( + targetRequestCode, + Activity.RESULT_OK, + Intent().putExtra(EXTRA_TIMESTAMP, initial.withMillisOfDay(it)) + ) + dismiss() + }, + dismiss = { dismiss() }, + ) } } private val initial: Long get() = arguments?.getLong(EXTRA_TIMESTAMP) ?: currentTimeMillis().startOfDay() - private fun selected(hour: Int, minute: Int) { - targetFragment?.onActivityResult( - targetRequestCode, - Activity.RESULT_OK, - Intent().putExtra( - EXTRA_TIMESTAMP, - initial - .toDateTime() - .startOfDay() - .withHourOfDay(hour) - .withMinuteOfHour(minute) - .millis - ) - ) - dismiss() - } - - private fun cancel() { - targetFragment?.onActivityResult(targetRequestCode, RESULT_CANCELED, null) - dismiss() - } - companion object { - const val FRAG_TAG_TIME_PICKER = "frag_time_picker" const val EXTRA_TIMESTAMP = "extra_timestamp" fun newTimePicker( @@ -86,22 +73,5 @@ class MyTimePickerDialog : DialogFragment() { } setTargetFragment(target, rc) } - - @JvmStatic - fun newTimePicker(context: Context?, initial: Long, inputMode: Int) = - DateTime(initial).let { - MaterialTimePicker.Builder() - .setInputMode(inputMode) - .setTimeFormat(if (is24HourFormat(context)) CLOCK_24H else CLOCK_12H) - .setHour(it.hourOfDay) - .setMinute(it.minuteOfHour) - .build() - } - - val Preferences.timeInputMode: Int - get() = when (getIntegerFromString(R.string.p_picker_mode_time, 0)) { - 1 -> INPUT_MODE_KEYBOARD - else -> INPUT_MODE_CLOCK - } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/tasks/dialogs/StartDatePicker.kt b/app/src/main/java/org/tasks/dialogs/StartDatePicker.kt index 2be16d895..31cbfd8f7 100644 --- a/app/src/main/java/org/tasks/dialogs/StartDatePicker.kt +++ b/app/src/main/java/org/tasks/dialogs/StartDatePicker.kt @@ -26,7 +26,6 @@ import org.tasks.compose.pickers.TimePickerDialog import org.tasks.compose.pickers.TimeShortcuts import org.tasks.data.entity.Task import org.tasks.date.DateTimeUtils.newDateTime -import org.tasks.dialogs.MyTimePickerDialog.Companion.timeInputMode import org.tasks.extensions.Context.is24HourFormat import org.tasks.notifications.NotificationManager import org.tasks.themes.TasksTheme @@ -84,10 +83,13 @@ class StartDatePicker : BaseDateTimePicker() { savedInstanceState: Bundle? ) = content { TasksTheme(theme = theme.themeBase.index) { - val state = rememberDatePickerState() + val state = rememberDatePickerState( + initialDisplayMode = remember { preferences.calendarDisplayMode }, + ) DatePickerBottomSheet( state = state, showButtons = !autoclose, + setDisplayMode = { preferences.calendarDisplayMode = it }, dismiss = { onDismissHandler?.onDismiss() ?: dismiss() }, accept = { sendSelected() }, dateShortcuts = { @@ -112,7 +114,8 @@ class StartDatePicker : BaseDateTimePicker() { TimePickerDialog( millisOfDay = time, is24Hour = remember { requireContext().is24HourFormat }, - textInput = remember { preferences.timeInputMode == 1 }, + initialDisplayMode = remember { preferences.timeDisplayMode }, + setDisplayMode = { preferences.timeDisplayMode = it }, selected = { returnSelectedTime(it + 1000) }, dismiss = { showTimePicker = false } ) diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt index dea7f8310..c4c8350d1 100644 --- a/app/src/main/java/org/tasks/preferences/Preferences.kt +++ b/app/src/main/java/org/tasks/preferences/Preferences.kt @@ -9,6 +9,8 @@ import android.content.pm.PackageManager import android.media.RingtoneManager import android.net.Uri import android.os.Binder +import androidx.compose.material3.DisplayMode +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.core.app.NotificationCompat import androidx.core.net.toUri import androidx.documentfile.provider.DocumentFile @@ -588,6 +590,22 @@ class Preferences @JvmOverloads constructor( val multilineTitle: Boolean get() = getBoolean(R.string.p_multiline_title, false) + @OptIn(ExperimentalMaterial3Api::class) + var calendarDisplayMode: DisplayMode + get() = if (getIntegerFromString(R.string.p_picker_mode_date, 0) == 1) + DisplayMode.Input else DisplayMode.Picker + set(mode) { + setStringFromInteger(R.string.p_picker_mode_date, if (mode == DisplayMode.Input) 1 else 0) + } + + @OptIn(ExperimentalMaterial3Api::class) + var timeDisplayMode: DisplayMode + get() = if (getIntegerFromString(R.string.p_picker_mode_time, 0) == 1) + DisplayMode.Input else DisplayMode.Picker + set(mode) { + setStringFromInteger(R.string.p_picker_mode_time, if (mode == DisplayMode.Input) 1 else 0) + } + companion object { private fun getSharedPreferencesName(context: Context): String = context.packageName + "_preferences" diff --git a/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt b/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt index 0a2f63e44..a3c6e953c 100644 --- a/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt +++ b/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt @@ -13,7 +13,6 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch import org.tasks.activities.DateAndTimePickerActivity -import org.tasks.dialogs.MyTimePickerDialog import org.tasks.time.DateTime import javax.inject.Inject @@ -81,7 +80,7 @@ class SnoozeActivity : AppCompatActivity(), SnoozeCallback, DialogInterface.OnCa override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == REQUEST_DATE_TIME) { if (resultCode == Activity.RESULT_OK && data != null) { - val timestamp = data.getLongExtra(MyTimePickerDialog.EXTRA_TIMESTAMP, 0L) + val timestamp = data.getLongExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, 0L) snoozeForTime(DateTime(timestamp)) } else { finish() diff --git a/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt b/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt index d188977b9..55e2c1022 100644 --- a/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt +++ b/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt @@ -5,10 +5,13 @@ import android.content.Intent import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.viewModels +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.remember import androidx.fragment.app.FragmentActivity import androidx.lifecycle.compose.collectAsStateWithLifecycle import dagger.hilt.android.AndroidEntryPoint import org.tasks.compose.pickers.CustomRecurrence +import org.tasks.preferences.Preferences import org.tasks.themes.TasksTheme import org.tasks.themes.Theme import javax.inject.Inject @@ -16,9 +19,11 @@ import javax.inject.Inject @AndroidEntryPoint class CustomRecurrenceActivity : FragmentActivity() { @Inject lateinit var theme: Theme + @Inject lateinit var preferences: Preferences val viewModel: CustomRecurrenceViewModel by viewModels() + @OptIn(ExperimentalMaterial3Api::class) override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) setContent { @@ -37,6 +42,8 @@ class CustomRecurrenceActivity : FragmentActivity() { setOccurrences = { viewModel.setOccurrences(it) }, toggleDay = { viewModel.toggleDay(it) }, setMonthSelection = { viewModel.setMonthSelection(it) }, + calendarDisplayMode = remember { preferences.calendarDisplayMode }, + setDisplayMode = { preferences.calendarDisplayMode = it } ) } } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index af1351894..f5ef8bf5a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -282,8 +282,6 @@ أنشأ تصفيةً جديدة بتاريخ الإنشاء تبدأ %s - الساعة - التقويم أرسل دعوة البريد اﻹلكتروني أعط كلمة سرّك اسمًا (اختياري) @@ -477,9 +475,6 @@ افتح جميع الثيمات والألوان والرموز المزيد من التخصيص يحصل المشتركون الجدد على نسخة تجريبية مجانية مدتها 7 أيام. تلغى في أي وقت - نص - وضع منتقي الوقت - وضع منتقي التاريخ %1$s لا يملك حق الوصول ل%2$s غير مشمول في اشتراكات \"ضع سعرك\" استخدم بيانات الاعتماد هذه لتكوين تطبيق تابع لجهة خارجية. يمنحون حق الوصول الكامل إلى حساب Tasks.org الخاص بك ، ولا تكتبها بالاسفل أو تشاركها مع أي شخص! diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index 4f203f498..ae5d71afc 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -426,10 +426,7 @@ Използвайте режима за ръчно сортиране на Astrid за „Моите задачи“, „Днес“ и етикетите. Този режим на сортиране ще бъде заменен с „Моя подредба“ в бъдещо издание Ръчно сортиране на Astrid Моя подредба - Часовник Покана - Календар - Текст Markdown Tasks е софтуер с отворен код, лицензиран под GNU General Public License v3.0 Тази възможност изисква абонамент @@ -546,7 +543,6 @@ Произволно на всеки %s Пренасрочване Автоматично затваряне след избор на дата и час - Режим на избор на час Допълнителни настройки Затваряне след избор от списъка със задачи Час по избор @@ -589,7 +585,6 @@ Поканата е отхвърлена Поканата очаква орговор Поканата е недейсвителна - Режим избор на дата Пароли на приложениятя Текущ абонамент: %s $%s/година diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4b42e314f..7f3c64910 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -620,11 +620,6 @@ Odemknout všechny vzhledy, barvy a ikony Další přizpůsobení Noví předplatitelé dostanou 7 dnů na vyzkoušení zdarma. Předplatné je možné kdykoli zrušit - Text - Hodiny - Kalendář - Režim výběru času - Režim výběru data Neplatné pozvání Pozvání čeká na odpověď Pozvání odmítnuto diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 104ecfe7a..b56da972e 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -561,11 +561,6 @@ Låse alle temaer, farver og ikoner op Mere tilpasning Nye abonnenter får en gratis prøveperiode på 7 dage. Du kan til enhver tid annullere - Tekst - Ur - kalender - Time picker-tilstand - Tilstand for datovælger Invitere ugyldig Invitation afventer svar Invitation afvist diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e32c5eb53..13877be68 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -604,11 +604,6 @@ Schalte alle Themen, Farben und Symbole frei Mehr Anpassungsmöglichkeiten Neue Abonnenten erhalten eine 7-tägige kostenlose Testversion. Jederzeit abbrechen - Text - Uhr - Kalender - Zeitauswahlmodus - Datumsauswahlmodus Nächsten Samstag Nächsten Freitag Nächsten Donnerstag diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index d4d0d4a77..b30afe468 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -366,7 +366,6 @@ Bedaŭrinde ni spertis problemon dum komuniki kun serviloj de Google. Bonvolu repeni poste. Daŭraj sciigoj ne povas esti forigitaj Nova tasko - Teksto %s post komenco Por ebligi manan ordigon de Astrid por \'Miaj Taskoj\', \'Hodiaŭ\', kaj etikedoj. Ĉi tiu maniero de ordigi estos anstataŭigita per \'Mia ordigo\' per estonta ĝisdatigo Defaŭltaj lokaj memorigiloj @@ -415,7 +414,6 @@ Ensaluti per Google Ensaluti per GitHub Nevalida invito - Horloĝo Konsenti Ne nun Ordigo @@ -539,7 +537,6 @@ Tasks.org konto Forigi uzanton? Invito atendas respondon - Kalendaro Novaj abonantoj ricevas provperiodon de 7 tagoj. Iam ajn nuligi ĝin Pli da adapto Nekonata @@ -675,8 +672,6 @@ Via abono finiĝis. Abonu tuj por reaktivigi servon. Sinkronigi kun Tasks.org kaj kunlabori kun aliaj uzantoj Uzu ĉi tiujn identigilojn por agordi aplikaĵon de ekstera liveranto. Ili permesas tutan atingorajton al via Tasks.org konto. Ne skribi ilin aŭ konigi ilin al iu ajn! - Datelektila reĝimo - Tempelektila reĝimo Malŝlosi ĉiujn etosojn, kolorojn, kaj piktogramojn Aliri per labortablo Ne inkluzivite per \'Elekti propran prezon\' abonoj diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index eb231f657..004b06565 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -617,11 +617,6 @@ Invitar Correo electrónico Compartir lista - Texto - Reloj - Calendario - Modo de selección del tiempo - Modo de selección de fecha Más opciones Su suscripción apoya el desarrollo continuo Sincronización con clientes de terceros como Outlook y Apple Reminders diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 986a117f0..be7707366 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -269,7 +269,6 @@ Liitu kanaliga #tasks Libera Chat\'is Üle keskmise Loodud: %s - Kalender Salvesta audiomärge Nõustun Vaikeasukoht @@ -380,7 +379,6 @@ Algusaeg %s Sponsor Alamülesannetega - Tekst Ülesanne lõpetatud Grupeerimine Kasvavalt @@ -397,7 +395,6 @@ Liitu grupiga r/tasks Tugi Tasks.org konto - Kell Vigane kutse Lõpetatud Luba meeldetuletused @@ -722,8 +719,6 @@ Nihuta lõpetatud ülesanded alla Sa võid seda vaadet kohendada väljade ümbertõstmise ja eemaldamise teel Taga õigeaegsed teavitused - Kuupäevavalija vaade - Kellaajavalija vaade Asukoht esiplaanil Sinu tellimus aitab toetada arendustöö jätkamist Asukoht tagaplaanil diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 89f4ec764..41aa426c1 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -608,11 +608,6 @@ Desblokeatu gai, kolore eta ikono guztiak Pertsonalizazio gehiago Harpidedun berriek 7 eguneko doako proba jasotzen dute. Ezeztatu edozein unetan - Testua - Erlojua - Egutegia - Denbora hautatzeko modua - Data hautatzeko modua Hurrengo larunbata Hurrengo ostirala Hurrengo osteguna diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 8032297f6..f7056a13a 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -508,11 +508,6 @@ Avaa kaikki teemat, värit ja kuvakkeet Lisää räätälöintiä Uudet tilaajat saavat 7 päivän ilmaisen kokeilujakson. Peruuta milloin tahansa - Teksti - Kello - kalenteri - Ajanottotila - Päivämäärän poimintatila Kutsu on mitätön Kutsu odottaa vastausta Kutsu hylätty diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 08a631860..c9ee9e9f2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -617,11 +617,6 @@ Inviter Courriel Partager la liste - Texte - Horloge - Calendrier - Mode sélecteur de temps - Mode sélecteur de date Plus d’options Votre abonnement soutient le développement continu Synchronisez avec des clients tiers comme « Outlook » et « Apple Reminders » diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index dd376fac5..ef0b86a4f 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -369,7 +369,6 @@ $%s/ano Mover %s a Tasks.org Lista de participantes - Modo de selección de data Descoñecido Outro Máis opcións @@ -529,10 +528,6 @@ Convidar Convite rexeitado Convite en agarda - Modo de selección de hora - Calendario - Reloxo - Texto Sincronizar con clientes de terceiros como Outlook e Appler Reminders Finalizada Mover as tarefas finalizadas ao fondo diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 4db434458..0dbe9df8a 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -167,11 +167,6 @@ Otključaj sve teme, boje i ikone Više prilagođavanja Novi pretplatnici dobivaju 7-dnevno besplatno probno razdoblje. Otkaži bilo kada - Tekst - Sat - Kalendar - Modus birača vremena - Modus birača datuma Poziv nevaljan Poziv čeka odgovor Poziv odbijen diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 10a41550e..0986dc7c9 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -595,11 +595,6 @@ Meghívás E-mail Lista megosztása - Szöveg - Óra - Naptár - Időválasztó mód - Dátumválasztó mód Több opció Az előfizetéseddel a folyamatos fejlesztést támogatod Szinkronizálás harmadik fél megoldásaival, mint az Outlook vagy az Apple Emlékeztetők diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 62970b895..ee276cbb9 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -589,11 +589,6 @@ Buka semua tema, warna, dan ikon Lebih banyak kostumisasi Pelanggan baru menerima percobaan aplikasi gratis selama 7-hari. Batalkan kapan saja - Teks - Jam - Kalender - Mode pengambil waktu - Mode pengambil tanggal Saya telah menghabiskan ribuan jam bekerja pada Tasks, dan saya mempublikasikan semua kode sumber online secara gratis. Untuk mendukung pekerjaan saya, beberapa fitur memerlukan berlangganan Hi. Nama saya Alex. Saya adalah pengembang independen dibelakang aplikasi Tasks Sabtu Depan diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e66efeb36..81e979e07 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -594,11 +594,6 @@ Inizia… Password delle app Mostra titolo - Modalità selettore ora - Modalità selettore data - Calendario - Orologio - Testuale Condividi lista %1$s non avrà più accesso a %2$s Vuoi rimuovere l\'utente\? diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 7acd6b1d7..89b550401 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -615,11 +615,6 @@ ביטול נעילה של כל ערכות הנושא, הצבעים והסמלים התאמה אישית נוספת מנויים חדשים מקבלים תקופת ניסיון ללא תשלום למשך 7 ימים. ביטול בכל עת - טקסט - שָׁעוֹן - לוח שנה - מצב בורר זמן - מצב בוחר תאריכים הזמנה לא חוקית הזמן תגובה ממתינה ההזמנה נדחתה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d341ca448..a29aa110f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -484,7 +484,6 @@ 認証が必要です リストを共有 マークダウン - 日付選択の方法 ウィジェット リスト タスクを移行する @@ -571,8 +570,6 @@ Tasks.org のアカウントが必要です 「価格はあなた次第」でのサブスクリプションには含まれていません リストメンバー - 文字 - 時間選択の方法 %1$s は %2$s にアクセスできなくなります 応答待ちの招待 リマインダーを有効にする @@ -616,8 +613,6 @@ トラブルシューティング タスクやカレンダーをサードパーティ製のデスクトップアプリやモバイルアプリと同期します。詳しくはここをタップ サポート - 時計 - カレンダー Tasks データベースへの完全なアクセス 日時選択画面を自動で閉じる アイコンのみ diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 6236d37ec..022af3efc 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -567,12 +567,7 @@ 모든 테마, 색상, 아이콘 사용 더 다양한 맞춤설정 새 구독자는 7일간 무료 체험이 가능합니다. 언제라도 취소할 수 있습니다 - 글자 타사 데스크탑 및 모바일 앱으로 할일과 달력을 동기화합니다. 자세한 정보는 여기를 탭하세요 - 시계 - 달력 - 시간 선택상자 모드 - 날짜 선택상자 모드 유효하지 않은 초대 응답 대기중인 초대 초대 거절 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 5961de45a..5026ecd29 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -488,9 +488,6 @@ Kvietimas atmestas Kvietimas laukia atsakymo Kvietimas negalioja - Kalendorius - Laikrodis - Tekstas Naujiems prenumeratoriams suteikiamas 7 dienų nemokamas bandomasis laikotarpis. Atšaukite bet kuriuo metu Daugiau tinkinimo Sinchronizuokite su Tasks.org ir bendradarbiaukite su kitais naudotojais @@ -597,8 +594,6 @@ Automatinės atsarginės kopijos Pilna prieiga prie Tasks duomenų bazės Iš naujo nustatyti rūšiavimo tvarką - Laiko rinkiklio režimas - Datos rinkiklio režimas Vietiniai sąrašai Atidaryti paskutinį peržiūrėtą sąrašą Paleidžiant diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 277444983..6500540ee 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -605,11 +605,6 @@ Lås opp alle temaer, farger og ikoner Mer tilpasning Nye abonnenter får en 7-dagers gratis prøveperiode. Avbryt når som helst - Tekst - klokke - Kalender - Modus for tidsvelger - Datovelgermodus Invitasjon ugyldig Inviter venter på svar Invitasjon avslått diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 94b3f2059..45daf4ca5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -595,11 +595,6 @@ Uitnodiging wacht op reactie Uitnodiging afgewezen E-mail - Tekst - Klok - Kalender - Tijdkiezer-modus - Datumkiezer-modus Meer maatwerk Alle thema\'s, kleuren en pictogrammen ontgrendelen Meer opties diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index c9eb4baeb..1fa2e2c75 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -109,8 +109,6 @@ ଖୋଲା ଉତ୍ସ ନିମନ୍ତ୍ରଣ ପଠାଇବା ନିମନ୍ତ୍ରଣ ଅମାନ୍ୟ ଅଟେ - କ୍ୟାଲେଣ୍ଡର - ଘଡ଼ି ଆଖ୍ୟା ଦେଖାଅ ମୋର କ୍ରମ ଆରମ୍ଭ ତାରିଖ ଅନୁଯାୟୀ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 8f3e29ccb..3a1f76afa 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -614,11 +614,6 @@ Odblokuj wszystkie motywy, kolory oraz ikony Więcej możliwości konfiguracji Nowi subskrybenci otrzymują 7-dniowy, darmowy okres próbny. Można anulować w dowolnym momencie - Tekst - Zegar - Kalendarz - Tryb Time picker - Tryb selektora dat Zaproszenie nieważne Zaproszenie oczekuje na odpowiedź Zaproszenie odrzucone diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9b53c0515..3e5ae873b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -564,11 +564,6 @@ Desbloqueie todos os temas, cores e ícones Mais customização Novos assinantes recebem 7 dias de teste grátis. Cancele a qualquer momento - Texto - Relógio - Calendário - Modo de escolher hora - Modo de escolher data Convite inválido Convite aguardando resposta Convite cancelado diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 6c9553454..3115027ad 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -539,11 +539,6 @@ Desbloqueie todos os temas, cores e ícones Mais personalizações Os novos subscritores recebem 7 dias de teste grátis. Cancele a qualquer momento - Texto - Relógio - Calendário - Modo de escolher hora - Modo de escolher data Convite inválido Convite a aguardar resposta Convite cancelado diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1ad5bb9d0..328ded5da 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -7,7 +7,6 @@ SAU Filtre E-mail - Calendar Compact Estim. %s Calendar @@ -23,10 +22,6 @@ Deblochează toate temele, culorile și pictogramele Mai multă personalizare Noii abonați beneficiază de o perioadă de încercare gratuită de 7 zile. Anulare în orice moment - Text - Ceas - Modul de selectare a timpului - Modul de selectare a datei Invitație nevalabilă Invitație în așteptarea răspunsului Invitație refuzată diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2f6c4e83d..16eb7d136 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -613,11 +613,6 @@ Разблокировать все темы, цвета и иконки Больше настроек Новые подписчики получают 7-дневный бесплатный пробный период. Отмена возможна в любое время - Текст - Часы - Календарь - Режим выбора времени - Режим выбора даты Приглашение недействительно Приглашение в ожидании ответа Приглашение отклонено diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index b6664ecee..45410413f 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,7 +1,6 @@ අනුග්‍රාහකයා - දින තේරීම් ආකාරය ආරාධනය අවලංගුයි ලැයිස්තුව බෙදාගන්න දෝෂ සෙවීම @@ -65,9 +64,6 @@ සියලුම තේමාවන්, වර්ණ සහ අයිකන අගුළු ඇරීම තවත් අභිරුචිකරණය නව ග්‍රාහකයින්ට දින 7 ක නොමිලේ අත්හදා බැලීම් කාලයක් ලැබේ. ඕනෑම වේලාවක අවලංගු කරන්න - පෙළ - ඔරලෝසුව - දින දර්ශනය ආරාධනය ප්‍රතික්ෂේප විය ආරාධනා කරන්න විද්යුත් තැපෑල @@ -610,7 +606,6 @@ %1$s, %2$s පුනරාවර්තනය වේ මාතෘකාව සහ විස්තරය තුළ ලකුණු කිරීම සක්‍රිය කරන්න ලකුණු කිරීම - කාලය තෝරාගැනීම් මාදිලිය ප්‍රතිචාරයක් බලාපොරොත්තුවෙන් ඇති ආරාධන සාමාජික ලැයිස්තුව සංක්‍රමණික කාර්යයන් diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 798894efc..5cc2fbe03 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -705,7 +705,6 @@ Heslá aplikácie Synchronizujte svoje úlohy a kalendáre s desktopovými a mobilnými aplikáciami tretích strán. Pre viac informácii kliknite sem Neplatná pozvánka - Hodiny Neznámy Súhlasím Triedenie @@ -725,11 +724,7 @@ Pozvánka čaká na odpoveď Pozvánka bola odmietnutá Synchronizujte s Tasks.org a spolupracujte s ostatnými používateľmi - Text Odobrať používateľa? - Režim výberu dátumu - Režim výberu času - Kalendár Noví predplatitelia dostanú 7 dní na bezplatné otestovanie. Predplatné je možné kedykoľvek zrušiť Ďalšie prispôsobenie Odomknúť všetky motívy, farby a ikony diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 793e37a2d..b0a130f2e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -443,11 +443,6 @@ Lås upp alla teman, färger och ikoner Mer anpassning Nya prenumeranter får en gratis provperiod på 7 dagar. Avbryt när som helst - Text - Klocka - Kalender - Tidsväljarläge - Datumväljarläge Inbjudan ogiltig Inbjudan väntar på svar Inbjudan avfärdad diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 36063d748..a740f6cf8 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -40,11 +40,6 @@ ตัวเลือกเพิ่มเติม การเข้าถึงเดสก์ท็อป ซิงค์กับ Tasks.org และทํางานร่วมกับผู้ใช้รายอื่น - ข้อความ - นาฬิกา - ปฏิทิน - โหมดตัวใช้เลือกเวลา - โหมดตัวใช้เลือกวันที่ การเชิญไม่ถูกต้อง คําเชิญที่กําลังรอการตอบกลับ ปฏิเสธคำเชิญ diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 66f734c2c..71be44e03 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -608,11 +608,6 @@ Tasks.org ile eşzamanla ve diğer kullanıcılarla ortak çalış Daha çok özelleştirme Yeni aboneler 7 günlük sınama süresi kazanır. İstendiğinde iptal edilir - Metin - Saat - Takvim - Zaman seçici kipi - Tarih seçici kipi Sonraki Cma Sonraki Cts Sonraki Per diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8437e50f0..9e9585dbc 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -615,11 +615,6 @@ Запросити Е-пошта Поділитися списком - Текст - Годинник - Календар - Режим вибору часу - Режим вибору дати Додаткові параметри Ваша передплата підтримує постійний розвиток Синхронізація зі сторонніми клієнтами, наприклад Outlook і Apple Нагадування diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index ce3acb93c..67194a376 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -66,11 +66,6 @@ Mở khoá tất cả chủ đề, màu sắc, và biểu tượng Nhiều tuỳ biến hơn Những người đăng ký mới sẽ nhận khoảng thời gian dùng thử 7 ngày miễn phí. Huỷ vào bất kỳ lúc nào - Văn bản - Đồng hồ - Lịch - Chế độ trình chọn thời gian - Chế độ trình chọn ngày Lời mời không hợp lệ Lời mời Lời mời đang chờ phản hồi diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d480ec48e..ae2080c0b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -589,11 +589,6 @@ 邀请 电子邮件 分享列表 - 日历 - 文本 - 时钟 - 时间选择器模式 - 日期选择器模式 更多选项 你的订阅支持持续开发 与 Outlook 和 Apple Reminders 等第三方客户端同步 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ca696745d..1bb99038a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -568,7 +568,6 @@ 將已完成的任務移至底部 每月於 %1$s %2$s Tasks 收集位置資料以啟用基於位置的提醒,即使應用程式關閉或未使用。 - 時鐘 解鎖所有主題、顏色和圖示 返回 位置設定 @@ -576,7 +575,6 @@ Dashclock 擴充 選擇任務編輯時自動關閉 %1$s 將不再存取 %2$s 的資料庫 - 時間選取器模式 任務已完成 建立於 %s 邀請已拒絕 @@ -589,7 +587,6 @@ 高於平均 關閉 自訂通知 - 行事曆 有提醒 沒有符合資格的 Google Play 訂閱 加入 r/tasks @@ -640,8 +637,6 @@ 新訂閱者享有 7 天免費試用。隨時取消 清單成員 邀請無效 - 日期選擇模式 - 文字 與 Tasks.org 同步,並與其他用戶協作 更多自訂 本機清單 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 5ee37b74b..2b37df7b3 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -127,16 +127,6 @@ 2 - - @string/picker_mode_calendar - @string/picker_mode_text - - - - @string/picker_mode_clock - @string/picker_mode_text - - 0 1 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0651b026e..644e86c66 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -679,11 +679,6 @@ File %1$s contained %2$s.\n\n Invite declined Invite awaiting response Invite invalid - Date picker mode - Time picker mode - Calendar - Clock - Text New subscribers receive a 7-day free trial. Cancel at any time More customization Unlock all themes, colors, and icons diff --git a/app/src/main/res/xml/preferences_date_and_time.xml b/app/src/main/res/xml/preferences_date_and_time.xml index c089ee8d2..4d5137512 100644 --- a/app/src/main/res/xml/preferences_date_and_time.xml +++ b/app/src/main/res/xml/preferences_date_and_time.xml @@ -8,23 +8,6 @@ android:key="@string/p_always_display_full_date" android:title="@string/always_display_full_date" /> - - - -