Convert calendar picker to compose

pull/1964/head
Alex Baker 2 years ago
parent 437d69d741
commit 4f267ad989

@ -1,128 +0,0 @@
package org.tasks.calendars;
import static com.google.common.collect.Lists.transform;
import static org.tasks.PermissionUtil.verifyPermissions;
import static org.tasks.Strings.isNullOrEmpty;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import dagger.hilt.android.AndroidEntryPoint;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.preferences.FragmentPermissionRequestor;
import org.tasks.preferences.PermissionChecker;
import org.tasks.preferences.PermissionRequestor;
import org.tasks.themes.Theme;
import org.tasks.ui.SingleCheckedArrayAdapter;
@AndroidEntryPoint
public class CalendarPicker extends DialogFragment {
public static final String EXTRA_CALENDAR_ID = "extra_calendar_id";
public static final String EXTRA_CALENDAR_NAME = "extra_calendar_name";
private static final String EXTRA_SELECTED = "extra_selected";
private final List<String> calendarNames = new ArrayList<>();
private final List<AndroidCalendar> calendars = new ArrayList<>();
@Inject DialogBuilder dialogBuilder;
@Inject CalendarProvider calendarProvider;
@Inject PermissionChecker permissionChecker;
@Inject FragmentPermissionRequestor permissionRequestor;
@Inject Theme theme;
private SingleCheckedArrayAdapter adapter;
private ListView listView;
public static CalendarPicker newCalendarPicker(Fragment target, int rc, String selected) {
Bundle arguments = new Bundle();
arguments.putString(EXTRA_SELECTED, selected);
CalendarPicker fragment = new CalendarPicker();
fragment.setArguments(arguments);
fragment.setTargetFragment(target, rc);
return fragment;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
theme.applyToContext(getActivity());
adapter =
new SingleCheckedArrayAdapter(getActivity(), calendarNames) {
@Override
protected int getDrawable() {
return R.drawable.ic_outline_event_24px;
}
@Override
protected int getDrawableColor(int position) {
return calendars.get(position).getColor();
}
};
AlertDialog dialog =
dialogBuilder
.newDialog()
.setSingleChoiceItems(
adapter, -1, (d, which) -> {
dismiss();
AndroidCalendar calendar = calendars.get(which);
Intent data = new Intent();
data.putExtra(EXTRA_CALENDAR_ID, calendar.getId());
data.putExtra(EXTRA_CALENDAR_NAME, calendar.getName());
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data);
})
.setNegativeButton(R.string.cancel, null)
.show();
listView = dialog.getListView();
if (permissionChecker.canAccessCalendars()) {
loadCalendars();
} else if (savedInstanceState == null) {
permissionRequestor.requestCalendarPermissions();
}
return dialog;
}
private void loadCalendars() {
calendars.clear();
calendarNames.clear();
calendars.addAll(calendarProvider.getCalendars());
if (calendars.isEmpty()) {
Toast.makeText(getActivity(), R.string.no_calendars_found, Toast.LENGTH_LONG).show();
dismiss();
} else {
calendars.add(0, new AndroidCalendar(null, getString(R.string.dont_add_to_calendar), -1));
calendarNames.addAll(transform(calendars, AndroidCalendar::getName));
Bundle arguments = getArguments();
String selected = arguments.getString(EXTRA_SELECTED);
int selectedIndex = isNullOrEmpty(selected) ? 0 : calendarNames.indexOf(selected);
adapter.notifyDataSetChanged();
listView.setItemChecked(selectedIndex, true);
listView.setSelection(selectedIndex);
}
}
@Override
public void onRequestPermissionsResult(
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PermissionRequestor.REQUEST_CALENDAR) {
if (verifyPermissions(grantResults)) {
loadCalendars();
} else {
dismiss();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}

@ -0,0 +1,168 @@
package org.tasks.calendars
import android.Manifest
import android.app.Activity
import android.app.Dialog
import android.content.Intent
import android.os.Bundle
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ContentAlpha
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Block
import androidx.compose.material.icons.outlined.Check
import androidx.compose.material.icons.outlined.Event
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberMultiplePermissionsState
import com.google.android.material.composethemeadapter.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.dialogs.DialogBuilder
import javax.inject.Inject
@AndroidEntryPoint
class CalendarPicker : DialogFragment() {
private val viewModel: CalendarPickerViewModel by viewModels()
@Inject lateinit var dialogBuilder: DialogBuilder
@OptIn(ExperimentalPermissionsApi::class)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return dialogBuilder
.newDialog()
.setContent {
val hasPermissions = rememberMultiplePermissionsState(
permissions = listOf(Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR),
onPermissionsResult = { result ->
if (result.values.all { it }) {
viewModel.loadCalendars()
}
}
)
if (hasPermissions.allPermissionsGranted) {
CalendarList(
calendars = viewModel.viewState.collectAsStateLifecycleAware().value.calendars,
selected = arguments?.getString(EXTRA_SELECTED),
onClick = { selectEntry(it) },
)
}
LaunchedEffect(hasPermissions) {
if (!hasPermissions.allPermissionsGranted) {
hasPermissions.launchMultiplePermissionRequest()
}
}
}
.show()
}
@Composable
fun CalendarList(
calendars: List<AndroidCalendar>,
selected: String?,
onClick: (AndroidCalendar?) -> Unit,
) {
MdcTheme {
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(vertical = 12.dp)
) {
CalendarRow(
icon = Icons.Outlined.Block,
tint = MaterialTheme.colors.onSurface,
text = stringResource(id = R.string.dont_add_to_calendar),
selected = selected.isNullOrBlank(),
onClick = { onClick(null) },
)
calendars.forEach {
CalendarRow(
icon = Icons.Outlined.Event,
tint = Color(it.color),
text = it.name,
selected = selected == it.name,
onClick = { onClick(it) }
)
}
}
}
}
@Composable
fun CalendarRow(
icon: ImageVector,
tint: Color,
text: String,
selected: Boolean,
onClick: () -> Unit,
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.clickable { onClick() }
) {
Icon(
imageVector = icon,
contentDescription = null,
tint = tint.copy(alpha = ContentAlpha.medium),
modifier = Modifier.padding(start = 16.dp, end = 32.dp, top = 12.dp, bottom = 12.dp),
)
Text(
text = text,
style = MaterialTheme.typography.body1,
modifier = Modifier.weight(1f),
)
if (selected) {
Icon(
imageVector = Icons.Outlined.Check,
contentDescription = null,
tint = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.medium),
modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp),
)
}
}
}
private fun selectEntry(calendar: AndroidCalendar?) {
val data = Intent()
data.putExtra(EXTRA_CALENDAR_ID, calendar?.id)
data.putExtra(EXTRA_CALENDAR_NAME, calendar?.name)
targetFragment!!.onActivityResult(targetRequestCode, Activity.RESULT_OK, data)
dismiss()
}
companion object {
const val EXTRA_CALENDAR_ID = "extra_calendar_id"
const val EXTRA_CALENDAR_NAME = "extra_calendar_name"
private const val EXTRA_SELECTED = "extra_selected"
fun newCalendarPicker(target: Fragment?, rc: Int, selected: String?): CalendarPicker {
val arguments = Bundle()
arguments.putString(EXTRA_SELECTED, selected)
val fragment = CalendarPicker()
fragment.arguments = arguments
fragment.setTargetFragment(target, rc)
return fragment
}
}
}

@ -0,0 +1,36 @@
package org.tasks.calendars
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class CalendarPickerViewModel @Inject constructor(
private val calendarProvider: CalendarProvider
) : ViewModel() {
data class ViewState(
val calendars: List<AndroidCalendar> = emptyList(),
)
private val _viewState = MutableStateFlow(ViewState())
val viewState: StateFlow<ViewState>
get() = _viewState.asStateFlow()
fun loadCalendars() {
viewModelScope.launch(Dispatchers.IO) {
_viewState.update { it.copy(calendars = calendarProvider.calendars) }
}
}
init {
loadCalendars()
}
}

@ -5,6 +5,8 @@ import android.content.DialogInterface
import android.view.View
import android.widget.ListAdapter
import androidx.appcompat.app.AlertDialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.ComposeView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
class AlertDialogBuilder internal constructor(private val context: Context) {
@ -72,6 +74,11 @@ class AlertDialogBuilder internal constructor(private val context: Context) {
return this
}
fun setContent(content: @Composable () -> Unit): AlertDialogBuilder {
builder.setView(ComposeView(context).apply { setContent(content) })
return this
}
fun setOnCancelListener(onCancelListener: DialogInterface.OnCancelListener?): AlertDialogBuilder {
builder.setOnCancelListener(onCancelListener)
return this

@ -17,7 +17,7 @@ import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.activities.ListPicker
import org.tasks.calendars.CalendarPicker
import org.tasks.calendars.CalendarPicker.newCalendarPicker
import org.tasks.calendars.CalendarPicker.Companion.newCalendarPicker
import org.tasks.calendars.CalendarProvider
import org.tasks.data.LocationDao
import org.tasks.data.Place
@ -140,6 +140,7 @@ class TaskDefaults : InjectingPreferenceFragment() {
)
defaultCalendarPref.summary =
data.getStringExtra(CalendarPicker.EXTRA_CALENDAR_NAME)
?: getString(R.string.dont_add_to_calendar)
}
REQUEST_RECURRENCE -> if (resultCode == RESULT_OK) {
preferences.setString(

@ -357,7 +357,6 @@
<string name="preferences_advanced">متقدم</string>
<string name="choose_synchronization_service">اختر منصّة</string>
<string name="create_new_tag">أنشأ \"%s\"</string>
<string name="no_calendars_found">لم يوجد أيّ تقويم</string>
<string name="filter">تصفية</string>
<string name="move">انقل</string>
<string name="subtasks">مهام فرعيّة</string>

@ -336,7 +336,6 @@
<string name="settings_localization">Локализация</string>
<string name="led_notification">Известия с LED</string>
<string name="hardware_support_required">Необходима е апаратна поддръжка</string>
<string name="no_calendars_found">Не са намерени календари</string>
<string name="widget_settings">Настройки на приспособления</string>
<string name="widget_header_settings">Настройки на заглавието</string>
<string name="widget_row_settings">Настройки на реда</string>

@ -199,7 +199,6 @@
<string name="restart_now">Restartovat nyní</string>
<string name="restart_later">Později</string>
<string name="settings_localization">Překlad</string>
<string name="no_calendars_found">Nenalezeny žádné kalendáře</string>
<string name="widget_settings">Nastavení ovládacího prvku</string>
<string name="discard_confirmation">Opravdu chcete provedené změny zahodit\?</string>
<string name="keep_editing">Pokračovat v úpravách</string>

@ -275,7 +275,6 @@
<string name="widget_row_settings">Rækkeindstillinger</string>
<string name="widget_header_settings">Topbjælkeindstillinger</string>
<string name="widget_settings">Widget-indstillinger</string>
<string name="no_calendars_found">Der blev ikke fundet nogen kalendre</string>
<string name="hardware_support_required">Skal understøttes af hardware</string>
<string name="led_notification">LED-påmindelse</string>
<string name="settings_localization">Oversættelse</string>

@ -325,7 +325,6 @@
<string name="settings_localization">Übersetzung</string>
<string name="led_notification">Benachrichtigungs-LED</string>
<string name="hardware_support_required">Hardware-Unterstützung benötigt</string>
<string name="no_calendars_found">Es wurden keine Kalender gefunden</string>
<string name="widget_settings">Widget-Einstellungen</string>
<string name="widget_header_settings">Kopfleisteneinstellungen</string>
<string name="widget_row_settings">Zeileneinstellungen</string>

@ -234,7 +234,6 @@
<string name="widget_open_list">Malfermu liston</string>
<string name="widget_do_nothing">Faru nenion</string>
<string name="widget_settings">Agordoj de fenestraĵo</string>
<string name="no_calendars_found">Neniu kalendaro trovita</string>
<string name="restart_later">Poste</string>
<string name="language">Lingvo</string>
<string name="theme_system_default">Laŭ operaciumo</string>

@ -328,7 +328,6 @@
<string name="settings_localization">Configuración regional</string>
<string name="led_notification">Notificación de LED</string>
<string name="hardware_support_required">Se necesita compatibilidad de hárdwer</string>
<string name="no_calendars_found">No se han encontrado calendarios</string>
<string name="widget_settings">Configuración de widget</string>
<string name="widget_header_settings">Configuración de cabecera</string>
<string name="widget_row_settings">Configuración de fila</string>

@ -211,7 +211,6 @@
<string name="restart_later">Hiljem</string>
<string name="led_notification">LED-i teavitused</string>
<string name="hardware_support_required">Riistvara tugi on nõutud</string>
<string name="no_calendars_found">Ühtegi kalendrit ei leitud</string>
<string name="widget_settings">Vidina seaded</string>
<string name="widget_header_settings">Päise seaded</string>
<string name="widget_row_settings">Rea seaded</string>

@ -332,7 +332,6 @@
<string name="settings_localization">Lokalizazioa</string>
<string name="led_notification">LED jakinarazpena</string>
<string name="hardware_support_required">Hardwareak onartzea ezinbestekoa</string>
<string name="no_calendars_found">Ez da egutegitik aurkitu</string>
<string name="widget_settings">Trepetaren ezarpenak</string>
<string name="widget_header_settings">Goiburuaren ezarpenak</string>
<string name="widget_row_settings">Errenkadaren ezarpenak</string>

@ -311,7 +311,6 @@
<string name="settings_localization">Paikallistaminen</string>
<string name="led_notification">LED muistutus</string>
<string name="hardware_support_required">Laitetuki vaaditaan</string>
<string name="no_calendars_found">Kalenteria ei löydy</string>
<string name="widget_settings">Widgetin asetukset</string>
<string name="widget_header_settings">Otsikon asetukset</string>
<string name="widget_row_settings">Rivin asetukset</string>

@ -310,7 +310,6 @@
<string name="settings_localization">Localisation</string>
<string name="led_notification">Notification de la LED</string>
<string name="hardware_support_required">Support matériel requis</string>
<string name="no_calendars_found">Pas de calendrier trouvé</string>
<string name="widget_settings">Paramètres du widget</string>
<string name="widget_header_settings">Paramètres de l\'en-tête</string>
<string name="widget_row_settings">Paramètres de la colonne</string>

@ -242,7 +242,6 @@
<string name="settings_localization">Localización</string>
<string name="led_notification">Notificación LED</string>
<string name="hardware_support_required">Precísase de soporte con hardware</string>
<string name="no_calendars_found">Non se atoparon calendarios</string>
<string name="widget_settings">Configuración de widgets</string>
<string name="widget_header_settings">Configuración de cabeceiras</string>
<string name="widget_row_settings">Configuración de filas</string>

@ -371,7 +371,6 @@
<string name="widget_footer">Podnožje</string>
<string name="widget_row_settings">Postavke redaka</string>
<string name="widget_header_settings">Postavke zaglavlja</string>
<string name="no_calendars_found">Nema kalendara</string>
<string name="hardware_support_required">Podrška za hardver je obavezna</string>
<string name="led_notification">LED obavijest</string>
<string name="settings_localization">Lokalizacija</string>

@ -328,7 +328,6 @@
<string name="settings_localization">Lokalizáció</string>
<string name="led_notification">LED értesítés</string>
<string name="hardware_support_required">Hardveres támogatás szükséges</string>
<string name="no_calendars_found">Naptár nem található</string>
<string name="widget_settings">Widget beállításai</string>
<string name="widget_header_settings">Fejléc beállításai</string>
<string name="widget_row_settings">Sorok beállíátsai</string>

@ -252,7 +252,6 @@
<string name="settings_localization">Pelokalan bahasa</string>
<string name="led_notification">Notifikasi LED</string>
<string name="hardware_support_required">Dukungan perangkat keras diperlukan</string>
<string name="no_calendars_found">Tidak ada kalender yang ditemukan</string>
<string name="widget_settings">Pengaturan wisaya</string>
<string name="widget_header_settings">Pengaturan tajuk</string>
<string name="widget_row_settings">Pengaturan baris</string>

@ -330,7 +330,6 @@
<string name="settings_localization">Localizzazione</string>
<string name="led_notification">LED di notifica</string>
<string name="hardware_support_required">È richiesto il supporto hardware</string>
<string name="no_calendars_found">Nessun calendario</string>
<string name="widget_settings">Impostazioni widget</string>
<string name="widget_header_settings">Impostazioni intestazione</string>
<string name="widget_row_settings">Impostazioni riga</string>

@ -362,7 +362,6 @@
<string name="settings_localization">לוקאליזציה</string>
<string name="led_notification">תאורת התראות</string>
<string name="hardware_support_required">נדרשת חומרה תואמת</string>
<string name="no_calendars_found">לא נמצאו לוחות שנה</string>
<string name="widget_settings">הגדרות ווידג\'ט</string>
<string name="widget_header_settings">הגדרות כותרת</string>
<string name="widget_row_settings">הגדרות שורה</string>

@ -330,7 +330,6 @@
<string name="settings_localization">ローカライズ</string>
<string name="led_notification">LED 通知</string>
<string name="hardware_support_required">ハードウェア サポートが必要です</string>
<string name="no_calendars_found">カレンダーが見つかりません</string>
<string name="widget_settings">ウィジェット設定</string>
<string name="widget_header_settings">ヘッダー設定</string>
<string name="widget_row_settings">行設定</string>

@ -327,7 +327,6 @@
<string name="settings_localization">현지화</string>
<string name="led_notification">LED 알림</string>
<string name="hardware_support_required">하드웨어 지원을 필요로 합니다</string>
<string name="no_calendars_found">달력 없음</string>
<string name="widget_settings">위젯 설정</string>
<string name="widget_header_settings">헤더 설정</string>
<string name="widget_row_settings">줄 설정</string>

@ -350,7 +350,6 @@
<string name="settings_localization">Lokalizacija</string>
<string name="led_notification">LED pranešimai</string>
<string name="hardware_support_required">Reikalingas techninės įrangos palaikymas</string>
<string name="no_calendars_found">Kalendorių nerasta</string>
<string name="widget_settings">Valdiklio nustatymai</string>
<string name="widget_header_settings">Antraščių nustatymai</string>
<string name="widget_row_settings">Eilutės nustatymai</string>

@ -350,7 +350,6 @@
<string name="theme_wallpaper">Bakgrunnsbilde</string>
<string name="theme_day_night">Dag/natt</string>
<string name="hardware_support_required">Maskinvarestøtte kreves</string>
<string name="no_calendars_found">Fant ingen kalendre</string>
<string name="widget_settings">Miniprogramsinnstillinger</string>
<string name="widget_header_settings">Hodeinnstillinger</string>
<string name="widget_row_settings">Radinnstillinger</string>

@ -324,7 +324,6 @@
<string name="settings_localization">Localisatie</string>
<string name="led_notification">LED melding</string>
<string name="hardware_support_required">Hardware ondersteuning vereist</string>
<string name="no_calendars_found">Geen kalenders gevonden</string>
<string name="widget_settings">Widget instellingen</string>
<string name="widget_header_settings">Koptekst instellingen</string>
<string name="widget_row_settings">Regel instellingen</string>

@ -340,7 +340,6 @@
<string name="settings_localization">Ustawienia regionalne</string>
<string name="led_notification">Powiadomienie LED</string>
<string name="hardware_support_required">Wymagane wsparcie sprzętowe</string>
<string name="no_calendars_found">Nie znaleziono kalendzarzy</string>
<string name="widget_settings">Ustawienie widgetu</string>
<string name="widget_header_settings">Ustawienia nagłówka</string>
<string name="widget_row_settings">Ustawienia rzędu</string>

@ -326,7 +326,6 @@
<string name="settings_localization">Localização</string>
<string name="led_notification">LED de notificações</string>
<string name="hardware_support_required">Suporte de hardware necessário</string>
<string name="no_calendars_found">Não foi encontrado nenhum calendário</string>
<string name="widget_settings">Configurações de Widget</string>
<string name="widget_header_settings">Config. cabeçalho</string>
<string name="widget_row_settings">Congif. entrada</string>

@ -309,7 +309,6 @@
<string name="restart_later">Mais tarde</string>
<string name="settings_localization">Tradução</string>
<string name="led_notification">Notificação no LED</string>
<string name="no_calendars_found">Não foi encontrado nenhum calendário</string>
<string name="widget_settings">Definições do widget</string>
<string name="widget_header_settings">Definições de cabeçalho</string>
<string name="widget_row_settings">Definições de linhas</string>

@ -170,7 +170,6 @@
<string name="widget_row_settings">Setări de rânduri</string>
<string name="widget_header_settings">Setări de antet</string>
<string name="widget_settings">Setări Widget</string>
<string name="no_calendars_found">Nu s-au găsit calendare</string>
<string name="hardware_support_required">Suport hardware necesar</string>
<string name="led_notification">Notificare cu LED-uri</string>
<string name="settings_localization">Localizare</string>

@ -346,7 +346,6 @@
<string name="settings_localization">Локализация</string>
<string name="led_notification">LED уведомления</string>
<string name="hardware_support_required">Необходима аппаратная поддержка</string>
<string name="no_calendars_found">Календарей не найдено</string>
<string name="widget_settings">Настройки виджета</string>
<string name="widget_header_settings">Настройки заголовка</string>
<string name="widget_row_settings">Настройки строк</string>

@ -198,7 +198,6 @@
<string name="widget_footer">පාදකය</string>
<string name="widget_row_settings">පේළි සැකසුම්</string>
<string name="widget_header_settings">ශීර්ෂ සැකසුම්</string>
<string name="no_calendars_found">දින දර්ශන කිසිවක් හමු නොවීය</string>
<string name="hardware_support_required">දෘඩාංග සහාය අවශ්‍යයි</string>
<string name="led_notification">LED දැනුම්දීම</string>
<string name="settings_localization">ප්‍රාදේශීයකරණය</string>

@ -330,7 +330,6 @@
<string name="settings_localization">Určovanie polohy</string>
<string name="led_notification">LED oznámenia</string>
<string name="hardware_support_required">Vyžaduje sa podpora zariadenia</string>
<string name="no_calendars_found">Kalendár nenájdený</string>
<string name="widget_settings">Widget - nastavenia</string>
<string name="widget_header_settings">Nastavenie záhlavia </string>
<string name="widget_row_settings">Nastavenie riadka</string>

@ -232,7 +232,6 @@
<string name="settings_localization">Språk</string>
<string name="led_notification">LED Notifiering</string>
<string name="hardware_support_required">Hårdvarustöd krävs</string>
<string name="no_calendars_found">Inga kalendrar hittades</string>
<string name="widget_settings">Inställningar för widget</string>
<string name="clear_completed_tasks_confirmation">Rensa bort slutförda uppgifter?</string>
<string name="action_call">Ring</string>

@ -323,7 +323,6 @@
<string name="widget_row_settings">வரிசை அமைப்புகள்</string>
<string name="widget_header_settings">தலைப்பு அமைப்புகள்</string>
<string name="widget_settings">விட்ஜெட் அமைப்புகள்</string>
<string name="no_calendars_found">காலெண்டர்கள் எதுவும் கிடைக்கவில்லை</string>
<string name="hardware_support_required">வன்பொருள் ஆதரவு தேவை</string>
<string name="led_notification">LED அறிவிப்பு</string>
<string name="settings_localization">உள்ளூர்மயமாக்கல்</string>

@ -297,7 +297,6 @@
<string name="widget_row_settings">การตั้งค่าแถว</string>
<string name="widget_header_settings">การตั้งค่าส่วนหัว</string>
<string name="widget_settings">การตั้งค่าวิดเจ็ต</string>
<string name="no_calendars_found">ไม่พบปฏิทิน</string>
<string name="hardware_support_required">ต้องการการสนับสนุนฮาร์ดแวร์</string>
<string name="led_notification">การแจ้งเตือน LED</string>
<string name="settings_localization">แปล</string>

@ -331,7 +331,6 @@
<string name="settings_localization">Yerelleştirme</string>
<string name="led_notification">LED bildirimi</string>
<string name="hardware_support_required">Donanım desteği gerekiyor</string>
<string name="no_calendars_found">Takvim bulunamadı</string>
<string name="widget_settings">Widget ayarları</string>
<string name="widget_header_settings">Başlık ayarları</string>
<string name="widget_row_settings">Satır ayarları</string>

@ -347,7 +347,6 @@
<string name="settings_localization">Локалізація</string>
<string name="led_notification">LED-сповіщення</string>
<string name="hardware_support_required">Потрібна підтримка апартних засобів</string>
<string name="no_calendars_found">Календарів не знайдено</string>
<string name="widget_settings">Налаштування віджету</string>
<string name="widget_header_settings">Налаштування заголовку</string>
<string name="widget_row_settings">Налаштування рядку</string>

@ -354,7 +354,6 @@
<string name="widget_row_settings">قطار کی سیٹنگ</string>
<string name="widget_header_settings">ہیڈر کی سیٹنگ</string>
<string name="widget_settings">ویجٹ سیٹنگ</string>
<string name="no_calendars_found">کوئی کیلنڈر نہیں ملا</string>
<string name="hardware_support_required">ہارڈ وئیر سپورٹ درکار ہے</string>
<string name="led_notification">ایل ای ڈی نوٹیفیکیشن</string>
<string name="settings_localization">لوکلائزیشن</string>

@ -357,7 +357,6 @@
<string name="widget_row_settings">Cài đặt hàng</string>
<string name="widget_header_settings">Cài đặt tiêu đề</string>
<string name="widget_settings">Cài đặt tiện ích</string>
<string name="no_calendars_found">Không tìm thấy lịch nào</string>
<string name="hardware_support_required">Yêu cầu sự hỗ trợ của phần cứng</string>
<string name="led_notification">Thông báo LED</string>
<string name="settings_localization">Ngôn ngữ</string>

@ -312,7 +312,6 @@
<string name="settings_localization">本地化</string>
<string name="led_notification">LED 提醒</string>
<string name="hardware_support_required">需要硬件支持</string>
<string name="no_calendars_found">没有找到日历</string>
<string name="widget_settings">插件设置</string>
<string name="widget_header_settings">标题设置</string>
<string name="widget_row_settings">行设置</string>

@ -168,7 +168,6 @@
<string name="restart_required">重新啟動 Tasks以使變更生效</string>
<string name="restart_now">馬上重新啟動</string>
<string name="restart_later">稍後</string>
<string name="no_calendars_found">找不到日曆</string>
<string name="repeats_single">%s重複</string>
<string name="repeats_minutely">每分鐘</string>
<string name="repeats_hourly">每小時</string>

@ -413,7 +413,6 @@ File %1$s contained %2$s.\n\n
<string name="settings_localization">Localization</string>
<string name="led_notification">LED notification</string>
<string name="hardware_support_required">Hardware support required</string>
<string name="no_calendars_found">No calendars found</string>
<string name="widget_settings">Widget settings</string>
<string name="widget_header_settings">Header settings</string>
<string name="widget_row_settings">Row settings</string>

Loading…
Cancel
Save