use the DAO classes from the Astrid API library
+ *
+ *
+ * The following base URI's are supported:
+ *
+ * - content://com.todoroo.astrid/tasks - task data ({@link Task})
+ *
- content://com.todoroo.astrid/metadata - task metadata ({@link Metadata})
+ *
+ *
+ * Each URI supports the following components:
+ *
+ * - / - operate on all items (insert, delete, update, query)
+ *
- /123 - operate on item id #123 (delete, update, query)
+ *
- /groupby/title - query with SQL "group by" (query)
+ *
+ *
+ * If you are writing a third-party application to access this data, you may
+ * also consider using one of the Api DAO objects like TaskApiDao.
+ *
+ * @author Tim Su
+ */
+@SuppressWarnings("DeprecatedIsStillUsed")
+@Deprecated
+public class Astrid3ContentProvider extends InjectingContentProvider {
+
+ private static final Uri TASKS = Uri.parse("content://" + BuildConfig.APPLICATION_ID + "/tasks");
+ private static final Uri METADATA = Uri
+ .parse("content://" + BuildConfig.APPLICATION_ID + "/metadata");
+
+ /**
+ * URI for making a request over all items
+ */
+ private static final int URI_DIR = 1;
+
+ /**
+ * URI for making a request over a single item by id
+ */
+ private static final int URI_ITEM = 2;
+
+ /**
+ * URI for making a request over all items grouped by some field
+ */
+ private static final int URI_GROUP = 3;
+
+ private static final UriMatcher uriMatcher;
+
+ @SuppressLint("StaticFieldLeak")
+ private static Database databaseOverride;
+
+ // --- instance variables
+
+ private boolean open;
+ @Inject Lazy database;
+ @Inject Lazy tracker;
+ @Inject Lazy localBroadcastManager;
+ @Inject Lazy taskCreator;
+ @Inject Lazy taskDao;
+
+ static {
+ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+
+ for (Uri uri : new Uri[]{TASKS, METADATA}) {
+ String authority = BuildConfig.APPLICATION_ID;
+
+ String table = uri.toString();
+ table = table.substring(table.indexOf('/', 11) + 1);
+
+ uriMatcher.addURI(authority, table, URI_DIR);
+ uriMatcher.addURI(authority, table + "/#", URI_ITEM);
+ uriMatcher.addURI(authority, table +
+ AstridApiConstants.GROUP_BY_URI + "*", URI_GROUP);
+ }
+ }
+
+ public Astrid3ContentProvider() {
+ setReadPermission(AstridApiConstants.PERMISSION_READ);
+ setWritePermission(AstridApiConstants.PERMISSION_WRITE);
+ }
+
+ @Override
+ public String getType(@NonNull Uri uri) {
+ switch (uriMatcher.match(uri)) {
+ case URI_DIR:
+ case URI_GROUP:
+ return "vnd.android.cursor.dir/vnd.astrid";
+ case URI_ITEM:
+ return "vnd.android.cursor/vnd.astrid.item";
+ default:
+ throw new IllegalArgumentException(
+ "Unsupported URI " + uri + " (" + uriMatcher.match(uri) + ")");
+ }
+ }
+
+ @Override
+ protected void inject(ContentProviderComponent component) {
+ component.inject(this);
+ }
+
+ public static void setDatabaseOverride(Database override) {
+ databaseOverride = override;
+ }
+
+ private SupportSQLiteDatabase getDatabase() {
+ if (!open) {
+ database.get().openForWriting();
+ open = true;
+ }
+ Database database = databaseOverride == null ? this.database.get() : databaseOverride;
+ return database.getDatabase();
+ }
+
+ /* ======================================================================
+ * =========================================================== delete ===
+ * ====================================================================== */
+
+ @Override
+ public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
+ Timber.d("DELETE %s\nselection=%s\nselectionArgs=%s", uri, selection,
+ Arrays.toString(selectionArgs));
+
+ String tableName = getTableName(uri);
+ if (!"tasks".equals(tableName)) {
+ return 0;
+ }
+
+ switch (uriMatcher.match(uri)) {
+ case URI_GROUP:
+ throw new IllegalArgumentException("Only the / or /# URI is valid for deletion.");
+ case URI_ITEM: {
+ String itemSelector = String.format("_id = '%s'", uri.getPathSegments().get(1));
+ if (TextUtils.isEmpty(selection)) {
+ selection = itemSelector;
+ } else {
+ selection = itemSelector + " AND " + selection;
+ }
+ }
+ case URI_DIR:
+ break;
+ default:
+ throw new IllegalArgumentException(
+ "Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
+ }
+
+ int numDeleted = getDatabase().delete(tableName, selection, selectionArgs);
+ if (numDeleted > 0) {
+ localBroadcastManager.get().broadcastRefresh();
+ }
+ return numDeleted;
+ }
+
+ /* ======================================================================
+ * =========================================================== insert ===
+ * ====================================================================== */
+
+ /**
+ * Insert key/value pairs into given table
+ */
+ @Override
+ public Uri insert(@NonNull Uri uri, ContentValues values) {
+ Timber.d("INSERT %s\nvalues=%s", uri, values);
+ String tableName = getTableName(uri);
+
+ if (!"tasks".equals(tableName)) {
+ return null;
+ }
+
+ switch (uriMatcher.match(uri)) {
+ case URI_ITEM:
+ case URI_GROUP:
+ throw new IllegalArgumentException("Only the / URI is valid for insertion.");
+ case URI_DIR: {
+ Task task = taskCreator.get().createWithValues(null, "");
+ taskDao.get().createNew(task);
+ long id = task.getId();
+ if (id <= 0) {
+ throw new SQLException("Could not insert row into database (constraint failed?)");
+ }
+ getDatabase()
+ .update(tableName, SQLiteDatabase.CONFLICT_REPLACE, values, "_id = '" + id + "'",
+ null);
+ taskDao.get().save(taskDao.get().fetch(id), null);
+ Uri newUri = ContentUris.withAppendedId(uri, id);
+ getContext().getContentResolver().notifyChange(newUri, null);
+ return newUri;
+ }
+
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ }
+
+ /* ======================================================================
+ * =========================================================== update ===
+ * ====================================================================== */
+
+ @Override
+ public int update(@NonNull Uri uri, ContentValues values, String selection,
+ String[] selectionArgs) {
+ Timber.d("UPDATE %s\nvalues=%s\nselection=%s\nselectionArgs=%s", uri, values, selection,
+ Arrays.toString(selectionArgs));
+ String tableName = getTableName(uri);
+ if (!"tasks".equals(tableName)) {
+ return 0;
+ }
+
+ switch (uriMatcher.match(uri)) {
+ case URI_DIR:
+ case URI_GROUP:
+ throw new IllegalArgumentException("Only the /# URI is valid for update.");
+ case URI_ITEM:
+ Long id = Long.parseLong(uri.getPathSegments().get(1));
+ String byId = String.format("_id = '%s'", id);
+ selection = TextUtils.isEmpty(selection) ? byId : byId + " AND " + selection;
+ Task original = taskDao.get().fetch(id);
+ int updated = getDatabase()
+ .update(tableName, SQLiteDatabase.CONFLICT_ABORT, values, selection, selectionArgs);
+ if (updated == 1) {
+ taskDao.get().save(taskDao.get().fetch(id), original);
+ getContext().getContentResolver().notifyChange(uri, null);
+ }
+ return updated;
+ default:
+ throw new IllegalArgumentException(
+ "Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
+ }
+ }
+
+ /* ======================================================================
+ * ============================================================ query ===
+ * ====================================================================== */
+
+ /**
+ * Query by task.
+ *
+ * Note that the "sortOrder" field actually can be used to append any
+ * sort of clause to your SQL query as long as it is not also the
+ * name of a column
+ */
+ @Override
+ public Cursor query(@NonNull Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+ Timber.d("QUERY %s\ncolumns=%s\nselection=%s\nselectionArgs=%s\nsortOrder=%s", uri,
+ Arrays.toString(projection), selection, Arrays.toString(selectionArgs), sortOrder);
+
+ String tableName = getTableName(uri);
+ if (!"tasks".equals(tableName)) {
+ return null;
+ }
+
+ String groupBy = null;
+
+ SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
+ builder.setTables(getTableName(uri));
+
+ switch (uriMatcher.match(uri)) {
+ case URI_GROUP:
+ groupBy = uri.getPathSegments().get(2);
+ case URI_DIR:
+ break;
+ case URI_ITEM:
+ String itemSelector = String.format("_id = '%s'", uri.getPathSegments().get(1));
+ builder.appendWhere(itemSelector);
+ break;
+ default:
+ throw new IllegalArgumentException(
+ "Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
+ }
+
+ String query = builder.buildQuery(projection, selection, groupBy, null, sortOrder, null);
+ Cursor cursor = getDatabase().query(query, selectionArgs);
+ cursor.setNotificationUri(getContext().getContentResolver(), uri);
+ return cursor;
+ }
+
+ // --- change listeners
+
+ public static void notifyDatabaseModification(Context context) {
+ ContentResolver cr = context.getContentResolver();
+ cr.notifyChange(TASKS, null, false);
+ }
+
+ private String getTableName(Uri uri) {
+ tracker.get().reportEvent(Events.ASTRID_3_CP);
+ String uriString = uri.toString();
+ if (uriString.startsWith(TASKS.toString())) {
+ return "tasks";
+ }
+ if (uriString.startsWith(METADATA.toString())) {
+ return "tags";
+ }
+ throw new IllegalArgumentException("Unsupported uri: " + uriString);
+ }
+}
diff --git a/app/src/main/java/org/tasks/analytics/Tracking.java b/app/src/main/java/org/tasks/analytics/Tracking.java
index 8147d557a..252966e8e 100644
--- a/app/src/main/java/org/tasks/analytics/Tracking.java
+++ b/app/src/main/java/org/tasks/analytics/Tracking.java
@@ -38,7 +38,8 @@ public class Tracking {
TASKER_LIST_NOTIFICATION(R.string.tracking_category_tasker, R.string.tracking_action_list_notification),
IMPORT_XML(R.string.tracking_category_backup, R.string.tracking_action_import_xml),
IMPORT_JSON(R.string.tracking_category_backup, R.string.tracking_action_import_json),
- EXPORT(R.string.tracking_category_backup, R.string.tracking_action_export);
+ EXPORT(R.string.tracking_category_backup, R.string.tracking_action_export),
+ ASTRID_3_CP(R.string.tracking_category_api, R.string.tracking_action_api_astrid3);
public final int category;
public final int action;
diff --git a/app/src/main/java/org/tasks/injection/ApplicationModule.java b/app/src/main/java/org/tasks/injection/ApplicationModule.java
index c9fcbd136..08b09d41a 100644
--- a/app/src/main/java/org/tasks/injection/ApplicationModule.java
+++ b/app/src/main/java/org/tasks/injection/ApplicationModule.java
@@ -7,6 +7,7 @@ import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.provider.Astrid2TaskProvider;
+import com.todoroo.astrid.provider.Astrid3ContentProvider;
import org.tasks.ErrorReportingSingleThreadExecutor;
import org.tasks.analytics.Tracker;
import org.tasks.data.AlarmDao;
@@ -64,7 +65,10 @@ public class ApplicationModule {
.allowMainThreadQueries() // TODO: remove me
.addMigrations(Migrations.MIGRATIONS)
.build()
- .init(tracker, () -> Astrid2TaskProvider.notifyDatabaseModification(context));
+ .init(tracker, () -> {
+ Astrid2TaskProvider.notifyDatabaseModification(context);
+ Astrid3ContentProvider.notifyDatabaseModification(context);
+ });
}
@Provides
diff --git a/app/src/main/java/org/tasks/injection/ContentProviderComponent.java b/app/src/main/java/org/tasks/injection/ContentProviderComponent.java
index a1d5f320a..6befd1fd6 100644
--- a/app/src/main/java/org/tasks/injection/ContentProviderComponent.java
+++ b/app/src/main/java/org/tasks/injection/ContentProviderComponent.java
@@ -1,6 +1,7 @@
package org.tasks.injection;
import com.todoroo.astrid.provider.Astrid2TaskProvider;
+import com.todoroo.astrid.provider.Astrid3ContentProvider;
import dagger.Component;
@@ -10,5 +11,7 @@ import dagger.Component;
ContentProviderModule.class
})
public interface ContentProviderComponent {
+ void inject(Astrid3ContentProvider astrid3ContentProvider);
+
void inject(Astrid2TaskProvider astrid2TaskProvider);
}
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 4911b0000..0ca87f991 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -13,6 +13,7 @@
لا يوجد مهام للتصدير.
إستعادة المُلخَّص
إذن المهام
+ أخذ التصاريح
حذف هذه المهمه؟
الوقت (ساعة : دقيقة)
تراجع
diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml
index c3602ee0b..ec57d0f8c 100644
--- a/app/src/main/res/values-bg-rBG/strings.xml
+++ b/app/src/main/res/values-bg-rBG/strings.xml
@@ -24,6 +24,7 @@
Нямате достъп до папка: %s
SD картата не може да бъде достъпена!
Tasks Разрешение
+ Tasks Разрешение
Сигурни ли сте че искате да отхвърлите промените си?
Продължаване на редактиране
Изтриване на тази задача?
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index b6a871ca2..de5722116 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -17,6 +17,7 @@
No es pot accedir a la carpeta: %s
No s\'ha pogut accedir a la targeta SD.
Permís de l\'Tasks
+ Permís de l\'Tasks
Voleu suprimir aquesta tasca?
Temps (hores : minuts)
Desfés
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 4318ec01f..775826aae 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -20,6 +20,7 @@
Chyba v přístupu k adresáři: %s
Chyba v přístupu k SD kartě!
Tasks Práva
+ Tasks Práva
Smazat tento úkol?
Čas (hodin : minut)
Vrátit změny
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index a1a091777..8f5a73ae6 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -19,6 +19,7 @@
Kan ikke få adgang til mappen: %s
Kan ikke få adgang til dig SD-kort!
Tasks Tilladelser
+ Tasks Tilladelser
Slet denne opgave?
Tid (timer : minutter)
Tryk for at indstille
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 1512deace..62ac2f9ac 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -19,6 +19,7 @@
Ordner konnte nicht geöffnet werden: %s
Auf die SD-Karte konnte nicht zugegriffen werden!
Tasks Zugriffsrechte
+ Tasks Zugriffsrechte
Änderungen wirklich verwerfen?
Weiter bearbeiten
Diese Aufgabe löschen?
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index f6cfef883..b4eb2438d 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -22,6 +22,7 @@
Δεν υπάρχει πρόσβαση στον φάκελο: %s
Δεν υπάρχει πρόσβαση στην SD κάρτα!
Άδεια εργασιών
+ Άδεια Εργασιών
Διαγραφή εργασίας;
Ώρα (ώρες : λεπτά)
Αναίρεση
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 9b639ede0..d3ace9461 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -21,6 +21,7 @@
No se puede acceder a la carpeta: %s
¡No se pudo acceder a su tarjeta de memoria SD!
Permisos de Tasks
+ Permisos de Tasks
¿Quieres descartar los cambios?
Seguir editando
¿Borrar esta tarea?
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 5988127cb..2c3ecf9cc 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -24,6 +24,7 @@
Ei pääsyä kansioon: %s
Ei pääsyä SD kortillesi!
Tasks käyttöoikeus
+ Tasks käyttöoikeus
Oletko varma että haluat hylätä muutokset?
Jatka muokkausta
Poista tämä tehtävä?
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index f2b162bec..2fb62cab2 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -21,6 +21,7 @@
Impossible d\'accéder au dossier : %s
Impossible d\'accéder à la carte SD !
Permissions de Tasks
+ Permissions de Tasks
Êtes-vous sûr de vouloir annuler vos modifications ?
Continuer l\'édition
Supprimer cette tâche ?
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 1b0087450..7dd2327ef 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -21,6 +21,7 @@
No se puede acceder a la carpeta: %s
¡No se pudo acceder a su tarjeta de memoria SD!
Permisos de Tasks
+ Permisos de Tasks
¿Quieres descartar los cambios?
Seguir editando
¿Borrar esta tarea?
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 3c90d4be4..ad6157000 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -24,6 +24,7 @@
Könyvtár nem elérhető: %s
SD kártya nem elérhető
Tasks Engedélyek
+ Tasks Engedélyek
Biztosan el akarja vetni a változtatásokat?
Vissza a szerkesztéshez
Feladat törlése?
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 557699157..7d2e04160 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -21,6 +21,7 @@
Impossibile accedere alla cartella: %s
Impossibile accedere alla scheda SD!
Permessi attività
+ Permessi attività
Sicuro di voler annullare tutte le modifiche?
Continua modifica
Elimino l\'attività?
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 544d30eda..4346e3b72 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -21,6 +21,7 @@
לא ניתן לגשת לתיקיה: %s
לא ניתן לגשת לכרטיס ה־SD שלך!
הרשאות אסטריד
+ הרשאות אסטריד
להתעלם מהשינויים ?
המשך לערוך
למחוק משימה זו?
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 2318e94ef..ef59978b1 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -21,6 +21,7 @@
フォルダ %s を開けません
SDカードにアクセスできません
タスクの読み込み
+ タスクの読み込み
変更を破棄してもよろしいですか?
編集を続ける
このタスクを削除しますか?
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index e56ff2fda..18d79947a 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -24,6 +24,7 @@
폴더에 접근 불가: %s
SD 카드에 접근할 수 없습니다!
Tasks 권한
+ Tasks 권한
변경 사항을 버리시겠습니까?
계속 편집
이 할일을 삭제할까요?
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index e61befdbb..afbad2a6c 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -21,6 +21,7 @@
Nėra prieigos prie aplanko: %s
Nėra prieigos prie SD kortelės!
Tasks leidimas
+ Tasks leidimas
Ar tikrai norite atmesti pakeitimus?
Tęsti redagavimą
Ištrinti šią užduotį?
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 141f9d47b..8c424f8ac 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -17,6 +17,7 @@
Får ikke tilgang til mappen: %s
Ditt SD-kort er ikke tilgjengelig!
Tasks Tillatelse
+ Tasks Tillatelse
Slett denne oppgaven?
Tid (timer : minutter)
Klikk for å sette
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 0f79ab04b..4e8df71ea 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -21,6 +21,7 @@
Toegang geweigerd tot map: %s
Toegang tot SD-kaart geweigerd!
Taak toestemmingen
+ Taak toestemmingen
Weet u zeker dat u de wijzigingen niet wilt opslaan?
Blijf editen
Taak verwijderen?
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 5addf4638..2792994d4 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -21,6 +21,7 @@
Brak dostępu do folderu: %s
Brak dostępu do Twojej karty SD!
Uprawnienia Tasks
+ Zezwolenia Tasks
Czy jesteś pewien, że chcesz porzucić zmiany?
Kontynuuj edycję
Usunąć to zadanie?
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index fd37babbb..043898ec8 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -20,6 +20,7 @@
Não foi possível acessar a pasta: %s
Não foi possível acessar seu cartão SD!
Permissões do Tasks
+ Permissões do Tasks
Você tem certeza que deseja descartar suas mudanças?
Continuar editando
Excluir esta tarefa?
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 46123cd87..f0af0e552 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -23,6 +23,7 @@
Não é possível aceder à pasta: %s
Não é possível aceder ao seu cartão SD!
Permissões do Tasks
+ Permissões do Tasks
Tem a certeza que deseja descartar as alterações?
Continuar a editar
Remover esta tarefa?
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index c2b7ef5e7..4eabdf10b 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -21,6 +21,7 @@
Нет доступа к папке:%s
Нет доступа к карте памяти!
Разрешения Tasks
+ Разрешения Tasks
Вы действительно хотите отказаться от сделанных изменений?
Продолжить редактировать
Удалить эту задачу?
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 439d06c2a..9a24e42c0 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -21,6 +21,7 @@
Chyba v prístupe do priečinka. %s
Chyba v prístupe k SD karte!
Povolenia Úloh
+ Tasks povolenia
Naozaj nechceš uložiť zmeny?
Pokračuj v úpravách
Vymazať túto úlohu?
diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/app/src/main/res/values-sl-rSI/strings.xml
index a14435bff..77e13978e 100644
--- a/app/src/main/res/values-sl-rSI/strings.xml
+++ b/app/src/main/res/values-sl-rSI/strings.xml
@@ -22,6 +22,7 @@
Datoteka:%s ni dostopna
Tvoja SD kartica ni dostopna.
Dovoljenje Opravkom
+ Dovoljenje Opravkom
Zbrišem ta opravek?
Čas (ure : minute)
Razveljavi
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 2c6729f8d..e9f96ac60 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -21,6 +21,7 @@
Mappåtkomst nekad: %s
SD-kort ej tillgängligt!
Tasks Tillstånd
+ Tasks Tillstånd
Är du säker på att du inte vill spara dina ändringar?
Fortsätt redigera
Radera denna uppgift?
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index f78f0ba7b..1e4e5f35c 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -25,6 +25,7 @@
%s dizinine erişilemedi.
Bellek kartınıza erişilemiyor!
Tasks İzni
+ Tasks İzni
Değişikliklerinizi gözden çıkarmak istediğinize emin misiniz?
Düzenlemeyi sürdür
Bu görev silinsin mi?
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 4683e3cfb..2fa0368ee 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -24,6 +24,7 @@
Немає доступу до папки: %s
Немає доступу до карти SD!
Дозволи Tasks
+ Дозволи Tasks
Дійсно хочете скасувати ваші зміни?
Продовжити редагування
Видалити цю задачу?
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index c58a28f21..b58f85e14 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -22,6 +22,7 @@
无法访问您的 SD 卡!
清单小助理权限
确定放弃你的改变吗?
+ 清单小助理权限
继续编辑
确认删除?
时间(小时:分钟)
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 7a28ad60d..e7e1f3c89 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -19,6 +19,7 @@
無法開啟資料夾: %s
無法存取您的SD卡!
Tasks 權限
+ Tasks 權限
確認刪除?
時間 (小時:分鐘)
撤消
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 1fc75d39a..781f0fe14 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -13,6 +13,7 @@
date_shortcut_evening
date_shortcut_night
+ create new tasks, edit existing tasks
read tasks, display task filters
@@ -232,6 +233,7 @@
Error
Tasker
Backup
+ API
Add
Start
Move
@@ -249,6 +251,7 @@
Import XML
Import JSON
Export
+ 3
Night Mismatch
Play Services Error
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 608512400..627ab19cb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -57,6 +57,9 @@ File %1$s contained %2$s.\n\n
Tasks Permission
+
+ Tasks Permission
+
Are you sure you want to discard your changes?