From 90ba23620c811c83714671a2e8c5b4da99e09e26 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 27 Mar 2018 16:45:05 -0500 Subject: [PATCH] Partially restore Astrid3ContentProvider --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 31 +- .../astrid/api/AstridApiConstants.java | 23 ++ .../provider/Astrid3ContentProvider.java | 335 ++++++++++++++++++ .../java/org/tasks/analytics/Tracking.java | 3 +- .../tasks/injection/ApplicationModule.java | 6 +- .../injection/ContentProviderComponent.java | 3 + app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-bg-rBG/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 1 + app/src/main/res/values-hu/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-iw/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sl-rSI/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/keys.xml | 3 + app/src/main/res/values/strings.xml | 3 + 39 files changed, 435 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/todoroo/astrid/provider/Astrid3ContentProvider.java diff --git a/app/build.gradle b/app/build.gradle index bee1fc7fb..24e02956e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,8 +33,8 @@ android { defaultConfig { testApplicationId "org.tasks.test" applicationId "org.tasks" - versionCode 506 - versionName "5.3.4" + versionCode 507 + versionName "5.3.5" targetSdkVersion 27 minSdkVersion 15 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8367ac57c..29d43fd33 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,12 +59,30 @@ + + + + + + + + + + + + + *
  • access it directly just like any other content provider + *
  • 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?