New recurrence activity

pull/2421/head
Alex Baker 10 months ago
parent 5308404ed6
commit dff522437d

@ -663,7 +663,11 @@
android:name="org.tasks.dialogs.SortSettingsActivity"
android:theme="@style/TranslucentWindow" />
<!-- launcher icons -->
<activity
android:name="org.tasks.repeats.CustomRecurrenceActivity"
android:theme="@style/Tasks" />
<!-- launcher icons -->
<activity-alias
android:enabled="true"

@ -0,0 +1,31 @@
package org.tasks.compose
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun border() = MaterialTheme.colors.onSurface.copy(alpha = .5f)
@Composable
fun OutlinedBox(
modifier: Modifier = Modifier,
content: @Composable BoxScope.() -> Unit,
) {
Box(
modifier = modifier
.height(45.dp)
.border(1.dp, color = border(), RoundedCornerShape(4.dp))
.padding(start = 8.dp, end = 8.dp),
contentAlignment = Alignment.Center,
content = content,
)
}

@ -0,0 +1,65 @@
package org.tasks.compose
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowDropDown
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
@Composable
fun OutlinedSpinner(
text: String,
options: List<String>,
onSelected: (Int) -> Unit,
) {
var expanded by remember { mutableStateOf(false) }
OutlinedBox(
modifier = Modifier.clickable { expanded = !expanded }
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(start = 8.dp),
) {
Text(text = text)
Icon(
imageVector = Icons.Outlined.ArrowDropDown,
contentDescription = null,
tint = MaterialTheme.colors.onSurface,
)
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
offset = DpOffset(-8.dp, 0.dp),
) {
options.forEachIndexed { index, item ->
DropdownMenuItem(
onClick = {
expanded = false
onSelected(index)
},
content = {
Text(
text = item,
style = MaterialTheme.typography.body2,
)
},
)
}
}
}
}

@ -0,0 +1,91 @@
package org.tasks.compose
import androidx.compose.foundation.border
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.MaterialTheme
import androidx.compose.material.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.core.os.ConfigurationCompat
import org.tasks.extensions.formatNumber
import org.tasks.extensions.parseInteger
import java.util.Locale
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun OutlinedNumberInput(
number: Int,
onTextChanged: (Int) -> Unit,
onFocus: () -> Unit = {},
) {
val interactionSource = remember { MutableInteractionSource() }
val context = LocalContext.current
val locale = remember {
ConfigurationCompat
.getLocales(context.resources.configuration)
.get(0)
?: Locale.getDefault()
}
val numberString = remember(number) {
number.takeIf { it > 0 }?.let { locale.formatNumber(it) } ?: ""
}
BasicTextField(
value = numberString,
onValueChange = {
val newValue = locale
.parseInteger(it)
?: 0
onTextChanged(newValue)
},
textStyle = MaterialTheme.typography.body1.copy(
color = MaterialTheme.colors.onSurface,
textAlign = TextAlign.Center,
),
modifier = Modifier
.border(
width = 1.dp,
color = border(),
shape = RoundedCornerShape(4.dp),
)
.onFocusChanged {
if (it.hasFocus) {
onFocus()
}
}
.width(60.dp)
.height(45.dp)
.fillMaxWidth(),
cursorBrush = SolidColor(MaterialTheme.colors.onBackground),
interactionSource = interactionSource,
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
) {
TextFieldDefaults.TextFieldDecorationBox(
value = number.toString(),
innerTextField = it,
singleLine = true,
enabled = true,
visualTransformation = VisualTransformation.None,
interactionSource = interactionSource,
// keep horizontal paddings but change the vertical
contentPadding = TextFieldDefaults.textFieldWithoutLabelPadding(
top = 0.dp, bottom = 0.dp
)
)
}
}

@ -0,0 +1,526 @@
package org.tasks.compose.pickers
import android.content.res.Configuration
import android.os.LocaleList
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.RadioButton
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowBack
import androidx.compose.material3.Divider
import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.os.ConfigurationCompat
import com.google.android.material.composethemeadapter.MdcTheme
import com.todoroo.andlib.utility.DateUtilities
import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.WeekDay
import org.tasks.R
import org.tasks.compose.OutlinedBox
import org.tasks.compose.OutlinedNumberInput
import org.tasks.compose.OutlinedSpinner
import org.tasks.compose.border
import org.tasks.repeats.CustomRecurrenceViewModel
import java.time.DayOfWeek
import java.time.format.FormatStyle
import java.time.format.TextStyle
import java.util.Locale
@Composable
fun CustomRecurrence(
state: CustomRecurrenceViewModel.ViewState,
save: () -> Unit,
discard: () -> Unit,
setInterval: (Int) -> Unit,
setSelectedFrequency: (Recur.Frequency) -> Unit,
setEndDate: (Long) -> Unit,
setSelectedEndType: (Int) -> Unit,
setOccurrences: (Int) -> Unit,
toggleDay: (DayOfWeek) -> Unit,
setMonthSelection: (Int) -> Unit,
) {
BackHandler {
save()
}
Scaffold(
topBar = {
TopAppBar(
title = {
Text(
text = stringResource(id = R.string.repeats_custom_recurrence),
)
},
navigationIcon = {
IconButton(onClick = save) {
Icon(
imageVector = Icons.Outlined.ArrowBack,
contentDescription = stringResource(id = R.string.save),
tint = MaterialTheme.colors.onSurface,
)
}
},
actions = {
TextButton(onClick = discard) {
Text(
text = stringResource(id = R.string.cancel),
style = MaterialTheme.typography.body1.copy(
fontFeatureSettings = "c2sc, smcp"
)
)
}
},
backgroundColor = MaterialTheme.colors.surface,
contentColor = MaterialTheme.colors.onSurface,
)
}
) { padding ->
Surface(
color = MaterialTheme.colors.surface,
modifier = Modifier
.fillMaxSize()
.padding(padding),
) {
Column {
Spacer(modifier = Modifier.height(16.dp))
Header(R.string.repeats_every)
Spacer(modifier = Modifier.height(16.dp))
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier.padding(horizontal = 16.dp),
) {
OutlinedNumberInput(
number = state.interval,
onTextChanged = setInterval,
)
val context = LocalContext.current
val options by remember(state.interval, state.frequency) {
derivedStateOf {
state.frequencyOptions.map {
context.resources.getQuantityString(
it.plural,
state.interval,
state.interval,
)
}
}
}
OutlinedSpinner(
text = pluralStringResource(
id = state.frequency.plural,
count = state.interval
),
options = options,
onSelected = { setSelectedFrequency(state.frequencyOptions[it]) },
)
}
if (state.frequency == Recur.Frequency.WEEKLY) {
WeekdayPicker(
daysOfWeek = state.daysOfWeek,
selected = state.selectedDays,
toggle = toggleDay,
)
} else if (state.frequency == Recur.Frequency.MONTHLY) {
MonthlyPicker(
monthDay = state.monthDay,
dayNumber = state.dueDayOfMonth,
dayOfWeek = state.dueDayOfWeek,
nthWeek = state.nthWeek,
isLastWeek = state.lastWeekDayOfMonth,
locale = state.locale,
onSelected = setMonthSelection,
)
}
Divider(
modifier = Modifier.padding(vertical = if (state.frequency == Recur.Frequency.WEEKLY) 11.dp else 16.dp),
color = border()
)
EndsPicker(
selection = state.endSelection,
endDate = state.endDate,
endOccurrences = state.endCount,
setEndDate = setEndDate,
setSelection = setSelectedEndType,
setOccurrences = setOccurrences,
)
}
}
}
}
@Composable
private fun Header(resId: Int) {
Text(
text = stringResource(id = resId),
style = MaterialTheme.typography.caption,
color = MaterialTheme.colors.onSurface,
modifier = Modifier.padding(horizontal = 16.dp),
)
}
@OptIn(ExperimentalLayoutApi::class)
@Composable
private fun WeekdayPicker(
daysOfWeek: List<DayOfWeek>,
selected: List<DayOfWeek>,
toggle: (DayOfWeek) -> Unit,
) {
val context = LocalContext.current
val locale = remember {
ConfigurationCompat
.getLocales(context.resources.configuration)
.get(0)
?: Locale.getDefault()
}
Divider(
modifier = Modifier.padding(vertical = 16.dp),
color = border()
)
Header(R.string.repeats_weekly_on)
Spacer(modifier = Modifier.height(16.dp))
FlowRow(
horizontalArrangement = Arrangement.spacedBy(10.dp),
modifier = Modifier.padding(horizontal = 16.dp),
) {
daysOfWeek.forEach { dayOfWeek ->
val string = remember(dayOfWeek) {
dayOfWeek.getDisplayName(TextStyle.NARROW, locale)
}
Box(
modifier = Modifier
.padding(bottom = 5.dp) // hack until compose 1.5
.size(36.dp)
.let {
if (selected.contains(dayOfWeek)) {
it.background(MaterialTheme.colors.secondary, shape = CircleShape)
} else {
it.border(1.dp, border(), shape = CircleShape)
}
}
.clickable { toggle(dayOfWeek) },
contentAlignment = Alignment.Center
) {
Text(
text = string,
style = MaterialTheme.typography.body2,
color = if (selected.contains(dayOfWeek)) MaterialTheme.colors.onSecondary else MaterialTheme.colors.onSurface
)
}
}
}
}
@Composable
private fun MonthlyPicker(
monthDay: WeekDay?,
dayNumber: Int,
dayOfWeek: DayOfWeek,
nthWeek: Int,
isLastWeek: Boolean,
locale: Locale,
onSelected: (Int) -> Unit,
) {
val selection = remember(monthDay) {
when (monthDay?.offset) {
null -> 0
-1 -> 2
else -> 1
}
}
Divider(
modifier = Modifier.padding(vertical = 16.dp),
color = border()
)
val context = LocalContext.current
val options = remember(dayNumber, dayOfWeek, nthWeek, isLastWeek, locale) {
ArrayList<String>().apply {
add(context.getString(R.string.repeat_monthly_on_day_number, dayNumber))
val nth = context.getString(
when (nthWeek - 1) {
0 -> R.string.repeat_monthly_first_week
1 -> R.string.repeat_monthly_second_week
2 -> R.string.repeat_monthly_third_week
3 -> R.string.repeat_monthly_fourth_week
4 -> R.string.repeat_monthly_fifth_week
else -> throw IllegalArgumentException()
}
)
val dayOfWeekDisplayName = dayOfWeek.getDisplayName(TextStyle.FULL, locale)
add(
context.getString(
R.string.repeat_monthly_on_the_nth_weekday,
nth,
dayOfWeekDisplayName
)
)
if (isLastWeek) {
add(
context.getString(
R.string.repeat_monthly_on_the_nth_weekday,
context.getString(R.string.repeat_monthly_last_week),
dayOfWeekDisplayName
)
)
}
}
}
Row(
modifier = Modifier.padding(horizontal = 16.dp),
) {
OutlinedSpinner(
text = options[selection],
options = options,
onSelected = onSelected,
)
}
}
@Composable
private fun EndsPicker(
selection: Int,
endDate: Long,
endOccurrences: Int,
setOccurrences: (Int) -> Unit,
setEndDate: (Long) -> Unit,
setSelection: (Int) -> Unit,
) {
Header(R.string.repeats_ends)
Spacer(modifier = Modifier.height(8.dp))
RadioRow(selected = selection == 0, onClick = { setSelection(0) }) {
Text(text = stringResource(id = R.string.repeats_never))
}
Divider(
modifier = Modifier.padding(start = 50.dp, end = 16.dp, top = 8.dp, bottom = 8.dp),
color = border()
)
RadioRow(selected = selection == 1, onClick = { setSelection(1) }) {
Text(text = stringResource(id = R.string.repeats_on))
Spacer(modifier = Modifier.width(8.dp))
val context = LocalContext.current
val locale = remember { LocaleList.getDefault()[0] }
val endDateString by remember(context, endDate) {
derivedStateOf {
DateUtilities.getRelativeDay(context, endDate, locale, FormatStyle.MEDIUM)
}
}
var showDatePicker by remember { mutableStateOf(false) }
if (showDatePicker) {
DatePickerDialog(
initialDate = endDate,
selected = { setEndDate(it) },
dismiss = { showDatePicker = false },
)
}
OutlinedBox(
modifier = Modifier.clickable {
setSelection(1)
showDatePicker = true
}
) {
Text(text = endDateString)
Spacer(modifier = Modifier.width(4.dp))
}
}
Divider(
modifier = Modifier.padding(start = 50.dp, end = 16.dp, top = 8.dp, bottom = 8.dp),
color = border()
)
RadioRow(selected = selection == 2, onClick = { setSelection(2) }) {
Text(text = stringResource(id = R.string.repeats_after))
Spacer(modifier = Modifier.width(8.dp))
OutlinedNumberInput(
number = endOccurrences,
onTextChanged = setOccurrences,
onFocus = { setSelection(2) },
)
Spacer(modifier = Modifier.width(8.dp))
Text(text = pluralStringResource(id = R.plurals.repeat_occurrence, endOccurrences))
}
}
@Composable
fun RadioRow(
selected: Boolean,
onClick: () -> Unit,
content: @Composable RowScope.() -> Unit
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.clickable { onClick() },
) {
RadioButton(selected = selected, onClick = onClick)
Row(
verticalAlignment = Alignment.CenterVertically,
content = content,
)
}
}
private val Recur.Frequency.plural: Int
get() = when (this) {
Recur.Frequency.MINUTELY -> R.plurals.repeat_minutes
Recur.Frequency.HOURLY -> R.plurals.repeat_hours
Recur.Frequency.DAILY -> R.plurals.repeat_days
Recur.Frequency.WEEKLY -> R.plurals.repeat_weeks
Recur.Frequency.MONTHLY -> R.plurals.repeat_months
Recur.Frequency.YEARLY -> R.plurals.repeat_years
else -> throw RuntimeException()
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun WeeklyPreview() {
MdcTheme {
CustomRecurrence(
state = CustomRecurrenceViewModel.ViewState(frequency = Recur.Frequency.WEEKLY),
save = {},
discard = {},
setSelectedFrequency = {},
setSelectedEndType = {},
setEndDate = {},
setInterval = {},
setOccurrences = {},
toggleDay = {},
setMonthSelection = {},
)
}
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun MonthlyPreview() {
MdcTheme {
CustomRecurrence(
state = CustomRecurrenceViewModel.ViewState(frequency = Recur.Frequency.MONTHLY),
save = {},
discard = {},
setSelectedFrequency = {},
setSelectedEndType = {},
setEndDate = {},
setInterval = {},
setOccurrences = {},
toggleDay = {},
setMonthSelection = {},
)
}
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun MinutelyPreview() {
MdcTheme {
CustomRecurrence(
state = CustomRecurrenceViewModel.ViewState(frequency = Recur.Frequency.MINUTELY),
save = {},
discard = {},
setSelectedFrequency = {},
setSelectedEndType = {},
setEndDate = {},
setInterval = {},
setOccurrences = {},
toggleDay = {},
setMonthSelection = {},
)
}
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun HourlyPreview() {
MdcTheme {
CustomRecurrence(
state = CustomRecurrenceViewModel.ViewState(frequency = Recur.Frequency.HOURLY),
save = {},
discard = {},
setSelectedFrequency = {},
setSelectedEndType = {},
setEndDate = {},
setInterval = {},
setOccurrences = {},
toggleDay = {},
setMonthSelection = {},
)
}
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun DailyPreview() {
MdcTheme {
CustomRecurrence(
state = CustomRecurrenceViewModel.ViewState(frequency = Recur.Frequency.DAILY),
save = {},
discard = {},
setSelectedFrequency = {},
setSelectedEndType = {},
setEndDate = {},
setInterval = {},
setOccurrences = {},
toggleDay = {},
setMonthSelection = {},
)
}
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun YearlyPreview() {
MdcTheme {
CustomRecurrence(
state = CustomRecurrenceViewModel.ViewState(frequency = Recur.Frequency.YEARLY),
save = {},
discard = {},
setSelectedFrequency = {},
setSelectedEndType = {},
setEndDate = {},
setInterval = {},
setOccurrences = {},
toggleDay = {},
setMonthSelection = {},
)
}
}

@ -0,0 +1,77 @@
package org.tasks.compose.pickers
import android.content.res.Configuration
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.Text
import androidx.compose.material3.DatePicker
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.TextButton
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.material3.rememberDatePickerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.google.android.material.composethemeadapter.MdcTheme
import org.tasks.R
import org.tasks.time.DateTime
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DatePickerDialog(
initialDate: Long,
selected: (Long) -> Unit,
dismiss: () -> Unit,
) {
MaterialTheme(
colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
) {
val initialDateUTC by remember(initialDate) {
derivedStateOf {
DateTime(initialDate).toUTC().millis
}
}
val datePickerState = rememberDatePickerState(
initialSelectedDateMillis = initialDateUTC,
)
androidx.compose.material3.DatePickerDialog(
onDismissRequest = { dismiss() },
dismissButton = {
TextButton(onClick = dismiss) {
Text(text = stringResource(id = R.string.cancel))
}
},
confirmButton = {
TextButton(
onClick = {
datePickerState
.selectedDateMillis
?.let { selected(it - DateTime(it).offset) }
dismiss()
}
) {
Text(text = stringResource(id = R.string.ok))
}
}
) {
DatePicker(state = datePickerState)
}
}
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun DatePickerPreview() {
MdcTheme {
DatePickerDialog(
initialDate = DateTime().plusDays(1).millis,
selected = {},
dismiss = {}
)
}
}

@ -5,7 +5,6 @@ import android.app.Activity.RESULT_OK
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
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
@ -66,15 +65,6 @@ class MyDatePickerDialog : DialogFragment() {
const val FRAG_TAG_DATE_PICKER = "frag_date_picker"
const val EXTRA_TIMESTAMP = "extra_timestamp"
@JvmStatic
fun newDatePicker(target: Fragment, rc: Int, initial: Long) =
MyDatePickerDialog().apply {
arguments = Bundle().apply {
putLong(EXTRA_TIMESTAMP, initial)
}
setTargetFragment(target, rc)
}
@JvmStatic
fun newDatePicker(initial: Long, inputMode: Int) =
MaterialDatePicker.Builder.datePicker()

@ -28,7 +28,7 @@ import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.IconPreference
import org.tasks.preferences.Preferences
import org.tasks.repeats.BasicRecurrenceDialog
import org.tasks.repeats.BasicRecurrenceDialog.EXTRA_RRULE
import org.tasks.repeats.BasicRecurrenceDialog.Companion.EXTRA_RRULE
import org.tasks.repeats.RepeatRuleToString
import org.tasks.tags.TagPickerActivity
import org.tasks.tags.TagPickerActivity.Companion.EXTRA_SELECTED

@ -1,163 +0,0 @@
package org.tasks.repeats;
import static android.app.Activity.RESULT_OK;
import static com.google.common.collect.Lists.newArrayList;
import static net.fortuna.ical4j.model.Recur.Frequency.DAILY;
import static net.fortuna.ical4j.model.Recur.Frequency.HOURLY;
import static net.fortuna.ical4j.model.Recur.Frequency.MINUTELY;
import static net.fortuna.ical4j.model.Recur.Frequency.MONTHLY;
import static net.fortuna.ical4j.model.Recur.Frequency.WEEKLY;
import static net.fortuna.ical4j.model.Recur.Frequency.YEARLY;
import static org.tasks.Strings.isNullOrEmpty;
import static org.tasks.repeats.CustomRecurrenceDialog.newCustomRecurrenceDialog;
import static org.tasks.repeats.RecurrenceUtils.newRecur;
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import dagger.hilt.android.AndroidEntryPoint;
import java.util.List;
import javax.inject.Inject;
import net.fortuna.ical4j.model.Recur;
import net.fortuna.ical4j.model.Recur.Frequency;
import org.tasks.R;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.ui.SingleCheckedArrayAdapter;
import timber.log.Timber;
@AndroidEntryPoint
public class BasicRecurrenceDialog extends DialogFragment {
public static final String EXTRA_RRULE = "extra_rrule";
private static final String EXTRA_DATE = "extra_date";
private static final String FRAG_TAG_CUSTOM_RECURRENCE = "frag_tag_custom_recurrence";
@Inject Activity context;
@Inject DialogBuilder dialogBuilder;
@Inject RepeatRuleToString repeatRuleToString;
public static BasicRecurrenceDialog newBasicRecurrenceDialog(
Fragment target, int rc, String rrule, long dueDate) {
BasicRecurrenceDialog dialog = new BasicRecurrenceDialog();
dialog.setTargetFragment(target, rc);
Bundle arguments = new Bundle();
if (rrule != null) {
arguments.putString(EXTRA_RRULE, rrule);
}
arguments.putLong(EXTRA_DATE, dueDate);
dialog.setArguments(arguments);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Bundle arguments = getArguments();
long dueDate = arguments.getLong(EXTRA_DATE, currentTimeMillis());
String rule = arguments.getString(EXTRA_RRULE);
Recur rrule = null;
try {
if (!isNullOrEmpty(rule)) {
rrule = newRecur(rule);
}
} catch (Exception e) {
Timber.e(e);
}
boolean customPicked = isCustomValue(rrule);
List<String> repeatOptions =
newArrayList(context.getResources().getStringArray(R.array.repeat_options));
SingleCheckedArrayAdapter adapter =
new SingleCheckedArrayAdapter(context, repeatOptions);
int selected = 0;
if (customPicked) {
adapter.insert(repeatRuleToString.toString(rule), 0);
} else if (rrule != null) {
switch (rrule.getFrequency()) {
case DAILY:
selected = 1;
break;
case WEEKLY:
selected = 2;
break;
case MONTHLY:
selected = 3;
break;
case YEARLY:
selected = 4;
break;
default:
selected = 0;
break;
}
}
return dialogBuilder
.newDialog()
.setSingleChoiceItems(
adapter,
selected,
(dialogInterface, i) -> {
if (customPicked) {
if (i == 0) {
dialogInterface.dismiss();
return;
}
i--;
}
Recur result;
if (i == 0) {
result = null;
} else if (i == 5) {
newCustomRecurrenceDialog(
getTargetFragment(), getTargetRequestCode(), rule, dueDate)
.show(getParentFragmentManager(), FRAG_TAG_CUSTOM_RECURRENCE);
dialogInterface.dismiss();
return;
} else {
result = newRecur();
result.setInterval(1);
switch (i) {
case 1:
result.setFrequency(DAILY.name());
break;
case 2:
result.setFrequency(WEEKLY.name());
break;
case 3:
result.setFrequency(MONTHLY.name());
break;
case 4:
result.setFrequency(YEARLY.name());
break;
}
}
Intent intent = new Intent();
intent.putExtra(EXTRA_RRULE, result == null ? null : result.toString());
getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_OK, intent);
dialogInterface.dismiss();
})
.setOnCancelListener(null)
.show();
}
private boolean isCustomValue(Recur rrule) {
if (rrule == null) {
return false;
}
Frequency frequency = rrule.getFrequency();
return (frequency == WEEKLY || frequency == MONTHLY) && !rrule.getDayList().isEmpty()
|| frequency == HOURLY
|| frequency == MINUTELY
|| rrule.getUntil() != null
|| rrule.getInterval() > 1
|| rrule.getCount() > 0;
}
}

@ -0,0 +1,130 @@
package org.tasks.repeats
import android.app.Activity
import android.app.Activity.RESULT_OK
import android.app.Dialog
import android.content.DialogInterface
import android.content.Intent
import android.os.Bundle
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import com.google.common.collect.Lists
import dagger.hilt.android.AndroidEntryPoint
import net.fortuna.ical4j.model.Recur
import org.tasks.R
import org.tasks.Strings.isNullOrEmpty
import org.tasks.dialogs.DialogBuilder
import org.tasks.repeats.CustomRecurrenceActivity.Companion.newIntent
import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.ui.SingleCheckedArrayAdapter
import timber.log.Timber
import javax.inject.Inject
@AndroidEntryPoint
class BasicRecurrenceDialog : DialogFragment() {
@Inject lateinit var context: Activity
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var repeatRuleToString: RepeatRuleToString
private val customRecurrence =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
targetFragment?.onActivityResult(targetRequestCode, it.resultCode, it.data)
dismiss()
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val arguments = arguments
val dueDate = arguments!!.getLong(EXTRA_DATE, currentTimeMillis())
val rule = arguments.getString(EXTRA_RRULE)
var rrule: Recur? = null
try {
if (!isNullOrEmpty(rule)) {
rrule = newRecur(rule!!)
}
} catch (e: Exception) {
Timber.e(e)
}
val customPicked = isCustomValue(rrule)
val repeatOptions: List<String> =
Lists.newArrayList(*requireContext().resources.getStringArray(R.array.repeat_options))
val adapter = SingleCheckedArrayAdapter(requireContext(), repeatOptions)
var selected = 0
if (customPicked) {
adapter.insert(repeatRuleToString!!.toString(rule), 0)
} else if (rrule != null) {
selected = when (rrule.frequency) {
Recur.Frequency.DAILY -> 1
Recur.Frequency.WEEKLY -> 2
Recur.Frequency.MONTHLY -> 3
Recur.Frequency.YEARLY -> 4
else -> 0
}
}
return dialogBuilder
.newDialog()
.setSingleChoiceItems(
adapter,
selected
) { dialogInterface: DialogInterface, i: Int ->
var i = i
if (customPicked) {
if (i == 0) {
dialogInterface.dismiss()
return@setSingleChoiceItems
}
i--
}
val result: Recur?
when (i) {
0 -> result = null
5 -> {
customRecurrence.launch(newIntent(requireContext(), rule, dueDate))
return@setSingleChoiceItems
}
else -> {
result = newRecur()
result.interval = 1
when (i) {
1 -> result.setFrequency(Recur.Frequency.DAILY.name)
2 -> result.setFrequency(Recur.Frequency.WEEKLY.name)
3 -> result.setFrequency(Recur.Frequency.MONTHLY.name)
4 -> result.setFrequency(Recur.Frequency.YEARLY.name)
}
}
}
val intent = Intent()
intent.putExtra(EXTRA_RRULE, result?.toString())
targetFragment!!.onActivityResult(targetRequestCode, RESULT_OK, intent)
dialogInterface.dismiss()
}
.show()
}
private fun isCustomValue(rrule: Recur?): Boolean {
if (rrule == null) {
return false
}
val frequency = rrule.frequency
return (frequency == Recur.Frequency.WEEKLY || frequency == Recur.Frequency.MONTHLY) && !rrule.dayList.isEmpty() || frequency == Recur.Frequency.HOURLY || frequency == Recur.Frequency.MINUTELY || rrule.until != null || rrule.interval > 1 || rrule.count > 0
}
companion object {
const val EXTRA_RRULE = "extra_rrule"
private const val EXTRA_DATE = "extra_date"
fun newBasicRecurrenceDialog(
target: Fragment?, rc: Int, rrule: String?, dueDate: Long
): BasicRecurrenceDialog {
val dialog = BasicRecurrenceDialog()
dialog.setTargetFragment(target, rc)
val arguments = Bundle()
if (rrule != null) {
arguments.putString(EXTRA_RRULE, rrule)
}
arguments.putLong(EXTRA_DATE, dueDate)
dialog.arguments = arguments
return dialog
}
}
}

@ -0,0 +1,53 @@
package org.tasks.repeats
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.fragment.app.FragmentActivity
import com.google.android.material.composethemeadapter.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.pickers.CustomRecurrence
@AndroidEntryPoint
class CustomRecurrenceActivity : FragmentActivity() {
val viewModel: CustomRecurrenceViewModel by viewModels()
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
setContent {
MdcTheme {
CustomRecurrence(
state = viewModel.state.collectAsStateLifecycleAware().value,
save = {
setResult(RESULT_OK, Intent().putExtra(EXTRA_RRULE, viewModel.getRecur()))
finish()
},
discard = { finish() },
setSelectedFrequency = { viewModel.setFrequency(it) },
setEndDate = { viewModel.setEndDate(it) },
setSelectedEndType = { viewModel.setEndType(it) },
setInterval = { viewModel.setInterval(it) },
setOccurrences = { viewModel.setOccurrences(it) },
toggleDay = { viewModel.toggleDay(it) },
setMonthSelection = { viewModel.setMonthSelection(it) },
)
}
}
}
companion object {
const val EXTRA_RRULE = "extra_rrule"
const val EXTRA_DATE = "extra_date"
@JvmStatic
fun newIntent(context: Context, rrule: String?, dueDate: Long) =
Intent(context, CustomRecurrenceActivity::class.java)
.putExtra(EXTRA_DATE, dueDate)
.putExtra(EXTRA_RRULE, rrule)
}
}

@ -1,557 +0,0 @@
package org.tasks.repeats;
import static android.app.Activity.RESULT_OK;
import static com.google.common.collect.Lists.newArrayList;
import static net.fortuna.ical4j.model.Recur.Frequency.DAILY;
import static net.fortuna.ical4j.model.Recur.Frequency.HOURLY;
import static net.fortuna.ical4j.model.Recur.Frequency.MINUTELY;
import static net.fortuna.ical4j.model.Recur.Frequency.MONTHLY;
import static net.fortuna.ical4j.model.Recur.Frequency.WEEKLY;
import static net.fortuna.ical4j.model.Recur.Frequency.YEARLY;
import static org.tasks.Strings.isNullOrEmpty;
import static org.tasks.dialogs.MyDatePickerDialog.newDatePicker;
import static org.tasks.repeats.BasicRecurrenceDialog.EXTRA_RRULE;
import static org.tasks.repeats.RecurrenceUtils.newRecur;
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import static java.util.Arrays.asList;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.ToggleButton;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSpinner;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import com.todoroo.andlib.utility.DateUtilities;
import net.fortuna.ical4j.model.Recur;
import net.fortuna.ical4j.model.Recur.Frequency;
import net.fortuna.ical4j.model.WeekDay;
import org.tasks.R;
import org.tasks.databinding.ControlSetRepeatBinding;
import org.tasks.databinding.WeekButtonsBinding;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.MyDatePickerDialog;
import org.tasks.extensions.LocaleKt;
import org.tasks.preferences.ResourceResolver;
import org.tasks.time.DateTime;
import org.tasks.ui.OnItemSelected;
import org.tasks.ui.OnTextChanged;
import java.text.DateFormatSymbols;
import java.time.format.FormatStyle;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint;
import timber.log.Timber;
@AndroidEntryPoint
public class CustomRecurrenceDialog extends DialogFragment {
private static final List<Frequency> FREQUENCIES =
asList(MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY);
private static final String EXTRA_DATE = "extra_date";
private static final String FRAG_TAG_DATE_PICKER = "frag_tag_date_picker";
private static final int REQUEST_PICK_DATE = 505;
private final List<String> repeatUntilOptions = new ArrayList<>();
@Inject Activity context;
@Inject DialogBuilder dialogBuilder;
@Inject Locale locale;
private LinearLayout weekGroup1;
@Nullable private LinearLayout weekGroup2;
private RadioGroup monthGroup;
private RadioButton repeatMonthlyDayOfNthWeek;
private RadioButton repeatMonthlyDayOfLastWeek;
private Spinner repeatUntilSpinner;
private EditText intervalEditText;
private TextView intervalTextView;
private EditText repeatTimes;
private TextView repeatTimesText;
private ArrayAdapter<String> repeatUntilAdapter;
private ToggleButton[] weekButtons;
private Recur rrule;
private long dueDate;
public static CustomRecurrenceDialog newCustomRecurrenceDialog(
Fragment target, int rc, String rrule, long dueDate) {
CustomRecurrenceDialog dialog = new CustomRecurrenceDialog();
dialog.setTargetFragment(target, rc);
Bundle arguments = new Bundle();
if (rrule != null) {
arguments.putString(EXTRA_RRULE, rrule);
}
arguments.putLong(EXTRA_DATE, dueDate);
dialog.setArguments(arguments);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(context);
ControlSetRepeatBinding binding = ControlSetRepeatBinding.inflate(inflater);
WeekButtonsBinding weekBinding = WeekButtonsBinding.bind(binding.getRoot());
Bundle arguments = getArguments();
dueDate = arguments.getLong(EXTRA_DATE, currentTimeMillis());
String rule =
savedInstanceState == null
? arguments.getString(EXTRA_RRULE)
: savedInstanceState.getString(EXTRA_RRULE);
try {
if (!isNullOrEmpty(rule)) {
rrule = newRecur(rule);
}
} catch (Exception e) {
Timber.e(e);
}
if (rrule == null) {
rrule = newRecur();
rrule.setInterval(1);
rrule.setFrequency(WEEKLY.name());
}
DateFormatSymbols dfs = new DateFormatSymbols(locale);
String[] shortWeekdays = dfs.getShortWeekdays();
weekGroup1 = weekBinding.weekGroup;
weekGroup2 = weekBinding.weekGroup2;
monthGroup = binding.monthGroup;
repeatMonthlyDayOfNthWeek = binding.repeatMonthlyDayOfNthWeek;
repeatMonthlyDayOfLastWeek = binding.repeatMonthlyDayOfLastWeek;
repeatUntilSpinner = binding.repeatUntil;
repeatUntilSpinner.setOnItemSelectedListener(new OnItemSelected() {
@Override
public void onItemSelected(int position) {
onRepeatUntilChanged(position);
}
});
intervalEditText = binding.intervalValue;
intervalEditText.addTextChangedListener(new OnTextChanged() {
@Override
public void onTextChanged(@Nullable CharSequence text) {
if (text != null) {
onRepeatValueChanged(text);
}
}
});
intervalTextView = binding.intervalText;
repeatTimes = binding.repeatTimesValue;
repeatTimes.addTextChangedListener(new OnTextChanged() {
@Override
public void onTextChanged(@Nullable CharSequence text) {
if (text != null) {
onRepeatTimesValueChanged(text);
}
}
});
repeatTimesText = binding.repeatTimesText;
AppCompatSpinner frequency = binding.frequency;
frequency.setOnItemSelectedListener(new OnItemSelected() {
@Override
public void onItemSelected(int position) {
onFrequencyChanged(position);
}
});
Calendar dayOfMonthCalendar = Calendar.getInstance(locale);
dayOfMonthCalendar.setTimeInMillis(dueDate);
int dayOfWeekInMonth = dayOfMonthCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);
int maxDayOfWeekInMonth = dayOfMonthCalendar.getActualMaximum(Calendar.DAY_OF_WEEK_IN_MONTH);
int dueDayOfWeek = dayOfMonthCalendar.get(Calendar.DAY_OF_WEEK);
String today = dfs.getWeekdays()[dueDayOfWeek];
if (dayOfWeekInMonth == maxDayOfWeekInMonth) {
repeatMonthlyDayOfLastWeek.setVisibility(View.VISIBLE);
String last = getString(R.string.repeat_monthly_last_week);
String text = getString(R.string.repeat_monthly_on_every_day_of_nth_week, last, today);
repeatMonthlyDayOfLastWeek.setTag(new WeekDay(calendarDayToWeekday(dueDayOfWeek), -1));
repeatMonthlyDayOfLastWeek.setText(text);
} else {
repeatMonthlyDayOfLastWeek.setVisibility(View.GONE);
}
if (dayOfWeekInMonth < 6) {
int[] resources =
new int[] {
R.string.repeat_monthly_first_week,
R.string.repeat_monthly_second_week,
R.string.repeat_monthly_third_week,
R.string.repeat_monthly_fourth_week,
R.string.repeat_monthly_fifth_week,
};
repeatMonthlyDayOfNthWeek.setVisibility(View.VISIBLE);
String nth = getString(resources[dayOfWeekInMonth - 1]);
String text = getString(R.string.repeat_monthly_on_every_day_of_nth_week, nth, today);
repeatMonthlyDayOfNthWeek.setTag(
new WeekDay(calendarDayToWeekday(dueDayOfWeek), dayOfWeekInMonth));
repeatMonthlyDayOfNthWeek.setText(text);
} else {
repeatMonthlyDayOfNthWeek.setVisibility(View.GONE);
}
if (rrule.getFrequency() == MONTHLY) {
if (rrule.getDayList().size() == 1) {
WeekDay weekday = rrule.getDayList().get(0);
if (weekday.getOffset() == -1) {
repeatMonthlyDayOfLastWeek.setChecked(true);
} else if (weekday.getOffset() == dayOfWeekInMonth) {
repeatMonthlyDayOfNthWeek.setChecked(true);
}
}
}
if (monthGroup.getCheckedRadioButtonId() != R.id.repeat_monthly_day_of_last_week
&& monthGroup.getCheckedRadioButtonId() != R.id.repeat_monthly_day_of_nth_week) {
binding.repeatMonthlySameDay.setChecked(true);
}
ArrayAdapter<CharSequence> frequencyAdapter =
ArrayAdapter.createFromResource(context, R.array.repeat_frequency, R.layout.frequency_item);
frequencyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
frequency.setAdapter(frequencyAdapter);
frequency.setSelection(FREQUENCIES.indexOf(rrule.getFrequency()));
intervalEditText.setText(LocaleKt.formatNumber(locale, rrule.getInterval()));
repeatUntilAdapter =
new ArrayAdapter<String>(context, 0, repeatUntilOptions) {
@Override
public View getDropDownView(
int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewGroup vg =
(ViewGroup) inflater.inflate(R.layout.simple_spinner_dropdown_item, parent, false);
((TextView) vg.findViewById(R.id.text1)).setText(getItem(position));
return vg;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
int selectedItemPosition = position;
if (parent instanceof AdapterView) {
selectedItemPosition = ((AdapterView) parent).getSelectedItemPosition();
}
TextView tv =
(TextView) inflater.inflate(android.R.layout.simple_spinner_item, parent, false);
tv.setPadding(0, 0, 0, 0);
tv.setText(repeatUntilOptions.get(selectedItemPosition));
return tv;
}
};
repeatUntilAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
repeatUntilSpinner.setAdapter(repeatUntilAdapter);
updateRepeatUntilOptions();
weekButtons = new ToggleButton[]{
weekBinding.weekDay1.button,
weekBinding.weekDay2.button,
weekBinding.weekDay3.button,
weekBinding.weekDay4.button,
weekBinding.weekDay5.button,
weekBinding.weekDay6.button,
weekBinding.weekDay7.button
};
// set up days of week
Calendar dayOfWeekCalendar = Calendar.getInstance(locale);
dayOfWeekCalendar.set(Calendar.DAY_OF_WEEK, dayOfWeekCalendar.getFirstDayOfWeek());
WeekDay todayWeekday = new WeekDay(new DateTime(dueDate).getWeekDay(), 0);
ColorStateList colorStateList =
new ColorStateList(
new int[][] {
new int[] {android.R.attr.state_checked}, new int[] {-android.R.attr.state_checked}
},
new int[] {
ResourceResolver.getData(context, com.google.android.material.R.attr.colorOnSecondary),
context.getColor(R.color.text_primary)
});
int inset = (int) context.getResources().getDimension(R.dimen.week_button_inset);
int accentColor = ResourceResolver.getData(context, androidx.appcompat.R.attr.colorAccent);
int animationDuration =
context.getResources().getInteger(android.R.integer.config_shortAnimTime);
for (int i = 0; i < 7; i++) {
ToggleButton weekButton = weekButtons[i];
GradientDrawable ovalDrawable =
(GradientDrawable)
context.getDrawable(R.drawable.week_day_button_oval).mutate();
ovalDrawable.setColor(accentColor);
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] {ovalDrawable});
layerDrawable.setLayerInset(0, inset, inset, inset, inset);
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.setEnterFadeDuration(animationDuration);
stateListDrawable.setExitFadeDuration(animationDuration);
stateListDrawable.addState(
new int[] {-android.R.attr.state_checked}, new ColorDrawable(Color.TRANSPARENT));
stateListDrawable.addState(new int[] {android.R.attr.state_checked}, layerDrawable);
int paddingBottom = weekButton.getPaddingBottom();
int paddingTop = weekButton.getPaddingTop();
int paddingLeft = weekButton.getPaddingLeft();
int paddingRight = weekButton.getPaddingRight();
weekButton.setBackground(stateListDrawable);
weekButton.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
int dayOfWeek = dayOfWeekCalendar.get(Calendar.DAY_OF_WEEK);
String text = shortWeekdays[dayOfWeek];
weekButton.setTextColor(colorStateList);
weekButton.setTextOn(text);
weekButton.setTextOff(text);
weekButton.setTag(new WeekDay(calendarDayToWeekday(dayOfWeek), 0));
if (savedInstanceState == null) {
weekButton.setChecked(
rrule.getFrequency() != WEEKLY || rrule.getDayList().isEmpty()
? todayWeekday.equals(weekButton.getTag())
: rrule.getDayList().contains(weekButton.getTag()));
}
dayOfWeekCalendar.add(Calendar.DATE, 1);
}
setCancelable(false);
return dialogBuilder
.newDialog()
.setView(binding.getRoot())
.setPositiveButton(R.string.ok, this::onRuleSelected)
.setNegativeButton(R.string.cancel, null)
.show();
}
private void onRuleSelected(DialogInterface dialogInterface, int which) {
if (rrule.getFrequency() == WEEKLY) {
List<WeekDay> checked = new ArrayList<>();
for (ToggleButton weekButton : weekButtons) {
if (weekButton.isChecked()) {
checked.add((WeekDay) weekButton.getTag());
}
}
rrule.getDayList().clear();
rrule.getDayList().addAll(checked);
} else if (rrule.getFrequency() == MONTHLY) {
int checkedRadioButtonId = monthGroup.getCheckedRadioButtonId();
if (checkedRadioButtonId == R.id.repeat_monthly_same_day) {
rrule.getDayList().clear();
} else if (checkedRadioButtonId == R.id.repeat_monthly_day_of_nth_week) {
rrule.getDayList().clear();
rrule.getDayList().addAll(newArrayList((WeekDay) repeatMonthlyDayOfNthWeek.getTag()));
} else if (checkedRadioButtonId == R.id.repeat_monthly_day_of_last_week) {
rrule.getDayList().clear();
rrule.getDayList().addAll(newArrayList((WeekDay) repeatMonthlyDayOfLastWeek.getTag()));
}
} else {
rrule.getDayList().clear();
}
Intent intent = new Intent();
intent.putExtra(EXTRA_RRULE, rrule.toString());
getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_OK, intent);
dismiss();
}
private WeekDay calendarDayToWeekday(int calendarDay) {
switch (calendarDay) {
case Calendar.SUNDAY:
return WeekDay.SU;
case Calendar.MONDAY:
return WeekDay.MO;
case Calendar.TUESDAY:
return WeekDay.TU;
case Calendar.WEDNESDAY:
return WeekDay.WE;
case Calendar.THURSDAY:
return WeekDay.TH;
case Calendar.FRIDAY:
return WeekDay.FR;
case Calendar.SATURDAY:
return WeekDay.SA;
}
throw new RuntimeException("Invalid calendar day: " + calendarDay);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(EXTRA_RRULE, rrule.toString());
}
private void setInterval(int interval, boolean updateEditText) {
rrule.setInterval(interval);
if (updateEditText) {
intervalEditText.setText(LocaleKt.formatNumber(locale, interval));
}
updateIntervalTextView();
}
private void updateIntervalTextView() {
int resource = getFrequencyPlural();
String quantityString = getResources().getQuantityString(resource, rrule.getInterval());
intervalTextView.setText(quantityString);
}
private void setCount(int count, boolean updateEditText) {
rrule.setCount(count);
if (updateEditText) {
intervalEditText.setText(LocaleKt.formatNumber(locale, count));
}
updateCountText();
}
private void updateCountText() {
repeatTimesText.setText(
getResources().getQuantityString(R.plurals.repeat_times, rrule.getCount()));
}
private int getFrequencyPlural() {
switch (rrule.getFrequency()) {
case MINUTELY:
return R.plurals.repeat_minutes;
case HOURLY:
return R.plurals.repeat_hours;
case DAILY:
return R.plurals.repeat_days;
case WEEKLY:
return R.plurals.repeat_weeks;
case MONTHLY:
return R.plurals.repeat_months;
case YEARLY:
return R.plurals.repeat_years;
default:
throw new RuntimeException("Invalid frequency: " + rrule.getFrequency());
}
}
private void onRepeatUntilChanged(int position) {
if (repeatUntilOptions.size() == 4) {
position--;
}
if (position == 0) {
rrule.setUntil(null);
updateRepeatUntilOptions();
} else if (position == 1) {
repeatUntilClick();
} else if (position == 2) {
rrule.setUntil(null);
rrule.setCount(Math.max(rrule.getCount(), 1));
updateRepeatUntilOptions();
}
}
private void onFrequencyChanged(int position) {
Frequency frequency = FREQUENCIES.get(position);
rrule.setFrequency(frequency.name());
int weekVisibility = frequency == WEEKLY ? View.VISIBLE : View.GONE;
weekGroup1.setVisibility(weekVisibility);
if (weekGroup2 != null) {
weekGroup2.setVisibility(weekVisibility);
}
monthGroup.setVisibility(frequency == MONTHLY && dueDate >= 0 ? View.VISIBLE : View.GONE);
updateIntervalTextView();
}
private void onRepeatValueChanged(CharSequence text) {
Integer value = LocaleKt.parseInteger(locale, text.toString());
if (value == null) {
return;
}
if (value < 1) {
setInterval(1, true);
} else {
setInterval(value, false);
}
}
private void onRepeatTimesValueChanged(CharSequence text) {
Integer value = LocaleKt.parseInteger(locale, text.toString());
if (value == null) {
return;
}
if (value < 1) {
setCount(1, true);
} else {
setCount(value, false);
}
}
private void repeatUntilClick() {
if (getParentFragmentManager().findFragmentByTag(FRAG_TAG_DATE_PICKER) == null) {
long repeatUntil = DateTime.from(rrule.getUntil()).getMillis();
newDatePicker(this, REQUEST_PICK_DATE, repeatUntil > 0 ? repeatUntil : 0L)
.show(getParentFragmentManager(), FRAG_TAG_DATE_PICKER);
}
}
private void updateRepeatUntilOptions() {
repeatUntilOptions.clear();
long repeatUntil = DateTime.from(rrule.getUntil()).getMillis();
int count = rrule.getCount();
if (repeatUntil > 0) {
repeatUntilOptions.add(
getString(
R.string.repeat_until,
DateUtilities.getRelativeDateTime(
context, repeatUntil, locale, FormatStyle.MEDIUM, true)));
repeatTimes.setVisibility(View.GONE);
repeatTimesText.setVisibility(View.GONE);
} else if (count > 0) {
repeatUntilOptions.add(getString(R.string.repeat_occurs));
repeatTimes.setText(LocaleKt.formatNumber(locale, count));
repeatTimes.setVisibility(View.VISIBLE);
updateCountText();
repeatTimesText.setVisibility(View.VISIBLE);
} else {
repeatTimes.setVisibility(View.GONE);
repeatTimesText.setVisibility(View.GONE);
}
repeatUntilOptions.add(getString(R.string.repeat_forever));
repeatUntilOptions.add(getString(R.string.repeat_until, "").trim());
repeatUntilOptions.add(getString(R.string.repeat_number_of_times));
repeatUntilAdapter.notifyDataSetChanged();
repeatUntilSpinner.setSelection(0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_PICK_DATE) {
if (resultCode == RESULT_OK) {
rrule.setUntil(
new DateTime(data.getLongExtra(MyDatePickerDialog.EXTRA_TIMESTAMP, 0L)).toDate());
}
updateRepeatUntilOptions();
}
super.onActivityResult(requestCode, resultCode, data);
}
}

@ -0,0 +1,224 @@
package org.tasks.repeats
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import net.fortuna.ical4j.model.Date
import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.Recur.Frequency.DAILY
import net.fortuna.ical4j.model.Recur.Frequency.HOURLY
import net.fortuna.ical4j.model.Recur.Frequency.MINUTELY
import net.fortuna.ical4j.model.Recur.Frequency.MONTHLY
import net.fortuna.ical4j.model.Recur.Frequency.WEEKLY
import net.fortuna.ical4j.model.Recur.Frequency.YEARLY
import net.fortuna.ical4j.model.WeekDay
import net.fortuna.ical4j.model.WeekDayList
import net.fortuna.ical4j.model.property.RRule
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.repeats.CustomRecurrenceActivity.Companion.EXTRA_DATE
import org.tasks.repeats.CustomRecurrenceActivity.Companion.EXTRA_RRULE
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.startOfDay
import java.time.DayOfWeek
import java.time.Instant
import java.time.ZoneId
import java.time.temporal.WeekFields
import java.util.Calendar
import java.util.Calendar.DAY_OF_WEEK_IN_MONTH
import java.util.Locale
import javax.inject.Inject
@HiltViewModel
class CustomRecurrenceViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
locale: Locale,
) : ViewModel() {
data class ViewState(
val interval: Int = 1,
val frequency: Recur.Frequency = WEEKLY,
val dueDate: Long = DateTime().startOfDay().millis,
val endSelection: Int = 0,
val endDate: Long = dueDate.toDateTime().plusMonths(1).startOfDay().millis,
val endCount: Int = 1,
val frequencyOptions: List<Recur.Frequency> = DEFAULT_FREQUENCIES,
val daysOfWeek: List<DayOfWeek> = Locale.getDefault().daysOfWeek(),
val selectedDays: List<DayOfWeek> = emptyList(),
val locale: Locale = Locale.getDefault(),
val monthDay: WeekDay? = null,
) {
val dueDayOfWeek: DayOfWeek
get() = Instant.ofEpochMilli(dueDate).atZone(ZoneId.systemDefault()).dayOfWeek
val dueDayOfMonth: Int
get() = DateTime(dueDate).dayOfMonth
val nthWeek: Int
get() =
Calendar.getInstance(locale)
.apply { timeInMillis = dueDate }
.get(DAY_OF_WEEK_IN_MONTH)
val lastWeekDayOfMonth: Boolean
get() =
Calendar.getInstance(locale)
.apply { timeInMillis = dueDate }
.let { it[DAY_OF_WEEK_IN_MONTH] == it.getActualMaximum(DAY_OF_WEEK_IN_MONTH) }
}
private val _state = MutableStateFlow(ViewState())
val state = _state.asStateFlow()
init {
val daysOfWeek = locale.daysOfWeek()
val recur = savedStateHandle.get<String>(EXTRA_RRULE)?.let { RRule(it) }?.recur
val dueDate = savedStateHandle
.get<Long>(EXTRA_DATE)
?.takeIf { it > 0 }
?: System.currentTimeMillis().startOfDay()
val selectedDays = if (recur?.frequency == WEEKLY) {
recur.dayList?.toDaysOfWeek()
} else {
emptyList()
}
_state.update { state ->
state.copy(
interval = recur?.interval?.takeIf { it > 0 } ?: 1,
frequency = recur?.frequency ?: WEEKLY,
dueDate = dueDate,
endSelection = when {
recur == null -> 0
recur.until != null -> 1
recur.count >= 0 -> 2
else -> 0
},
endDate = DateTime(dueDate).plusMonths(1).startOfDay().millis,
endCount = recur?.count?.takeIf { it >= 0 } ?: 1,
daysOfWeek = daysOfWeek,
selectedDays = recur
?.dayList
?.takeIf { recur.frequency == WEEKLY }
?.toDaysOfWeek()
?: emptyList(),
locale = locale,
monthDay = recur?.dayList?.takeIf { recur.frequency == MONTHLY }?.firstOrNull(),
)
}
}
fun setEndType(endType: Int) {
_state.update {
it.copy(endSelection = endType)
}
}
fun setFrequency(frequency: Recur.Frequency) {
_state.update {
it.copy(frequency = frequency)
}
}
fun setEndDate(endDate: Long) {
_state.update {
it.copy(endDate = endDate)
}
}
fun setInterval(interval: Int) {
_state.update {
it.copy(interval = interval)
}
}
fun setOccurrences(occurrences: Int) {
_state.update {
it.copy(endCount = occurrences)
}
}
fun toggleDay(dayOfWeek: DayOfWeek) {
_state.update { state ->
state.copy(
selectedDays = state.selectedDays.toMutableList().also {
if (!it.remove(dayOfWeek)) {
it.add(dayOfWeek)
}
}
)
}
}
fun getRecur(): String {
val state = _state.value
val builder = Recur.Builder().frequency(state.frequency)
if (state.frequency == WEEKLY) {
builder.dayList(state.selectedDays.toWeekDayList())
} else if (state.frequency == MONTHLY) {
state.monthDay?.let { builder.dayList(WeekDayList(it)) }
}
if (state.interval > 1) {
builder.interval(state.interval)
}
when (state.endSelection) {
1 -> builder.until(Date(state.endDate))
2 -> builder.count(state.endCount.coerceAtLeast(1))
}
return builder.build().toString()
}
fun setMonthSelection(selection: Int) {
_state.update {
it.copy(
monthDay = when (selection) {
0 -> null
1 -> WeekDay(it.dueDayOfWeek.weekDay, it.nthWeek)
2 -> WeekDay(it.dueDayOfWeek.weekDay, -1)
else -> throw IllegalArgumentException()
},
)
}
}
companion object {
val DEFAULT_FREQUENCIES = listOf(MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY)
private fun Locale.daysOfWeek(): List<DayOfWeek> {
val values = DayOfWeek.values()
val weekFields = WeekFields.of(this)
var index = values.indexOf(weekFields.firstDayOfWeek)
return (0..6).map {
values[index].also { index = (index + 1) % 7 }
}
}
private fun WeekDayList.toDaysOfWeek(): List<DayOfWeek> = map {
when (it) {
WeekDay.SU -> DayOfWeek.SUNDAY
WeekDay.MO -> DayOfWeek.MONDAY
WeekDay.TU -> DayOfWeek.TUESDAY
WeekDay.WE -> DayOfWeek.WEDNESDAY
WeekDay.TH -> DayOfWeek.THURSDAY
WeekDay.FR -> DayOfWeek.FRIDAY
WeekDay.SA -> DayOfWeek.SATURDAY
else -> throw IllegalArgumentException()
}
}
private fun List<DayOfWeek>.toWeekDayList(): WeekDayList =
WeekDayList(*sortedBy { it.value }.map { it.weekDay }.toTypedArray())
private val DayOfWeek.weekDay: WeekDay
get() = when (this) {
DayOfWeek.SUNDAY -> WeekDay.SU
DayOfWeek.MONDAY -> WeekDay.MO
DayOfWeek.TUESDAY -> WeekDay.TU
DayOfWeek.WEDNESDAY -> WeekDay.WE
DayOfWeek.THURSDAY -> WeekDay.TH
DayOfWeek.FRIDAY -> WeekDay.FR
DayOfWeek.SATURDAY -> WeekDay.SA
else -> throw IllegalArgumentException()
}
}
}

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="@dimen/week_button_state_on_circle_size"/>
</shape>

@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2015 Vikram Kakkar
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:id="@+id/weekGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:gravity="center_horizontal"
android:orientation="horizontal">
<include
android:id="@+id/week_day_1"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_2"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_3"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_4"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_5"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_6"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_7"
layout="@layout/week_day_button"/>
</LinearLayout>
</merge>

@ -1,152 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorAccent">
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/frequency"
style="Widget.MaterialComponents.Spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:layout_gravity="center_horizontal"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
app:backgroundTint="?attr/colorOnSecondary"/>
</FrameLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="0dp"
android:text="@string/repeat_every"
android:textAppearance="@style/TextAppearance"/>
<EditText
android:id="@+id/intervalValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="4dp"
android:paddingEnd="4dp"
android:ems="3"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center_horizontal"
android:imeOptions="flagNoExtractUi"
android:inputType="number"
android:maxLength="3"
android:selectAllOnFocus="true"
android:singleLine="true"
android:textSize="15sp"/>
<TextView
android:id="@+id/intervalText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="0dp"
android:paddingEnd="@dimen/keyline_first"
android:textAppearance="@style/TextAppearance"/>
</LinearLayout>
<include layout="@layout/week_buttons"/>
<RadioGroup
android:id="@+id/month_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:orientation="vertical"
android:visibility="gone">
<RadioButton
android:id="@+id/repeat_monthly_same_day"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/repeat_monthly_same_day_each_month"/>
<RadioButton
android:id="@+id/repeat_monthly_day_of_nth_week"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RadioButton
android:id="@+id/repeat_monthly_day_of_last_week"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RadioGroup>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<Spinner
android:id="@+id/repeat_until"
style="Widget.MaterialComponents.Spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/keyline_first"
android:layout_marginEnd="0dp"
android:layout_gravity="center"/>
<EditText
android:id="@+id/repeatTimesValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="4dp"
android:paddingEnd="4dp"
android:ems="3"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:imeOptions="flagNoExtractUi"
android:inputType="number"
android:maxLength="3"
android:selectAllOnFocus="true"
android:singleLine="true"
android:textSize="15sp"/>
<TextView
android:id="@+id/repeatTimesText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingStart="0dp"
android:paddingEnd="@dimen/keyline_first"
android:textAppearance="@style/TextAppearance"/>
</LinearLayout>
</LinearLayout>
</ScrollView>

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Widget.AppCompat.TextView.SpinnerItem"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingStart="0dp"
android:paddingEnd="0dp"
android:ellipsize="end"
android:singleLine="true"
android:textAlignment="viewStart"
android:textColor="?attr/colorOnSecondary"/>

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License")
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?attr/dropdownListPreferredItemHeight"
android:gravity="center_vertical"
android:orientation="horizontal">
<CheckedTextView
android:id="@+id/text1"
style="?attr/spinnerDropDownItemStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"/>
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/text1"
android:layout_alignParentEnd="true"
android:layout_toEndOf="@id/text1"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:gravity="center_vertical|end"
android:textSize="12sp"/>
</RelativeLayout>

@ -1,67 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2015 Vikram Kakkar
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:id="@+id/weekGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<include
android:id="@+id/week_day_1"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_2"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_3"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_4"
layout="@layout/week_day_button"/>
</LinearLayout>
<LinearLayout
android:id="@+id/weekGroup2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"
tools:ignore="InconsistentLayout">
<include
android:id="@+id/week_day_5"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_6"
layout="@layout/week_day_button"/>
<include
android:id="@+id/week_day_7"
layout="@layout/week_day_button"/>
<include
layout="@layout/week_day_button"
android:visibility="invisible"/>
</LinearLayout>
</merge>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ToggleButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@null"
android:gravity="center"
android:singleLine="true"
android:textAllCaps="true"
android:textSize="12sp"/>

@ -79,7 +79,6 @@
<string name="default_random_reminder_daily">يومي</string>
<string name="default_random_reminder_weekly">أسبوعي</string>
<string name="default_random_reminder_bi_weekly">مرتين في الأسبوع</string>
<string name="repeat_forever">كرِّر للأبد</string>
<string name="TEA_timer_controls">مؤقت</string>
<string name="TEA_timer_comment_started">بدء هذه المهمة:</string>
<string name="TEA_timer_comment_spent">الوقت المنقضي:</string>
@ -196,7 +195,6 @@
<string name="priority_medium">متوسط</string>
<string name="priority_high">عال</string>
<string name="date_and_time">التاريخ والوقت</string>
<string name="repeat_until">كرِّر حتَّى %s</string>
<plurals name="task_count">
<item quantity="zero">لا مهام</item>
<item quantity="one">مهمة واحدة</item>
@ -207,12 +205,6 @@
</plurals>
<string name="repeat_type_completion_capitalized">تاريخ الإكمال</string>
<string name="repeat_type_completion">تاريخ الإكمال</string>
<string name="repeat_minutely">كرِّر كل دقيقة</string>
<string name="repeat_yearly">كرِّر سنويًّا</string>
<string name="repeat_monthly">كرِّر شهريًّا</string>
<string name="repeat_weekly">كرِّر أسبوعيًّا</string>
<string name="repeat_daily">كرِّر يوميًّا</string>
<string name="repeat_hourly">كرِّر كلّ ساعة</string>
<string name="above_average">فوق المتوسط</string>
<string name="icon">الأيقونة</string>
<string name="copy">نسخ</string>
@ -222,8 +214,6 @@
<string name="date_shortcut_night">ليلًا</string>
<string name="date_shortcut_evening">مساءً</string>
<string name="date_shortcut_morning">صباحًا</string>
<string name="repeat_number_of_times">كرّر عددًا من المرات</string>
<string name="repeat_every">كلّ</string>
<string name="default_random_reminder_hourly">كل ساعة</string>
<string name="no_reminders">لا منبهات</string>
<string name="always_display_full_date">أظهر التاريخ الكامل</string>
@ -410,7 +400,6 @@
<string name="this_feature_requires_a_subscription">هذه الميزة تحتاج إلى اشتراك</string>
<string name="network_error">لم يمكن الاتصال</string>
<string name="tasker_create_task">أنشأ مهمّة</string>
<string name="repeat_monthly_same_day_each_month">في نفس اليوم شهريًّا</string>
<string name="default_calendar">التقويم الافتراضي</string>
<string name="dont_add_to_calendar">لا تضف إلى التقويم</string>
<string name="repeats_from">تكرار من</string>
@ -574,7 +563,6 @@
<string name="upgrade_to_pro">طور لاصدار متقدم</string>
<string name="help_and_feedback">مساعدة وتبليغات</string>
<string name="tasker_list_notification">قائمة الاشعارات</string>
<string name="repeat_monthly_on_every_day_of_nth_week">في كل %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">كل %1$s %2$s</string>
<string name="repeats_plural_on_until">كرره كل %1$s في %2$s حتى %3$s</string>
<string name="repeats_plural_number_of_times">كرره كل %1$s، يحدث %2$d %3$s</string>
@ -691,7 +679,6 @@
<item quantity="many">%d ساعة</item>
<item quantity="other">%d ساعة</item>
</plurals>
<string name="repeat_occurs">يحدث</string>
<string name="background_location">موقع الخلفية</string>
<string name="foreground_location">موقع المقدمة</string>
<string name="sort_due_group">مستحق %s</string>

@ -148,19 +148,12 @@
<string name="default_random_reminder_daily">ежедневно</string>
<string name="default_random_reminder_weekly">ежеседмично</string>
<string name="default_random_reminder_bi_weekly">на две седмици</string>
<string name="repeat_every">Всеки(а)</string>
<string name="repeat_option_does_not_repeat">Не се повтаря</string>
<string name="repeat_option_every_day">всеки ден</string>
<string name="repeat_option_every_week">всяка седмица</string>
<string name="repeat_option_every_month">всеки месец</string>
<string name="repeat_option_every_year">всяка година</string>
<string name="repeat_option_custom">По избор…</string>
<string name="repeat_minutely">Да се повтаря всяка минута</string>
<string name="repeat_hourly">Да се повтаря всеки час</string>
<string name="repeat_daily">Да се повтаря всеки ден</string>
<string name="repeat_weekly">Да се повтаря всяка седмица</string>
<string name="repeat_monthly">Да се повтаря всеки месец</string>
<string name="repeat_yearly">Да се повтаря всяка година</string>
<plurals name="task_count">
<item quantity="one">%d задача</item>
<item quantity="other">%d задачи</item>
@ -219,10 +212,6 @@
</plurals>
<string name="repeat_type_due">крайна дата</string>
<string name="repeat_type_completion">дата на завършване</string>
<string name="repeat_forever">Да се повтаря винаги</string>
<string name="repeat_until">Да се повтаря до %s</string>
<string name="repeat_number_of_times">Да се повтаря няколко пъти</string>
<string name="repeat_occurs">Да се повтаря</string>
<string name="repeat_snackbar">%1$s е преместена за %2$s</string>
<string name="new_tag">Създаване на етикет</string>
<string name="new_list">Създаване на списък</string>
@ -375,9 +364,7 @@
<string name="default_calendar">Календар по подразбиране</string>
<string name="badges_description">Броят на задачите е видим върху иконата на Tasks. Не всички начални екрани го поддържат.</string>
<string name="bundle_notifications_summary">Няколко известия се обединяват в едно</string>
<string name="repeat_monthly_same_day_each_month">на един и същи ден всеки месец</string>
<string name="repeat_monthly_every_day_of_nth_week">всеки %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">на всеки %1$s %2$s</string>
<string name="repeat_monthly_first_week">първа</string>
<string name="repeat_monthly_second_week">втора</string>
<string name="repeat_monthly_third_week">трета</string>

@ -67,8 +67,6 @@
<string name="rmd_EPr_quiet_hours_start_title">Inici de Silenci</string>
<string name="rmd_EPr_quiet_hours_end_title">Final de Silenci</string>
<string name="rmd_EPr_defaultRemind_title">Notificacions al Atzar</string>
<string name="repeat_forever">Repeteix indefinidament</string>
<string name="repeat_until">Repeteix fins %s</string>
<string name="TPl_notification">Temporitzadors actius per %s!</string>
<string name="TFE_workingOn">Tasques sent cronometrades</string>
<string name="TEA_timer_comment_started">inici d\'aquesta tasca:</string>
@ -177,7 +175,6 @@
<string name="default_random_reminder_bi_weekly">Cada dues setmanes</string>
<string name="repeat_option_every_week">Setmanalment</string>
<string name="repeat_option_every_year">Anualment</string>
<string name="repeat_daily">REPETEIX CADA DIA</string>
<string name="CFC_startBefore_text">Comença per: \?</string>
<string name="CFC_startBefore_name">Comença per…</string>
<string name="CFC_tag_contains_text">El nom de l\'etiqueta conté: \?</string>
@ -189,9 +186,6 @@
<string name="default_random_reminder_daily">A diari</string>
<string name="default_random_reminder_weekly">Setmanalment</string>
<string name="repeat_option_custom">Personalitza…</string>
<string name="repeat_minutely">REPETEIX CADA MINUT</string>
<string name="repeat_hourly">REPETEIX CADA HORA</string>
<string name="repeat_weekly">REPETEIX CADA SETMANA</string>
<string name="no_start_date">Sense data d\'inici</string>
<string name="CFC_tag_text">Etiqueta: \?</string>
<string name="CFC_tag_contains_name">El nom de l\'etiqueta conté…</string>
@ -202,8 +196,6 @@
<item quantity="one">%d tasca</item>
<item quantity="other">%d tasques</item>
</plurals>
<string name="repeat_monthly">REPETEIX MENSUALMENT</string>
<string name="repeat_yearly">REPETEIX ANUALMENT</string>
<string name="gtasks_GLA_errorIOAuth">Ho sentim, hem tingut problemes de comunicació amb els servidors de Google. Per favor torna-ho a intentar.</string>
<string name="gtasks_GPr_header">Google Tasks</string>
<string name="gtasks_error_accountNotFound">Compte %s no trobat-si us plau desconnecta i torna a connectar-te des de la configuració de Google Tasks.</string>
@ -211,7 +203,6 @@
<string name="ring_five_times">Sona cinc cops</string>
<string name="ring_nonstop">Sona ininterrompudament</string>
<string name="snooze_all">Posposa tot</string>
<string name="repeat_every">Cada</string>
<plurals name="reminder_hours">
<item quantity="one">Hora</item>
<item quantity="other">Hores</item>
@ -292,9 +283,7 @@
<string name="sort_completed">Per data de finalització</string>
<string name="repeat_snackbar">%1$s reprogramat pel %2$s</string>
<string name="repeat_type_completion_capitalized">Data de finalització</string>
<string name="repeat_number_of_times">Repeteix un número de vegades</string>
<string name="repeat_type_due">data de venciment</string>
<string name="repeat_type_completion">data de finalització</string>
<string name="TEA_creation_date">Data de creació</string>
<string name="repeat_occurs">Succeeix</string>
</resources>

@ -117,8 +117,6 @@
<string name="default_random_reminder_daily">Denně</string>
<string name="default_random_reminder_weekly">Týdně</string>
<string name="default_random_reminder_bi_weekly">Každých čtrnáct dní</string>
<string name="repeat_forever">Opakovat stále</string>
<string name="repeat_until">Opakovat až do %s</string>
<string name="new_tag">Vytvořit nový štítek</string>
<string name="delete_tag_confirmation">Smazat %s?</string>
<string name="TPl_notification">Časovače aktivní pro %s!</string>
@ -221,18 +219,12 @@
<string name="snooze_all">Odložit vše</string>
<string name="persistent_notifications">Trvalá upozornění</string>
<string name="persistent_notifications_description">Trvalá upozornění nemohou být odstraněna</string>
<string name="repeat_every">Každý</string>
<string name="repeat_option_does_not_repeat">Neopakuje se</string>
<string name="repeat_option_every_day">Každý den</string>
<string name="repeat_option_every_week">Každý týden</string>
<string name="repeat_option_every_month">Každý měsíc</string>
<string name="repeat_option_every_year">Každý rok</string>
<string name="repeat_option_custom">Vlastní…</string>
<string name="repeat_hourly">OPAKOVAT PO HODINĚ</string>
<string name="repeat_daily">OPAKOVAT DENNĚ</string>
<string name="repeat_weekly">OPAKOVAT TÝDNĚ</string>
<string name="repeat_monthly">OPAKOVAT MĚSÍČNĚ</string>
<string name="repeat_yearly">OPAKOVAT KAŽDOROČNĚ</string>
<plurals name="task_count">
<item quantity="one">%d úkol</item>
<item quantity="few">%d úkoly</item>
@ -310,7 +302,6 @@
</plurals>
<string name="repeat_type_due">termínu úkolu</string>
<string name="repeat_type_completion">okamžiku dokončení</string>
<string name="repeat_occurs">Výskytů</string>
<string name="repeat_snackbar">Úkol %1$s byl znovu naplánován na %2$s</string>
<string name="new_list">Vytvořit nový seznam</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks bude při upomínce nahlas číst název úkolu</string>
@ -381,7 +372,6 @@
<string name="default_calendar">Výchozí kalendář</string>
<string name="badges_description">Zobrazit počet úkolů u ikony Tasks. Některé spouštěče tuto funkci nepodporují.</string>
<string name="bundle_notifications_summary">Seskupit několik upozornění do jednoho</string>
<string name="repeat_monthly_same_day_each_month">ve stejný den každý měsíc</string>
<string name="repeat_monthly_every_day_of_nth_week">každý %1$s %2$s</string>
<string name="repeat_monthly_first_week">první</string>
<string name="repeat_monthly_second_week">druhý</string>
@ -405,8 +395,6 @@
<string name="requires_pro_subscription">Vyžaduje PRO předplatné</string>
<string name="logout">Odhlásit se</string>
<string name="this_feature_requires_a_subscription">Tato funkce vyžaduje předplatné</string>
<string name="repeat_minutely">OPAKOVAT PO MINUTĚ</string>
<string name="repeat_number_of_times">Opakovat několikrát</string>
<string name="when_overdue">Po termínu</string>
<string name="logout_warning">Všechna data daného účtu budou z tohoto zařízení odstraněna</string>
<string name="cannot_access_account">Nepodařilo se připojit k účtu</string>
@ -421,7 +409,6 @@
<string name="list_settings">Nastavení seznamu</string>
<string name="repeats_plural_on_number_of_times">Opakuje se každý %1$s v %2$s, ještě %3$d %4$s</string>
<string name="theme_system_default">Podle systému</string>
<string name="repeat_monthly_on_every_day_of_nth_week">každý %1$s %2$s</string>
<string name="or_choose_a_location">Nebo vyberte místo</string>
<string name="missing_permissions">Chybí oprávnění</string>
<string name="location_permission_required_location">Oprávnění k přístupu k poloze je nutné pro zjištění vaší aktuální polohy</string>

@ -59,8 +59,6 @@
<string name="rmd_EPr_quiet_hours_start_title">Hviletid begynder</string>
<string name="rmd_EPr_quiet_hours_end_title">Hviletid slutter</string>
<string name="rmd_EPr_defaultRemind_title">Tilfældige påmindelser</string>
<string name="repeat_forever">Gentag uendeligt</string>
<string name="repeat_until">Gentag indtil %s</string>
<string name="delete_task">Slet opgave</string>
<plurals name="Ntasks">
<item quantity="one">1 opgave</item>
@ -84,7 +82,6 @@
<string name="quiet_hours">Hviletid</string>
<string name="widget_show_header">Vis topbjælke</string>
<string name="voice_command_added_task">Tilføjede en opgave</string>
<string name="repeat_occurs">Stopper efter</string>
<string name="CFC_gtasks_list_name">På Google Huskelisten…</string>
<string name="gtasks_error_accountNotFound">Kontoen %s ikke fundet. Prøv at logge ud og logge ind igen gennem Google Huskeliste-indstillingerne.</string>
<string name="EPr_show_task_edit_comments">Vis kommentarer i opgaveredigering</string>
@ -220,7 +217,6 @@
<string name="repeat_monthly_third_week">tredje</string>
<string name="repeat_monthly_second_week">anden</string>
<string name="repeat_monthly_first_week">første</string>
<string name="repeat_monthly_same_day_each_month">på samme dag hver måned</string>
<string name="bundle_notifications_summary">Saml flere notifikationer i én</string>
<string name="badges_description">Vis en opgavetæller på Tasks app-ikon. Ikke alle platforme understøtter badges.</string>
<string name="default_calendar">Standardkalender</string>
@ -362,7 +358,6 @@
<string name="upgrade_to_pro">Opgrader til pro</string>
<string name="refresh_purchases">Opdater køb</string>
<string name="manage_subscription">Administrer abonnement</string>
<string name="repeat_monthly_on_every_day_of_nth_week">hver %1$s i %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">hver %1$s i %2$s</string>
<string name="repeats_plural_on_number_of_times">Gentages %2$s hver %1$s, stopper efter %3$d %4$s</string>
<string name="repeats_plural_on_until">Gentages %2$s hver %1$s indtil %3$s</string>
@ -384,7 +379,6 @@
<string name="new_list">Opret ny liste</string>
<string name="new_tag">Opret nyt tag</string>
<string name="repeat_snackbar">%1$s er planlagt næste gang til %2$s</string>
<string name="repeat_number_of_times">Gentag et bestemt antal gange</string>
<string name="repeat_type_completion">udført-dato</string>
<string name="repeat_type_due">frist-dato</string>
<plurals name="repeat_n_years">
@ -447,19 +441,12 @@
<item quantity="one">%d opgave</item>
<item quantity="other">%d opgaver</item>
</plurals>
<string name="repeat_yearly">Gentag årligt</string>
<string name="repeat_monthly">Gentag månedligt</string>
<string name="repeat_weekly">Gentag ugentligt</string>
<string name="repeat_daily">Gentag dagligt</string>
<string name="repeat_hourly">Gentag hver time</string>
<string name="repeat_minutely">Gentag hvert minut</string>
<string name="repeat_option_custom">Tilpas…</string>
<string name="repeat_option_every_year">Hvert år</string>
<string name="repeat_option_every_month">Hver måned</string>
<string name="repeat_option_every_week">Hver uge</string>
<string name="repeat_option_every_day">Hver dag</string>
<string name="repeat_option_does_not_repeat">Gentages ikke</string>
<string name="repeat_every">Hver</string>
<string name="default_random_reminder_bi_weekly">Hver anden uge</string>
<string name="default_random_reminder_weekly">Ugentligt</string>
<string name="default_random_reminder_daily">Dagligt</string>

@ -142,19 +142,12 @@
<string name="default_random_reminder_daily">täglich</string>
<string name="default_random_reminder_weekly">wöchentlich</string>
<string name="default_random_reminder_bi_weekly">vierzehntägig</string>
<string name="repeat_every">Jede(n, -s)</string>
<string name="repeat_option_does_not_repeat">Wiederholt sich nicht</string>
<string name="repeat_option_every_day">Jeden Tag</string>
<string name="repeat_option_every_week">Jede Woche</string>
<string name="repeat_option_every_month">Jeden Monat</string>
<string name="repeat_option_every_year">Jedes Jahr</string>
<string name="repeat_option_custom">Eigene…</string>
<string name="repeat_minutely">Minütlich wiederholen</string>
<string name="repeat_hourly">Stündlich wiederholen</string>
<string name="repeat_daily">Täglich wiederholen</string>
<string name="repeat_weekly">Wöchentlich wiederholen</string>
<string name="repeat_monthly">Monatlich wiederholen</string>
<string name="repeat_yearly">Jährlich wiederholen</string>
<plurals name="task_count">
<item quantity="one">%d Aufgabe</item>
<item quantity="other">%d Aufgaben</item>
@ -213,10 +206,6 @@
</plurals>
<string name="repeat_type_due">Fälligkeitsdatum</string>
<string name="repeat_type_completion">Erledigung</string>
<string name="repeat_forever">Endlos wiederholen</string>
<string name="repeat_until">Wiederholen bis %s</string>
<string name="repeat_number_of_times">N-mal wiederholen</string>
<string name="repeat_occurs">Erscheint</string>
<string name="repeat_snackbar">%1$s neu geplant für %2$s</string>
<string name="new_tag">Neues Schlagwort erstellen</string>
<string name="new_list">Neue Liste erstellen</string>
@ -364,9 +353,7 @@
<string name="default_calendar">Standardkalender</string>
<string name="badges_description">Anzeige eines Aufgabenzählers am Tasks Launcher Icon. Nicht alle Launcher unterstützen Badges.</string>
<string name="bundle_notifications_summary">Mehrere Benachrichtigungen in einer zusammenfassen</string>
<string name="repeat_monthly_same_day_each_month">am selben Tag des Monats</string>
<string name="repeat_monthly_every_day_of_nth_week">jeden %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">an jedem %1$s %2$s</string>
<string name="repeat_monthly_first_week">ersten</string>
<string name="repeat_monthly_second_week">zweiten</string>
<string name="repeat_monthly_third_week">dritten</string>

@ -111,8 +111,6 @@
<string name="default_random_reminder_daily">Ημερήσια</string>
<string name="default_random_reminder_weekly">Εβδομαδιαία</string>
<string name="default_random_reminder_bi_weekly">κάθε δυο εβδομάδες</string>
<string name="repeat_forever">Επανάληψη επ\'αορίστου</string>
<string name="repeat_until">Επανάληψη μέχρι %s</string>
<string name="TPl_notification">Χρονοδιακόπτες ενεργοί για %s!</string>
<string name="TFE_workingOn">Καθήκοντα με χρονικό όριο</string>
<string name="TEA_timer_controls">Χρονοδιακόπτης</string>
@ -136,7 +134,6 @@
<string name="add_reminder">Προσθήκη υπενθύμισης</string>
<string name="email">Ηλε. ταχυδρομείο</string>
<string name="repeat_option_does_not_repeat">Δεν επαναλαμβάνεται</string>
<string name="repeat_every">Κάθε</string>
<string name="astrid_sort_order">Μη αυτόματη ταξινόμηση Astrid</string>
<string name="SSD_sort_my_order">Η παραγγελία μου</string>
<string name="action_open">Ανοίξτε το</string>

@ -113,19 +113,10 @@
<string name="repeat_option_every_month">Ĉiumonate</string>
<string name="repeat_option_every_day">Ĉiutage</string>
<string name="repeat_option_every_week">Ĉiusemajne</string>
<string name="repeat_every">Ĉiu</string>
<string name="repeat_option_does_not_repeat">Ne ripetas</string>
<string name="repeat_monthly_on_every_day_of_nth_week">je ĉia %1$s %2$s</string>
<string name="repeat_monthly_same_day_each_month">je la sama tago ĉiumonate</string>
<string name="repeat_monthly_every_day_of_nth_week">ĉia %1$s %2$s</string>
<string name="filter_today_only">Nur hodiaŭ</string>
<string name="chip_appearance_text_only">Nur teksto</string>
<string name="repeat_yearly">RIPETI ĈIUJARE</string>
<string name="repeat_monthly">RIPETI ĈIUMONATE</string>
<string name="repeat_weekly">RIPETI ĈIUSEMAJNE</string>
<string name="repeat_daily">RIPETI ĈIUTAGE</string>
<string name="repeat_hourly">RIPETI ĈIUHORE</string>
<string name="repeat_minutely">RIPETI ĈIUMINUTE</string>
<string name="repeat_monthly_last_week">lasta</string>
<string name="repeat_monthly_fifth_week">kvina</string>
<string name="repeat_monthly_fourth_week">kvara</string>
@ -308,7 +299,6 @@
<string name="new_list">Krei novan liston</string>
<string name="new_tag">Krei novan etikedon</string>
<string name="repeat_snackbar">%1$s tempe replanis al %2$s</string>
<string name="repeat_until">Ripeti ĝis %s</string>
<plurals name="repeat_n_years">
<item quantity="one">%d jaro</item>
<item quantity="other">%d jaroj</item>
@ -371,7 +361,6 @@
<string name="pick_this_location">Elekti ĉi tiun lokon</string>
<string name="when_overdue">Kiam malfrua</string>
<string name="auto_dismiss_datetime_list_summary">Aŭtomate fermi kiam elekti per tasklisto</string>
<string name="repeat_forever">Ripeti ĉiame</string>
<string name="show_unstarted">Montri nekomencitajn</string>
<string name="sort_modified_group">Modifita %s</string>
<string name="auto_dismiss_datetime_edit_summary">Aŭtomate fermi kiam elekti per taska redakto</string>

@ -142,19 +142,12 @@
<string name="default_random_reminder_daily">Diariamente</string>
<string name="default_random_reminder_weekly">Semanalmente</string>
<string name="default_random_reminder_bi_weekly">Quincenalmente</string>
<string name="repeat_every">Cada</string>
<string name="repeat_option_does_not_repeat">No repetir</string>
<string name="repeat_option_every_day">Cada día</string>
<string name="repeat_option_every_week">Cada semana</string>
<string name="repeat_option_every_month">Cada mes</string>
<string name="repeat_option_every_year">Cada año</string>
<string name="repeat_option_custom">Personalizado…</string>
<string name="repeat_minutely">REPETIR CADA MINUTO</string>
<string name="repeat_hourly">REPETIR CADA HORA</string>
<string name="repeat_daily">REPETIR DIARIAMENTE</string>
<string name="repeat_weekly">REPETIR SEMANALMENTE</string>
<string name="repeat_monthly">REPETIR MENSUALMENTE</string>
<string name="repeat_yearly">REPETIR ANUALMENTE</string>
<plurals name="task_count">
<item quantity="one">%d tarea</item>
<item quantity="many">%d tareas</item>
@ -227,10 +220,6 @@
</plurals>
<string name="repeat_type_due">fecha límite</string>
<string name="repeat_type_completion">fecha de finalización</string>
<string name="repeat_forever">Repetir por siempre</string>
<string name="repeat_until">Repetir hasta %s</string>
<string name="repeat_number_of_times">Repetir un número de veces</string>
<string name="repeat_occurs">Número de repeticiones</string>
<string name="repeat_snackbar">%1$s He reprogramado esta tarea recurrente para %2$s</string>
<string name="new_tag">Crear nueva etiqueta</string>
<string name="new_list">Crea una nueva lista</string>
@ -382,9 +371,7 @@
<string name="default_calendar">Calendario predeterminado</string>
<string name="badges_description">Muestre un recuento de tareas en el icono de iniciador de Tasks. No todos los iniciadores admiten insignias de notificación.</string>
<string name="bundle_notifications_summary">Combinar múltiples notificaciones en una sola</string>
<string name="repeat_monthly_same_day_each_month">el mismo día cada mes</string>
<string name="repeat_monthly_every_day_of_nth_week">cada %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">cada %1$s %2$s</string>
<string name="repeat_monthly_first_week">primer</string>
<string name="repeat_monthly_second_week">segundo</string>
<string name="repeat_monthly_third_week">tercer</string>

@ -109,7 +109,6 @@
<string name="rmd_EPr_rmd_time_title">Vaikimisi meeldetuletus</string>
<string name="persistent_notifications">Püsiv meeldetuletus</string>
<string name="default_random_reminder_disabled">Välja lülitatud</string>
<string name="repeat_every">Iga</string>
<string name="repeat_option_does_not_repeat">Ei kordu</string>
<string name="repeat_option_every_day">Iga päev</string>
<string name="repeat_option_every_week">Iga nädal</string>
@ -117,9 +116,6 @@
<string name="repeat_option_every_year">Iga aasta</string>
<string name="repeat_option_custom">Kohandatud…</string>
<string name="repeat_type_completion">lõpetamise kuupäev</string>
<string name="repeat_forever">Korda igavesti</string>
<string name="repeat_until">Korda kuni %s</string>
<string name="repeat_number_of_times">Korda määratud arv kordi</string>
<string name="new_list">Loo uus nimekiri</string>
<string name="TEA_timer_controls">Taimer</string>
<string name="delete_task">Kustuta ülesanne</string>

@ -144,19 +144,12 @@
<string name="default_random_reminder_daily">Egunero</string>
<string name="default_random_reminder_weekly">Astero</string>
<string name="default_random_reminder_bi_weekly">Bi astean behin</string>
<string name="repeat_every">Errepikapena</string>
<string name="repeat_option_does_not_repeat">Ez errepikatu</string>
<string name="repeat_option_every_day">Egunero</string>
<string name="repeat_option_every_week">Astero</string>
<string name="repeat_option_every_month">Hilabetero</string>
<string name="repeat_option_every_year">Urtero</string>
<string name="repeat_option_custom">Pertsonalizatua…</string>
<string name="repeat_minutely">ERREPIKATU MINUTUKO</string>
<string name="repeat_hourly">ERREPIKATU ORDUKO</string>
<string name="repeat_daily">ERREPIKATU EGUNEKO</string>
<string name="repeat_weekly">ERREPIKATU ASTEKO</string>
<string name="repeat_monthly">ERREPIKATU HILABETEKO</string>
<string name="repeat_yearly">ERREPIKATU URTEKO</string>
<plurals name="task_count">
<item quantity="one">Zeregin %d</item>
<item quantity="other">%d zeregin</item>
@ -215,10 +208,6 @@
</plurals>
<string name="repeat_type_due">epemuga-data</string>
<string name="repeat_type_completion">burutze-data</string>
<string name="repeat_forever">Errepikatu betirako</string>
<string name="repeat_until">Errepikatu %s arte</string>
<string name="repeat_number_of_times">Errepikatu aldi kopuru bat</string>
<string name="repeat_occurs">Errepikapenak</string>
<string name="repeat_snackbar">%1$s %2$s-rako programatuta</string>
<string name="new_tag">Sortu etiketa berria</string>
<string name="new_list">Sortu zerrenda berria</string>
@ -373,9 +362,7 @@
<string name="default_calendar">Lehenetsitako egutegia</string>
<string name="badges_description">Bistaratu zeregin kopurua abiarazleko Tasks ikonoan. Abiarazle guztiek ez dituzte dominak onartzen.</string>
<string name="bundle_notifications_summary">Taldekatu hainbat jakinarazpen batean</string>
<string name="repeat_monthly_same_day_each_month">egun berean hilero</string>
<string name="repeat_monthly_every_day_of_nth_week">%1$s %2$s bakoitzean</string>
<string name="repeat_monthly_on_every_day_of_nth_week">%1$s %2$s bakoitzean</string>
<string name="repeat_monthly_first_week">lehen</string>
<string name="repeat_monthly_second_week">bigarren</string>
<string name="repeat_monthly_third_week">hirugarren</string>

@ -124,8 +124,6 @@
</plurals>
<string name="repeat_type_due">تاریخ موعود</string>
<string name="repeat_type_completion">تاریخ اتمام</string>
<string name="repeat_forever">تکرار بینهایت</string>
<string name="repeat_until">تکرار تا %s</string>
<string name="new_tag">ایجاد تگ جدید</string>
<string name="new_list">ایجاد لیست جدید</string>
<string name="TFE_workingOn">وظایف زمانبندی شده</string>

@ -134,19 +134,12 @@
<string name="default_random_reminder_daily">Päivittäin</string>
<string name="default_random_reminder_weekly">Viikoittain</string>
<string name="default_random_reminder_bi_weekly">Jokatoinen viikko</string>
<string name="repeat_every">Joka</string>
<string name="repeat_option_does_not_repeat">Älä toista</string>
<string name="repeat_option_every_day">Joka päivä</string>
<string name="repeat_option_every_week">Joka viikko</string>
<string name="repeat_option_every_month">Joka kuukausi</string>
<string name="repeat_option_every_year">Joka vuosi</string>
<string name="repeat_option_custom">Valinnainen…</string>
<string name="repeat_minutely">TOISTA MINUUTEITTAIN</string>
<string name="repeat_hourly">TOISTA TUNNEITTAIN</string>
<string name="repeat_daily">TOISTA PÄIVITTÄIN</string>
<string name="repeat_weekly">TOISTA VIIKOTTAIN</string>
<string name="repeat_monthly">TOISTA KUUKAUSITTAIN</string>
<string name="repeat_yearly">TOISTA VUOSITTAIN</string>
<plurals name="task_count">
<item quantity="one">%d tehtävä</item>
<item quantity="other">%d tehtävät</item>
@ -205,10 +198,6 @@
</plurals>
<string name="repeat_type_due">Määräpäivä</string>
<string name="repeat_type_completion">valmistumispäivä</string>
<string name="repeat_forever">Toista loputtomiin</string>
<string name="repeat_until">Toista kunnes %s</string>
<string name="repeat_number_of_times">Toista useita kertoja</string>
<string name="repeat_occurs">Tapahtuu</string>
<string name="repeat_snackbar">%1$s uudelleenajastettu %2$s</string>
<string name="new_tag">Luo uusi tunniste</string>
<string name="new_list">Luo uusi lista</string>
@ -347,9 +336,7 @@
<string name="default_calendar">Oletus kalenteri</string>
<string name="badges_description">Näytä tehtävien lukumäärä Tasksin käynnistyskuvakkeessa. Kaikki käynnistimet eivät tue merkkejä.</string>
<string name="bundle_notifications_summary">Yhdistä useita ilmoituksia yhdeksi</string>
<string name="repeat_monthly_same_day_each_month">sama päivä joka kuukausi</string>
<string name="repeat_monthly_every_day_of_nth_week">joka %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">jokaisella %1$s %2$s</string>
<string name="repeat_monthly_first_week">ensimmäinen</string>
<string name="repeat_monthly_second_week">toinen</string>
<string name="repeat_monthly_third_week">kolmas</string>

@ -135,19 +135,12 @@
<string name="default_random_reminder_daily">chaque jour</string>
<string name="default_random_reminder_weekly">hebdomadaire</string>
<string name="default_random_reminder_bi_weekly">bi-hebdomadaire</string>
<string name="repeat_every">Tou(te)s les</string>
<string name="repeat_option_does_not_repeat">Ne pas répéter</string>
<string name="repeat_option_every_day">Tous les jours</string>
<string name="repeat_option_every_week">Toutes les semaines</string>
<string name="repeat_option_every_month">Tous les mois</string>
<string name="repeat_option_every_year">Tous les ans</string>
<string name="repeat_option_custom">Personnalisé…</string>
<string name="repeat_minutely">Répéter toutes les minutes</string>
<string name="repeat_hourly">Répéter toutes les heures</string>
<string name="repeat_daily">Répéter tous les jours</string>
<string name="repeat_weekly">Répéter toutes les semaines</string>
<string name="repeat_monthly">Répéter tous les mois</string>
<string name="repeat_yearly">Répéter tous les ans</string>
<plurals name="task_count">
<item quantity="one">%d tâche</item>
<item quantity="many">%d tâches</item>
@ -210,10 +203,6 @@
</plurals>
<string name="repeat_type_due">date d\'échéance</string>
<string name="repeat_type_completion">date d\'achèvement</string>
<string name="repeat_forever">Répéter indéfiniment</string>
<string name="repeat_until">Répéter jusqu\'à %s</string>
<string name="repeat_number_of_times">Nombre de répétitions</string>
<string name="repeat_occurs">Se répète</string>
<string name="repeat_snackbar">%1$s replanifiée à %2$s</string>
<string name="new_tag">Créer une nouvelle étiquette</string>
<string name="new_list">Créer une nouvelle liste</string>
@ -362,9 +351,7 @@
<string name="default_calendar">Calendrier par défaut</string>
<string name="badges_description">Afficher un compteur de tâche sur l\'icône du lanceur de Tasks. Certains lanceurs ne supportent pas les badges.</string>
<string name="bundle_notifications_summary">Combiner plusieurs notifications en une seule</string>
<string name="repeat_monthly_same_day_each_month">le même jour chaque mois</string>
<string name="repeat_monthly_every_day_of_nth_week">tous les %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">tous les %1$s %2$s</string>
<string name="repeat_monthly_first_week">première</string>
<string name="repeat_monthly_second_week">seconde</string>
<string name="repeat_monthly_third_week">troisième</string>

@ -138,8 +138,6 @@
<string name="default_random_reminder_daily">Diariamente</string>
<string name="default_random_reminder_weekly">Semanalmente</string>
<string name="default_random_reminder_bi_weekly">Quincenalmente</string>
<string name="repeat_forever">Repetir de por sempre</string>
<string name="repeat_until">Repetir ata o %s</string>
<string name="repeat_snackbar">%1$s reprogramou esta tarefa para %2$s</string>
<string name="new_tag">Crear nova etiqueta</string>
<string name="new_list">Crea unha nova lista</string>
@ -327,8 +325,6 @@
<string name="repeat_option_every_week">Todas as semanas</string>
<string name="repeat_option_every_month">Todos os meses</string>
<string name="repeat_option_custom">Personalizado…</string>
<string name="repeat_minutely">REPETIR POR MINUTOS</string>
<string name="repeat_daily">REPETIR POR DÍAS</string>
<plurals name="task_count">
<item quantity="one">%d tarefa</item>
<item quantity="other">%d tarefas</item>
@ -341,7 +337,6 @@
<item quantity="one">tempo</item>
<item quantity="other">tempos</item>
</plurals>
<string name="repeat_number_of_times">Repetir un número de veces</string>
<string name="tomorrow_lowercase">mañá</string>
<string name="next_tuesday">Próx Mar</string>
<string name="next_wednesday">Próx Mér</string>
@ -354,7 +349,6 @@
<string name="action_create_new_task">Crear nova tarefa</string>
<string name="show_description">Amosar descrición</string>
<string name="repeats_plural_on">Repetir cada %1$s en %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">en cada %1$s %2$s</string>
<string name="cannot_access_account">Non se pode acceder á conta</string>
<string name="location_remind_arrival">Recordatorio de chegada</string>
<string name="location_remind_departure">Recordatorio de saída</string>
@ -424,7 +418,6 @@
<string name="repeats_hourly">por hora</string>
<string name="repeats_plural_on_until">Repetir cada %1$s en %2$s ata %3$s</string>
<string name="repeats_plural_on_number_of_times">Repetir cada %1$s o %2$s, ocorre que %3$d %4$s</string>
<string name="repeat_monthly_same_day_each_month">no mesmo día de cada mes</string>
<string name="license_summary">Tasks é software de código aberto, con licenza baixo a GNU General Public License v3.0</string>
<string name="requires_pro_subscription">Precísase dunha suscrición pro</string>
<string name="this_feature_requires_a_subscription">Esta característica necesita dunha suscrición</string>
@ -511,12 +504,7 @@
<string name="default_location_reminder_on_arrival_or_departure">Á chegada e á saída</string>
<string name="no_start_date">Sen data de inicio</string>
<string name="snooze_all">Pospoñer todo</string>
<string name="repeat_every">Todo</string>
<string name="repeat_option_every_year">Todos os anos</string>
<string name="repeat_hourly">REPETIR POR HORAS</string>
<string name="repeat_weekly">REPETIR POR SEMANAS</string>
<string name="repeat_monthly">REPETIR POR MESES</string>
<string name="repeat_yearly">REPETIR POR ANOS</string>
<string name="google_drive_backup">Seguranza en Google Drive</string>
<string name="url_required">Precísase a URL</string>
<string name="opacity_row">Opacidade da fila</string>
@ -599,7 +587,6 @@
<string name="alarm_after_start">%s despois do inicio</string>
<string name="alarm_before_due">%s antes do límite</string>
<string name="alarm_after_due">%s despois do límite</string>
<string name="repeat_occurs">Ocorre</string>
<string name="CFC_startBefore_text">Comeza con: \?</string>
<string name="CFC_startBefore_name">Comezar por…</string>
<string name="filter_any_start_date">Calquera data de inicio</string>

@ -312,9 +312,7 @@
<string name="repeat_monthly_third_week">treći</string>
<string name="repeat_monthly_second_week">drugi</string>
<string name="repeat_monthly_first_week">prvi</string>
<string name="repeat_monthly_on_every_day_of_nth_week">na svaki %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">svaki %1$s %2$s</string>
<string name="repeat_monthly_same_day_each_month">na isti dan svaki mjesec</string>
<string name="bundle_notifications_summary">Spoji više obavijesti u jednu</string>
<string name="badges_description">Prikaži broj zadataka na ikoni pokretača programa Tasks. Neki pokretači ne podržavaju značke.</string>
<string name="default_calendar">Standardni kalendar</string>
@ -452,13 +450,6 @@
<item quantity="few">%d zadatka</item>
<item quantity="other">%d zadataka</item>
</plurals>
<string name="repeat_yearly">PONAVLJAJ GODIŠNJE</string>
<string name="repeat_monthly">PONAVLJAJ MJESEČNO</string>
<string name="repeat_weekly">PONAVLJAJ TJEDNO</string>
<string name="repeat_daily">PONAVLJAJ DNEVNO</string>
<string name="repeat_hourly">PONAVLJAJ SVAKI SAT</string>
<string name="repeat_minutely">PONAVLJAJ SVAKE MINUTE</string>
<string name="repeat_every">Svakih</string>
<string name="default_random_reminder_bi_weekly">Dvotjedno</string>
<string name="default_random_reminder_weekly">Tjedno</string>
<string name="default_random_reminder_daily">Dnevno</string>
@ -611,10 +602,6 @@
<string name="TPl_notification">Mjerači vremena aktivni za %s!</string>
<string name="delete_tag_confirmation">Izbrisati %s\?</string>
<string name="repeat_snackbar">%1$s preraspoređen za %2$s</string>
<string name="repeat_occurs">Pojavljivanja</string>
<string name="repeat_number_of_times">Ponavljaj x-puta</string>
<string name="repeat_until">Ponavljaj do %s</string>
<string name="repeat_forever">Ponavljaj zauvijek</string>
<string name="repeat_type_completion_capitalized">Datum obavljanja</string>
<string name="repeat_type_completion">datum obavljanja</string>
<string name="repeat_type_due">datum roka</string>

@ -141,19 +141,12 @@
<string name="default_random_reminder_daily">Naponta</string>
<string name="default_random_reminder_weekly">Hetente</string>
<string name="default_random_reminder_bi_weekly">Kéthetente</string>
<string name="repeat_every">Minden</string>
<string name="repeat_option_does_not_repeat">Nincs ismétlés</string>
<string name="repeat_option_every_day">Minden nap</string>
<string name="repeat_option_every_week">Minden héten</string>
<string name="repeat_option_every_month">Minden hónapban</string>
<string name="repeat_option_every_year">Minden évben</string>
<string name="repeat_option_custom">Egyéni…</string>
<string name="repeat_minutely">ISMÉTLÉS PERCENKÉNT</string>
<string name="repeat_hourly">ISMÉTLÉS ÓRÁNKÉNT</string>
<string name="repeat_daily">ISMÉTLÉS NAPONTA</string>
<string name="repeat_weekly">ISMÉTLÉS HETENTE</string>
<string name="repeat_monthly">ISMÉTLÉS HAVONTA</string>
<string name="repeat_yearly">ISMÉTLÉS ÉVENTE</string>
<plurals name="task_count">
<item quantity="one">%d feladat</item>
<item quantity="other">%d feladat</item>
@ -212,10 +205,6 @@
</plurals>
<string name="repeat_type_due">határidő</string>
<string name="repeat_type_completion">befejezés dátuma</string>
<string name="repeat_forever">Ismétlés örökké</string>
<string name="repeat_until">Ismétlés eddig: %s</string>
<string name="repeat_number_of_times">Ismétlés meghatározott alkalommal</string>
<string name="repeat_occurs">Előfordul</string>
<string name="repeat_snackbar">%1$s újraütemezve ekkorra: %2$s</string>
<string name="new_tag">Új címke létrehozása</string>
<string name="new_list">Új lista létrehozása</string>
@ -368,9 +357,7 @@
<string name="default_calendar">Alapértelmezett naptár</string>
<string name="badges_description">Feladatok számának megjelenítése a Tasks ikonon. Nem minden launcher által támogatott funkció.</string>
<string name="bundle_notifications_summary">Több értesítés összevonása eggyé</string>
<string name="repeat_monthly_same_day_each_month">minden hónap egyazon napján</string>
<string name="repeat_monthly_every_day_of_nth_week">minden %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">minden %1$s %2$s</string>
<string name="repeat_monthly_first_week">első</string>
<string name="repeat_monthly_second_week">második</string>
<string name="repeat_monthly_third_week">harmadik</string>

@ -101,19 +101,12 @@
<string name="default_random_reminder_daily">Harian</string>
<string name="default_random_reminder_weekly">Mingguan</string>
<string name="default_random_reminder_bi_weekly">Dua mingguan</string>
<string name="repeat_every">Setiap</string>
<string name="repeat_option_does_not_repeat">Tidak berulang</string>
<string name="repeat_option_every_day">Setiap hari</string>
<string name="repeat_option_every_week">Setiap minggu</string>
<string name="repeat_option_every_month">Setiap bulan</string>
<string name="repeat_option_every_year">Setiap tahun</string>
<string name="repeat_option_custom">Khusus…</string>
<string name="repeat_minutely">ULANGI PER MENIT</string>
<string name="repeat_hourly">ULANGI PER JAM</string>
<string name="repeat_daily">ULANGI HARIAN</string>
<string name="repeat_weekly">ULANGI MINGGUAN</string>
<string name="repeat_monthly">ULANGI BULANAN</string>
<string name="repeat_yearly">ULANGI TAHUNAN</string>
<plurals name="task_count">
<item quantity="other">%d tugas</item>
</plurals>
@ -158,9 +151,6 @@
</plurals>
<string name="repeat_type_due">tanggal jatuh tempo</string>
<string name="repeat_type_completion">tanggal selesai</string>
<string name="repeat_forever">Ulangi selamanya</string>
<string name="repeat_until">Ulangi sampai %s</string>
<string name="repeat_number_of_times">Ulangi beberapa kali</string>
<string name="new_tag">Buat tag baru</string>
<string name="new_list">Buat daftar baru</string>
<string name="delete_tag_confirmation">Hapus %s\?</string>
@ -309,7 +299,6 @@
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks akan mengucapkan nama tugas selama pengingat tugas berjalan</string>
<string name="badges_description">Tampilkan jumlah tugas pada ikon peluncur Tasks. Tidak semua peluncur mendukung fitur lencana ini.</string>
<string name="bundle_notifications_summary">Gabung beberapa notifikasi menjadi satu</string>
<string name="repeat_monthly_same_day_each_month">pada hari yang sama setiap bulan</string>
<string name="repeat_monthly_first_week">pertama</string>
<string name="repeat_monthly_second_week">kedua</string>
<string name="repeat_monthly_third_week">ketiga</string>
@ -566,7 +555,6 @@
<string name="subscription">Langganan</string>
<string name="caldav_home_set_not_found">Set beranda tidak ditemukan</string>
<string name="repeat_monthly_fifth_week">kelima</string>
<string name="repeat_monthly_on_every_day_of_nth_week">pada setiap %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">setiap %1$s %2$s</string>
<string name="repeats_plural_on_until">Ulangi setiap %1$s pada %2$s sampai %3$s</string>
<string name="repeats_plural_on">Ulangi setiap %1$s pada %2$s</string>
@ -589,7 +577,6 @@
<string name="TFE_workingOn">Tugas yang Dicatat Waktu</string>
<string name="TPl_notification">Pencatat Waktu Aktif untuk %s!</string>
<string name="repeat_snackbar">%1$s dijadwalkan ulang untuk %2$s</string>
<string name="repeat_occurs">Terjadi</string>
<string name="repeat_type_completion_capitalized">tanggal selesai</string>
<string name="persistent_notifications_description">Notifikasi tetap tidak dapat dihapus</string>
<string name="rmd_EPr_rmd_time_desc">Notifikasi untuk tugas tanpa waktu jatuh tempo akan muncul pada %s</string>

@ -144,19 +144,12 @@
<string name="default_random_reminder_daily">Quotidianamente</string>
<string name="default_random_reminder_weekly">Settimanale</string>
<string name="default_random_reminder_bi_weekly">Bisettimanale</string>
<string name="repeat_every">Ogni</string>
<string name="repeat_option_does_not_repeat">Non si ripete</string>
<string name="repeat_option_every_day">Ogni giorno</string>
<string name="repeat_option_every_week">Ogni settimana</string>
<string name="repeat_option_every_month">Ogni mese</string>
<string name="repeat_option_every_year">Ogni anno</string>
<string name="repeat_option_custom">Personalizzato…</string>
<string name="repeat_minutely">RIPETI OGNI MINUTO</string>
<string name="repeat_hourly">RIPETI OGNI ORA</string>
<string name="repeat_daily">RIPETI OGNI GIORNO</string>
<string name="repeat_weekly">RIPETI OGNI SETTIMANA</string>
<string name="repeat_monthly">RIPETI OGNI MESE</string>
<string name="repeat_yearly">RIPETI OGNI ANNO</string>
<plurals name="task_count">
<item quantity="one">%d attività</item>
<item quantity="many">%d attività</item>
@ -229,10 +222,6 @@
</plurals>
<string name="repeat_type_due">data di scadenza</string>
<string name="repeat_type_completion">data di completamento</string>
<string name="repeat_forever">Ripeti all\'infinito</string>
<string name="repeat_until">Ripeti fino a %s</string>
<string name="repeat_number_of_times">Ripeti un dato numero di volte</string>
<string name="repeat_occurs">Si ripete</string>
<string name="repeat_snackbar">%1$s ripianificata per %2$s</string>
<string name="new_tag">Crea nuova etichetta</string>
<string name="new_list">Crea nuova lista</string>
@ -383,9 +372,7 @@
<string name="default_calendar">Calendario predefinito</string>
<string name="badges_description">Mostra il contatore delle notifiche sull\'icona di Tasks. Non tutti i launcher supportano questa funzionalità.</string>
<string name="bundle_notifications_summary">Combina diverse notifiche in una sola</string>
<string name="repeat_monthly_same_day_each_month">lo stesso giorno di ogni mese</string>
<string name="repeat_monthly_every_day_of_nth_week">ogni %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">ogni %1$s %2$s</string>
<string name="repeat_monthly_first_week">primo</string>
<string name="repeat_monthly_second_week">secondo</string>
<string name="repeat_monthly_third_week">terzo</string>

@ -144,19 +144,12 @@
<string name="default_random_reminder_daily">יומי</string>
<string name="default_random_reminder_weekly">שבועי</string>
<string name="default_random_reminder_bi_weekly">דו שבועי</string>
<string name="repeat_every">כל</string>
<string name="repeat_option_does_not_repeat">לא חוזר</string>
<string name="repeat_option_every_day">כל יום</string>
<string name="repeat_option_every_week">כל שבוע</string>
<string name="repeat_option_every_month">כל חודש</string>
<string name="repeat_option_every_year">כל שנה</string>
<string name="repeat_option_custom">התאמה אישית…</string>
<string name="repeat_minutely">חזרה בדקות</string>
<string name="repeat_hourly">חזרה בשעות</string>
<string name="repeat_daily">חזרה בימים</string>
<string name="repeat_weekly">חזרה בשבועות</string>
<string name="repeat_monthly">חזרה בחודשים</string>
<string name="repeat_yearly">חזרה בשנים</string>
<plurals name="task_count">
<item quantity="one">%d משימה</item>
<item quantity="two">%d משימות</item>
@ -243,10 +236,6 @@
</plurals>
<string name="repeat_type_due">תאריך יעד</string>
<string name="repeat_type_completion">תאריך סיום</string>
<string name="repeat_forever">חזור לנצח</string>
<string name="repeat_until">חזרה עד %s</string>
<string name="repeat_number_of_times">חוזר מספר פעמים</string>
<string name="repeat_occurs">קורה</string>
<string name="repeat_snackbar">%1$s תזמן מחדש משימה חוזרת זו ל־%2$s</string>
<string name="new_tag">יצירת תגית חדשה</string>
<string name="new_list">יצירת רשימה חדשה</string>
@ -402,9 +391,7 @@
<string name="default_calendar">יומן ברירת מחדל</string>
<string name="badges_description">הצגת כמות המשימות על הסמל של Tasks במשגר. לא כל המשגרים תומכים בעיטורים.</string>
<string name="bundle_notifications_summary">שילוב מספר התראות באמת</string>
<string name="repeat_monthly_same_day_each_month">באותו היום בכל חודש</string>
<string name="repeat_monthly_every_day_of_nth_week">בכל %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">בכל %1$s %2$s</string>
<string name="repeat_monthly_first_week">ראשון</string>
<string name="repeat_monthly_second_week">שני</string>
<string name="repeat_monthly_third_week">שלישי</string>

@ -149,19 +149,12 @@
<string name="default_random_reminder_daily">毎日</string>
<string name="default_random_reminder_weekly">毎週</string>
<string name="default_random_reminder_bi_weekly">1 週間おき</string>
<string name="repeat_every"></string>
<string name="repeat_option_does_not_repeat">繰り返ししない</string>
<string name="repeat_option_every_day">毎日</string>
<string name="repeat_option_every_week">毎週</string>
<string name="repeat_option_every_month">毎月</string>
<string name="repeat_option_every_year">毎年</string>
<string name="repeat_option_custom">カスタム…</string>
<string name="repeat_minutely">毎分繰り返す</string>
<string name="repeat_hourly">毎時間繰り返す</string>
<string name="repeat_daily">毎日繰り返す</string>
<string name="repeat_weekly">毎週繰り返す</string>
<string name="repeat_monthly">毎月繰り返す</string>
<string name="repeat_yearly">毎年繰り返す</string>
<plurals name="task_count">
<item quantity="other">タスク %d 件</item>
</plurals>
@ -217,10 +210,6 @@
</plurals>
<string name="repeat_type_due">締切日時</string>
<string name="repeat_type_completion">完了日</string>
<string name="repeat_forever">永久に繰り返す</string>
<string name="repeat_until">%s まで繰り返す</string>
<string name="repeat_number_of_times">繰り返し回数</string>
<string name="repeat_occurs">回数</string>
<string name="repeat_snackbar">%1$s を %2$s にスケジュール変更しました</string>
<string name="new_tag">新しいタグを作成</string>
<string name="new_list">新しいリストを作成</string>
@ -371,9 +360,7 @@
<string name="default_calendar">デフォルトのカレンダー</string>
<string name="badges_description">Tasksランチャーアイコンにタスク数を表示します。すべてのランチャーがバッジをサポートしているわけではありません。</string>
<string name="bundle_notifications_summary">複数の通知を1つの通知にまとめる</string>
<string name="repeat_monthly_same_day_each_month">毎月同じ日に</string>
<string name="repeat_monthly_every_day_of_nth_week">%1$s %2$s ごと</string>
<string name="repeat_monthly_on_every_day_of_nth_week">%1$s %2$s ごとに</string>
<string name="repeat_monthly_first_week">第一週</string>
<string name="repeat_monthly_second_week">第二週</string>
<string name="repeat_monthly_third_week">第三週</string>

@ -144,19 +144,12 @@
<string name="default_random_reminder_daily">매일</string>
<string name="default_random_reminder_weekly">매주</string>
<string name="default_random_reminder_bi_weekly">격주로</string>
<string name="repeat_every"></string>
<string name="repeat_option_does_not_repeat">반복하지 않기</string>
<string name="repeat_option_every_day">매일</string>
<string name="repeat_option_every_week">매주</string>
<string name="repeat_option_every_month">매월</string>
<string name="repeat_option_every_year">매년</string>
<string name="repeat_option_custom">사용자설정…</string>
<string name="repeat_minutely">매분 반복</string>
<string name="repeat_hourly">매시 반복</string>
<string name="repeat_daily">매일 반복</string>
<string name="repeat_weekly">매주 반복</string>
<string name="repeat_monthly">매월 반복</string>
<string name="repeat_yearly">매년 반복</string>
<plurals name="task_count">
<item quantity="one">%d 할일</item>
<item quantity="other">%d 할일들</item>
@ -215,10 +208,6 @@
</plurals>
<string name="repeat_type_due">마감일</string>
<string name="repeat_type_completion">완료일</string>
<string name="repeat_forever">계속 반복</string>
<string name="repeat_until">%s 까지 반복</string>
<string name="repeat_number_of_times">여러회 반복</string>
<string name="repeat_occurs">반복횟수</string>
<string name="repeat_snackbar">%1$s 이 %2$s 로 변경되었습니다</string>
<string name="new_tag">새 태그 만들기</string>
<string name="new_list">새 목록 만들기</string>
@ -368,9 +357,7 @@
<string name="default_calendar">기본 달력</string>
<string name="badges_description">Tasks 앱 아이콘 위에 할일 개수를 표시합니다. 모든 런처가 배지 기능을 지원하지는 않습니다. </string>
<string name="bundle_notifications_summary">여러 상태바 알림을 하나로 묶어서 표시합니다</string>
<string name="repeat_monthly_same_day_each_month">매월 같은 날에</string>
<string name="repeat_monthly_every_day_of_nth_week">매 %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">매 %1$s %2$s 마다</string>
<string name="repeat_monthly_first_week">첫번째</string>
<string name="repeat_monthly_second_week">두번째</string>
<string name="repeat_monthly_third_week">세번째</string>

@ -148,19 +148,12 @@
<string name="default_random_reminder_daily">Kas dieną</string>
<string name="default_random_reminder_weekly">Kas savaitę</string>
<string name="default_random_reminder_bi_weekly">Du kart savaitėje</string>
<string name="repeat_every">Kiekvieną</string>
<string name="repeat_option_does_not_repeat">Nekartoti</string>
<string name="repeat_option_every_day">Kiekvieną dieną</string>
<string name="repeat_option_every_week">Kiekvieną savaitę</string>
<string name="repeat_option_every_month">Kiekvieną mėnesį</string>
<string name="repeat_option_every_year">Kiekvienais metais</string>
<string name="repeat_option_custom">Individualizuotas…</string>
<string name="repeat_minutely">KARTOTI KAS MINUTĘ</string>
<string name="repeat_hourly">KARTOTI KAS VALANDĄ</string>
<string name="repeat_daily">KARTOTI KAS DIENĄ</string>
<string name="repeat_weekly">KARTOTI KAS SAVAITĘ</string>
<string name="repeat_monthly">KARTOTI KAS MĖNESĮ</string>
<string name="repeat_yearly">KARTOTI KAS METUS</string>
<plurals name="task_count">
<item quantity="one">%d užduotis</item>
<item quantity="few">%d užduotys</item>
@ -233,10 +226,6 @@
</plurals>
<string name="repeat_type_due">termino data</string>
<string name="repeat_type_completion">Užbaigimo data</string>
<string name="repeat_forever">Kartoti amžinai</string>
<string name="repeat_until">Kartoti iki %s</string>
<string name="repeat_number_of_times">Kartoti nustatytą kiekį kartų</string>
<string name="repeat_occurs">Įvyksta</string>
<string name="repeat_snackbar">%1$s perplanuotas šiai datai: %2$s</string>
<string name="new_tag">Sukurti naują etiketę</string>
<string name="new_list">Sukurti naują sąrašą</string>
@ -389,9 +378,7 @@
<string name="default_calendar">Numatytas kalendorius</string>
<string name="badges_description">Rodyti užduočių kiekį Tasks paleidimo piktogramoje. Ne visos paleidimo programos palaiko šią funkciją.</string>
<string name="bundle_notifications_summary">Sujungti kelis pranešimus į vieną</string>
<string name="repeat_monthly_same_day_each_month">Tą pačią mėnesio dieną</string>
<string name="repeat_monthly_every_day_of_nth_week">Kiekvieną %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">Kiekvieną %1$s %2$s</string>
<string name="repeat_monthly_first_week">pirmą</string>
<string name="repeat_monthly_second_week">antrą</string>
<string name="repeat_monthly_third_week">trečią</string>

@ -89,8 +89,6 @@
<item quantity="one">år</item>
<item quantity="other">år</item>
</plurals>
<string name="repeat_forever">Gjenta for alltid</string>
<string name="repeat_until">Gjenta til %s</string>
<string name="TPl_notification">%s har aktive tidtakere!</string>
<string name="TFE_workingOn">Gjøremål med tidtaker</string>
<string name="TEA_timer_controls">Nedtelling</string>
@ -229,19 +227,12 @@
<string name="default_random_reminder_daily">Daglig</string>
<string name="default_random_reminder_weekly">Ukentlig</string>
<string name="default_random_reminder_bi_weekly">Annenhver uke</string>
<string name="repeat_every">Hver</string>
<string name="repeat_option_does_not_repeat">Gjentas ikke</string>
<string name="repeat_option_every_day">Hver dag</string>
<string name="repeat_option_every_week">Hver uke</string>
<string name="repeat_option_every_month">Månedlig</string>
<string name="repeat_option_every_year">Årlig</string>
<string name="repeat_option_custom">Egendefinert…</string>
<string name="repeat_minutely">GJENTA HVERT MINUTT</string>
<string name="repeat_hourly">GJENTA HVER TIME</string>
<string name="repeat_daily">GJENTA DAGLIG</string>
<string name="repeat_weekly">GJENTA UKENTLIG</string>
<string name="repeat_monthly">GJENTA MÅNEDLIG</string>
<string name="repeat_yearly">GJENTA ÅRLIG</string>
<plurals name="task_count">
<item quantity="one">%d gjøremål</item>
<item quantity="other">%d gjøremål</item>
@ -272,8 +263,6 @@
</plurals>
<string name="repeat_type_due">tidsfristsdato</string>
<string name="repeat_type_completion">fullføringsdato</string>
<string name="repeat_number_of_times">Gjenta et antall ganger</string>
<string name="repeat_occurs">Inntreffer</string>
<string name="repeat_snackbar">%1$s flyttet til %2$s</string>
<string name="new_tag">Opprett en ny etikett</string>
<string name="new_list">Opprett en ny liste</string>
@ -373,9 +362,7 @@
<string name="dont_add_to_calendar">Ikke legg til i kalender</string>
<string name="default_calendar">Forvalgt kalender</string>
<string name="badges_description">Vis gjøremålsantall i Task-oppstarterikonet. Ikke alle oppstartere støtter merker.</string>
<string name="repeat_monthly_same_day_each_month">på samme dag hver måned</string>
<string name="repeat_monthly_every_day_of_nth_week">hver %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">hver %1$s %2$s</string>
<string name="repeat_monthly_first_week">første</string>
<string name="repeat_monthly_second_week">andre</string>
<string name="repeat_monthly_third_week">tredje</string>

@ -143,19 +143,12 @@
<string name="default_random_reminder_daily">Dagelijks</string>
<string name="default_random_reminder_weekly">Wekelijks</string>
<string name="default_random_reminder_bi_weekly">Elke twee weken</string>
<string name="repeat_every">Elke</string>
<string name="repeat_option_does_not_repeat">Niet herhalen</string>
<string name="repeat_option_every_day">Elke dag</string>
<string name="repeat_option_every_week">Elke week</string>
<string name="repeat_option_every_month">Elke maand</string>
<string name="repeat_option_every_year">Elk jaar</string>
<string name="repeat_option_custom">Aangepast…</string>
<string name="repeat_minutely">HERHAAL ELKE MINUUT</string>
<string name="repeat_hourly">HERHAAL ELK UUR</string>
<string name="repeat_daily">HERHAAL DAGELIJKS</string>
<string name="repeat_weekly">HERHAAL WEKELIJKS</string>
<string name="repeat_monthly">HERHAAL MAANDELIJKS</string>
<string name="repeat_yearly">HERHAAL JAARLIJKS</string>
<plurals name="task_count">
<item quantity="one">%d taak</item>
<item quantity="other">%d taken</item>
@ -214,10 +207,6 @@
</plurals>
<string name="repeat_type_due">vervaldatum</string>
<string name="repeat_type_completion">voltooiingsdatum</string>
<string name="repeat_forever">Eindeloos herhalen</string>
<string name="repeat_until">Herhalen tot %s</string>
<string name="repeat_number_of_times">N-keer herhalen</string>
<string name="repeat_occurs">Gebeurt</string>
<string name="repeat_snackbar">%1$s verplaatst naar %2$s</string>
<string name="new_tag">Nieuw label aanmaken</string>
<string name="new_list">Nieuwe lijst maken</string>
@ -363,9 +352,7 @@
<string name="default_calendar">Standaardkalender</string>
<string name="badges_description">Toon taken teller bij pictogram van Tasks. Niet alle launchers ondersteunen badges.</string>
<string name="bundle_notifications_summary">Combineer meerdere meldingen samen in één</string>
<string name="repeat_monthly_same_day_each_month">elke maand op dezelfde dag</string>
<string name="repeat_monthly_every_day_of_nth_week">elke %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">op elke %1$s %2$s</string>
<string name="repeat_monthly_first_week">eerste</string>
<string name="repeat_monthly_second_week">tweede</string>
<string name="repeat_monthly_third_week">derde</string>

@ -126,7 +126,6 @@
<string name="TEA_note_label">ଵର୍ଣ୍ଣନା</string>
<string name="TEA_importance_label">ପ୍ରାଥମିକତା</string>
<string name="default_random_reminder_hourly">ପ୍ରତି ଘଣ୍ଟା</string>
<string name="repeat_every">ପ୍ରତ୍ୟେକ</string>
<string name="repeat_option_every_year">ପ୍ରତିଵର୍ଷ</string>
<string name="repeat_option_every_month">ପ୍ରତି ମାସ</string>
<plurals name="repeat_n_hours">

@ -138,19 +138,12 @@
<string name="default_random_reminder_daily">raz dziennie</string>
<string name="default_random_reminder_weekly">raz w tygodniu</string>
<string name="default_random_reminder_bi_weekly">raz na dwa tygodnie</string>
<string name="repeat_every">Każdy</string>
<string name="repeat_option_does_not_repeat">Nie powtarza się</string>
<string name="repeat_option_every_day">Każdego dnia</string>
<string name="repeat_option_every_week">Każdego tygodnia</string>
<string name="repeat_option_every_month">Każdego miesiąca</string>
<string name="repeat_option_every_year">Każdego roku</string>
<string name="repeat_option_custom">Własne ustawienie…</string>
<string name="repeat_minutely">Powtarzaj co ileś minut</string>
<string name="repeat_hourly">Powtarzaj co ileś godzin</string>
<string name="repeat_daily">Powtarzaj co ileś dni</string>
<string name="repeat_weekly">Powtarzaj co ileś tygodni</string>
<string name="repeat_monthly">Powtarzaj co ileś miesięcy</string>
<string name="repeat_yearly">Powtarzaj co ileś lat</string>
<plurals name="task_count">
<item quantity="one">%d zadań</item>
<item quantity="few">%d zadania</item>
@ -223,10 +216,6 @@
</plurals>
<string name="repeat_type_due">w terminie</string>
<string name="repeat_type_completion">data zakończenia</string>
<string name="repeat_forever">Powtarzaj bez końca</string>
<string name="repeat_until">Powtarzaj do %s</string>
<string name="repeat_number_of_times">Powtarzaj podaną ilość razy</string>
<string name="repeat_occurs">Występuje</string>
<string name="repeat_snackbar">%1$s przełożone na %2$s</string>
<string name="new_tag">Stwórz nowy tag</string>
<string name="new_list">Utwórz nową listę</string>
@ -379,9 +368,7 @@
<string name="default_calendar">Domyślny kalendarz</string>
<string name="badges_description">Wyświetl liczbę zadań na ikonie Tasks. Nie wszystkie launchery to wspierają.</string>
<string name="bundle_notifications_summary">Wyświetlaj wiele powiadomień jako jedno</string>
<string name="repeat_monthly_same_day_each_month">tego samego dnia każdego miesiąca</string>
<string name="repeat_monthly_every_day_of_nth_week">każdy %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">co każde %1$s %2$s</string>
<string name="repeat_monthly_first_week">pierwszy</string>
<string name="repeat_monthly_second_week">drugi</string>
<string name="repeat_monthly_third_week">trzeci</string>

@ -139,19 +139,12 @@
<string name="default_random_reminder_daily">Diariamente</string>
<string name="default_random_reminder_weekly">Semanalmente</string>
<string name="default_random_reminder_bi_weekly">A cada duas semanas</string>
<string name="repeat_every">Todo</string>
<string name="repeat_option_does_not_repeat">Não repete</string>
<string name="repeat_option_every_day">Todos os dias</string>
<string name="repeat_option_every_week">Todas as semanas</string>
<string name="repeat_option_every_month">Todos os meses</string>
<string name="repeat_option_every_year">Todos os anos</string>
<string name="repeat_option_custom">Personalizado…</string>
<string name="repeat_minutely">REPETIR A CADA MINUTO</string>
<string name="repeat_hourly">REPETIR A CADA HORA</string>
<string name="repeat_daily">REPETIR DIARIAMENTE</string>
<string name="repeat_weekly">REPETIR SEMANALMENTE</string>
<string name="repeat_monthly">REPETIR MENSALMENTE</string>
<string name="repeat_yearly">REPETIR ANUALMENTE</string>
<plurals name="task_count">
<item quantity="one">%d tarefa</item>
<item quantity="other">%d tarefas</item>
@ -210,10 +203,6 @@
</plurals>
<string name="repeat_type_due">data de vencimento</string>
<string name="repeat_type_completion">data de conclusão</string>
<string name="repeat_forever">Repetir para sempre</string>
<string name="repeat_until">Repetir até %s</string>
<string name="repeat_number_of_times">Repetir um número de vezes</string>
<string name="repeat_occurs">Ocorre</string>
<string name="repeat_snackbar">%1$s remarcada para %2$s</string>
<string name="new_tag">Criar nova etiqueta</string>
<string name="new_list">Criar nova lista</string>
@ -365,9 +354,7 @@
<string name="default_calendar">Calendário padrão</string>
<string name="badges_description">Mostrar a contagem de tarefas no ícone do Tasks no launcher. Nem todos os launchers suportam emblemas.</string>
<string name="bundle_notifications_summary">Combinar múltiplas notificações em uma única</string>
<string name="repeat_monthly_same_day_each_month">no mesmo dia cada mês</string>
<string name="repeat_monthly_every_day_of_nth_week">todo %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">em todo %1$s %2$s</string>
<string name="repeat_monthly_first_week">primeiro</string>
<string name="repeat_monthly_second_week">segundo</string>
<string name="repeat_monthly_third_week">terceiro</string>

@ -133,19 +133,12 @@
<string name="default_random_reminder_daily">Diariamente</string>
<string name="default_random_reminder_weekly">Semanalmente</string>
<string name="default_random_reminder_bi_weekly">A cada 2 semanas</string>
<string name="repeat_every">A cada</string>
<string name="repeat_option_does_not_repeat">Não repetir</string>
<string name="repeat_option_every_day">Todos os dias</string>
<string name="repeat_option_every_week">Todas as semanas</string>
<string name="repeat_option_every_month">Todos os meses</string>
<string name="repeat_option_every_year">Todos os anos</string>
<string name="repeat_option_custom">Personalizado…</string>
<string name="repeat_minutely">Repetir a cada minuto</string>
<string name="repeat_hourly">Repetir a cada hora</string>
<string name="repeat_daily">Repetir todos os dias</string>
<string name="repeat_weekly">Repetir todas as semanada</string>
<string name="repeat_monthly">Repetir todos os meses</string>
<string name="repeat_yearly">Repetir todos os anos</string>
<plurals name="task_count">
<item quantity="one">%d tarefa</item>
<item quantity="other">%d tarefas</item>
@ -204,10 +197,6 @@
</plurals>
<string name="repeat_type_due">data de fim</string>
<string name="repeat_type_completion">Data de conclusão</string>
<string name="repeat_forever">Repetir eternamente</string>
<string name="repeat_until">Repetir até %s</string>
<string name="repeat_number_of_times">Repetir um número de vezes</string>
<string name="repeat_occurs">Ocorre</string>
<string name="repeat_snackbar">%1$s agendada para %2$s</string>
<string name="new_tag">Criar nova etiqueta</string>
<string name="new_list">Criar nova lista</string>
@ -343,9 +332,7 @@
<string name="dont_add_to_calendar">Não adicionar ao calendário</string>
<string name="default_calendar">Calendário predefinido</string>
<string name="bundle_notifications_summary">Combinar várias notificações numa só notificação</string>
<string name="repeat_monthly_same_day_each_month">cada mês no mesmo dia</string>
<string name="repeat_monthly_every_day_of_nth_week">cada %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">em cada %1$s %2$s</string>
<string name="repeat_monthly_first_week">primeiro</string>
<string name="repeat_monthly_second_week">segundo</string>
<string name="repeat_monthly_third_week">terceiro</string>

@ -114,9 +114,7 @@
<string name="repeat_monthly_third_week">al treilea</string>
<string name="repeat_monthly_second_week">al doilea</string>
<string name="repeat_monthly_first_week">prima</string>
<string name="repeat_monthly_on_every_day_of_nth_week">la fiecare %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">în fiecare %1$s %2$s</string>
<string name="repeat_monthly_same_day_each_month">în aceeași zi în fiecare lună</string>
<string name="bundle_notifications_summary">Combinați mai multe notificări într-una singură</string>
<string name="badges_description">Afișarea unui număr de sarcini pe pictograma de lansare a aplicației Tasks. Nu toate lansatoarele acceptă insigne.</string>
<string name="default_calendar">Calendar implicit</string>
@ -366,19 +364,12 @@
<item quantity="few">%d sarcini</item>
<item quantity="other">%d sarcini</item>
</plurals>
<string name="repeat_yearly">SE REPETĂ ANUAL</string>
<string name="repeat_monthly">REPETIȚIE LUNARĂ</string>
<string name="repeat_weekly">REPETAȚI SĂPTĂMÂNAL</string>
<string name="repeat_daily">REPETIȚI ZILNIC</string>
<string name="repeat_hourly">REPETIȚIE ORARĂ</string>
<string name="repeat_minutely">REPETĂ CU MINUȚIOZITATE</string>
<string name="repeat_option_custom">Personalizat…</string>
<string name="repeat_option_every_year">În fiecare an</string>
<string name="repeat_option_every_month">In fiecare luna</string>
<string name="repeat_option_every_week">În fiecare săptămână</string>
<string name="repeat_option_every_day">Zilnic</string>
<string name="repeat_option_does_not_repeat">Nu se repetă</string>
<string name="repeat_every">Fiecare</string>
<string name="default_random_reminder_bi_weekly">Bi-săptămânal</string>
<string name="default_random_reminder_weekly">Săptămânal</string>
<string name="default_random_reminder_daily">Zilnic</string>
@ -658,10 +649,6 @@
<string name="new_list">Creați o nouă listă</string>
<string name="new_tag">Creați o nouă etichetă</string>
<string name="repeat_snackbar">%1$s reprogramat pentru %2$s</string>
<string name="repeat_occurs">Se întâmplă</string>
<string name="repeat_number_of_times">Se repetă de mai multe ori</string>
<string name="repeat_until">Se repetă până la %s</string>
<string name="repeat_forever">Repetă pentru totdeauna</string>
<string name="repeat_type_completion_capitalized">Data de finalizare</string>
<string name="repeat_type_completion">data finalizării</string>
<string name="repeat_type_due">data scadentă</string>

@ -143,19 +143,12 @@
<string name="default_random_reminder_daily">Ежедневно</string>
<string name="default_random_reminder_weekly">Еженедельно</string>
<string name="default_random_reminder_bi_weekly">Каждые две недели</string>
<string name="repeat_every">Каждую(ые)</string>
<string name="repeat_option_does_not_repeat">Не повторять</string>
<string name="repeat_option_every_day">Ежедневно</string>
<string name="repeat_option_every_week">Еженедельно</string>
<string name="repeat_option_every_month">Ежемесячно</string>
<string name="repeat_option_every_year">Ежегодно</string>
<string name="repeat_option_custom">Другой…</string>
<string name="repeat_minutely">ПОВТОРЯТЬ ЕЖЕМИНУТНО</string>
<string name="repeat_hourly">ПОВТОРЯТЬ ЕЖЕЧАСНО</string>
<string name="repeat_daily">ПОВТОРЯТЬ ЕЖЕДНЕВНО</string>
<string name="repeat_weekly">ПОВТОРЯТЬ ЕЖЕНЕДЕЛЬНО</string>
<string name="repeat_monthly">ПОВТОРЯТЬ ЕЖЕМЕСЯЧНО</string>
<string name="repeat_yearly">ПОВТОРЯТЬ ЕЖЕГОДНО</string>
<plurals name="task_count">
<item quantity="one">%d задача</item>
<item quantity="few">%d задачи</item>
@ -228,10 +221,6 @@
</plurals>
<string name="repeat_type_due">намеченной даты</string>
<string name="repeat_type_completion">даты завершения</string>
<string name="repeat_forever">Повторять всегда</string>
<string name="repeat_until">Повторять до %s</string>
<string name="repeat_number_of_times">Повторять несколько раз</string>
<string name="repeat_occurs">Повторять</string>
<string name="repeat_snackbar">%1$s перенесено на %2$s</string>
<string name="new_tag">Создать новый тег</string>
<string name="new_list">Создать новый список</string>
@ -385,9 +374,7 @@
<string name="default_calendar">Календарь по умолчанию</string>
<string name="badges_description">Отображать количество задач на иконке приложения. Не все лаунчеры это поддерживают.</string>
<string name="bundle_notifications_summary">Группировать несколько уведомлений в одно</string>
<string name="repeat_monthly_same_day_each_month">в тот же день ежемесячно</string>
<string name="repeat_monthly_every_day_of_nth_week">каждый %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">в каждый %1$s %2$s</string>
<string name="repeat_monthly_first_week">первая</string>
<string name="repeat_monthly_second_week">вторая</string>
<string name="repeat_monthly_third_week">третья</string>

@ -45,9 +45,6 @@
<string name="geofence_radius">අරය</string>
<string name="voice_command_added_task">කාර්යය එකතු කරන ලදි</string>
<string name="TEA_timer_comment_started">මෙම කාර්යය ආරම්භ කරන ලදි:</string>
<string name="repeat_occurs">සිදු වේ</string>
<string name="repeat_number_of_times">කිහිප වතාවක් නැවත කරන්න</string>
<string name="repeat_until">%s තෙක් නැවත කරන්න</string>
<plurals name="repeat_minutes">
<item quantity="one">විනාඩි</item>
<item quantity="other">විනාඩි</item>
@ -234,7 +231,6 @@
<string name="davx5_selection_description">DAVx⁵ යෙදුම සමඟ ඔබගේ කාර්යයන් සමමුහුර්ත කරන්න</string>
<string name="decsync_selection_description">ගොනු මත පදනම් වූ සමමුහුර්තකරණය</string>
<string name="tasks_org_description">Tasks.org සමඟ ඔබේ කාර්යයන් සමමුහුර්ත කරන්න</string>
<string name="repeat_every">සෑම</string>
<string name="widget_show_checkboxes">පිරික්සුම් කොටු පෙන්වන්න</string>
<string name="yesterday_abbrev_lowercase">ඊයේ</string>
<string name="yest">ඊයේ</string>
@ -269,7 +265,6 @@
<string name="delete_tag_confirmation">%s මකාදමනවාද\?</string>
<string name="new_list">නව ලැයිස්තුවක් සාදන්න</string>
<string name="new_tag">නව ටැගයක් සාදන්න</string>
<string name="repeat_forever">දිගටම නැවත කරන්න</string>
<string name="repeat_type_completion_capitalized">සම්පූර්ණ කරන දිනය</string>
<string name="repeat_type_completion">සම්පූර්ණ කරන දිනය</string>
<plurals name="repeat_n_years">
@ -329,12 +324,6 @@
<item quantity="other">කාර්යයන් %d</item>
</plurals>
<string name="rmd_EPr_rmd_time_desc">නියමිත වේලාවක් නොමැති කාර්යයන් සඳහා දැනුම්දීම් %s හි දිස්වනු ඇත</string>
<string name="repeat_yearly">වසරකට වතාවක් නැවත</string>
<string name="repeat_monthly">මාසයකට වතාවක් නැවත</string>
<string name="repeat_weekly">සතියකට වතාවක් නැවත</string>
<string name="repeat_daily">සෑම දිනකම නැවත</string>
<string name="repeat_hourly">පැයකට වතාවක් නැවත</string>
<string name="repeat_minutely">මිනිත්තුවකට වතාවක් නැවත</string>
<string name="repeat_option_custom">අභිරුචි…</string>
<string name="repeat_option_every_year">සෑම වසරකම</string>
<string name="repeat_option_every_month">සෑම මාසයකම</string>
@ -412,7 +401,6 @@
<string name="pro_dashclock_extension">Dashclock දිගුව</string>
<string name="upgrade_to_pro">Pro වෙත උත්ශ්‍රේණි කරන්න</string>
<string name="caldav_home_set_not_found">CalDAV Home Set හමු නොවීය</string>
<string name="repeat_monthly_on_every_day_of_nth_week">සෑම %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">සෑම %1$s %2$s</string>
<string name="list_separator_with_space">", "</string>
<string name="repeats_plural_on_number_of_times">පුනරාවර්තනය සෑම %1$s %2$s, %3$d %4$s සිදු වේ</string>
@ -572,7 +560,6 @@
<string name="repeat_monthly_third_week">තෙවන</string>
<string name="repeat_monthly_second_week">දෙවැනි</string>
<string name="repeat_monthly_first_week">පළමුවන</string>
<string name="repeat_monthly_same_day_each_month">සෑම මසකම එකම දිනයක</string>
<string name="bundle_notifications_summary">බහුවිධ දැනුම්දීම් එකකට ඒකාබද්ධ කරන්න</string>
<string name="badges_description">Tasks දියත් කිරීමේ නිරූපකයේ කාර්ය ගණන පෙන්වන්න. සියලුම දියත් කරන්නන් (launchers) ලාංඡන සඳහා සහය නොදක්වයි.</string>
<string name="default_calendar">පෙරනිමි දින දර්ශනය</string>

@ -144,19 +144,12 @@
<string name="default_random_reminder_daily">denne</string>
<string name="default_random_reminder_weekly">Týždenne</string>
<string name="default_random_reminder_bi_weekly">Každý druhý týždeň</string>
<string name="repeat_every">Každý</string>
<string name="repeat_option_does_not_repeat">Neopakovať</string>
<string name="repeat_option_every_day">Každý deň</string>
<string name="repeat_option_every_week">Každý týždeň</string>
<string name="repeat_option_every_month">Každý mesiac</string>
<string name="repeat_option_every_year">Každý rok</string>
<string name="repeat_option_custom">Vlastné…</string>
<string name="repeat_minutely">OPAKOVAŤ KAŽDÚ MINÚTU</string>
<string name="repeat_hourly">OPAKOVAŤ KAŽDÚ HODINU</string>
<string name="repeat_daily">OPAKOVAŤ KAŽDÝ DEŇ</string>
<string name="repeat_weekly">OPAKOVAŤ KAŽDÝ TÝŽDEŇ</string>
<string name="repeat_monthly">OPAKOVAŤ KAŽDÝ MESIAC</string>
<string name="repeat_yearly">OPAKOVAŤ KAŽDÝ ROK</string>
<plurals name="task_count">
<item quantity="one">%d úloha</item>
<item quantity="other">%d úloh</item>
@ -215,10 +208,6 @@
</plurals>
<string name="repeat_type_due">termín</string>
<string name="repeat_type_completion">deň dokončenia</string>
<string name="repeat_forever">Opakovať donekonečna</string>
<string name="repeat_until">Opakovať do %s</string>
<string name="repeat_number_of_times">Opakovať určitý počet krát</string>
<string name="repeat_occurs">Vyskytuje sa</string>
<string name="repeat_snackbar">%1$s preložené na %2$s</string>
<string name="new_tag">Vytvoriť nový štítok</string>
<string name="new_list">Vytvoriť nový zoznam</string>
@ -369,9 +358,7 @@
<string name="default_calendar">Východzí kalendár</string>
<string name="badges_description">Zobraziť počet úloh na ikone spustenia Úloh. Niektoré spúšťače nepodporujú odznaky.</string>
<string name="bundle_notifications_summary">Zlúč viaceré upozornenia do jedného</string>
<string name="repeat_monthly_same_day_each_month">v ten istý deň v každom mesiaci</string>
<string name="repeat_monthly_every_day_of_nth_week">každý %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">na každý %1$s %2$s</string>
<string name="repeat_monthly_first_week">prvý</string>
<string name="repeat_monthly_second_week">druhý</string>
<string name="repeat_monthly_third_week">tretí</string>

@ -111,8 +111,6 @@
<string name="default_random_reminder_daily">dnevno</string>
<string name="default_random_reminder_weekly">tedensko</string>
<string name="default_random_reminder_bi_weekly">vsake dva tedna</string>
<string name="repeat_forever">Ponavljaj do preklica</string>
<string name="repeat_until">Ponavljaj do %s</string>
<string name="TPl_notification">Merilniki časa aktivni za %s!</string>
<string name="TFE_workingOn">Opravki katerim se meri čas</string>
<string name="TEA_timer_controls">Merilnik časa</string>

@ -14,8 +14,6 @@
<string name="CFC_dueBefore_text">Po datumu: ?</string>
<string name="gcal_completed_title">%s (završeno)</string>
<string name="rmd_EPr_defaultRemind_title">Nasumice posetnik</string>
<string name="repeat_forever">Ponavljaj zauvek</string>
<string name="repeat_until">Interval ponavljanja %s</string>
<string name="delete_task">Obriši zadatak</string>
<string name="vibrations">Vibracije</string>
<string name="contact_developer">Kontaktiraj razvojni tim</string>

@ -133,8 +133,6 @@
<string name="default_random_reminder_daily">varje dag</string>
<string name="default_random_reminder_weekly">varje vecka</string>
<string name="default_random_reminder_bi_weekly">varannan vecka</string>
<string name="repeat_forever">Upprepa för alltid</string>
<string name="repeat_until">Repetera till %s</string>
<string name="repeat_snackbar">%1$s omplanerat till %2$s</string>
<string name="new_tag">Skapa en ny ettikett</string>
<string name="new_list">Skapa en ny lista</string>
@ -241,19 +239,12 @@
<string name="default_location_reminder_on_departure">Vid avgång</string>
<string name="default_location_reminder_on_arrival_or_departure">Vid ankomst och avgång</string>
<string name="snooze_all">Snooza alla</string>
<string name="repeat_every">Varje</string>
<string name="repeat_option_does_not_repeat">Repetera inte</string>
<string name="repeat_option_every_day">Varje dag</string>
<string name="repeat_option_every_week">Varje vecka</string>
<string name="repeat_option_every_month">Varje månad</string>
<string name="repeat_option_every_year">Varje år</string>
<string name="repeat_option_custom">Anpassad…</string>
<string name="repeat_minutely">REPETERA VARJE MINUT</string>
<string name="repeat_hourly">REPETERA VARJE TIMME</string>
<string name="repeat_daily">REPETERA VARJE DAG</string>
<string name="repeat_weekly">REPETERA VARJE VECKA</string>
<string name="repeat_monthly">REPETERA VARJE MÅNAD</string>
<string name="repeat_yearly">REPETERA VARJE ÅR</string>
<plurals name="task_count">
<item quantity="one">%d uppgift</item>
<item quantity="other">%d uppgifter</item>
@ -312,8 +303,6 @@
</plurals>
<string name="repeat_type_due">förfallodatum</string>
<string name="repeat_type_completion">datum färdigställt</string>
<string name="repeat_number_of_times">Upprepa ett antal gånger</string>
<string name="repeat_occurs">Inträffar</string>
<string name="TEA_timer_controls">Tidtagare</string>
<string name="google_drive_backup">Google Drive-säkerhetskopia</string>
<string name="row_spacing">Radavstånd</string>
@ -371,9 +360,7 @@
<string name="default_calendar">Standardkalender</string>
<string name="badges_description">Visa en uppgiftsräkning på Tasks-startikon. Inte alla startprogram stöder märken.</string>
<string name="bundle_notifications_summary">Kombinera flera aviseringar till en</string>
<string name="repeat_monthly_same_day_each_month">samma dag varje månad</string>
<string name="repeat_monthly_every_day_of_nth_week">varje %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">på varje %1$s %2$s</string>
<string name="repeat_monthly_first_week">första</string>
<string name="repeat_monthly_second_week">andra</string>
<string name="repeat_monthly_third_week">Tredje</string>

@ -84,18 +84,12 @@
<string name="backup_BAc_export">இப்போதே நகல் எடு</string>
<string name="backup_BAc_import">நகலை இறக்குமதி செய்</string>
<string name="display_name">பெயர்</string>
<string name="repeat_yearly">வருடந்தோறும் மீண்டும் செய்யவும்</string>
<string name="repeat_monthly">மாதந்தோறும் செய்யவும்</string>
<string name="repeat_weekly">வாரந்தோறும் செய்யவும்</string>
<string name="repeat_daily">தினமும் செய்யவும்</string>
<string name="repeat_hourly">மணிநேரம் மீண்டும் செய்யவும்</string>
<string name="repeat_option_custom">தனிப்பயன்…</string>
<string name="repeat_option_every_year">ஒவ்வொரு வருடமும்</string>
<string name="repeat_option_every_month">ஒவ்வொரு மாதமும்</string>
<string name="repeat_option_every_week">ஒவ்வொரு வாரமும்</string>
<string name="repeat_option_every_day">தினமும்</string>
<string name="repeat_option_does_not_repeat">மீண்டும் செய்யாது</string>
<string name="repeat_every">ஒவ்வொரு</string>
<string name="default_random_reminder_bi_weekly">இரு வாராந்திர</string>
<string name="default_random_reminder_weekly">வாராந்திர</string>
<string name="default_random_reminder_daily">தினசரி</string>
@ -271,9 +265,7 @@
<string name="repeat_monthly_third_week">மூன்றாவது</string>
<string name="repeat_monthly_second_week">இரண்டாவது</string>
<string name="repeat_monthly_first_week">முதல்</string>
<string name="repeat_monthly_on_every_day_of_nth_week">ஒவ்வொரு %1$s %2$s இல்</string>
<string name="repeat_monthly_every_day_of_nth_week">ஒவ்வொரு %1$s %2$s</string>
<string name="repeat_monthly_same_day_each_month">ஒவ்வொரு மாதமும் ஒரே நாளில்</string>
<string name="bundle_notifications_summary">பல அறிவிப்புகளை ஒன்றில் இணைக்கவும்</string>
<string name="default_calendar">இயல்புநிலை காலண்டர்</string>
<string name="dont_add_to_calendar">நாள்காட்டியில் சேர்க்க வேண்டாம்</string>
@ -437,10 +429,6 @@
<string name="delete_tag_confirmation">%s ஐ நீக்கவா\?</string>
<string name="new_list">புதிய பட்டியலை உருவாக்கவும்</string>
<string name="new_tag">புதிய குறிச்சொல்லை உருவாக்கவும்</string>
<string name="repeat_occurs">நிகழ்கிறது</string>
<string name="repeat_number_of_times">பல முறை செய்யவும்</string>
<string name="repeat_until">%s வரை மீண்டும் செய்யவும்</string>
<string name="repeat_forever">என்றென்றும் செய்யவும்</string>
<string name="repeat_type_completion">நிறைவு தேதி</string>
<string name="repeat_type_due">உரிய தேதி</string>
<plurals name="repeat_n_years">

@ -234,9 +234,7 @@
<string name="repeat_monthly_third_week">ที่สาม</string>
<string name="repeat_monthly_second_week">ที่สอง</string>
<string name="repeat_monthly_first_week">ก่อน</string>
<string name="repeat_monthly_on_every_day_of_nth_week">ทุกๆ %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">ทุกๆ %1$s %2$s</string>
<string name="repeat_monthly_same_day_each_month">ในวันเดียวกันของทุกเดือน</string>
<string name="bundle_notifications_summary">รวมการแจ้งเตือนหลายรายการไว้ในรายการเดียว</string>
<string name="badges_description">แสดงจํานวนงานบนไอคอนตัวเปิดใช้งาน ตัวเรียกใช้งานไม่รองรับป้ายทั้งหมด</string>
<string name="default_calendar">ปฏิทินเริ่มต้น</string>
@ -416,10 +414,6 @@
<string name="new_list">สร้างรายการใหม่</string>
<string name="new_tag">สร้างแท็กใหม่</string>
<string name="repeat_snackbar">%1$s จัดกําหนดการใหม่สําหรับ %2$s</string>
<string name="repeat_occurs">เกิดขึ้น</string>
<string name="repeat_number_of_times">ทําซ้ําหลายครั้ง</string>
<string name="repeat_until">ทําซ้ําจนถึง %s</string>
<string name="repeat_forever">ทําซ้ําตลอดไป</string>
<string name="repeat_type_completion_capitalized">วันที่เสร็จสมบูรณ์</string>
<string name="repeat_type_completion">วันที่เสร็จสมบูรณ์</string>
<string name="repeat_type_due">วันที่ครบกําหนด</string>
@ -471,18 +465,11 @@
<plurals name="task_count">
<item quantity="other">%d งาน</item>
</plurals>
<string name="repeat_yearly">ทําซ้ําทุกปี</string>
<string name="repeat_monthly">ทําซ้ําทุกเดือน</string>
<string name="repeat_weekly">ทําซ้ําทุกสัปดาห์</string>
<string name="repeat_daily">ทำซ้ำทุกวัน</string>
<string name="repeat_hourly">ทําซ้ํารายชั่วโมง</string>
<string name="repeat_minutely">ทําซ้ําเป็นนาที</string>
<string name="repeat_option_every_year">ทุกปี</string>
<string name="repeat_option_every_month">ทุกเดือน</string>
<string name="repeat_option_every_week">ทุกสัปดาห์</string>
<string name="repeat_option_every_day">ทุกวัน</string>
<string name="repeat_option_does_not_repeat">ไม่ซ้ำ</string>
<string name="repeat_every">ทุกๆ</string>
<string name="default_random_reminder_bi_weekly">รายปักษ์</string>
<string name="default_random_reminder_weekly">รายสัปดาห์</string>
<string name="default_random_reminder_daily">ทุกวัน</string>

@ -39,8 +39,6 @@
<item quantity="one">taon</item>
<item quantity="other">mga taon</item>
</plurals>
<string name="repeat_forever">Ulitin habambuhay</string>
<string name="repeat_until">Ulitin hanggang %s</string>
<string name="delete_task">Tanggalin gawain</string>
<string name="vibrations">Mga taginting</string>
<string name="source_code">Pinagmulang code</string>

@ -144,19 +144,12 @@
<string name="default_random_reminder_daily">her gün</string>
<string name="default_random_reminder_weekly">her hafta</string>
<string name="default_random_reminder_bi_weekly">haftada 2 kez</string>
<string name="repeat_every">Her</string>
<string name="repeat_option_does_not_repeat">Yinelemez</string>
<string name="repeat_option_every_day">Her gün</string>
<string name="repeat_option_every_week">Her hafta</string>
<string name="repeat_option_every_month">Her ay</string>
<string name="repeat_option_every_year">Her yıl</string>
<string name="repeat_option_custom">Özel…</string>
<string name="repeat_minutely">DAKİKALIK YİNELE</string>
<string name="repeat_hourly">SAATLİK YİNELE</string>
<string name="repeat_daily">GÜNLÜK YİNELE</string>
<string name="repeat_weekly">HAFTALIK YİNELE</string>
<string name="repeat_monthly">AYLIK YİNELE</string>
<string name="repeat_yearly">YILLIK YİNELE</string>
<plurals name="task_count">
<item quantity="one">%d görev</item>
<item quantity="other">%d görev</item>
@ -215,10 +208,6 @@
</plurals>
<string name="repeat_type_due">bitiş tarihi</string>
<string name="repeat_type_completion">tamamlanma tarihi</string>
<string name="repeat_forever">Sürekli yinele</string>
<string name="repeat_until">%s\'e kadar yinele</string>
<string name="repeat_number_of_times">Birkaç kez yinele</string>
<string name="repeat_occurs">Şu kadar gerçekleşir</string>
<string name="repeat_snackbar">%1$s, %2$s için yeniden zamanlandı</string>
<string name="new_tag">Yeni etiket oluştur</string>
<string name="new_list">Yeni liste oluştur</string>
@ -370,9 +359,7 @@
<string name="default_calendar">Öntanımlı takvim</string>
<string name="badges_description">Tasks başlatıcı simgesinde görev sayısı göster. Tüm başlatıcılar rozetleri desteklemez.</string>
<string name="bundle_notifications_summary">Birden çok bildirimi tek bildirime birleştir</string>
<string name="repeat_monthly_same_day_each_month">her ayın aynı gününde</string>
<string name="repeat_monthly_every_day_of_nth_week">her %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">her %1$s %2$s</string>
<string name="repeat_monthly_first_week">birinci</string>
<string name="repeat_monthly_second_week">ikinci</string>
<string name="repeat_monthly_third_week">üçüncü</string>

@ -143,19 +143,12 @@
<string name="default_random_reminder_daily">Щоденно</string>
<string name="default_random_reminder_weekly">Щотижнево</string>
<string name="default_random_reminder_bi_weekly">Кожні два тижні</string>
<string name="repeat_every">Кожні</string>
<string name="repeat_option_does_not_repeat">Не повторювати</string>
<string name="repeat_option_every_day">Щодня</string>
<string name="repeat_option_every_week">Щотижня</string>
<string name="repeat_option_every_month">Щомісяця</string>
<string name="repeat_option_every_year">Щороку</string>
<string name="repeat_option_custom">Інше…</string>
<string name="repeat_minutely">ПОВТОРЮВАТИ ПОХВИЛИННО</string>
<string name="repeat_hourly">ПОВТОРЮВАТИ ПОГОДИННО</string>
<string name="repeat_daily">ПОВТОРЮВАТИ ПОДЕННО</string>
<string name="repeat_weekly">ПОВТОРЮВАТИ ПОТИЖНЕВО</string>
<string name="repeat_monthly">ПОВТОРЮВАТИ ПОМІСЯЧНО</string>
<string name="repeat_yearly">ПОВТОРЮВАТИ ПОРІЧНО</string>
<plurals name="task_count">
<item quantity="one">%d завдання</item>
<item quantity="few">%d завдання</item>
@ -228,10 +221,6 @@
</plurals>
<string name="repeat_type_due">призначеної дати</string>
<string name="repeat_type_completion">дати виконання</string>
<string name="repeat_forever">Повторювати завжди</string>
<string name="repeat_until">Повторювати до %s</string>
<string name="repeat_number_of_times">Повторити кількість разів</string>
<string name="repeat_occurs">Станеться</string>
<string name="repeat_snackbar">%1$s перенесено на %2$s</string>
<string name="new_tag">Створити нову мітку</string>
<string name="new_list">Новий список</string>
@ -386,9 +375,7 @@
<string name="default_calendar">Типовий календар</string>
<string name="badges_description">Показувати кількість завдань на піктограмі запуску Tasks. Не всі лаунчери підтримують такі значки.</string>
<string name="bundle_notifications_summary">Групувати кілька сповіщень в одне</string>
<string name="repeat_monthly_same_day_each_month">того ж дня щомісяця</string>
<string name="repeat_monthly_every_day_of_nth_week">що %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">що %1$s %2$s</string>
<string name="repeat_monthly_first_week">перший</string>
<string name="repeat_monthly_second_week">другий</string>
<string name="repeat_monthly_third_week">третій</string>

@ -140,7 +140,6 @@
<string name="calendar_event_not_found">کیلنڈر ایونٹ نہیں مل سکا</string>
<string name="gcal_TEA_showCalendar_label">کیلنڈر ایونٹ کھولیں</string>
<string name="gcal_TEA_error">کیلنڈر میں کام شامل کرنے میں خرابی!</string>
<string name="repeat_every">ہر ایک</string>
<string name="default_random_reminder_bi_weekly">ہفتے میں دو بار</string>
<string name="default_random_reminder_weekly">ہفتہ وار</string>
<string name="default_random_reminder_daily">روزانہ</string>
@ -160,10 +159,6 @@
<string name="ring_five_times">پانچ بار رنگ بجنا</string>
<string name="ring_once">ایک بار رنگ بجنا</string>
<string name="premium_record_audio">ایک نوٹ ریکارڈ کریں</string>
<string name="repeat_weekly">ہفتہ وار دہرانا</string>
<string name="repeat_daily">روزانہ دہرانا</string>
<string name="repeat_hourly">گھنٹہ وار دہرانا</string>
<string name="repeat_minutely">منٹ وار دہرانا</string>
<string name="repeat_option_custom">کسٹم…</string>
<string name="repeat_option_every_year">ہر سال</string>
<string name="repeat_option_every_month">ہر مہینے</string>
@ -183,10 +178,6 @@
<string name="default_start_date">ڈیفالٹ تاریخ آغاز</string>
<string name="start_date">تاریخ آغاز</string>
<string name="SSD_sort_start">بلحاظ تاریخ آغاز</string>
<string name="repeat_occurs">واقع ہونا</string>
<string name="repeat_number_of_times">چند مرتبہ دہرانا</string>
<string name="repeat_until">%s تک دہرانا</string>
<string name="repeat_forever">ہمیشہ دہرانا</string>
<string name="repeat_type_completion_capitalized">تاریخ تکمیل</string>
<string name="repeat_type_completion">تاریخ تکمیل</string>
<string name="repeat_type_due">مقررہ تاریخ</string>
@ -254,8 +245,6 @@
<item quantity="one">%d ٹاسک</item>
<item quantity="other">%d ٹاسکس</item>
</plurals>
<string name="repeat_yearly">سالانہ دہرانا</string>
<string name="repeat_monthly">مہینہ وار دہرانا</string>
<string name="yesterday_lowercase">گزشتہ کل</string>
<string name="yesterday">گزشتہ کل</string>
<string name="tomorrow_lowercase">آنے والا کل</string>
@ -420,9 +409,7 @@
<string name="repeat_monthly_third_week">تیسرا</string>
<string name="repeat_monthly_second_week">دوسرا</string>
<string name="repeat_monthly_first_week">پہلا</string>
<string name="repeat_monthly_on_every_day_of_nth_week">ہر %1$s%2$s کو</string>
<string name="repeat_monthly_every_day_of_nth_week">ہر %1$s%2$s</string>
<string name="repeat_monthly_same_day_each_month">ہر مہینے کو ایک ہی دن</string>
<string name="bundle_notifications_summary">متعدد نوٹیفیکیشنز کو ایک میں کر دیں</string>
<string name="badges_description">ٹاسکس ایپ کے آئیکن پر ٹاسک کی تعداد ظاہر کریں۔ تمام لانچرز نشانات کو سپوڑٹ نہیں کرتے۔</string>
<string name="default_calendar">ڈیفالٹ کیلںنڈر</string>

@ -291,11 +291,9 @@
<string name="repeat_monthly_last_week">cuối cùng</string>
<string name="repeat_monthly_fifth_week">thứ năm</string>
<string name="repeat_monthly_fourth_week">thứ tư</string>
<string name="repeat_monthly_same_day_each_month">vào ngày đó mỗi tháng</string>
<string name="repeat_monthly_third_week">thứ ba</string>
<string name="repeat_monthly_second_week">thứ hai</string>
<string name="repeat_monthly_first_week">đầu tiên</string>
<string name="repeat_monthly_on_every_day_of_nth_week">vào mỗi %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">mỗi %1$s %2$s</string>
<string name="bundle_notifications_summary">Kết hợp nhiều thông báo thành một</string>
<string name="badges_description">Hiển thị số lượng công việc trên biểu tượng trên launcher của Tasks. Không phải tất cả launcher đều hỗ trợ huy hiệu.</string>
@ -490,10 +488,6 @@
<string name="new_list">Tạo danh sách mới</string>
<string name="new_tag">Tạo thẻ mới</string>
<string name="repeat_snackbar">%1$s đã được lên lịch lại cho %2$s</string>
<string name="repeat_occurs">Xảy ra</string>
<string name="repeat_number_of_times">Lặp lại một số lần</string>
<string name="repeat_until">Lặp lại đến %s</string>
<string name="repeat_forever">Lặp lại mãi mãi</string>
<string name="repeat_type_completion_capitalized">Ngày hoàn thành</string>
<string name="repeat_type_completion">ngày hoàn thành</string>
<string name="repeat_type_due">ngày hạn</string>
@ -545,19 +539,12 @@
<plurals name="task_count">
<item quantity="other">%d công việc</item>
</plurals>
<string name="repeat_yearly">LẶP LẠI HÀNG NĂM</string>
<string name="repeat_monthly">LẶP LẠI HÀNG THÁNG</string>
<string name="repeat_weekly">LẶP LẠI HÀNG TUẦN</string>
<string name="repeat_daily">LẶP LẠI HÀNG NGÀY</string>
<string name="repeat_hourly">LẶP LẠI HÀNG TIẾNG</string>
<string name="repeat_minutely">LẶP LẠI HÀNG PHÚT</string>
<string name="repeat_option_custom">Tuỳ chỉnh…</string>
<string name="repeat_option_every_year">Mỗi năm</string>
<string name="repeat_option_every_month">Mỗi tháng</string>
<string name="repeat_option_every_week">Mỗi tuần</string>
<string name="repeat_option_every_day">Mỗi ngày</string>
<string name="repeat_option_does_not_repeat">Không lặp lại</string>
<string name="repeat_every">Mỗi</string>
<string name="default_random_reminder_bi_weekly">Mỗi hai tuần</string>
<string name="default_random_reminder_weekly">Hàng tuần</string>
<string name="default_random_reminder_daily">Hàng ngày</string>

@ -132,19 +132,12 @@
<string name="default_random_reminder_daily">每天</string>
<string name="default_random_reminder_weekly">每周</string>
<string name="default_random_reminder_bi_weekly">每两周</string>
<string name="repeat_every"></string>
<string name="repeat_option_does_not_repeat">不要重复</string>
<string name="repeat_option_every_day">每天</string>
<string name="repeat_option_every_week">每周</string>
<string name="repeat_option_every_month">每月</string>
<string name="repeat_option_every_year">每年</string>
<string name="repeat_option_custom">自定义…</string>
<string name="repeat_minutely">按分钟重复</string>
<string name="repeat_hourly">按小时重复</string>
<string name="repeat_daily">按天重复</string>
<string name="repeat_weekly">按周重复</string>
<string name="repeat_monthly">按月重复</string>
<string name="repeat_yearly">按年重复</string>
<plurals name="task_count">
<item quantity="other">%d 个任务</item>
</plurals>
@ -200,10 +193,6 @@
</plurals>
<string name="repeat_type_due">截止日期</string>
<string name="repeat_type_completion">完成日期</string>
<string name="repeat_forever">永远重复</string>
<string name="repeat_until">重复到 %s</string>
<string name="repeat_number_of_times">重复多次</string>
<string name="repeat_occurs">发生</string>
<string name="repeat_snackbar">%1$s 重新安排在 %2$s</string>
<string name="new_tag">新建标签</string>
<string name="new_list">新建列表</string>
@ -352,9 +341,7 @@
<string name="default_calendar">默认日历</string>
<string name="badges_description">在 Tasks 启动图标上显示任务计数。不是所有的启动器都支持角标。</string>
<string name="bundle_notifications_summary">将多个通知合并为一个通知</string>
<string name="repeat_monthly_same_day_each_month">在每月的同一天</string>
<string name="repeat_monthly_every_day_of_nth_week">每 %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">在每 %1$s 个 %2$s</string>
<string name="repeat_monthly_first_week">第一个</string>
<string name="repeat_monthly_second_week">第二个</string>
<string name="repeat_monthly_third_week">第三个</string>

@ -114,8 +114,6 @@
<item quantity="one">%d 分鐘</item>
<item quantity="other">%d 分鐘</item>
</plurals>
<string name="repeat_forever">永遠重複</string>
<string name="repeat_until">重複到 %s</string>
<string name="new_tag">新增標籤</string>
<string name="new_list">新增清單</string>
<string name="TPl_notification">%s 的碼錶啟動了!</string>
@ -263,8 +261,6 @@
<string name="voice_command_added_task">已新增的任務</string>
<string name="delete_tag_confirmation">要刪除 %s 嗎 \?</string>
<string name="repeat_snackbar">%1$s 重新安排至 %2$s</string>
<string name="repeat_occurs">發生</string>
<string name="repeat_number_of_times">重複次數</string>
<string name="repeat_type_completion_capitalized">完成日期</string>
<string name="repeat_type_completion">完成日期</string>
<string name="repeat_type_due">截止日期</string>
@ -278,7 +274,6 @@
<string name="repeat_option_every_week">每星期</string>
<string name="repeat_option_every_day">每天</string>
<string name="repeat_option_does_not_repeat">不重複</string>
<string name="repeat_every"></string>
<string name="persistent_notifications_description">固定通知將無法被消除</string>
<string name="persistent_notifications">固定通知</string>
<string name="snooze_all">全部延遲提醒</string>
@ -430,9 +425,7 @@
<string name="repeat_monthly_third_week">第三週</string>
<string name="repeat_monthly_second_week">第二週</string>
<string name="repeat_monthly_first_week">第一週</string>
<string name="repeat_monthly_on_every_day_of_nth_week">在每 %1$s %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">每 %1$s %2$s</string>
<string name="repeat_monthly_same_day_each_month">每月的同一天</string>
<string name="bundle_notifications_summary">結合多項通知成一項通知</string>
<string name="default_calendar">預設日曆</string>
<string name="dont_add_to_calendar">不要新增至日曆</string>
@ -529,12 +522,6 @@
<plurals name="repeat_times">
<item quantity="other">時間</item>
</plurals>
<string name="repeat_yearly">每年重覆</string>
<string name="repeat_monthly">每月重複</string>
<string name="repeat_weekly">每週重複</string>
<string name="repeat_daily">每天重複</string>
<string name="repeat_hourly">每小時重複</string>
<string name="repeat_minutely">每分鐘重複</string>
<string name="repeat_option_custom">自訂…</string>
<string name="repeat_option_every_year">每年</string>
<string name="filter_any_start_date">任何起始日期</string>

@ -82,15 +82,6 @@
<item>@string/repeat_option_custom</item>
</string-array>
<string-array name="repeat_frequency">
<item>@string/repeat_minutely</item>
<item>@string/repeat_hourly</item>
<item>@string/repeat_daily</item>
<item>@string/repeat_weekly</item>
<item>@string/repeat_monthly</item>
<item>@string/repeat_yearly</item>
</string-array>
<string-array name="repeat_type_capitalized">
<item>@string/due_date</item>
<item>@string/repeat_type_completion_capitalized</item>

@ -23,8 +23,6 @@
<dimen name="widget_height_default">48dp</dimen>
<dimen name="widget_height_compact">36dp</dimen>
<dimen name="widget_height_none">24dp</dimen>
<dimen name="week_button_inset">6dp</dimen>
<dimen name="week_button_state_on_circle_size">48dp</dimen>
<dimen name="sku_details_row_text_size">14sp</dimen>

@ -167,19 +167,16 @@ File %1$s contained %2$s.\n\n
<string name="default_random_reminder_daily">Daily</string>
<string name="default_random_reminder_weekly">Weekly</string>
<string name="default_random_reminder_bi_weekly">Bi-weekly</string>
<string name="repeat_every">Every</string>
<string name="repeat_option_does_not_repeat">Does not repeat</string>
<string name="repeat_option_every_day">Every day</string>
<string name="repeat_option_every_week">Every week</string>
<string name="repeat_option_every_month">Every month</string>
<string name="repeat_option_every_year">Every year</string>
<string name="repeat_option_custom">Custom…</string>
<string name="repeat_minutely">REPEAT MINUTELY</string>
<string name="repeat_hourly">REPEAT HOURLY</string>
<string name="repeat_daily">REPEAT DAILY</string>
<string name="repeat_weekly">REPEAT WEEKLY</string>
<string name="repeat_monthly">REPEAT MONTHLY</string>
<string name="repeat_yearly">REPEAT YEARLY</string>
<plurals name="repeat_occurrence">
<item quantity="one">occurrence</item>
<item quantity="other">occurrences</item>
</plurals>
<plurals name="task_count">
<item quantity="one">%d task</item>
<item quantity="other">%d tasks</item>
@ -263,10 +260,6 @@ File %1$s contained %2$s.\n\n
<string name="repeat_type_due">due date</string>
<string name="repeat_type_completion">completion date</string>
<string name="repeat_type_completion_capitalized">Completion date</string>
<string name="repeat_forever">Repeat forever</string>
<string name="repeat_until">Repeat until %s</string>
<string name="repeat_number_of_times">Repeat a number of times</string>
<string name="repeat_occurs">Occurs</string>
<string name="repeat_snackbar">%1$s rescheduled for %2$s</string>
<string name="new_tag">Create new tag</string>
<string name="new_list">Create new list</string>
@ -455,6 +448,13 @@ File %1$s contained %2$s.\n\n
<string name="repeats_weekly">weekly</string>
<string name="repeats_monthly">monthly</string>
<string name="repeats_yearly">yearly</string>
<string name="repeats_custom_recurrence">Custom recurrence</string>
<string name="repeats_every">Repeats every</string>
<string name="repeats_weekly_on">Repeats on</string>
<string name="repeats_never">Never</string>
<string name="repeats_on">On</string>
<string name="repeats_after">After</string>
<string name="repeats_ends">Ends</string>
<string name="repeats_plural">Repeats every %s</string>
<string name="repeats_plural_on">Repeats every %1$s on %2$s</string>
<string name="repeats_plural_until">Repeats every %1$s until %2$s</string>
@ -467,9 +467,9 @@ File %1$s contained %2$s.\n\n
<string name="rmd_time_description">Show notifications for tasks without due times</string>
<string name="badges_description">Display a task count on Tasks\' launcher icon. Not all launchers support badges.</string>
<string name="bundle_notifications_summary">Combine multiple notifications into one</string>
<string name="repeat_monthly_same_day_each_month">on the same day each month</string>
<string name="repeat_monthly_every_day_of_nth_week">every %1$s %2$s</string>
<string name="repeat_monthly_on_every_day_of_nth_week">on every %1$s %2$s</string>
<string name="repeat_monthly_on_day_number">Monthly on day %1d</string>
<string name="repeat_monthly_on_the_nth_weekday">Monthly on the %1$s %2$s</string>
<string name="repeat_monthly_first_week">first</string>
<string name="repeat_monthly_second_week">second</string>
<string name="repeat_monthly_third_week">third</string>

@ -0,0 +1,173 @@
package org.tasks.repeats
import androidx.lifecycle.SavedStateHandle
import net.fortuna.ical4j.model.Recur.Frequency.DAILY
import net.fortuna.ical4j.model.Recur.Frequency.HOURLY
import net.fortuna.ical4j.model.Recur.Frequency.MINUTELY
import net.fortuna.ical4j.model.Recur.Frequency.MONTHLY
import net.fortuna.ical4j.model.Recur.Frequency.SECONDLY
import net.fortuna.ical4j.model.Recur.Frequency.YEARLY
import org.junit.Assert.assertEquals
import org.junit.Test
import org.tasks.repeats.CustomRecurrenceActivity.Companion.EXTRA_DATE
import org.tasks.repeats.CustomRecurrenceActivity.Companion.EXTRA_RRULE
import org.tasks.time.DateTime
import java.time.DayOfWeek
import java.util.Locale
class CustomRecurrenceViewModelTest {
@Test
fun defaultStateValue() {
val state = newVM().state.value
assertEquals(CustomRecurrenceViewModel.ViewState(), state)
}
@Test
fun setFrequencies() {
assertEquals("FREQ=SECONDLY", newVM { setFrequency(SECONDLY) }.getRecur())
assertEquals("FREQ=MINUTELY", newVM { setFrequency(MINUTELY) }.getRecur())
assertEquals("FREQ=HOURLY", newVM { setFrequency(HOURLY) }.getRecur())
assertEquals("FREQ=DAILY", newVM { setFrequency(DAILY) }.getRecur())
assertEquals("FREQ=WEEKLY", newVM().getRecur())
assertEquals("FREQ=MONTHLY", newVM { setFrequency(MONTHLY) }.getRecur())
assertEquals("FREQ=YEARLY", newVM { setFrequency(YEARLY) }.getRecur())
}
@Test
fun setInterval() {
assertEquals("FREQ=WEEKLY;INTERVAL=4", newVM { setInterval(4) }.getRecur())
}
@Test
fun ignoreCountWhenChangingToNever() {
assertEquals(
"FREQ=WEEKLY",
newVM("FREQ=WEEKLY;COUNT=2") { setEndType(0) }.getRecur()
)
}
@Test
fun setEndDate() {
assertEquals(
"FREQ=WEEKLY;UNTIL=20230726",
newVM {
setEndDate(DateTime(2023, 7, 26).millis)
setEndType(1)
}.getRecur()
)
}
@Test
fun ignoreEndDateWhenChangingToNever() {
assertEquals(
"FREQ=WEEKLY",
newVM("FREQ=WEEKLY;UNTIL=20230726") { setEndType(0) }.getRecur()
)
}
@Test
fun setDaysInOrder() {
assertEquals(
"FREQ=WEEKLY;BYDAY=MO,TU,WE",
newVM {
toggleDay(DayOfWeek.MONDAY)
toggleDay(DayOfWeek.WEDNESDAY)
toggleDay(DayOfWeek.TUESDAY)
}
.getRecur()
)
}
@Test
fun ignoreDaysForNonWeekly() {
assertEquals(
"FREQ=MONTHLY",
newVM {
setFrequency(MONTHLY)
toggleDay(DayOfWeek.MONDAY)
}
.getRecur()
)
}
@Test
fun setCount() {
assertEquals(
"FREQ=WEEKLY;COUNT=3",
newVM {
setEndType(2)
setOccurrences(3)
}
.getRecur()
)
}
@Test
fun toggleDayOff() {
assertEquals(
"FREQ=WEEKLY;BYDAY=MO",
newVM("FREQ=WEEKLY;BYDAY=MO,TU") { toggleDay(DayOfWeek.TUESDAY) }.getRecur()
)
}
@Test
fun nthDayOfMonth() {
assertEquals(
"FREQ=MONTHLY;BYDAY=4TH",
newVM(dueDate = DateTime(2023, 7, 27)) {
setFrequency(MONTHLY)
setMonthSelection(1)
}.getRecur()
)
}
@Test
fun lastDayOfMonth() {
assertEquals(
"FREQ=MONTHLY;BYDAY=-1TH",
newVM(dueDate = DateTime(2023, 7, 27)) {
setFrequency(MONTHLY)
setMonthSelection(2)
}.getRecur()
)
}
@Test
fun restoreMonthDay() {
assertEquals(
"FREQ=MONTHLY;BYDAY=-1TH",
newVM(
recur = "FREQ=MONTHLY;BYDAY=-1TH",
dueDate = DateTime(2023, 7, 27)
).getRecur()
)
}
@Test
fun changeMonthDay() {
assertEquals(
"FREQ=MONTHLY;BYDAY=4TH",
newVM(
recur = "FREQ=MONTHLY;BYDAY=-1TH",
dueDate = DateTime(2023, 7, 27)
) {
setMonthSelection(1)
}.getRecur()
)
}
private fun newVM(
recur: String? = null,
dueDate: DateTime = DateTime(0),
block: CustomRecurrenceViewModel.() -> Unit = {}
) =
CustomRecurrenceViewModel(
savedStateHandle = SavedStateHandle(
mapOf(
EXTRA_RRULE to recur,
EXTRA_DATE to dueDate.millis,
)
),
locale = Locale.US
).also(block)
}
Loading…
Cancel
Save