From 20007b35d156831d625575e0aa0ee2de9aa574e6 Mon Sep 17 00:00:00 2001 From: Masoud Abkenar Date: Thu, 19 Jan 2017 13:59:10 +0100 Subject: [PATCH 001/881] welcome_link_url to providers page --- res/values/setup.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/setup.xml b/res/values/setup.xml index 8702106632..c19d46f083 100644 --- a/res/values/setup.xml +++ b/res/values/setup.xml @@ -20,7 +20,7 @@ true true - "https://nextcloud.com" + "https://nextcloud.com/providers" From 758cd442c907ce034782c2d6611032f7dcf26526 Mon Sep 17 00:00:00 2001 From: Masoud Abkenar Date: Thu, 19 Jan 2017 14:02:35 +0100 Subject: [PATCH 002/881] New to Nextcloud? -> Don't have a server yet? --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 13b3b135e2..bf76038136 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -57,7 +57,7 @@ Server address https://… Username Password - New to %1$s? + Don’t have a server yet? Get one from a provider Files Connect Upload From ff8e86160448781a357877272791cffeb5bc59fe Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 16 Jan 2017 15:10:57 +0100 Subject: [PATCH 003/881] fix quota display --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ae239c80d1..8d8836c686 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ dependencies { /// dependencies for app building compile name: 'touch-image-view' - compile 'com.github.nextcloud:android-library:1.0.9' + compile 'com.github.nextcloud:android-library:1.0.10' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' From 122e1636753a0b7a600b3d49de07f8550ff864e5 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Tue, 17 Jan 2017 22:43:50 +0100 Subject: [PATCH 004/881] prevent NoClassDefFound --- .../owncloud/android/datamodel/UploadsStorageManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/datamodel/UploadsStorageManager.java b/src/com/owncloud/android/datamodel/UploadsStorageManager.java index 221ddd3bc6..949acf5d83 100644 --- a/src/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/src/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -27,6 +27,7 @@ import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; +import android.os.Build; import android.os.PersistableBundle; import com.owncloud.android.db.OCUpload; @@ -381,7 +382,11 @@ public class UploadsStorageManager extends Observable { ); // add pending Jobs - return getPendingJobs().toArray(uploads); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return uploads; + } else { + return getPendingJobs().toArray(uploads); + } } private List getPendingJobs() { From 4aa12e390c35092bdd0a377098eeac8d37a90777 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 19 Jan 2017 17:02:20 +0100 Subject: [PATCH 005/881] changes according to Code Review --- .../owncloud/android/datamodel/UploadsStorageManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/datamodel/UploadsStorageManager.java b/src/com/owncloud/android/datamodel/UploadsStorageManager.java index 949acf5d83..070569f432 100644 --- a/src/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/src/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -40,6 +40,7 @@ import com.owncloud.android.operations.UploadFileOperation; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; import java.util.List; import java.util.Observable; @@ -382,10 +383,12 @@ public class UploadsStorageManager extends Observable { ); // add pending Jobs - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return uploads; } else { - return getPendingJobs().toArray(uploads); + List result = getPendingJobs(); + Collections.addAll(result, uploads); + return result.toArray(uploads); } } From 68ed1fc903efb7927afd718f5b1c7631fd6864dd Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 17 Jan 2017 11:40:14 +0100 Subject: [PATCH 006/881] 1.4.1 RC4 --- AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4a731842ae..a4724bd780 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,8 +20,8 @@ --> + android:versionCode="10040104" + android:versionName="1.4.1 RC4"> Date: Sat, 21 Jan 2017 14:09:19 +0100 Subject: [PATCH 007/881] add further checks for API Level --- src/com/owncloud/android/datamodel/UploadsStorageManager.java | 3 +++ src/com/owncloud/android/files/services/FileUploader.java | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/datamodel/UploadsStorageManager.java b/src/com/owncloud/android/datamodel/UploadsStorageManager.java index 070569f432..3abfcd0ae1 100644 --- a/src/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/src/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -29,6 +29,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.PersistableBundle; +import android.support.annotation.RequiresApi; import com.owncloud.android.db.OCUpload; import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; @@ -392,6 +393,7 @@ public class UploadsStorageManager extends Observable { } } + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) private List getPendingJobs() { JobScheduler js = (JobScheduler) mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE); @@ -409,6 +411,7 @@ public class UploadsStorageManager extends Observable { return list; } + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) public void cancelPendingJob(String accountName, String remotePath){ JobScheduler js = (JobScheduler) mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE); diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index c0c9659784..0d6ffb0738 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -33,6 +33,7 @@ import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Binder; +import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -678,7 +679,7 @@ public class FileUploader extends Service // need to update now table in mUploadsStorageManager, // since the operation will not get to be run by FileUploader#uploadFile mUploadsStorageManager.removeUpload(accountName, remotePath); - } else { + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // try to cancel job in jobScheduler mUploadsStorageManager.cancelPendingJob(accountName, remotePath); } From 74a5fef4e7f70cf9a2d8877a98509cea7c008ce2 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 22 Jan 2017 01:32:53 +0000 Subject: [PATCH 008/881] [tx-robot] updated from transifex --- res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index e9f10adf67..c6ed2c4925 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -497,8 +497,8 @@ Des permissions supplémentaires sont exigées pour téléverser & télécharger des fichiers. Le fichier n\'a pas été trouvé sur le système de fichier local - Voulez-vous vraiment supprimer les objets sélectionnés? - Voulez-vous vraiment supprimer les objets sélectionnés et leurs contenus? + Voulez-vous vraiment supprimer les éléments sélectionnés ? + Voulez-vous vraiment supprimer les éléments sélectionnés et leurs contenus ? En attente de recharge de l\'appareil Rechercher Il s\'agit d\'une fonctionnalité de Nextcloud ; veuillez mettre à jour.. From ad32ed593fbd0abe0669ae8681bb0a490989a83e Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 22 Jan 2017 23:31:09 +0000 Subject: [PATCH 009/881] [tx-robot] updated from transifex --- res/values-fr/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index c6ed2c4925..891d58c223 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -83,7 +83,7 @@ Chargement… Aucune application trouvée pour ce type de fichier ! Aucun fichier n\'est présent dans ce dossier. - Aucun téléversement disponible + Aucun historique de téléversement Téléversez du contenu ou activez le téléversement instantané ! dossier dossiers @@ -299,7 +299,7 @@ placeholder.txt Image PNG 389 Ko - 18/05/2012 12:23 + 18/05/2012 12:23 PM 12:23:45 Téléverse par wifi uniquement @@ -309,8 +309,8 @@ Téléverser les images uniquement si le chargeur est branché /InstantUpload Conflit de fichiers - Quel(s) fichier(s) voulez-vous garder ? Si vous sélectionnez les deux, un chiffre sera ajouté au nom du fichier local. - Garder les deux versions + Quels fichiers voulez-vous conserver ? Si vous sélectionnez les deux, un chiffre sera ajouté au nom du fichier local. + Conserver les deux version locale version serveur @@ -329,7 +329,7 @@ Une erreur est survenue lors de la tentative de partage de ce fichier ou répertoire Impossible de supprimer le partage. Vérifiez que le fichier est bien présent Une erreur est survenue lors de la tentative d’annulation du partage de ce fichier ou répertoire - Actualisation impossible. Veuillez vérifier que ce fichier existe + Mise à jour impossible. Veuillez vérifier que ce fichier existe Une erreur est survenue lors de la mise à jour du partage Saisissez un mot de passe Vous devez saisir un mot de passe @@ -372,7 +372,7 @@ ERREUR : Espace insufisant ERREUR : Le fichier n\'est pas modifiable ERREUR : Le fichier est illisible - ERREUR : Le répertoire Nextcloud existe déjà + ERREUR : Le dossier Nextcloud existe déjà ERREUR : Lors de la migration ERREUR : Lors de la mise à jour de l\'index @@ -396,7 +396,7 @@ Déplacer Copier Il n\'y a rien ici. Vous pouvez ajouter un dossier ! - Choisir + Sélectionner Impossible de déplacer. Vérifiez que le fichier existe Il n\'est pas possible de déplacer un dossier vers un de ses descendants @@ -412,7 +412,7 @@ de copier ce fichier Téléversement immédiat - Détails + Propriétés Téléversement immédiat du dossier vidéos La synchronisation du dossier %1$s n\'a pas pu être terminée @@ -482,7 +482,7 @@ Terminer le partage Terminé - Nouvel essai échoué + Relancer les échoués Effacer les échecs Effacer les réussis Effacer tous les terminés @@ -491,7 +491,7 @@ Affichage Liste Gestion de l\'espace - Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \n\nLes fichiers téléchargés ne seront pas impactés.\n\nCe processus peut prendre du temps. + Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \\n\\nLes fichiers téléchargés ne seront pas impactés.\\n\\nCette opération peut prendre du temps. Effacer les données Certains fichiers n\'ont pu être supprimés. @@ -518,7 +518,7 @@ ou La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid. Contribuer activement Rejoingez la discussion sur IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Aidez les autres sur le <a href=\"%1$s>forum</a> + Aidez les autres sur le <a href=\"%1$s\">forum</a>. <a href=\"%1$s>Traduisez</a> l\'application Développeurs ? Contribuez ! Plus de détails sur la page <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> Déplacer vers… From 9707d9a5840550cf9a549cc54bed74227a9b16a7 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 24 Jan 2017 01:17:19 +0000 Subject: [PATCH 010/881] [tx-robot] updated from transifex --- res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 891d58c223..1f3e901e2c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -185,7 +185,7 @@ Code de sécurité supprimé Code de sécurité enregistré - lecteur de musique %1$s + Lecteur de musique %1$s %1$s (lecture) %1$s (chargement) Lecture de %1$s terminée @@ -491,7 +491,7 @@ Affichage Liste Gestion de l\'espace - Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \\n\\nLes fichiers téléchargés ne seront pas impactés.\\n\\nCette opération peut prendre du temps. + Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \n\nLes fichiers téléchargés ne seront pas impactés.\n\nCette opération peut prendre du temps. Effacer les données Certains fichiers n\'ont pu être supprimés. From 0959d7aee625a861e4f542bfc06114a58d27a1ba Mon Sep 17 00:00:00 2001 From: Masoud Abkenar Date: Wed, 25 Jan 2017 15:38:45 +0100 Subject: [PATCH 011/881] line break + "click here to get one from a provider" --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index bf76038136..2fa6190f22 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -57,7 +57,7 @@ Server address https://… Username Password - Don’t have a server yet? Get one from a provider + Don’t have a server yet?\nClick here to get one from a provider Files Connect Upload From c61a1cdddb46ddc6e60714201ea1852916a65042 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Thu, 26 Jan 2017 01:17:28 +0000 Subject: [PATCH 012/881] [tx-robot] updated from transifex --- res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 16039e2d8e..93247d4894 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -129,7 +129,7 @@ Hochladen von %1$s konnte nicht abgeschlossen werden Hochladen fehlgeschlagen, erneute Anmeldung erforderlich Uploads - Wird hochgeladen + Aktuell Fehlgeschlagen (Tippen zum Wiederholen) Hochgeladen Fertiggestellt From fa577c7af9f175d6ec86c01930a6f7d01956fd55 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Wed, 4 Jan 2017 20:00:45 +0100 Subject: [PATCH 013/881] updated version info for final release --- AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a4724bd780..6947690423 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,8 +20,8 @@ --> + android:versionCode="10040199" + android:versionName="1.4.1"> Date: Mon, 16 Jan 2017 08:38:05 +0100 Subject: [PATCH 014/881] proper changelog 1.4.1 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aee1da8d4..cd37cbadaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ ## 1.4.1 (January, 2017) - Share URLs to Nextcloud +- Improve performance of Auto Upload view +- Fix for removing files +- Proper email sharee handling +- Navigation drawer: Fix lag on older devices +- Android 7: Pending jobs in upload view +- Android 7: Auto upload: ignore ".tmp" files and folders - Bugfixes and design improvements ## 1.4.0 (December 8, 2016) From 6737c21a1a5ebcd56ff3095cc090bfb0ecd68c6f Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 24 Jan 2017 09:59:49 +0100 Subject: [PATCH 015/881] set correct release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd37cbadaa..508db35489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.4.1 (January, 2017) +## 1.4.1 (January 27, 2017) - Share URLs to Nextcloud - Improve performance of Auto Upload view - Fix for removing files From f59773ab220cd2cafb9099217884c5bbf3e11a53 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 23 Jan 2017 17:14:09 +0100 Subject: [PATCH 016/881] grey icon work for shared (link/user) Resolves #577 --- drawable_resources/shared_via_link.svg | 65 ++++++++++++++++++++++ drawable_resources/shared_via_users.svg | 56 +++++++++++++++++++ res/drawable-hdpi/shared_via_link.png | Bin 987 -> 992 bytes res/drawable-hdpi/shared_via_users.png | Bin 930 -> 940 bytes res/drawable-mdpi/shared_via_link.png | Bin 659 -> 701 bytes res/drawable-mdpi/shared_via_users.png | Bin 609 -> 634 bytes res/drawable-xhdpi/shared_via_link.png | Bin 1239 -> 1436 bytes res/drawable-xhdpi/shared_via_users.png | Bin 1207 -> 1248 bytes res/drawable-xxhdpi/shared_via_link.png | Bin 1916 -> 2098 bytes res/drawable-xxhdpi/shared_via_users.png | Bin 1840 -> 1921 bytes res/drawable-xxxhdpi/shared_via_link.png | Bin 0 -> 2991 bytes res/drawable-xxxhdpi/shared_via_users.png | Bin 0 -> 2596 bytes 12 files changed, 121 insertions(+) create mode 100644 drawable_resources/shared_via_link.svg create mode 100644 drawable_resources/shared_via_users.svg create mode 100644 res/drawable-xxxhdpi/shared_via_link.png create mode 100644 res/drawable-xxxhdpi/shared_via_users.png diff --git a/drawable_resources/shared_via_link.svg b/drawable_resources/shared_via_link.svg new file mode 100644 index 0000000000..a00150a895 --- /dev/null +++ b/drawable_resources/shared_via_link.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/drawable_resources/shared_via_users.svg b/drawable_resources/shared_via_users.svg new file mode 100644 index 0000000000..51017f6ed9 --- /dev/null +++ b/drawable_resources/shared_via_users.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/res/drawable-hdpi/shared_via_link.png b/res/drawable-hdpi/shared_via_link.png index da2f1c86a07e1b6c5417793d34dda1c7c5314874..a7c3fd6ba373b73581762ec9d593729cc483c66d 100644 GIT binary patch delta 910 zcmV;919AM@2jB;gI|~*i000&x0ZCFM@R3F+e_csLK~zYI&6UqfBWD=LpEvF#%#0b) zM8v^(5lLiQc4^T}GBYVj!BOy!=&{#=?O}JpEx2CX(qrkRr{YDtDJFv2WE?{@beH~+ zj5&CT6R2q7#Qbp6`1ImPlBT<^w$S(XKJWW}KD;mA_k98W<3{eYIGfE1`FuW9DwP

=C@!Mor90ECdMo}M1vT2rglx&dx+M7M!o z&wEfP6dqcAnx@TL2~<^m)&V|uaB%QBBHAsus;UdARO%4`fXn5&^msgpcM7uE>_^FD z^3!&BJRYB4T3Y%{Rn?~e06RN7&(_!1BUe{fKnQ_AAh0)Yf1eMX zo}M}Y0Q`Rcuc9bE)pdO~7K?pSuh$`!N=1&2jvm+R^~*-10fZ1x6h)I|dER3EO@N5@ zL?ZF++1c6SN~Pko>Kw;q2qATjL#bVKih&0dh6_#b2)8eFQx;8a6m5M|nv(4}p zft8kxjg4TV(STeo=N%Xrh`ZhH8UR2#o&HeQ^;txuE-o&7);fk^N_~BOuR@{F7wzyC zfvT!=&1rEs9FEb^(N}^XY*G{jilW55Uhhjy(_ZZF?>__p=I9`2?m4n006Qqzi_+Ve~gWd{h(>u*Q=|mH)#7H(6h-00#Kg}|r!!M57C+eA+k13Z_>BMnARdn| zuC1+wJ5IVIyhUIb29wETp6~AN%BE>jR^8=tT?PVyO<9)b-xuB@u$r#xl3^G^wOVDI kPUi*B^9k$W`d_xc0E~U|a?O!s8vpTPwWB>pF delta 905 zcmV;419tr22ipgbI|~9f6tg+999d# zy0Jz{A(@M$ha?vZf`a}5y?C$;V-7){P$UG3co1d6!ZNUIRD@k{=0R#E>sI{rk|(plwQ2mp@ABUF`}w{1+puR8{pv?B{a1{d>VV=d@m{>-uw{f5~JruNs1zrr8i20AOKZVMFM$*=*&%;KVe| zul?{;Ds|2|r-&G=*ISk~6^q6G7TWpw`HedZtgo-W1UDpj2i^cs? zsq|QAIp;K;PM-^HG#Y(l+xFO<1@ig)ufmW>B&q^lC=~VyAt=kTx3#r3j))Hwe?@VH zR+6M^#+doOwzO6%l}{1z3Lr0?CeYe03d`wUtixb0Kmw|$XB^s?t9@mJUr}2#87v4_lYD) zxVX6ZouVjXgpjLu3e;Z9H#*|7qvY&Jv~hcZ7dc$B!mC}fa5qH zdY;$a(b0iROH1GS;qRQ>KcThj!pzLfkD?WkNaV6yE#QM7dwcfi=qOdKRzC^`gO}lO_|?F`z}oQe f@LE$R2Y`P8)#4`10mZEu00000NkvXXu0mjfT;|1z diff --git a/res/drawable-hdpi/shared_via_users.png b/res/drawable-hdpi/shared_via_users.png index 78dd0b6ffbdf7208d2ce1a8555e050838ef2fdcf..9f301247651338ea6fb5259d89978fa035164fce 100644 GIT binary patch delta 858 zcmV-g1Eu_;2doE>I|~*i000&x0ZCFM@R3F+e2pYaoh;c^Xj&?wzR=u zf0#6xOxY_jSY2IxytcOXI*~|p$T648wL{bNxYcTn0sts3E1t<@3>zC8FDu0X0M^&n zEs;p%jeNeeK|CHGW?8ngS}qogIV4HyxU@kkmFhe^JS1!7d7f7RKobB!<3)sXxf~u0 z2FE-e&k)P9*K6@iCesc8aOXD2X0vVKe{lH4^z^iwVVH7Tlu9Ltq6no@sm#T3ykN0d zrVv6BK*bbElB8H!SsCLv?v5Y`Y8=OtPN#D!91cH>L?Z6(?d>j^+tAPeeSLiqo6Rntt1CHV;XX-()U26-P@;OYgj1?~ot}Pw)6?^vrs)ZUQ1LviEgS6Z z?b!>3Le+`V>2&$Q!NCcNqCQ_lScc-X!kSN2sZ=LQrE(7dgj$?44fJ}wzqPfsYITW3 zLNhZnGd?#r_c0U-4PVrtJVndPf6L>Gi;E*iM@Qw+ZEtTcWwY6G>(pwsNKw>=#bTLt zI2_(eAxV-H2%!@EgTI!Y-|rvcIPSh62#s2;HbD@CZ*z0=$=24^0LO8d%)>D3grX>a zZ*TAH{{H@LmSqQu#UiHBXgIUk{MG4n&Q~?4g?K!Ei(#1O!C-J8oldLee|Sqvir&g)Znyi5M&oj=JceO>b8~YJppO4QtJVH6 zo6Y;xaz>*uh!CpJpu4*}L`l>1CxgL|tBku`F4k(bevr>~fBMmA)SgbKhYt=8)HHL;wH)07*qoM6N<$f}5|A>;M1& delta 848 zcmV-W1F!t72cid%I|~=?000;60lmhhfssZie;-LiK~zYIrIlYuT5%M|f7iUO{FA0w zh(v>+NwA3G3NaysQF0}E>cuS#$)2QM$_QF}8I0A~a(fCgqq#x@n?^4g^JSz1T`n23 z88@FS)M zfAaG3lTy7=AP{IJNpe4HoEwdejlb5{*B_Ua0%&S#dSNn|9$c48BoeIp`g%U26hJf@ zt)t7wVzIlo0;JPv!Q$fLYro&$Kv#$3`0t{O0f1+-*{1sX`gU_S^?xxvJ#8=4m}9rw zpZE9o@32^`OD6fx+0bY-dw#$FK9)7vf7sa21_A-q@$oTNB9R=(<#G!_5L*t1W6bS# z_sq}F%g)ZuE}$$H3u(35ADx|@u6R7&u(r0Q2nK^fsZ@H})zuYHDwSgjh2j$e0LH?? z!u#6V+CRA~Xm4--X)qYRv)SxRE5mUdbUIzcX0uHJ05_*gQ8*k{C6h_nrS_dpf9JSR zC_KMuo=headV71RrKP1;sZ@$z&} z=m18eaeIG%UtF~DKQYS7%TMSELZOhr>-8D{pyE~pv)MeyU@&Os&t|j1U@(N7PUkoP z+$jpMySrOGF){H4!>}voJ0HyDe{x}HXy~iU8Hx<(j=WdNW@AP_wD`Fsx#4-ac9Dk=^Mg7B$Ss!_36 aeDW8zlc^G23VI^|0000zD-K~y-6m5?!L8ets8|DQdg_i0TI z;jExU4RH+xK~V^ZT4JCn++1j&9lJ!5J!46eP8~Y6OTbN#NJuIw9z7AUO>q!hL@{Jg ztap{(=ONtJNw^f#kT?GM{~qr>fCq?DiYcYYctdwR8&#=PHrws?8%0rkR;yKUxm=eX ze~;%=Fc_RM_rZli;YGPz-d9zXbvm8u&CLzp?RH<8OeP8dA5Hhck|gaDLfB9!be>M9 zw^FIp5yLQgzu$jGDMfc07~ya@d?pCOAwozE1Ok^F$4v<#D*(VQG${)lL(Fkp2O*>`+@Ra-?y9QFe}+P#bGzOCBcIQ|@AvzsX0v%(uh+LR#>D6I zeFgxym7r8A34_7lsiG)8hr=HyVvBfk2?m^ZXS6Tp3d{005m%=k>gEB9S-+09apN|JiD_ zQuEGhYinN??Pa2rVp*1bJkS3T1mPV*NCyCDwOXlKt@fN{SrUy#k7Kdew}l1(KrqI# zEX!=QTHPKD2DWTAduW7>o&OaAQvk^2a&IL`+Fe>&(wCQ)r^De8V~p>G0RSEW0Awcf5?}uZFBGMeeaQb`G6NIjfv|X{00000NkvXXu0mjf DifS2@ delta 575 zcmV-F0>J&f1(OAkI|~n)000k}0ganisF6k}e-KGTK~y-6m6Jbc8gUfIzt-|~KZ-h1Eg@AoL&A-dh}lSZSVjYgvv03Lb0-T}|^rF1&o zf7=M#w!I^YVjlo;o=_-sWtt|pwFxejN}pP-)^nC+m$EE>h(@Dd=ks}RI2`&s9*_6G zupkI$00_&n*SfANw|9j?;Sd1fdH(yoVF1WxvnK$EAPCh-z|0Ks7Jbgg@>e^z_ta=8di(>KLp@r|Zw`wYV@IgY!S&1Os_ z5}5!XqA2z|ozC_@V_TMWtg7mPQ=es7dp@7<7e!H|QmMR-$K$pj2xqo!?*PCWhY3TR+GqG6g2Y^4H0@?lH1o{M!I|~lP000ie0hKEb8<9pRfA>j5K~y-6l~PZO({L1gzaKG`N`%6O z1e&ylCW4go&`4~LD~RV7#e*Pz0MVl#z?-Kkc<|t9S@0l)N`;oDhpttKAD~hQK`IJu zvV|=5Uz*MHpu5z?mhK#9nBl!)08Rl!q=-3{F%O5syk%Jr!Z17s01yPhb}E(n3;<8*CIPB+zJEa!#SzQ02d?YhYPZ{F6h%}NML(aLSmSvO0 zVnGoRWLf^AD9Y<%vAC-!%FmSn008}d|7s8fsvrm-<2c?LjYf6P^DZGG$DvxDZ{;_h2h)8?AUfp%wy61TpPwLfbb*EOVJz2Q}LP!DtuMp9) zZTo(=+r7Q4&t|g%z@HM=mqf^+AP7y4 delta 524 zcmV+n0`vX)1mOgbI|~o=000m40qLS%#*s!Sf8I$%K~y-6jg!Bt+E5h7Z*CHQVPfTpdb5rNu=|Un@F2oC+>2TDo-BbTC9p3w5z?s#qlLP?r{p z9i)SO>FMO7FGZ3AXStW}htE0OOCpyA03-nP0)fDJG#b5ME|+f(hr>5+^GH=ym7*v> ze+XT5qtSRux&<%{^JKkVM{Q@UBVaO_BtoH3-!P0j`~BYY?_E3||9UbwolbAnYPILF zSnTIf+3)vX>9Z{RyVvVA2>_tm?e?SPa+$*z|4FCQ`gXg$F`LaQrfISWA(Y8vzT|Sb zmpspZ(sjK609X`7tzNIcK&@8m9AkWKe>um_X0x9=oz7#^G(#s{Bi;yRaMVC9?yUJG)+UXSo|;;4DJB{bt+E)0MYOF z8;iw4!Wcs;m3qHgt!`_YChc}Ril%8K%kqUJNza18;5WlC%9dqeQ50V{o6Ye_cC*oF zR8$m2i$o#^gb+{^1>tb`@@U8~%w@ORec(9acs#zVD9VK6xPyJnLZNWs2sl=$RC;Fz z>2{Zx z<q8fu|zg&%e^MOcQ?7T`P1f)W^MfKVV)4%)HSwlu=94l=l;&;dw=Jg-#GyPaU-u{ ze^NxO0{{*HwgSLBAtd#$7|3KYR#jDxYnrxQQIw{9KF_c$yC?{P+T7ec=4;(mf&*gHRv{)?VjBJX5Xf)~{A0Iz8K0a=H(RYLp zICSVxc-O97$7m+%HUmB}G4aJpxYOw@fAsY9=p4uWNi{@-!NI}KSS)sgYFjn}S5>up zWMt&IKd-N^hu+@admSAeKbXyCSy7a|;c)oq@bGXe06;F6t9$h5(QW{^vLOS}Xw+W~ ze(>PIU}tCNr-YE=Gx^T!>@1Na>9nrv^#A~gL_$EsHwht`ms)~qYrX~?005esf17`8 zZ*MPeyi_V>1^^b|CH8=-s@=7~0RWQ8q(j$rGwm}B^8^5LH5<@0ZRhCd=$Ey?5wSs% zq!Y3%GgK1_v zLAXx{!I}(AO-&sO1On}A!6zmrf4=VT@82DXM9v~2LBuVQNaVuRt5>_0mX^x%?Ay0b z_INy(Xn)-XG);TEa-zPzzHlXcXlTe@DwW{Yty}(BEY=4ArF1%Nu8i^dd~uJ*bB++Q zxGn?HXtXDr&F)1+i>~V&)tydf!R2zDCxjH2mzRZ7sZ@?hrBVh(QQjqle;~`U(^MBl zG2Y$XeTL`xa3y0+1JP*IKQlA))#Bo!0RY}86beQ<*4WsXGn>sZ0DzX3mY=)2x~^EQ z*75}~KR@4$hz%BtC2BMpK@`Qf-|s(Tx7$Zoa;h4j<@N5}yNydrOK$-{ie=e69e?=n zVWXlb@6$fd^S^A{wk=tae+3f&utuXXxo6LwIZ+hPR)beHK#NQ;803q^B4o4KHbTe~ zj^k$OH|cb`E))uV7>mU|002lN5^ZyHb0#{@Fia5u@+On1=yJKfX>DyCsRjpFQHp10 zXWtnc8+)$EB$G)uA`(?q?^vzY&U89WV+@G+2O>6v!{JY4S$>_ye{dY9Kig=5wZN+~ zkjZ4MQ&Ur)uPicFt2GM%2D{z<)BgSYM-2u8`2Bv(>-C;)X=(Xwa&q$GjT<+1R>lZ| z5cwzYstl;AdOQ#av{g=Y`0(Me9XocMpm#SSo?;m0TZUlS3*bu08SucLp8Y1=Zm}D?sJ5YJgl?PCEzqo zYoeml=`3_~bevzSwpWAGb1n$Nz4gK?4VWH3e*790o0^&y&1SP)3w*6}zFq?*oLNb9<8t~}=yE{fvW7ZsVB3?Sl`P$+cy+O=yt5%GmVqA13_Uhj8K zr*n8C@aGHw04yvluro6==LQD{J9D|*sxoab80dZeJC=< delta 1160 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 tPft%-JRa| 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 diff --git a/res/drawable-xxhdpi/shared_via_users.png b/res/drawable-xxhdpi/shared_via_users.png index ae760862693297a78c08a14906a00891d323114f..b3d0f851d4a90c2e2c003d4e5ced6c3ec84375ba 100644 GIT binary patch delta 1847 zcmV-72gvxa4uKDlI}0pJ001mY0i`{bsgXt~fBs2CK~!jg?U`RpTh|@Of5$fd2iO07 zeeGdv;>4ge%0IIxjWj1>iGr<03QMIf>h`n;x>lQ(c6r&urb*LY+I9c5G*Z+lW7@i@ zA=%3?q^VFAi);u(Q9%u(jc=#`j^i%SH2tFo4<49Psnm{kgb-Z3croR2xkimf<4+Mn z`5k=@CDL73US95+nVI?d{rmR~mHHk%e|mKF>eZ_so6Y8*6t{^ECcN@sjHOFUOFteM z7^oOL0KnYboGcIse4Xd{^Tllq5s*kEUL719v|x<)JjU<$6FkqqR%~yG06`Gkp-@Ot z&6s>X4+{$mdW^BE(B2RMnM{VLW!&7{oE88&3vGuk0AnoP*w~QPGB%gXH37i3f0?Ul z8utUnSd__Ru7$(lZ#{kbbWcBTF$6(m0e~;G9k>9Du_&2Lz7!6Jzy0LNldnuqPs?ic z<#akz05Dryv|tA(DP9=f%)b=+Vu z{AMqC{$AN80As9(L?Zon?%ZiFp3YiOtJUD~cw!cdmi^wq zz<_PP!4m`lSFT)HvRbX5QWW)0;r~)^{x1MyjOOO%UR+#UtU0}Ce{ODuo}Qkiwzjru zilTmr5Tff7W@!p%z#0mLG_^QUDwS~g@@3ZHaQw$)GQEuuTC7ui6)6-zF$~jOi<92o z-ldL?jyL3Td9Y4#?U};QB`1+c%CCbZkV>UFnM@X`Q%qG+C?I07STeOZ85tQNgTdfm zS(g0{#`w@OT!5lwe>4;d{pI%U+s;~@Ii1ejrAwC<2!i-fr_2$kO;>cBPu9LMzz z4i3IKH8rK!kJHZ1&b99D?gh14{eecK`TK6=ka|(Pk%<_Fxqa{6Jy$#)-*?I7`0?Xw z7cN{_APC}*TCMgU2%*~Z=@RS+5@Xy<)Aa8iK79DqatCjhf6KKpKR+*HS+=6kQ>RV| zZnt}(rKRN$YPI^KdI~9(%!%Xi_#5$fygLvG7{lSPY-MEy2!a5I!?Aq&^y!#ZtNpVe z2q&Y_=+}mZhRlgXqWpspg08Nv?D_NOBPx~ZEBj+34#b1e+-8A5kh=PzvUi^F_vaBnR9|5oW>aI#9}e6*X#WNFunB_F~&NYrhiD& z^ckPeMWpP3<_bQ51!}UhksOXnaqv*AG=K zpc*j7hFC0ib8&I;l+Wig?N;k7L?jY{%jH^~nVFH5f6ICS0K8r=ck<-P_q1B=gW|Tj z*G4hMB*QRohQr|#LqkJkxzkoP+_-Ur>Fn%$O`%YP3+)G1+{GAEG)=!XKR^G%@bECX zyu7?Ge@dki`uh5wna$?!7upYO*WAoRZ()orcDwynFc|E7^yrbX(&ti&Y&HuF!`Lv! z%EA-ce}QlNo0;iNjIq^bv)y|B{CUUY$B*^32$`Lo)t)$U!U+JMY}pPiZ$Sus4gfz8 z1fgA{(fq!@zn`qu2ha10_4Rdqq3zIXqY8!MxmYX~Y8fk+%X1QmWZTp=q&iIyM9Gb* z91e$r1Axy8Z4D8iP$>Rsx7(}AR1rd8wOZNYf5JdR1n6|S54>LQ0z!LV#ocZhkY)-P+J=)?_l-9gRkBR=Q?AbLNbnB*~wB zp{`lCz!;O87v0WaFsM!@lPyxIbfvw$J#99d8I?+PSEW+zS{DWQ0tnb*^DKP?05kxw lAr1haA%to=qkqX^@?W~G?X3ntb29({002ovPDHLkV1mR>r&9m` delta 1765 zcmVf2~PGK~!jg&6#~@Q|leapS+i*vB%pQ zTBE_WqF!dpE!P@s9gH%Ds97&u&|9X`&B@#qE^_Z(gpGkPMPxFsS8*aj=W0aC6?NL{ z3rObd+L_!rI!)5#ygesr&714eHcgwf^}By=Sk3yJ6)RSN5b~N83I)t&^VG9v&!j*gu&cPVZzz#Syz6v2X>D!oTi|b6 zrBb1@vok^|{dMt(X9>V^kH^F5_4)u_+XfPAtxx9b>fBwlxB=YlOuoFTEiAJOQ_wL=B$OLvSmzS4= zW!YYNG2jUyBpeR^ptrYo(Je4CGD2dpSY^=y$mMcFAP~r@Mk0|YDN2A?EcQdSTD>;c zI!dK-Djz%3I*Q4^L$T7M@P82x;n4m zgb=j0woXz?FXbH^z;^{fuwA)wCA50=>WqQr`hZL4rlzK8O6fNMR13k>MWfM!l+xe( ze7@htVzD0s(5D%@UJ!%_U0q$le>H2?WDH|88gcdN)sWBU>%VpDR%pH;YPA{`i)EBj zY6GB42Q3SS!$0wQz3hbx7ecMAtuUEP*t&Hq_U+r3xO3;u5XW&n$z<}qZ^zg2Jpc90 zn>Pb%*RIVN++Z-^^5x56p6CAxpq>yy;_X(&kt3sOwL0y|tE;PV|Ni|TrS$LJ-Q6!XY}k-7cvV#u zE?v45;d%aV$z<~VG#rM}(b0BM6i;&;_lHO%@+p9ZIiY7Aq^6X9)7;!VohgjbXw0g| z&!0d4lIQs+@pyd8yfBNAe<+F_X0v%RQ=m*;QBi?2XU@FjIPM=46BFOdJ2)YP0I0cp z_wI{)f-?+*lP6C`S(g3R*w|Q0LBLa@l%6%2OnCucwrm-WA3q-Tcs#D*;o-mDpMsl@UoyesC!!Sgv)vf~YZoZ(h63eoEI-M@3XP~yW7T2#| z4{;oK4?xa8Dp@HM3Vqz(-kz6t!20#;ar^e|fFKBe2C!yH0szps-ELvN&xdTiapOkZ zyLT@r2*OtYRuw!%e<&3Cz-qNd@)aQEhK7b$4<9}pqLf+zR24J?rSvx)9UU)~O67uJ zdc7VcB_$aL*}Qr4tH+NY4@#2M0boVJLIi`sw*LNpY5Vr=QwoLREfAef2aClrCW_*7 zmSw$%4<8=OruCYen`ip^`UWLQx&YvvH_s114q&Sw2w$=+e|w*0SsTl;S7NbP8-TKm zLIBYD{r(dkkH^*1(=*uF+4-WYt82(^w@Y5H_sPh}NZYq3QbZz=pLxAr?$Dt_F_lV{ zagdglmT8B>;g=-o41n^~#q)Z-?6G6V{(;Hq!Gj0mcDvm#NzxYp zN;AGA08{{0e*vfhphz=D8487d;qiF*0|ySoGikw;w{6=t_4MgepWpBAJAL}}utuYq zcf8qbPVzkOEXc$FKotxIKN%Pp5Zc?@C+2Fwbk62)uBN629LIT6cdigY)PX?YbC=5{ z?%A_vQZAS0b!H=kps}%WMij;Ff&`cqq-1b#@K;W!f0ORowQDlhFWxt8wOT`||LH;p zQTu$p&s;8-xO?~RM81O5)zv`|gg+KMz^ouzpU-!^zrSDFxpU`KK0-L1PWO@pm=#3l z^Z9<~a5#e5Oucj2Znuj|zPv7z$;OOE<1ZP88PI4nIn@FnFWLqNA;iCO<;t82Xf&Ec z(E=C@e}?XsmX`QpkJsz$!Wm(tw`1ot9+DpC=HJ<>~ zi=y~xB9Sn~VlfQ>rADKf&}y~*%F4=%<>lpH$z-xuvyb^N$%_e56dMlz00000NkvXX Hu0mjfmU?(H diff --git a/res/drawable-xxxhdpi/shared_via_link.png b/res/drawable-xxxhdpi/shared_via_link.png new file mode 100644 index 0000000000000000000000000000000000000000..194edfa6b81522f09c4f83e97dde7610c6eabc97 GIT binary patch literal 2991 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/shared_via_users.png b/res/drawable-xxxhdpi/shared_via_users.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2bfa5f08727e698609791c0e60ff4e7301595c GIT binary patch literal 2596 zcmV+<3fuLGP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1386_uK~#90?VEpWQ`Z&8&-HuHetyr-&kp8CQ)qw?jEaJ?ChYB=^YVPoxz_-9xWoT7WWE=0 zs~}<(0IV_$V-dqJX#f}lfXjrCXeoYfD*+JEVi?9l$z<|zMNu3hBO}&WEXM1)4vQ8o zO4iiW=%Oh8TM&dlavXPNCO&T)0TA&XO6e>8{ry$Fy}e>Gnan%RjXCGFi;;Z6ScBX^n|Q;@92X-Bn+H`Q?n})Ya8p-@SYHxFktGB7_v2RPh2J;ytlg ztgExLvnr8Dlr(qQvSqk$-@dDoBt1q5QSyzkn6k<;frvy^)t9=vyG!0Y0KkemZ%HH)-$uk``Ro-fKr)$pytlX4FY)}Oa=jf&HcP01wcej*L9!8VljJt)BH_SWIjPeR@1bH5{bkU;c!@b@4feU zvwVx9hyXC{yR;$%KtzkK>wZew$vnwy(bHk<84KHIzqfQTfWPH$9I^}zY_=c`VhJn2wXwJfoC zo(G@LN9}g|+xhHsDgYu9UDr2JN}v4n(@*7|o}RL8e2P7L_E4+U+DQn>=CjY40EoCj zRn@01T)5yqb?THS63hBdH&r(V@j$9Z**an1AqqrGys?c zfD42Wt;n1fO6k*sgM(F}P{>*8#@%i=Y~Q|JsjI8QbLY;n$BrEnv)R0V%&!nd5%%ug ztGM0n9$A*3%lGn|;-&&1qD9lRM>3hr4-`dljE;`7larG?%d$pQRh3p-TWb(PhGkiP zl@Ky8HBZyD=5#uJXlQ826AFc#(P&AXDsZ`6(9zMM)YjHc@I3z_$8l#gsCf z=;%=HzWeU5D2jhkRrSe{k&z{#P{=txK3>wsWm$%8+qTiwt5-)QNqUJ8@?p-J?1o`% zrj&l)VzDgLb)BW!J7umgg!9_9YcrZNg(OL^b?a7j&6+haK@fh!vh3fAJ-TL*R{%s@Juxxy zT4!gc+suR{AEGEidwYAbzP>(YwOU`b*=)UYvGFOUeG4EWlSm|9=<4b!>*fVPfX$mX zCmI?W6sy(xTbs@H?o1zBGnpnpDwXDwx3#q;SeE^hD2i_uOPJ=1 zTmd|>Sj=vg^OlyDlq}2NC4`jT)1D)8J0u#%ai;xWvMdV#V19jTBDn&LyWQ^6DvlyV zqfwSp`XVAOHOr^jd?OJ;M1EpoBJlk4&sUihpr)nJ>O5R!^9*@5k2m~4j1_sL3Fj=>5-Sv)+jyS_GXJlD^ zoe&Z$SFBv2EKnh2ywWk|h1U&@pzoC|C|7qDNKL z*H525z4W7xKDy}%jVOxX_xqCr0|WNK!NHO`O@t6=Y;4s1em~_nE+~rPVM0iGn}t)c ziy0BoN-2Fx(=`9-)2E%EefF6pw<+TBc);iLCGWfMzJwqMze^+%ZK|r)zw^#J@}*0c zN)p0iv4GF#)3$8cqOvUewjc;c2qE7Hh=_7Jo!*(rWI6!AZ5W0H5edt(1^`4H4#!&z z!}JnDX7qJFqXi=3!elb}h+!D*x~@C3*{p?O7{YO!frwXlp8xBOIzD@2e2tZh+-^7c ze7BCb>vzH1(t}@o@x`)0AmBDT>-;)as}&9&JUA)K^3L2B zD!@EnlS9OHilQ7E9UZL>g+lV!Sb37d*49?d@AtoAv)TTfYpaNRf{6GnRaFlS4-YRn ze*C!8?0%%f;eZ1N4h*_nuHCt|int#@2>B-f>_Nna<;#~Jj6@>Ufk2?-LzP0PstSnc zMnsa^a<8Z>GK7$SNs{!K*X#Y+{{8z$8XFsn9|D#Dr4#^QT7g$l0!%>&`G>>dc-iCe zm?nU(>i_^u?&lRLzzw2qx7)NPs?+HN0GL*2Rk8p>OP4M+<-mkt7~nWg%XdklVg(?C zByBd^q%608se?^w!tckKJ|G zUAOF`p`k%{xmI)VuNUvPE(%^ais?+KG zL!q~RF1M8cUk4Ev0>CN&SO@?a0Ehy>xqKz>9qw?4g8T Date: Fri, 27 Jan 2017 16:15:10 +0100 Subject: [PATCH 017/881] 1.4.2 RC1 --- AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6947690423..80678592ac 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,8 +20,8 @@ --> + android:versionCode="10040201" + android:versionName="1.4.2 RC1"> Date: Sun, 8 Jan 2017 08:55:48 +0100 Subject: [PATCH 018/881] remove read_phone_state permission --- AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 80678592ac..1df083b751 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -56,7 +56,6 @@ - Date: Thu, 26 Jan 2017 18:27:06 +0100 Subject: [PATCH 019/881] removed WRITE_EXTERNAL_STORAGE -> covered by WRITE_EXTERNAL_STORAGE --- AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 1df083b751..e8c1a28421 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -56,7 +56,6 @@ - Date: Wed, 28 Dec 2016 19:24:01 +0100 Subject: [PATCH 020/881] fix codacy warnings --- .../authentication/AccountAuthenticator.java | 67 ++-- .../authentication/AuthenticatorActivity.java | 8 +- .../services/ConnectivityActionReceiver.java | 11 +- .../android/files/services/FileUploader.java | 3 +- .../operations/CreateFolderOperation.java | 24 +- .../CreateShareWithShareeOperation.java | 2 +- .../operations/RefreshFolderOperation.java | 20 +- .../SynchronizeFolderOperation.java | 171 +++++----- .../android/services/OperationsService.java | 54 +-- src/com/owncloud/android/ui/ActionItem.java | 61 ---- src/com/owncloud/android/ui/QuickAction.java | 307 ------------------ .../ui/activity/FolderSyncActivity.java | 1 - .../android/ui/activity/HookActivity.java | 2 - .../ui/activity/LogHistoryActivity.java | 4 +- .../ui/activity/ManageAccountsActivity.java | 1 - .../ui/activity/ParticipateActivity.java | 5 +- .../android/ui/activity/ToolbarActivity.java | 6 - .../android/ui/adapter/FolderSyncAdapter.java | 2 - .../android/ui/adapter/LogListAdapter.java | 76 ----- .../android/ui/dialog/SamlWebViewDialog.java | 6 - .../ui/fragment/EditShareFragment.java | 7 - .../ui/fragment/SearchShareesFragment.java | 4 - .../ui/fragment/ShareFileFragment.java | 9 +- .../android/utils/ErrorMessageAdapter.java | 7 +- 24 files changed, 136 insertions(+), 722 deletions(-) delete mode 100644 src/com/owncloud/android/ui/ActionItem.java delete mode 100644 src/com/owncloud/android/ui/QuickAction.java delete mode 100644 src/com/owncloud/android/ui/adapter/LogListAdapter.java diff --git a/src/com/owncloud/android/authentication/AccountAuthenticator.java b/src/com/owncloud/android/authentication/AccountAuthenticator.java index 6734a33251..7595486811 100644 --- a/src/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/com/owncloud/android/authentication/AccountAuthenticator.java @@ -38,7 +38,8 @@ import com.owncloud.android.lib.common.utils.Log_OC; /** * Authenticator for ownCloud accounts. * - * Controller class accessed from the system AccountManager, providing integration of ownCloud accounts with the Android system. + * Controller class accessed from the system AccountManager, + * providing integration of ownCloud accounts with the Android system. * * TODO - better separation in operations for OAuth-capable and regular ownCloud accounts. * TODO - review completeness @@ -46,13 +47,13 @@ import com.owncloud.android.lib.common.utils.Log_OC; public class AccountAuthenticator extends AbstractAccountAuthenticator { /** - * Is used by android system to assign accounts to authenticators. Should be - * used by application and all extensions. + * Is used by android system to assign accounts to authenticators. + * Should be used by application and all extensions. */ - public static final String KEY_AUTH_TOKEN_TYPE = "authTokenType"; - public static final String KEY_REQUIRED_FEATURES = "requiredFeatures"; - public static final String KEY_LOGIN_OPTIONS = "loginOptions"; - public static final String KEY_ACCOUNT = "account"; + private static final String KEY_AUTH_TOKEN_TYPE = "authTokenType"; + private static final String KEY_REQUIRED_FEATURES = "requiredFeatures"; + private static final String KEY_LOGIN_OPTIONS = "loginOptions"; + private static final String KEY_ACCOUNT = "account"; private static final String TAG = AccountAuthenticator.class.getSimpleName(); @@ -74,8 +75,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException { - Log_OC.i(TAG, "Adding account with type " + accountType - + " and auth token " + authTokenType); + Log_OC.i(TAG, "Adding account with type " + accountType + " and auth token " + authTokenType); final Bundle bundle = new Bundle(); @@ -131,8 +131,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { try { validateAccountType(account.type); } catch (AuthenticatorException e) { - Log_OC.e(TAG, "Failed to validate account type " + account.type + ": " - + e.getMessage(), e); + Log_OC.e(TAG, "Failed to validate account type " + account.type + ": " + e.getMessage(), e); return e.getFailureBundle(); } Intent intent = new Intent(mContext, AuthenticatorActivity.class); @@ -149,8 +148,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } @Override - public Bundle editProperties(AccountAuthenticatorResponse response, - String accountType) { + public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { return null; } @@ -166,8 +164,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { validateAccountType(account.type); validateAuthTokenType(authTokenType); } catch (AuthenticatorException e) { - Log_OC.e(TAG, "Failed to validate account type " + account.type + ": " - + e.getMessage(), e); + Log_OC.e(TAG, "Failed to validate account type " + account.type + ": " + e.getMessage(), e); return e.getFailureBundle(); } @@ -219,8 +216,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Account account, String authTokenType, Bundle options) throws NetworkErrorException { final Intent intent = new Intent(mContext, AuthenticatorActivity.class); - intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, - response); + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -232,8 +228,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } @Override - public Bundle getAccountRemovalAllowed( - AccountAuthenticatorResponse response, Account account) + public Bundle getAccountRemovalAllowed(AccountAuthenticatorResponse response, Account account) throws NetworkErrorException { return super.getAccountRemovalAllowed(response, account); } @@ -244,15 +239,13 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { intent.addFlags(Intent.FLAG_FROM_BACKGROUND); } - private void validateAccountType(String type) - throws UnsupportedAccountTypeException { + private void validateAccountType(String type) throws UnsupportedAccountTypeException { if (!type.equals(MainApp.getAccountType())) { throw new UnsupportedAccountTypeException(); } } - private void validateAuthTokenType(String authTokenType) - throws UnsupportedAuthTokenTypeException { + private void validateAuthTokenType(String authTokenType) throws UnsupportedAuthTokenTypeException { if (!authTokenType.equals(MainApp.getAuthTokenType()) && !authTokenType.equals(AccountTypeUtils.getAuthTokenTypePass(MainApp.getAccountType())) && !authTokenType.equals(AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType())) && @@ -269,8 +262,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { public AuthenticatorException(int code, String errorMsg) { mFailureBundle = new Bundle(); mFailureBundle.putInt(AccountManager.KEY_ERROR_CODE, code); - mFailureBundle - .putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg); + mFailureBundle.putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg); } public Bundle getFailureBundle() { @@ -278,8 +270,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } } - public static class UnsupportedAccountTypeException extends - AuthenticatorException { + public static class UnsupportedAccountTypeException extends AuthenticatorException { private static final long serialVersionUID = 1L; public UnsupportedAccountTypeException() { @@ -288,8 +279,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } } - public static class UnsupportedAuthTokenTypeException extends - AuthenticatorException { + public static class UnsupportedAuthTokenTypeException extends AuthenticatorException { private static final long serialVersionUID = 1L; public UnsupportedAuthTokenTypeException() { @@ -297,23 +287,4 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { "Unsupported auth token type"); } } - - public static class UnsupportedFeaturesException extends - AuthenticatorException { - public static final long serialVersionUID = 1L; - - public UnsupportedFeaturesException() { - super(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION, - "Unsupported features"); - } - } - - public static class AccessDeniedException extends AuthenticatorException { - public AccessDeniedException(int code, String errorMsg) { - super(AccountManager.ERROR_CODE_INVALID_RESPONSE, "Access Denied"); - } - - private static final long serialVersionUID = 1L; - - } } diff --git a/src/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/com/owncloud/android/authentication/AuthenticatorActivity.java index 8f290541ee..8de275802f 100644 --- a/src/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -91,10 +91,12 @@ import com.owncloud.android.ui.dialog.SamlWebViewDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; import com.owncloud.android.utils.DisplayUtils; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import java.security.cert.X509Certificate; import java.util.Map; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** * This Activity is used to add an ownCloud account to the App */ @@ -401,7 +403,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity * @param savedInstanceState Saved activity state, as in {{@link #onCreate(Bundle)} */ private void initServerPreFragment(Bundle savedInstanceState) { - boolean checkHostUrl = true; /// step 1 - load and process relevant inputs (resources, intent, savedInstanceState) boolean isUrlInputAllowed = getResources().getBoolean(R.bool.show_server_url_input); @@ -444,9 +445,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity mHostUrlInput.setFocusable(false); } if (isUrlInputAllowed) { - if (mServerInfo.mBaseUrl.isEmpty()) { - checkHostUrl = false; - } mRefreshButton = findViewById(R.id.embeddedRefreshButton); } else { findViewById(R.id.hostUrlFrame).setVisibility(View.GONE); diff --git a/src/com/owncloud/android/files/services/ConnectivityActionReceiver.java b/src/com/owncloud/android/files/services/ConnectivityActionReceiver.java index ce698d10a6..f6c34399f0 100755 --- a/src/com/owncloud/android/files/services/ConnectivityActionReceiver.java +++ b/src/com/owncloud/android/files/services/ConnectivityActionReceiver.java @@ -21,10 +21,8 @@ package com.owncloud.android.files.services; import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; @@ -51,7 +49,7 @@ public class ConnectivityActionReceiver extends BroadcastReceiver { /** * Magic keyword, by Google. * - * {@See http://developer.android.com/intl/es/reference/android/net/wifi/WifiInfo.html#getSSID()} + * {@see http://developer.android.com/intl/es/reference/android/net/wifi/WifiInfo.html#getSSID()} */ private static final String UNKNOWN_SSID = ""; @@ -192,7 +190,9 @@ public class ConnectivityActionReceiver extends BroadcastReceiver { } } - private void wifiDisconnected(Context context) { + /** + * + private void wifiDisconnected() { // TODO something smart // NOTE: explicit cancellation of only-wifi instant uploads is not needed anymore, since currently: @@ -204,6 +204,7 @@ public class ConnectivityActionReceiver extends BroadcastReceiver { } + static public void enableActionReceiver(Context context) { PackageManager pm = context.getPackageManager(); ComponentName compName = new ComponentName(context.getApplicationContext(), ConnectivityActionReceiver.class); @@ -218,5 +219,5 @@ public class ConnectivityActionReceiver extends BroadcastReceiver { PackageManager.DONT_KILL_APP); } - + */ } \ No newline at end of file diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 0d6ffb0738..3859fc42ef 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -674,7 +674,6 @@ public class FileUploader extends Service upload = mCurrentUpload; } if (upload != null) { - boolean pending = !upload.isUploadInProgress(); upload.cancel(); // need to update now table in mUploadsStorageManager, // since the operation will not get to be run by FileUploader#uploadFile @@ -686,7 +685,7 @@ public class FileUploader extends Service } /** - * Cancels all the uploads for an account + * Cancels all the uploads for an account. * * @param account ownCloud account. */ diff --git a/src/com/owncloud/android/operations/CreateFolderOperation.java b/src/com/owncloud/android/operations/CreateFolderOperation.java index a2cee2811e..b0354153f3 100644 --- a/src/com/owncloud/android/operations/CreateFolderOperation.java +++ b/src/com/owncloud/android/operations/CreateFolderOperation.java @@ -42,7 +42,7 @@ public class CreateFolderOperation extends SyncOperation implements OnRemoteOper private static final String TAG = CreateFolderOperation.class.getSimpleName(); protected String mRemotePath; - protected boolean mCreateFullPath; + private boolean mCreateFullPath; /** * Constructor @@ -53,20 +53,18 @@ public class CreateFolderOperation extends SyncOperation implements OnRemoteOper public CreateFolderOperation(String remotePath, boolean createFullPath) { mRemotePath = remotePath; mCreateFullPath = createFullPath; - } @Override protected RemoteOperationResult run(OwnCloudClient client) { - CreateRemoteFolderOperation operation = new CreateRemoteFolderOperation(mRemotePath, - mCreateFullPath); + CreateRemoteFolderOperation operation = new CreateRemoteFolderOperation(mRemotePath, mCreateFullPath); RemoteOperationResult result = operation.execute(client); if (result.isSuccess()) { saveFolderInDB(); } else { - Log_OC.e(TAG, mRemotePath + "hasn't been created"); + Log_OC.e(TAG, mRemotePath + " hasn't been created"); } return result; @@ -75,22 +73,20 @@ public class CreateFolderOperation extends SyncOperation implements OnRemoteOper @Override public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { if (operation instanceof CreateRemoteFolderOperation) { - onCreateRemoteFolderOperationFinish((CreateRemoteFolderOperation)operation, result); + onCreateRemoteFolderOperationFinish(result); } } - - private void onCreateRemoteFolderOperationFinish(CreateRemoteFolderOperation operation, - RemoteOperationResult result) { + private void onCreateRemoteFolderOperationFinish(RemoteOperationResult result) { if (result.isSuccess()) { saveFolderInDB(); } else { - Log_OC.e(TAG, mRemotePath + "hasn't been created"); + Log_OC.e(TAG, mRemotePath + " hasn't been created"); } } /** - * Save new directory in local database + * Save new directory in local database. */ public void saveFolderInDB() { if (mCreateFullPath && getStorageManager(). @@ -101,8 +97,7 @@ public class CreateFolderOperation extends SyncOperation implements OnRemoteOper String composedRemotePath = "/"; // For each antecesor folders create them recursively - for (int i=0; i 0 || mFailsInFavouritesFound > 0) { result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be a different result code, but will do the job @@ -344,18 +344,14 @@ public class RefreshFolderOperation extends RemoteOperation { /** - * Synchronizes the data retrieved from the server about the contents of the target folder - * with the current data in the local database. - * - * Grants that mChildren is updated with fresh data after execution. - * - * @param folderAndFiles Remote folder and children files in Folder - * - * @param client Client instance to the remote server where the data were - * retrieved. - * @return 'True' when any change was made in the local data, 'false' otherwise + * Synchronizes the data retrieved from the server about the contents of the target folder + * with the current data in the local database. + *

+ * Grants that mChildren is updated with fresh data after execution. + * + * @param folderAndFiles Remote folder and children files in Folder */ - private void synchronizeData(ArrayList folderAndFiles, OwnCloudClient client) { + private void synchronizeData(ArrayList folderAndFiles) { // get 'fresh data' from the database mLocalFolder = mStorageManager.getFileByPath(mLocalFolder.getRemotePath()); diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index 2f19253dac..d8a27dedf1 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -154,9 +154,8 @@ public class SynchronizeFolderOperation extends SyncOperation { } if (result.isSuccess()) { - syncContents(client); + syncContents(); } - } if (mCancellationRequested.get()) { @@ -168,15 +167,13 @@ public class SynchronizeFolderOperation extends SyncOperation { } return result; - } - private RemoteOperationResult checkForChanges(OwnCloudClient client) - throws OperationCancelledException { + private RemoteOperationResult checkForChanges(OwnCloudClient client) throws OperationCancelledException { Log_OC.d(TAG, "Checking changes in " + mAccount.name + mRemotePath); mRemoteFolderChanged = true; - RemoteOperationResult result = null; + RemoteOperationResult result; if (mCancellationRequested.get()) { throw new OperationCancelledException(); @@ -185,12 +182,11 @@ public class SynchronizeFolderOperation extends SyncOperation { // remote request ReadRemoteFileOperation operation = new ReadRemoteFileOperation(mRemotePath); result = operation.execute(client); - if (result.isSuccess()){ + if (result.isSuccess()) { OCFile remoteFolder = FileStorageUtils.fillOCFile((RemoteFile) result.getData().get(0)); // check if remote and local folder are different - mRemoteFolderChanged = - !(remoteFolder.getEtag().equalsIgnoreCase(mLocalFolder.getEtag())); + mRemoteFolderChanged = !(remoteFolder.getEtag().equalsIgnoreCase(mLocalFolder.getEtag())); result = new RemoteOperationResult(ResultCode.OK); @@ -216,8 +212,7 @@ public class SynchronizeFolderOperation extends SyncOperation { } - private RemoteOperationResult fetchAndSyncRemoteFolder(OwnCloudClient client) - throws OperationCancelledException { + private RemoteOperationResult fetchAndSyncRemoteFolder(OwnCloudClient client) throws OperationCancelledException { if (mCancellationRequested.get()) { throw new OperationCancelledException(); } @@ -227,7 +222,7 @@ public class SynchronizeFolderOperation extends SyncOperation { Log_OC.d(TAG, "Synchronizing " + mAccount.name + mRemotePath); if (result.isSuccess()) { - synchronizeData(result.getData(), client); + synchronizeData(result.getData()); if (mConflictsFound > 0 || mFailsInFileSyncsFound > 0) { result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be a different result code, but will do the job @@ -237,7 +232,6 @@ public class SynchronizeFolderOperation extends SyncOperation { removeLocalFolder(); } } - return result; } @@ -260,19 +254,14 @@ public class SynchronizeFolderOperation extends SyncOperation { /** - * Synchronizes the data retrieved from the server about the contents of the target folder - * with the current data in the local database. + * Synchronizes the data retrieved from the server about the contents of the target folder + * with the current data in the local database. * - * Grants that mChildren is updated with fresh data after execution. + * Grants that mChildren is updated with fresh data after execution. * - * @param folderAndFiles Remote folder and children files in Folder - * - * @param client Client instance to the remote server where the data were - * retrieved. - * @return 'True' when any change was made in the local data, 'false' otherwise + * @param folderAndFiles Remote folder and children files in Folder */ - private void synchronizeData(ArrayList folderAndFiles, OwnCloudClient client) - throws OperationCancelledException { + private void synchronizeData(ArrayList folderAndFiles) throws OperationCancelledException { FileDataStorageManager storageManager = getStorageManager(); // parse data from remote folder @@ -283,7 +272,7 @@ public class SynchronizeFolderOperation extends SyncOperation { Log_OC.d(TAG, "Remote folder " + mLocalFolder.getRemotePath() + " changed - starting update of local data "); - List updatedFiles = new Vector(folderAndFiles.size() - 1); + List updatedFiles = new Vector<>(folderAndFiles.size() - 1); mFilesForDirectDownload.clear(); mFilesToSyncContents.clear(); @@ -293,7 +282,7 @@ public class SynchronizeFolderOperation extends SyncOperation { // get current data about local contents of the folder to synchronize List localFiles = storageManager.getFolderContent(mLocalFolder, false); - Map localFilesMap = new HashMap(localFiles.size()); + Map localFilesMap = new HashMap<>(localFiles.size()); for (OCFile file : localFiles) { localFilesMap.put(file.getRemotePath(), file); } @@ -306,79 +295,86 @@ public class SynchronizeFolderOperation extends SyncOperation { r = (RemoteFile) folderAndFiles.get(i); remoteFile = FileStorageUtils.fillOCFile(r); - /// new OCFile instance to merge fresh data from server with local state - updatedFile = FileStorageUtils.fillOCFile(r); - updatedFile.setParentId(mLocalFolder.getFileId()); - /// retrieve local data for the read file // localFile = mStorageManager.getFileByPath(remoteFile.getRemotePath()); localFile = localFilesMap.remove(remoteFile.getRemotePath()); + /// new OCFile instance to merge fresh data from server with local state + updatedFile = FileStorageUtils.fillOCFile(r); + updatedFile.setParentId(mLocalFolder.getFileId()); + /// add to updatedFile data about LOCAL STATE (not existing in server) - updatedFile.setLastSyncDateForProperties(mCurrentSyncTime); - if (localFile != null) { - updatedFile.setFileId(localFile.getFileId()); - updatedFile.setFavorite(localFile.isFavorite()); - updatedFile.setLastSyncDateForData(localFile.getLastSyncDateForData()); - updatedFile.setModificationTimestampAtLastSyncForData( - localFile.getModificationTimestampAtLastSyncForData() - ); - updatedFile.setStoragePath(localFile.getStoragePath()); - // eTag will not be updated unless file CONTENTS are synchronized - updatedFile.setEtag(localFile.getEtag()); - if (updatedFile.isFolder()) { - updatedFile.setFileLength(localFile.getFileLength()); - // TODO move operations about size of folders to FileContentProvider - } else if (mRemoteFolderChanged && MimeTypeUtil.isImage(remoteFile) && - remoteFile.getModificationTimestamp() != - localFile.getModificationTimestamp()) { - updatedFile.setNeedsUpdateThumbnail(true); - Log.d(TAG, "Image " + remoteFile.getFileName() + " updated on the server"); - } - updatedFile.setPublicLink(localFile.getPublicLink()); - updatedFile.setShareViaLink(localFile.isSharedViaLink()); - updatedFile.setShareWithSharee(localFile.isSharedWithSharee()); - updatedFile.setEtagInConflict(localFile.getEtagInConflict()); - } else { - // remote eTag will not be updated unless file CONTENTS are synchronized - updatedFile.setEtag(""); - } + updateLocalStateData(remoteFile, localFile, updatedFile); /// check and fix, if needed, local storage path searchForLocalFileInDefaultPath(updatedFile); /// classify file to sync/download contents later - if (remoteFile.isFolder()) { - /// to download children files recursively - synchronized (mCancellationRequested) { - if (mCancellationRequested.get()) { - throw new OperationCancelledException(); - } - startSyncFolderOperation(remoteFile.getRemotePath()); - } - - } else { - /// prepare content synchronization for files (any file, not just favorites) - SynchronizeFileOperation operation = new SynchronizeFileOperation( - localFile, - remoteFile, - mAccount, - true, - mContext - ); - mFilesToSyncContents.add(operation); - - } + classifyFileForLaterSyncOrDownload(remoteFile, localFile); updatedFiles.add(updatedFile); } // save updated contents in local database storageManager.saveFolder(remoteFolder, updatedFiles, localFilesMap.values()); - } - - + + private void updateLocalStateData(OCFile remoteFile, OCFile localFile, OCFile updatedFile) { + updatedFile.setLastSyncDateForProperties(mCurrentSyncTime); + if (localFile != null) { + updatedFile.setFileId(localFile.getFileId()); + updatedFile.setFavorite(localFile.isFavorite()); + updatedFile.setLastSyncDateForData(localFile.getLastSyncDateForData()); + updatedFile.setModificationTimestampAtLastSyncForData( + localFile.getModificationTimestampAtLastSyncForData() + ); + updatedFile.setStoragePath(localFile.getStoragePath()); + // eTag will not be updated unless file CONTENTS are synchronized + updatedFile.setEtag(localFile.getEtag()); + if (updatedFile.isFolder()) { + updatedFile.setFileLength(localFile.getFileLength()); + // TODO move operations about size of folders to FileContentProvider + } else if (mRemoteFolderChanged && MimeTypeUtil.isImage(remoteFile) && + remoteFile.getModificationTimestamp() != + localFile.getModificationTimestamp()) { + updatedFile.setNeedsUpdateThumbnail(true); + Log.d(TAG, "Image " + remoteFile.getFileName() + " updated on the server"); + } + updatedFile.setPublicLink(localFile.getPublicLink()); + updatedFile.setShareViaLink(localFile.isSharedViaLink()); + updatedFile.setShareWithSharee(localFile.isSharedWithSharee()); + updatedFile.setEtagInConflict(localFile.getEtagInConflict()); + } else { + // remote eTag will not be updated unless file CONTENTS are synchronized + updatedFile.setEtag(""); + } + } + + private void classifyFileForLaterSyncOrDownload(OCFile remoteFile, OCFile localFile) + throws OperationCancelledException { + if (remoteFile.isFolder()) { + /// to download children files recursively + synchronized (mCancellationRequested) { + if (mCancellationRequested.get()) { + throw new OperationCancelledException(); + } + startSyncFolderOperation(remoteFile.getRemotePath()); + } + + } else { + /// prepare content synchronization for files (any file, not just favorites) + SynchronizeFileOperation operation = new SynchronizeFileOperation( + localFile, + remoteFile, + mAccount, + true, + mContext + ); + mFilesToSyncContents.add(operation); + } + } + + private void prepareOpsFromLocalKnowledge() throws OperationCancelledException { List children = getStorageManager().getFolderContent(mLocalFolder, false); for (OCFile child : children) { @@ -415,9 +411,9 @@ public class SynchronizeFolderOperation extends SyncOperation { } - private void syncContents(OwnCloudClient client) throws OperationCancelledException { + private void syncContents() throws OperationCancelledException { startDirectDownloads(); - startContentSynchronizations(mFilesToSyncContents, client); + startContentSynchronizations(mFilesToSyncContents); } @@ -439,18 +435,15 @@ public class SynchronizeFolderOperation extends SyncOperation { * Performs a list of synchronization operations, determining if a download or upload is needed * or if exists conflict due to changes both in local and remote contents of the each file. * - * If download or upload is needed, request the operation to the corresponding service and goes - * on. + * If download or upload is needed, request the operation to the corresponding service and goes on. * * @param filesToSyncContents Synchronization operations to execute. - * @param client Interface to the remote ownCloud server. */ - private void startContentSynchronizations(List filesToSyncContents, - OwnCloudClient client) + private void startContentSynchronizations(List filesToSyncContents) throws OperationCancelledException { Log_OC.v(TAG, "Starting content synchronization... "); - RemoteOperationResult contentsResult = null; + RemoteOperationResult contentsResult; for (SyncOperation op: filesToSyncContents) { if (mCancellationRequested.get()) { throw new OperationCancelledException(); diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index 8c82716e0a..505b2e3483 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -709,55 +709,6 @@ public class OperationsService extends Service { } - /** - * Sends a broadcast when a new operation is added to the queue. - * - * Local broadcasts are only delivered to activities in the same process, but can't be - * done sticky :\ - * - * @param target Account or URL pointing to an OC server. - * @param operation Added operation. - */ - private void sendBroadcastNewOperation(Target target, RemoteOperation operation) { - Intent intent = new Intent(ACTION_OPERATION_ADDED); - if (target.mAccount != null) { - intent.putExtra(EXTRA_ACCOUNT, target.mAccount); - } else { - intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl); - } - //LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); - //lbm.sendBroadcast(intent); - sendStickyBroadcast(intent); - } - - - // TODO - maybe add a notification for real start of operations - - /** - * Sends a LOCAL broadcast when an operations finishes in order to the interested activities c - * an update their view - * - * Local broadcasts are only delivered to activities in the same process. - * - * @param target Account or URL pointing to an OC server. - * @param operation Finished operation. - * @param result Result of the operation. - */ - private void sendBroadcastOperationFinished(Target target, RemoteOperation operation, - RemoteOperationResult result) { - Intent intent = new Intent(ACTION_OPERATION_FINISHED); - intent.putExtra(EXTRA_RESULT, result); - if (target.mAccount != null) { - intent.putExtra(EXTRA_ACCOUNT, target.mAccount); - } else { - intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl); - } - //LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); - //lbm.sendBroadcast(intent); - sendStickyBroadcast(intent); - } - - /** * Notifies the currently subscribed listeners about the end of an operation. * @@ -784,9 +735,8 @@ public class OperationsService extends Service { } } if (count == 0) { - Pair undispatched = - new Pair(operation, result); - mUndispatchedFinishedOperations.put(((Runnable) operation).hashCode(), undispatched); + Pair undispatched = new Pair<>(operation, result); + mUndispatchedFinishedOperations.put(operation.hashCode(), undispatched); } Log_OC.d(TAG, "Called " + count + " listeners"); } diff --git a/src/com/owncloud/android/ui/ActionItem.java b/src/com/owncloud/android/ui/ActionItem.java deleted file mode 100644 index e1fa805c79..0000000000 --- a/src/com/owncloud/android/ui/ActionItem.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * ownCloud Android client application - * - * @author Bartek Przybylski - * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2015 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.owncloud.android.ui; - -import android.graphics.drawable.Drawable; -import android.view.View.OnClickListener; - -/** - * Represents an Item on the ActionBar. - */ -public class ActionItem { - private Drawable mIcon; - private String mTitle; - private OnClickListener mClickListener; - - public ActionItem() { - } - - public void setTitle(String title) { - mTitle = title; - } - - public String getTitle() { - return mTitle; - } - - public void setIcon(Drawable icon) { - mIcon = icon; - } - - public Drawable getIcon() { - return mIcon; - } - - public void setOnClickListener(OnClickListener listener) { - mClickListener = listener; - } - - public OnClickListener getOnClickListerner() { - return mClickListener; - } - -} diff --git a/src/com/owncloud/android/ui/QuickAction.java b/src/com/owncloud/android/ui/QuickAction.java deleted file mode 100644 index db27951e88..0000000000 --- a/src/com/owncloud/android/ui/QuickAction.java +++ /dev/null @@ -1,307 +0,0 @@ -/** - * ownCloud Android client application - * - * @author Lorensius. W. T - * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2015 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.owncloud.android.ui; - -import android.content.Context; - -import android.graphics.Rect; -import android.graphics.drawable.Drawable; - -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.LinearLayout; -import android.widget.ScrollView; - -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup.LayoutParams; -import android.view.ViewGroup; - -import java.util.ArrayList; - -import com.owncloud.android.R; - - -/** - * Popup window, shows action list as icon and text like the one in Gallery3D - * app. - */ -public class QuickAction extends CustomPopup { - private final View root; - private final ImageView mArrowUp; - private final ImageView mArrowDown; - private final LayoutInflater inflater; - private final Context context; - - protected static final int ANIM_GROW_FROM_LEFT = 1; - protected static final int ANIM_GROW_FROM_RIGHT = 2; - protected static final int ANIM_GROW_FROM_CENTER = 3; - protected static final int ANIM_REFLECT = 4; - protected static final int ANIM_AUTO = 5; - - private int animStyle; - private ViewGroup mTrack; - private ScrollView scroller; - private ArrayList actionList; - - /** - * Constructor - * - * @param anchor {@link View} on where the popup window should be displayed - */ - public QuickAction(View anchor) { - super(anchor); - - actionList = new ArrayList(); - context = anchor.getContext(); - inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - - root = (ViewGroup) inflater.inflate(R.layout.popup, null); - - mArrowDown = (ImageView) root.findViewById(R.id.arrow_down); - mArrowUp = (ImageView) root.findViewById(R.id.arrow_up); - - setContentView(root); - - mTrack = (ViewGroup) root.findViewById(R.id.tracks); - scroller = (ScrollView) root.findViewById(R.id.scroller); - animStyle = ANIM_AUTO; - } - - /** - * Set animation style - * - * @param animStyle animation style, default is set to ANIM_AUTO - */ - public void setAnimStyle(int animStyle) { - this.animStyle = animStyle; - } - - /** - * Add action item - * - * @param action {@link ActionItem} object - */ - public void addActionItem(ActionItem action) { - actionList.add(action); - } - - /** - * Show popup window. Popup is automatically positioned, on top or bottom of - * anchor view. - * - */ - public void show() { - preShow(); - - int xPos, yPos; - - int[] location = new int[2]; - - mAnchor.getLocationOnScreen(location); - - Rect anchorRect = new Rect(location[0], location[1], location[0] - + mAnchor.getWidth(), location[1] + mAnchor.getHeight()); - - createActionList(); - - root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT)); - root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); - - int rootHeight = root.getMeasuredHeight(); - int rootWidth = root.getMeasuredWidth(); - - int screenWidth = mWManager.getDefaultDisplay().getWidth(); - int screenHeight = mWManager.getDefaultDisplay().getHeight(); - - // automatically get X coord of popup (top left) - if ((anchorRect.left + rootWidth) > screenWidth) { - xPos = anchorRect.left - (rootWidth - mAnchor.getWidth()); - } else { - if (mAnchor.getWidth() > rootWidth) { - xPos = anchorRect.centerX() - (rootWidth / 2); - } else { - xPos = anchorRect.left; - } - } - - int dyTop = anchorRect.top; - int dyBottom = screenHeight - anchorRect.bottom; - - boolean onTop = (dyTop > dyBottom) ? true : false; - - if (onTop) { - if (rootHeight > dyTop) { - yPos = 15; - LayoutParams l = scroller.getLayoutParams(); - l.height = dyTop - mAnchor.getHeight(); - } else { - yPos = anchorRect.top - rootHeight; - } - } else { - yPos = anchorRect.bottom; - - if (rootHeight > dyBottom) { - LayoutParams l = scroller.getLayoutParams(); - l.height = dyBottom; - } - } - - showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), - anchorRect.centerX() - xPos); - - setAnimationStyle(screenWidth, anchorRect.centerX(), onTop); - - mWindow.showAtLocation(mAnchor, Gravity.NO_GRAVITY, xPos, yPos); - } - - /** - * Set animation style - * - * @param screenWidth screen width - * @param requestedX distance from left edge - * @param onTop flag to indicate where the popup should be displayed. Set - * TRUE if displayed on top of anchor view and vice versa - */ - private void setAnimationStyle(int screenWidth, int requestedX, - boolean onTop) { - int arrowPos = requestedX - mArrowUp.getMeasuredWidth() / 2; - - switch (animStyle) { - case ANIM_GROW_FROM_LEFT: - mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left - : R.style.Animations_PopDownMenu_Left); - break; - - case ANIM_GROW_FROM_RIGHT: - mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right - : R.style.Animations_PopDownMenu_Right); - break; - - case ANIM_GROW_FROM_CENTER: - mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center - : R.style.Animations_PopDownMenu_Center); - break; - - case ANIM_REFLECT: - mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Reflect - : R.style.Animations_PopDownMenu_Reflect); - break; - - case ANIM_AUTO: - if (arrowPos <= screenWidth / 4) { - mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left - : R.style.Animations_PopDownMenu_Left); - } else if (arrowPos > screenWidth / 4 - && arrowPos < 3 * (screenWidth / 4)) { - mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center - : R.style.Animations_PopDownMenu_Center); - } else { - mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right - : R.style.Animations_PopDownMenu_Right); - } - - break; - } - } - - /** - * Create action list - */ - private void createActionList() { - View view; - String title; - Drawable icon; - OnClickListener listener; - - for (int i = 0; i < actionList.size(); i++) { - title = actionList.get(i).getTitle(); - icon = actionList.get(i).getIcon(); - listener = actionList.get(i).getOnClickListerner(); - - view = getActionItem(title, icon, listener); - - view.setFocusable(true); - view.setClickable(true); - - mTrack.addView(view); - } - } - - /** - * Get action item {@link View} - * - * @param title action item title - * @param icon {@link Drawable} action item icon - * @param listener {@link View.OnClickListener} action item listener - * @return action item {@link View} - */ - private View getActionItem(String title, Drawable icon, - OnClickListener listener) { - LinearLayout container = (LinearLayout) inflater.inflate( - R.layout.action_item, null); - - ImageView img = (ImageView) container.findViewById(R.id.icon); - TextView text = (TextView) container.findViewById(R.id.title); - - if (icon != null) { - img.setImageDrawable(icon); - } - - if (title != null) { - text.setText(title); - } - - if (listener != null) { - container.setOnClickListener(listener); - } - - return container; - } - - /** - * Show arrow - * - * @param whichArrow arrow type resource id - * @param requestedX distance from left screen - */ - private void showArrow(int whichArrow, int requestedX) { - final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp - : mArrowDown; - final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown - : mArrowUp; - - final int arrowWidth = mArrowUp.getMeasuredWidth(); - - showArrow.setVisibility(View.VISIBLE); - - ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams) showArrow - .getLayoutParams(); - - param.leftMargin = requestedX - arrowWidth / 2; - - hideArrow.setVisibility(View.INVISIBLE); - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/ui/activity/FolderSyncActivity.java b/src/com/owncloud/android/ui/activity/FolderSyncActivity.java index 9ea678a1ec..a405e7ef65 100644 --- a/src/com/owncloud/android/ui/activity/FolderSyncActivity.java +++ b/src/com/owncloud/android/ui/activity/FolderSyncActivity.java @@ -63,7 +63,6 @@ import static com.owncloud.android.datamodel.SyncedFolderDisplayItem.UNPERSISTED */ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapter.ClickListener, SyncedFolderPreferencesDialogFragment.OnSyncedFolderPreferenceListener { - private static final String TAG = FolderSyncActivity.class.getSimpleName(); private static final String SYNCED_FOLDER_PREFERENCES_DIALOG_TAG = "SYNCED_FOLDER_PREFERENCES_DIALOG"; public static final String PRIORITIZED_FOLDER = "Camera"; diff --git a/src/com/owncloud/android/ui/activity/HookActivity.java b/src/com/owncloud/android/ui/activity/HookActivity.java index daca8ad019..852d3d86cc 100644 --- a/src/com/owncloud/android/ui/activity/HookActivity.java +++ b/src/com/owncloud/android/ui/activity/HookActivity.java @@ -21,6 +21,4 @@ package com.owncloud.android.ui.activity; public abstract class HookActivity extends FileActivity { - private static final String TAG = HookActivity.class.getName(); - } diff --git a/src/com/owncloud/android/ui/activity/LogHistoryActivity.java b/src/com/owncloud/android/ui/activity/LogHistoryActivity.java index 23de79b20b..d981aa171f 100644 --- a/src/com/owncloud/android/ui/activity/LogHistoryActivity.java +++ b/src/com/owncloud/android/ui/activity/LogHistoryActivity.java @@ -148,7 +148,7 @@ public class LogHistoryActivity extends ToolbarActivity { emailAddress = ""; } - ArrayList uris = new ArrayList(); + ArrayList uris = new ArrayList<>(); // Convert from paths to Android friendly Parcelable Uri's for (String file : Log_OC.getLogFileNames()) { @@ -193,7 +193,7 @@ public class LogHistoryActivity extends ToolbarActivity { public LoadingLogTask(TextView logTV){ // Use of a WeakReference to ensure the TextView can be garbage collected - textViewReference = new WeakReference(logTV); + textViewReference = new WeakReference<>(logTV); } protected String doInBackground(String... args) { diff --git a/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java index d016f80192..e571cb0c2e 100644 --- a/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java +++ b/src/com/owncloud/android/ui/activity/ManageAccountsActivity.java @@ -60,7 +60,6 @@ import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.utils.DisplayUtils; import java.util.ArrayList; -import java.util.HashSet; import java.util.Set; /** diff --git a/src/com/owncloud/android/ui/activity/ParticipateActivity.java b/src/com/owncloud/android/ui/activity/ParticipateActivity.java index d4e2e0af4c..48d41fc353 100644 --- a/src/com/owncloud/android/ui/activity/ParticipateActivity.java +++ b/src/com/owncloud/android/ui/activity/ParticipateActivity.java @@ -28,7 +28,6 @@ import android.text.Html; import android.text.method.LinkMovementMethod; import android.view.MenuItem; import android.view.View; -import android.widget.Button; import android.widget.TextView; import com.owncloud.android.R; @@ -37,7 +36,6 @@ import com.owncloud.android.R; * Activity providing information about ways to participate in the app's development. */ public class ParticipateActivity extends FileActivity { - private Button mReportBtn; @Override protected void onCreate(Bundle savedInstanceState) { @@ -91,8 +89,7 @@ public class ParticipateActivity extends FileActivity { contributeGithubView.setMovementMethod(LinkMovementMethod.getInstance()); contributeGithubView.setText(Html.fromHtml(getString(R.string.participate_contribute_github_text))); - mReportBtn = (Button) findViewById(R.id.participate_testing_report); - mReportBtn.setOnClickListener(new View.OnClickListener() { + findViewById(R.id.participate_testing_report).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.report_issue_link)))); diff --git a/src/com/owncloud/android/ui/activity/ToolbarActivity.java b/src/com/owncloud/android/ui/activity/ToolbarActivity.java index 9fdff2c0a1..cd81e0c3c8 100644 --- a/src/com/owncloud/android/ui/activity/ToolbarActivity.java +++ b/src/com/owncloud/android/ui/activity/ToolbarActivity.java @@ -28,7 +28,6 @@ import android.support.annotation.ColorInt; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; -import android.view.View; import android.widget.ProgressBar; import com.owncloud.android.R; @@ -92,11 +91,6 @@ public abstract class ToolbarActivity extends BaseActivity { ActionBar actionBar = getSupportActionBar(); actionBar.setTitle(titleToSet); - // also as content description - View actionBarTitleView = getWindow().getDecorView().findViewById( - getResources().getIdentifier("action_bar_title", "id", "android") - ); - // set home button properties actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowTitleEnabled(true); diff --git a/src/com/owncloud/android/ui/adapter/FolderSyncAdapter.java b/src/com/owncloud/android/ui/adapter/FolderSyncAdapter.java index df6de99ca8..47b1dbfe95 100644 --- a/src/com/owncloud/android/ui/adapter/FolderSyncAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FolderSyncAdapter.java @@ -45,8 +45,6 @@ import java.util.List; */ public class FolderSyncAdapter extends SectionedRecyclerViewAdapter { - private static final String TAG = FolderSyncAdapter.class.getSimpleName(); - private final Context mContext; private final int mGridWidth; private final int mGridTotal; diff --git a/src/com/owncloud/android/ui/adapter/LogListAdapter.java b/src/com/owncloud/android/ui/adapter/LogListAdapter.java deleted file mode 100644 index 449039d4a1..0000000000 --- a/src/com/owncloud/android/ui/adapter/LogListAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * ownCloud Android client application - * - * Copyright (C) 2015 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.owncloud.android.ui.adapter; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Environment; -import android.support.annotation.NonNull; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.TextView; - -import com.owncloud.android.R; - -import java.io.File; - - - -public class LogListAdapter extends ArrayAdapter { - private Context context = null; - private String[] values; - private Uri fileUri = null; - - - public LogListAdapter(Context context, String[] values) { - super(context, R.layout.log_item, values); - this.context = context; - this.values = values; - } - - @Override - public View getView(final int position, View convertView,@NonNull ViewGroup parent) { - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View rowView = inflater.inflate(R.layout.log_item, parent, false); - TextView listText = (TextView) rowView.findViewById(R.id.log_item_single); - listText.setText(values[position]); - listText.setTextSize(15); - fileUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + File.separator + "owncloud" + File - .separator+"log"+File.separator+values[position])); - listText.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - Intent emailIntent = new Intent(Intent.ACTION_SEND); - emailIntent.setType("text/rtf"); - emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Nextcloud Logfile"); - emailIntent.putExtra(Intent.EXTRA_TEXT, "This is a automatic E-mail send by nextcloud/android"); - emailIntent.putExtra(Intent.EXTRA_STREAM, fileUri); - emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(Intent.createChooser(emailIntent, "Send mail...")); - } - }); - return rowView; - } -} diff --git a/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java b/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java index cb2f5330f2..9bae3059ed 100644 --- a/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java +++ b/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java @@ -81,12 +81,6 @@ public class SamlWebViewDialog extends DialogFragment { return fragment; } - - public SamlWebViewDialog() { - super(); - } - - @Override public void onAttach(Activity activity) { Log_OC.v(TAG, "onAttach"); diff --git a/src/com/owncloud/android/ui/fragment/EditShareFragment.java b/src/com/owncloud/android/ui/fragment/EditShareFragment.java index 5c844a92b4..0786cb42d5 100644 --- a/src/com/owncloud/android/ui/fragment/EditShareFragment.java +++ b/src/com/owncloud/android/ui/fragment/EditShareFragment.java @@ -86,13 +86,6 @@ public class EditShareFragment extends Fragment { return fragment; } - /** - * Required empty public constructor - */ - public EditShareFragment() { - } - - /** * {@inheritDoc} */ diff --git a/src/com/owncloud/android/ui/fragment/SearchShareesFragment.java b/src/com/owncloud/android/ui/fragment/SearchShareesFragment.java index f3f949a2ee..a47762a065 100644 --- a/src/com/owncloud/android/ui/fragment/SearchShareesFragment.java +++ b/src/com/owncloud/android/ui/fragment/SearchShareesFragment.java @@ -89,10 +89,6 @@ public class SearchShareesFragment extends Fragment implements ShareUserListAdap return fragment; } - public SearchShareesFragment() { - // Required empty public constructor - } - /** * {@inheritDoc} */ diff --git a/src/com/owncloud/android/ui/fragment/ShareFileFragment.java b/src/com/owncloud/android/ui/fragment/ShareFileFragment.java index 1776eda84c..15fc264422 100644 --- a/src/com/owncloud/android/ui/fragment/ShareFileFragment.java +++ b/src/com/owncloud/android/ui/fragment/ShareFileFragment.java @@ -76,8 +76,7 @@ import java.util.Date; * Use the {@link ShareFileFragment#newInstance} factory method to * create an instance of this fragment. */ -public class ShareFileFragment extends Fragment - implements ShareUserListAdapter.ShareUserAdapterListener { +public class ShareFileFragment extends Fragment implements ShareUserListAdapter.ShareUserAdapterListener { private static final String TAG = ShareFileFragment.class.getSimpleName(); @@ -166,12 +165,6 @@ public class ShareFileFragment extends Fragment return fragment; } - /** - * Required empty public constructor. - */ - public ShareFileFragment() { - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/src/com/owncloud/android/utils/ErrorMessageAdapter.java b/src/com/owncloud/android/utils/ErrorMessageAdapter.java index 532fde2bff..860a2dcd0f 100644 --- a/src/com/owncloud/android/utils/ErrorMessageAdapter.java +++ b/src/com/owncloud/android/utils/ErrorMessageAdapter.java @@ -49,15 +49,10 @@ import java.net.SocketTimeoutException; /** * Class to choose proper error messages to show to the user depending on the results of operations, - * always following the same policy + * always following the same policy. */ - public class ErrorMessageAdapter { - public ErrorMessageAdapter() { - - } - public static String getErrorCauseMessage(RemoteOperationResult result, RemoteOperation operation, Resources res) { From 39b3f2f5d5c0179895249eb4cc6fa65cdd77e621 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Sat, 31 Dec 2016 18:22:36 +0100 Subject: [PATCH 021/881] fix visibility --- .../android/authentication/AccountAuthenticator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/owncloud/android/authentication/AccountAuthenticator.java b/src/com/owncloud/android/authentication/AccountAuthenticator.java index 7595486811..2c8c68903f 100644 --- a/src/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/com/owncloud/android/authentication/AccountAuthenticator.java @@ -50,10 +50,10 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { * Is used by android system to assign accounts to authenticators. * Should be used by application and all extensions. */ - private static final String KEY_AUTH_TOKEN_TYPE = "authTokenType"; - private static final String KEY_REQUIRED_FEATURES = "requiredFeatures"; - private static final String KEY_LOGIN_OPTIONS = "loginOptions"; - private static final String KEY_ACCOUNT = "account"; + public static final String KEY_AUTH_TOKEN_TYPE = "authTokenType"; + public static final String KEY_REQUIRED_FEATURES = "requiredFeatures"; + public static final String KEY_LOGIN_OPTIONS = "loginOptions"; + public static final String KEY_ACCOUNT = "account"; private static final String TAG = AccountAuthenticator.class.getSimpleName(); From a49daae9eb50ff302da33f758123f73f4722cf4f Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 3 Jan 2017 21:23:10 +0100 Subject: [PATCH 022/881] code review --- src/com/owncloud/android/operations/RefreshFolderOperation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/operations/RefreshFolderOperation.java b/src/com/owncloud/android/operations/RefreshFolderOperation.java index 18fbfd650f..920d94f83d 100644 --- a/src/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/src/com/owncloud/android/operations/RefreshFolderOperation.java @@ -346,7 +346,7 @@ public class RefreshFolderOperation extends RemoteOperation { /** * Synchronizes the data retrieved from the server about the contents of the target folder * with the current data in the local database. - *

+ * * Grants that mChildren is updated with fresh data after execution. * * @param folderAndFiles Remote folder and children files in Folder From 9d0306a8c88f4b96b80bce5ffaf94e38feba254e Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 3 Jan 2017 21:45:30 +0100 Subject: [PATCH 023/881] formatting --- src/com/owncloud/android/operations/RefreshFolderOperation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/operations/RefreshFolderOperation.java b/src/com/owncloud/android/operations/RefreshFolderOperation.java index 920d94f83d..2f1ab9934a 100644 --- a/src/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/src/com/owncloud/android/operations/RefreshFolderOperation.java @@ -346,7 +346,7 @@ public class RefreshFolderOperation extends RemoteOperation { /** * Synchronizes the data retrieved from the server about the contents of the target folder * with the current data in the local database. - * + * * Grants that mChildren is updated with fresh data after execution. * * @param folderAndFiles Remote folder and children files in Folder From f63efc713d03e9ad9db748ecf24e4863d83833a8 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sat, 28 Jan 2017 01:17:07 +0000 Subject: [PATCH 024/881] [tx-robot] updated from transifex --- res/values-ast/strings.xml | 1 - res/values-bg-rBG/strings.xml | 1 - res/values-ca/strings.xml | 1 - res/values-cs-rCZ/strings.xml | 1 - res/values-de-rDE/strings.xml | 1 - res/values-de/strings.xml | 1 - res/values-el/strings.xml | 1 - res/values-en-rGB/strings.xml | 1 - res/values-es-rMX/strings.xml | 1 - res/values-es/strings.xml | 1 - res/values-fr/strings.xml | 7 +++---- res/values-he/strings.xml | 1 - res/values-hu-rHU/strings.xml | 1 - res/values-id/strings.xml | 1 - res/values-is/strings.xml | 1 - res/values-it/strings.xml | 1 - res/values-ja-rJP/strings.xml | 1 - res/values-ko/strings.xml | 1 - res/values-nb-rNO/strings.xml | 1 - res/values-nl/strings.xml | 1 - res/values-pl/strings.xml | 1 - res/values-pt-rBR/strings.xml | 1 - res/values-pt-rPT/strings.xml | 1 - res/values-ru/strings.xml | 1 - res/values-sk-rSK/strings.xml | 1 - res/values-sl/strings.xml | 1 - res/values-sq/strings.xml | 1 - res/values-sv/strings.xml | 1 - res/values-tr/strings.xml | 1 - res/values-zh-rCN/strings.xml | 1 - res/values-zh-rTW/strings.xml | 1 - 31 files changed, 3 insertions(+), 34 deletions(-) diff --git a/res/values-ast/strings.xml b/res/values-ast/strings.xml index d641449fd2..6d797a334f 100644 --- a/res/values-ast/strings.xml +++ b/res/values-ast/strings.xml @@ -46,7 +46,6 @@ Direición del sirvidor https://... Nome d\'usuariu Contraseña - Nuevu en %1$s? Ficheros Coneutar Xubir diff --git a/res/values-bg-rBG/strings.xml b/res/values-bg-rBG/strings.xml index e36c72a6d7..ff3374faa0 100644 --- a/res/values-bg-rBG/strings.xml +++ b/res/values-bg-rBG/strings.xml @@ -57,7 +57,6 @@ Адрес на сървъра https://… Потребител Парола - Не сте %1$s? Файлове Свързване Качване diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index f7e2116f3a..64010df9fa 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -57,7 +57,6 @@ Adreça del servidor https://… Nom d\'usuari Contrasenya - Nou a %1$s? Fitxers Connecta Puja diff --git a/res/values-cs-rCZ/strings.xml b/res/values-cs-rCZ/strings.xml index 59533cf17b..1fb4bf5211 100644 --- a/res/values-cs-rCZ/strings.xml +++ b/res/values-cs-rCZ/strings.xml @@ -57,7 +57,6 @@ Adresa serveru https://... Uživatelské jméno Heslo - Nováček s %1$s? Soubory Připojit Nahrát diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 613ae834c5..7d5ffd3e10 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -57,7 +57,6 @@ Server-Adresse https://… Benutzername Passwort - Ist %1$s neu für Sie? Dateien Verbinden Hochladen diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 93247d4894..54933f0229 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -57,7 +57,6 @@ Server-Adresse https://… Benutzername Passwort - Ist %1$s neu für dich? Dateien Verbinden Hochladen diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index ad5e51ee67..8d4259eb29 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -52,7 +52,6 @@ Διεύθυνση διακομιστή https://… Όνομα χρήστη Συνθηματικό - Νέοι στο %1$s; Αρχεία Σύνδεση Μεταφόρτωση diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index b0226766f8..d27f614c63 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -57,7 +57,6 @@ Server address https://… Username Password - New to %1$s? Files Connect Upload diff --git a/res/values-es-rMX/strings.xml b/res/values-es-rMX/strings.xml index f507f0d8ea..870ed2b920 100644 --- a/res/values-es-rMX/strings.xml +++ b/res/values-es-rMX/strings.xml @@ -57,7 +57,6 @@ Dirección del servidor https://… Nombre de usuario Contraseña - New to %1$s? Archivos Conectar Subir diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 0765268ca3..65fc9b7ba8 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -57,7 +57,6 @@ Dirección del servidor https://… Nombre de usuario Contraseña - ¿Nuevo en %1$s? Archivos Conectar Subir diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 1f3e901e2c..27e8553dad 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -57,7 +57,6 @@ Adresse du serveur https://… Nom d\'utilisateur Mot de passe - Nouveau dans %1$s ? Fichiers Connecter Téléverser @@ -452,15 +451,15 @@ Partage Partager %1$s Partager avec des utilisateurs et des groupes - Aucune donnée partagée avec des utilisateurs pour le moment + Vous n\'avez partagé aucune donnée avec des utilisateurs pour l\'instant. Ajouter un Utilisateur ou un Groupe Partager par lien public - Spécifier une date d\'expiration + Indiquer une date d\'expiration Protéger par un mot de passe Sécurisé Permettre la modification Masquer la liste des fichiers - Obtenir le lien + Partager le lien Partager avec … Partager avec %1$s diff --git a/res/values-he/strings.xml b/res/values-he/strings.xml index 1c48adad71..a50b33e8e9 100644 --- a/res/values-he/strings.xml +++ b/res/values-he/strings.xml @@ -46,7 +46,6 @@ כתובת שרת https://… שם משתמש ססמה - חדש ב- %1$s? קבצים התחברות העלאה diff --git a/res/values-hu-rHU/strings.xml b/res/values-hu-rHU/strings.xml index a015758cca..f686acbd2d 100644 --- a/res/values-hu-rHU/strings.xml +++ b/res/values-hu-rHU/strings.xml @@ -58,7 +58,6 @@ Szerver címe https://... Felhasználónév Jelszó - Új vagy a %1$s területen? Fájlok Kapcsolódás Feltöltés diff --git a/res/values-id/strings.xml b/res/values-id/strings.xml index ccec163da7..1427aa3042 100644 --- a/res/values-id/strings.xml +++ b/res/values-id/strings.xml @@ -57,7 +57,6 @@ Alamat server https://… Nama Pengguna Sandi - Baru di %1$s? Berkas Sambungkan Unggah diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 796a7f39fd..50315873a9 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -53,7 +53,6 @@ Vistfang þjóns https://… Notendanafn Lykilorð - Nýr í %1$s? Skrár Tengjast Senda inn diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index eea382bbba..e24c953b27 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -57,7 +57,6 @@ Indirizzo server https://... Nome utente Password - Prima volta su %1$s? File Connetti Carica diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index cf8bacb178..182c4d60fa 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -58,7 +58,6 @@ サーバーアドレス https://… ユーザー名 パスワード - %1$sは初めてですか? ファイル 接続 アップロード diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 6e58b60527..75248f02cf 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -51,7 +51,6 @@ 서버 주소 https://… 사용자 이름 암호 - %1$s의 새로운 사용자입니까? 파일 접속 업로드 diff --git a/res/values-nb-rNO/strings.xml b/res/values-nb-rNO/strings.xml index 4098afdd2e..2d37861d29 100644 --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@ -57,7 +57,6 @@ Tjeneradresse https://... Brukernavn Passord - Ny med %1$s? Filer Koble til Last opp diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 557eaebefa..fc6759bbf4 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -58,7 +58,6 @@ Download hier: %2$s Serveradres https://… Gebruikersnaam Wachtwoord - Nieuw bij %1$s? Bestanden Verbinden Uploaden diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index c1209cd156..df32f37c11 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -57,7 +57,6 @@ Adres serwera https://... Nazwa użytkownika Hasło - Nowe %1$s? Pliki Połącz Wyślij diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 08cf0e7ac2..98cf9470dd 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -57,7 +57,6 @@ Endereço do servidor https://... Nome de usuário Senha - Novo usuário do %1$s? Arquivos Conectar Enviar diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d6a0b36a03..285b17a25c 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -57,7 +57,6 @@ Endereço do servidor https://.. Nome de Utilizador Palavra-passe - Novo em %1$s? Ficheiros Ligar Carregar diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 2a4a7654e6..a5d0be7198 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -58,7 +58,6 @@ Адрес сервера https://... Имя пользователя Пароль - Незнакомы с %1$s? Файлы Подключиться Загрузить diff --git a/res/values-sk-rSK/strings.xml b/res/values-sk-rSK/strings.xml index 5d76b6b9c2..484d7c715e 100644 --- a/res/values-sk-rSK/strings.xml +++ b/res/values-sk-rSK/strings.xml @@ -57,7 +57,6 @@ Adresa servera https://... Používateľské meno Heslo - Ste nový v %1$s? Súbory Pripojiť Nahrať diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 222a0e16bb..b65c978f3a 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -56,7 +56,6 @@ Naslov strežnika https://… Uporabniško ime Geslo - Ali ste novi uporabnik sistema %1$s? Datoteke Poveži Pošlji diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 61f265d20c..bfb01d8405 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -57,7 +57,6 @@ Adresa e serverit https://… Emër përdoruesi Fjalëkalim - I ri te %1$s? Kartela Lidhuni Ngarkoni diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 08301cc4f4..53397c00c2 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -57,7 +57,6 @@ Serveradress https://... Användarnamn Lösenord - Ny på %1$s? Filer Anslut Ladda upp diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 106da3600f..3cf92376e0 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -57,7 +57,6 @@ Sunucu adresi https://… Kullanıcı Adı Parola - %1$s sizin için yeni mi? Dosyalar Bağlan Yükle diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 42cc37421a..9f639a5afa 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -57,7 +57,6 @@ 服务器地址 https://... 用户名 密码 - 初次使用 %1$s? 文件 连接 上传 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index e147a1883e..ad69240563 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -56,7 +56,6 @@ 伺服器位址 https://... 使用者名稱 密碼 - 新增到 %1$s ? 檔案 連線 上傳 From 9b9ba9b19de975cb804e152e23ab4572cf431246 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 29 Jan 2017 01:17:23 +0000 Subject: [PATCH 025/881] [tx-robot] updated from transifex --- res/values-de-rDE/strings.xml | 1 + res/values-de/strings.xml | 1 + res/values-es/strings.xml | 1 + res/values-fr/strings.xml | 1 + res/values-pt-rBR/strings.xml | 1 + res/values-ru/strings.xml | 1 + res/values-sk-rSK/strings.xml | 33 +++++++++++++++++++++++++++------ res/values-zh-rCN/strings.xml | 1 + 8 files changed, 34 insertions(+), 6 deletions(-) diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 7d5ffd3e10..be485c6b8c 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -57,6 +57,7 @@ Server-Adresse https://… Benutzername Passwort + Sie haben bislang keinen Server?\\nHier klicken um Server-Anbieter zu finden Dateien Verbinden Hochladen diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 54933f0229..ecca3f7a10 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -57,6 +57,7 @@ Server-Adresse https://… Benutzername Passwort + Du hast noch keinen Server?\\nKlicke hier um von einen Provider einen zu bekommen Dateien Verbinden Hochladen diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 65fc9b7ba8..c73a9aad6b 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -57,6 +57,7 @@ Dirección del servidor https://… Nombre de usuario Contraseña + ¿No tiene un servidor aun?\\nHaga click aquí para obtener uno de un proveedor Archivos Conectar Subir diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 27e8553dad..7d85c5aafa 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -57,6 +57,7 @@ Adresse du serveur https://… Nom d\'utilisateur Mot de passe + Vous n\'avez pas encore un serveur ?\nCliquez ici pour en obtenir un d\'un fournisseur Fichiers Connecter Téléverser diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 98cf9470dd..40373a5989 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -57,6 +57,7 @@ Endereço do servidor https://... Nome de usuário Senha + Ainda não tem um servidor?\\nClique aqui para obter um de um fornecedor Arquivos Conectar Enviar diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index a5d0be7198..453f0475f0 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -58,6 +58,7 @@ Адрес сервера https://... Имя пользователя Пароль + Еще нет сервера?\\nЩёлкните здесь что бы получить от провайдера Файлы Подключиться Загрузить diff --git a/res/values-sk-rSK/strings.xml b/res/values-sk-rSK/strings.xml index 484d7c715e..46d189dd74 100644 --- a/res/values-sk-rSK/strings.xml +++ b/res/values-sk-rSK/strings.xml @@ -20,7 +20,7 @@ V zariadení Nastavenia Nahranie - Využitie: %1$s z %2$s + Využité: %1$s z %2$s Zavrieť Otvoriť Všeobecné @@ -28,7 +28,7 @@ Účty Správa účtov Heslo - Zobrazit skryté súbory + Zobraziť skryté súbory Okamžité nahratie obrázka Okamžite nahrať obrázok zaznamenaný fotoaparátom Okamžité nahranie videa @@ -65,6 +65,7 @@ Nastavenie Koniec Žiadny súbor pre nahratie + Prijaté dáta neobsahujú žiadny platný súbor. Súbor nie je možné nahrať %1$s nie je oprávnený čítať prijatý súbor Pri kopírovaní súboru do dočasného priečinka došlo k chybe. Skúste prosím znova. @@ -73,9 +74,12 @@ Ponechaj súbor v pôvodnom priečinku Odstráň súbor z pôvodného priečinka pred sekundami + Nie sú tu žiadne súbory + Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami! Načítavam... Aplikácia pre váš typ súboru sa nenašla! V tomto priečinku nie sú žiadne súbory. + Žiadne súbory na nahratie nie sú dostupné priečinok priečinky súbor @@ -93,7 +97,7 @@ Áno Nie OK - Odober nahrávanie + Odstrániť nahrávanie Zopakuj nahrávanie Zruš synchronizáciu Zrušiť @@ -104,6 +108,7 @@ Načítavam... neznámy Neznáma chyba + Prebieha O Zmeniť heslo Odstrániť účet @@ -120,11 +125,13 @@ Odoslanie neúspešné, je potrebné sa znovu prihlásiť Nahranie Aktuálne + Zlyhalo (ťuknutím zopakujete) Odoslané Dokončené Zrušené Pozastavené Chyba spojenia + Nahratie sa zopakuje o chvíľu Chybné prihlasovacie údaje Chybný priečinok Chybný súbor @@ -221,10 +228,11 @@ %1$s nepodporuje viacero účtov Váš server nevracia správne používateľské id, kontaktujte prosím správcu systému - Účet zatiaľ v zariadení neexistuje + Nie je možné sa overiť voči tomuto serveru + Účet zatiaľ v zariadení neexistuje - Premenuj - Odober + Premenovať + Odstrániť Naozaj chcete odstrániť %1$s? Naozaj chcete odstrániť %1$s a jeho obsah? Iba lokálne @@ -284,6 +292,7 @@ 2012/05/18 12:23 PM 12:23:45 + Nahrať iba cez wifi Nahrať obrázky iba cez wifi Nahrať videá iba cez wifi Nahrať iba počas nabíjania @@ -327,6 +336,9 @@ Kritická chyba: operáciu nemožno vykonať Pri pokuse o pripojenie na server nastala chyba. + Pri čakaní na odpoveď servera nastala chyba; operácia nemohla byť dokončená + Pri čakaní na odpoveď servera nastala chyba; operácia nemohla byť dokončená + Operáciu nebolo možné dokončiť; server nie je dostupný Nemáte oprávnenie %s premenovať tento súbor zmazať tento súbor @@ -377,6 +389,7 @@ Počas kopírovania súboru alebo zložky sa vyskytla chyba kopírovať súbor + Okamžité nahratia Podrobnosti Priečinok pre okamžité nahratie videa @@ -402,6 +415,8 @@ %1$d súb. %1$d súb., 1 priečinok %1$d súb., %2$d prieč. + Pôvodný súbor bude… + Pôvodný súbor bude… Kopírovať súbor Presunúť súbor Vybrať všetko @@ -445,9 +460,14 @@ Vyčistiť úspešné Vyčistiť všetky ukončené + Zobrazenie mriežky + Zobrazenie zoznamu + Vyčistiť dáta Niektoré súbory nebolo možné zmazať. + Naozaj chcete odstrániť vybraté položky? + Naozaj chcete odstrániť vybraté položky a ich obsah? Čakám na nabíjanie zariadenia Hľadať Dozvedieť sa viac @@ -455,6 +475,7 @@ Zúčastniť sa Pomôžte nám s testovaním. Testovať Beta verziu + Aktívne prispievať Presunúť do… Kopírovať do… Vybrať priečinok… diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 9f639a5afa..cc80595d84 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -57,6 +57,7 @@ 服务器地址 https://... 用户名 密码 + 还没有服务器吗? \\n点击这里从提供商那里获取一个 文件 连接 上传 From d7daeb7b79afbadb245a1454d4fe305c4d526c8b Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 29 Jan 2017 17:16:00 +0100 Subject: [PATCH 026/881] update description --- CONTRIBUTING.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4b11a1c94f..e14f7b9bb5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -130,9 +130,8 @@ Whenever a PR is reviewed/approved we put it on master. Before releasing a new stable version there is at least one release candidate. It is based on the current master and during this phase the master is feature freezed. After ~2 weeks with no error a stable version will be releaded, which is identically to the latest release candidate. ### Development Beta -Done as a standalone app that can be installed in parallel to the stable app -Any PR which is labelled "3. to review" or "4. to release" will be included in the beta app. The update interval depends on the speed of new/updated PRs. - +Done as a standalone app that can be installed in parallel to the stable app. +Any PR which is labelled "ready for beta" will be automatically included in the beta app. This label should only set by the main developers. ## Version Name and number ### Stable / Release candidate @@ -184,5 +183,4 @@ Release Candidate releases are based on the git [master](https://github.com/next ###Development Beta Release Beta releases are based on the git [beta](https://github.com/nextcloud/android/tree/beta) and are done independently from stable releases and integrate open PRs that might not be production ready or heavily tested but being put out there for people willing to test new features and provide valuable feedback on new features to be incorporated before a feature gets released in the stable app. -1. Bump the version name and version code in the [AndroidManifest.xml](https://github.com/nextcloud/android/blob/master/AndroidManifest.xml), see below the version name and code concept. -2. Create a [release/tag](https://github.com/nextcloud/android/releases) in git. Tag name following the naming schema: ```beta-YYYYMMDD``` (e.g. beta-20160612) +The deployment/build is done once a day automatically. If code has changed a new apk will be published on https://github.com/nextcloud/android/tree/beta/apks and it will also be available on f-droid. \ No newline at end of file From ee2884d9f143c05c543949a4691d31f6a5b4fc61 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Sun, 29 Jan 2017 19:35:08 +0100 Subject: [PATCH 027/881] use pullapprove --- .lgtm | 3 --- .pullapprove.yml | 43 +++++++++++++++++++++++++++++++++++++++++++ MAINTAINERS | 6 ------ 3 files changed, 43 insertions(+), 9 deletions(-) delete mode 100644 .lgtm create mode 100644 .pullapprove.yml delete mode 100644 MAINTAINERS diff --git a/.lgtm b/.lgtm deleted file mode 100644 index 6e9c5e12e3..0000000000 --- a/.lgtm +++ /dev/null @@ -1,3 +0,0 @@ -pattern = "(?i):shipit:|:\\+1:|LGTM" -self_approval_off=true -approvals = 1 \ No newline at end of file diff --git a/.pullapprove.yml b/.pullapprove.yml new file mode 100644 index 0000000000..12dc43d31a --- /dev/null +++ b/.pullapprove.yml @@ -0,0 +1,43 @@ +version: 2 + +# General settings to apply +always_pending: + title_regex: '(WIP|wip)' + labels: + - 1. to develop + - 2. developing + # custom message that will be used for the GitHub status + explanation: 'This PR is a work in progress...' + +# Group settings to apply to all groups by default, optionally being overridden later +group_defaults: + author_approval: + ignored: true + approve_by_comment: + enabled: true + approve_regex: '^(Approved|:shipit:|:\+1:|LGTM)' + reject_regex: '^(Rejected|:-1:)' + reset_on_push: + enabled: true + reset_on_reopened: + enabled: true + +groups: + code-review: + required: 2 + users: + - AndyScherzinger + - tobiasKaminsky + - mario + - przybylski + + design-review: + conditions: + labels: + - design + reset_on_push: + enabled: false + required: 1 + users: + - jancborchardt + - eppfel \ No newline at end of file diff --git a/MAINTAINERS b/MAINTAINERS deleted file mode 100644 index c4861931ac..0000000000 --- a/MAINTAINERS +++ /dev/null @@ -1,6 +0,0 @@ -AndyScherzinger -przybylski -tobiasKaminsky -LukasReschke -jancborchardt -MorrisJobke From 5f8e1f4b4abf293fec9e2e3426b4b3bc612ba6b8 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Sun, 29 Jan 2017 20:26:56 +0100 Subject: [PATCH 028/881] EOF new line --- .pullapprove.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pullapprove.yml b/.pullapprove.yml index 12dc43d31a..44c503ddab 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -40,4 +40,4 @@ groups: required: 1 users: - jancborchardt - - eppfel \ No newline at end of file + - eppfel From 9010476ccce1a7345251d00ba459a8df7a0b788d Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sun, 8 Jan 2017 13:54:47 +0100 Subject: [PATCH 029/881] Avoid toggling favourite for all selected files --- build.gradle | 2 +- .../ui/helpers/FileOperationsHelper.java | 36 ++++++++++++------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index 8d8836c686..8b2ac41d64 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:2.2.3' } } diff --git a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 4e1c4ae020..4462a2112b 100755 --- a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -54,6 +54,7 @@ import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.regex.Matcher; @@ -546,26 +547,37 @@ public class FileOperationsHelper { } public void toggleFavorites(Collection files, boolean isFavorite){ + List found = new ArrayList<>(); + for(OCFile file : files){ + if(file.isFavorite() == isFavorite){ + found.add(file); + } + } + + files.removeAll(found); + for (OCFile file: files) { toggleFavorite(file, isFavorite); } } public void toggleFavorite(OCFile file, boolean isFavorite) { - file.setFavorite(isFavorite); - mFileActivity.getStorageManager().saveFile(file); + if (file.isFavorite() != isFavorite) { + file.setFavorite(isFavorite); + mFileActivity.getStorageManager().saveFile(file); - /// register the OCFile instance in the observer service to monitor local updates - Intent observedFileIntent = FileObserverService.makeObservedFileIntent( - mFileActivity, - file, - mFileActivity.getAccount(), - isFavorite); - mFileActivity.startService(observedFileIntent); + /// register the OCFile instance in the observer service to monitor local updates + Intent observedFileIntent = FileObserverService.makeObservedFileIntent( + mFileActivity, + file, + mFileActivity.getAccount(), + isFavorite); + mFileActivity.startService(observedFileIntent); - /// immediate content synchronization - if (file.isFavorite()) { - syncFile(file); + /// immediate content synchronization + if (file.isFavorite()) { + syncFile(file); + } } } From 121bd06114c31869b56564e6760dbb4fee45b496 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 26 Jan 2017 03:22:32 +0100 Subject: [PATCH 030/881] Fix review comments --- build.gradle | 2 +- .../owncloud/android/ui/helpers/FileOperationsHelper.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 8b2ac41d64..8d8836c686 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:2.2.1' } } diff --git a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 4462a2112b..54f4391d04 100755 --- a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -547,14 +547,14 @@ public class FileOperationsHelper { } public void toggleFavorites(Collection files, boolean isFavorite){ - List found = new ArrayList<>(); + List alreadyRightStateList = new ArrayList<>(); for(OCFile file : files){ if(file.isFavorite() == isFavorite){ - found.add(file); + alreadyRightStateList.add(file); } } - files.removeAll(found); + files.removeAll(alreadyRightStateList); for (OCFile file: files) { toggleFavorite(file, isFavorite); From 28faac1b53a48ac6df952b1ecabe40636e58075d Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 26 Jan 2017 10:36:15 +0100 Subject: [PATCH 031/881] Fix a formatting issue --- src/com/owncloud/android/ui/helpers/FileOperationsHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 54f4391d04..10beff6057 100755 --- a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -549,7 +549,7 @@ public class FileOperationsHelper { public void toggleFavorites(Collection files, boolean isFavorite){ List alreadyRightStateList = new ArrayList<>(); for(OCFile file : files){ - if(file.isFavorite() == isFavorite){ + if(file.isFavorite() == isFavorite) { alreadyRightStateList.add(file); } } From ca4947271ce1b4f444924f7660650c197b057f4e Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 26 Jan 2017 10:36:46 +0100 Subject: [PATCH 032/881] Fix another formatting issue --- src/com/owncloud/android/ui/helpers/FileOperationsHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 10beff6057..539b8682ba 100755 --- a/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -548,7 +548,7 @@ public class FileOperationsHelper { public void toggleFavorites(Collection files, boolean isFavorite){ List alreadyRightStateList = new ArrayList<>(); - for(OCFile file : files){ + for(OCFile file : files) { if(file.isFavorite() == isFavorite) { alreadyRightStateList.add(file); } From e1f8ace98e5163510194bd61c4647b362850c90c Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sat, 7 Jan 2017 14:20:23 +0100 Subject: [PATCH 033/881] round thumbnail size to power of 2: 384 => 256 --- src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 1b5ee523da..aa713432cd 100644 --- a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -286,7 +286,8 @@ public class ThumbnailsCacheManager { private int getThumbnailDimension(){ // Converts dp to pixel Resources r = MainApp.getAppContext().getResources(); - return Math.round(r.getDimension(R.dimen.file_icon_size_grid)); + Double d = Math.pow(2,Math.floor(Math.log(r.getDimension(R.dimen.file_icon_size_grid))/Math.log(2))); + return d.intValue(); } private Bitmap doOCFileInBackground() { From 87e0d359e074df48b02ae580b464f93df1ae274f Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 30 Jan 2017 01:17:12 +0000 Subject: [PATCH 034/881] [tx-robot] updated from transifex --- res/values-de-rDE/strings.xml | 2 +- res/values-de/strings.xml | 2 +- res/values-el/strings.xml | 7 ++++++- res/values-es/strings.xml | 2 +- res/values-nl/strings.xml | 1 + res/values-pt-rBR/strings.xml | 2 +- res/values-ru/strings.xml | 4 ++-- res/values-zh-rCN/strings.xml | 2 +- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index be485c6b8c..8100714daf 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -57,7 +57,7 @@ Server-Adresse https://… Benutzername Passwort - Sie haben bislang keinen Server?\\nHier klicken um Server-Anbieter zu finden + Sie haben bislang keinen Server?\nHier klicken um Server-Anbieter zu finden Dateien Verbinden Hochladen diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index ecca3f7a10..acbd801e36 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -57,7 +57,7 @@ Server-Adresse https://… Benutzername Passwort - Du hast noch keinen Server?\\nKlicke hier um von einen Provider einen zu bekommen + Du hast noch keinen Server?\nKlicke hier um Server-Anbieter zu finden Dateien Verbinden Hochladen diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 8d4259eb29..65b26cd427 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -332,7 +332,8 @@ Απαιτείται πιστοποίηση Εσφαλμένος κωδικός πρόσβασης Μετακίνηση - Δεν υπάρχει τίποτα εδώ. Μπορείτε να προσθέσετε ένα φάκελο! + Αντιγραφή + Δεν υπάρχει τίποτα εδώ. Μπορείτε να προσθέσετε ένα φάκελο! Επιλέξτε Αδύνατη η μετακίνηση. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει @@ -381,6 +382,7 @@ κρατήθηκε στον πρωτότυπο φάκελο μετακινήθηκε στον φάκελο εφαρμογών + διαγράφηκε Διαμοιρασμός Διαμοιρασμός %1$s Διαμοιρασμός με χρήστες και ομάδες @@ -430,8 +432,11 @@ Δοκιμάστε την έκδοση Beta Βοηθήστε άλλους στο <a href=\"%1$s>forum</a> <a href=\"%1$s>Μεταφράστε</a> την εφαρμογή + Ρυθμίσεις %d επιλέχθηκε %d επιλέχθηκαν + Όνομα αρχείου + Τύπος αρχείου diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index c73a9aad6b..489cfd434c 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -57,7 +57,7 @@ Dirección del servidor https://… Nombre de usuario Contraseña - ¿No tiene un servidor aun?\\nHaga click aquí para obtener uno de un proveedor + ¿No tiene un servidor aun?\nHaga click aquí para obtener uno de un proveedor Archivos Conectar Subir diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index fc6759bbf4..534493aa1b 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -58,6 +58,7 @@ Download hier: %2$s Serveradres https://… Gebruikersnaam Wachtwoord + Heb je nog geen server?\nKlik hier om er een van een provider te krijgen Bestanden Verbinden Uploaden diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 40373a5989..20d1d64bec 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -57,7 +57,7 @@ Endereço do servidor https://... Nome de usuário Senha - Ainda não tem um servidor?\\nClique aqui para obter um de um fornecedor + Ainda não tem um servidor?\nClique aqui para obter um de um fornecedor Arquivos Conectar Enviar diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 453f0475f0..3fe816624e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -58,7 +58,7 @@ Адрес сервера https://... Имя пользователя Пароль - Еще нет сервера?\\nЩёлкните здесь что бы получить от провайдера + Еще нет сервера?\nЩёлкните здесь что бы получить от провайдера Файлы Подключиться Загрузить @@ -492,7 +492,7 @@ Вид списком Управление свободным местом - Настройки, сертификаты базы данных и сервера из данных %1$s будут удалены навсегда. \\n\\nЗагруженные файлы будут сохранены нетронутыми. \\n\\nЭтот процесс может занять некоторое время. + Настройки, сертификаты базы данных и сервера из данных %1$s будут удалены навсегда. \n\nЗагруженные файлы будут сохранены нетронутыми. \n\nЭтот процесс может занять некоторое время. Очистить данные Некоторые файлы не могут быть удалены. diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index cc80595d84..92935f2e9b 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -57,7 +57,7 @@ 服务器地址 https://... 用户名 密码 - 还没有服务器吗? \\n点击这里从提供商那里获取一个 + 还没有服务器吗? \n点击这里从提供商那里获取一个 文件 连接 上传 From 39bdef6da81784d75ef76fc138904e3ee4db39f3 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 30 Jan 2017 14:15:50 +0100 Subject: [PATCH 035/881] Fix #574 --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 2fa6190f22..c946ccd751 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -520,8 +520,8 @@ The release candidate (RC) is a snapshot of the upcoming release and it is expected to be stable. Testing your individual setup could help to ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid. Actively Contribute Join the chat on IRC: <a href="%1$s">#nextcloud-mobile</a> - Help others on the <a href="%1$s>forum</a> - <a href="%1$s>Translate</a> the app + Help others on the <a href="%1$s">forum</a> + <a href="%1$s">Translate</a> the app Contribute as a developer, see <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for details Move to… Copy to… From 5a647cf094c4fa89333b90e2681183c80c9fb5f6 Mon Sep 17 00:00:00 2001 From: Bartosz Przybylski Date: Mon, 30 Jan 2017 17:38:22 +0100 Subject: [PATCH 036/881] Don't restore from unknown state for migration. Fixes #597 --- .../android/ui/activity/StorageMigration.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/com/owncloud/android/ui/activity/StorageMigration.java b/src/com/owncloud/android/ui/activity/StorageMigration.java index ec5ec28456..f1caf51c0a 100644 --- a/src/com/owncloud/android/ui/activity/StorageMigration.java +++ b/src/com/owncloud/android/ui/activity/StorageMigration.java @@ -175,7 +175,7 @@ public class StorageMigration { String source, String target, ProgressDialog progressDialog, - StorageMigrationProgressListener listener) { + StorageMigrationProgressListener listener) throws SecurityException { mContext = context; mStorageSource = source; mStorageTarget = target; @@ -242,6 +242,12 @@ public class StorageMigration { } protected void restoreAccountsSyncStatus(boolean oldSync[]) { + // If we don't have the old sync statuses, then + // probably migration failed even before saving states, + // which is weird and should be investigated. + // But its better than crashing on ArrayOutOfBounds. + if (oldSync == null) + return; for (int i = 0; i < mOcAccounts.length; ++i) { ContentResolver.setSyncAutomatically(mOcAccounts[i], mAuthority, oldSync[i]); } @@ -263,7 +269,7 @@ public class StorageMigration { publishProgress(R.string.file_migration_preparing); Log_OC.stopLogging(); - boolean[] syncStates = new boolean[0]; + boolean[] syncStates = null; try { publishProgress(R.string.file_migration_saving_accounts_configuration); syncStates = saveAccountsSyncStatus(); @@ -306,7 +312,7 @@ public class StorageMigration { publishProgress(R.string.file_migration_preparing); Log_OC.stopLogging(); - boolean[] syncState = new boolean[0]; + boolean[] syncState = null; try { File dstFile = new File(mStorageTarget + File.separator + MainApp.getDataFolder()); From 3a86512b99729fa9b8509601e0c49f92a09dd43e Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 31 Jan 2017 01:36:12 +0000 Subject: [PATCH 037/881] [tx-robot] updated from transifex --- res/values-bg-rBG/strings.xml | 2 -- res/values-ca/strings.xml | 2 -- res/values-cs-rCZ/strings.xml | 2 -- res/values-de-rDE/strings.xml | 2 -- res/values-de/strings.xml | 2 -- res/values-el/strings.xml | 2 -- res/values-en-rGB/strings.xml | 2 -- res/values-es/strings.xml | 2 -- res/values-fr/strings.xml | 2 -- res/values-hu-rHU/strings.xml | 2 -- res/values-is/strings.xml | 2 -- res/values-it/strings.xml | 2 -- res/values-ja-rJP/strings.xml | 2 -- res/values-nb-rNO/strings.xml | 2 -- res/values-nl/strings.xml | 2 -- res/values-pl/strings.xml | 2 -- res/values-pt-rBR/strings.xml | 2 -- res/values-ru/strings.xml | 2 -- res/values-sl/strings.xml | 2 -- res/values-sq/strings.xml | 2 -- res/values-sv/strings.xml | 16 +++++++--------- res/values-tr/strings.xml | 2 -- res/values-zh-rCN/strings.xml | 2 -- res/values-zh-rTW/strings.xml | 2 -- 24 files changed, 7 insertions(+), 55 deletions(-) diff --git a/res/values-bg-rBG/strings.xml b/res/values-bg-rBG/strings.xml index ff3374faa0..605c524be5 100644 --- a/res/values-bg-rBG/strings.xml +++ b/res/values-bg-rBG/strings.xml @@ -505,8 +505,6 @@ Заинтересован сте от възможността да тествате следващата версия? Тестване на бета версия Присъединете се към IRC чата: <a href=\"%1$s\">#nextcloud-mobile</a> - Помогнете на други във <a href=\"%1$s>форума</a> - <a href=\"%1$s>Преведете</a> приложението Преместване в… Копиране в… Избери папка… diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 64010df9fa..0a421e1d51 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -514,8 +514,6 @@ o La versió candidata (RC) és una instantània de la versió següent i se suposa que és estable. Provar la vostra configuració individual pot ajudar a garantir-ho. Registreu-vos a Play Store per fer les proves o bé mireu la secció \"versions\" a F-Droid. Contribuïu activament Uniu-vos al xat a IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Ajudeu a altres al <a href=\"%1$s>fòrum</a> - <a href=\"%1$s>Traduïu</a> l\'app Contribuïu com a desenvolupador, mireu <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> per detalls Mou a… Copia a… diff --git a/res/values-cs-rCZ/strings.xml b/res/values-cs-rCZ/strings.xml index 1fb4bf5211..b9513522da 100644 --- a/res/values-cs-rCZ/strings.xml +++ b/res/values-cs-rCZ/strings.xml @@ -514,8 +514,6 @@ správce systému. Předběžná verze nebo také Release Candidate (RC) je stabilní stav připravované, finální verze. Přihlas se jako tester v Play store nebo si najdi a instaluj hodící se verzi z F-Droid pod \"Verze\". Aktivně něčím přispět Diskutovat na IRC: <a href="%1$s">#nextcloud-mobile</a> - Pomoz ostatním v <a href="%1$s>fóru</a> - <a href="%1$s>Přelož</a> aplikaci Přispět jako vývojář, detaily pod <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Přesunout do… Kopírovat do… diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 8100714daf..9efbe0e548 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -516,8 +516,6 @@ Die Vorabversion auch Release Candidate (RC) genannt ist ein stabiler Stand der kommenden, finalen Version. Ein Test auf der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version von F-Droid unter \"Versionen\". Aktiv etwas beitragen An Unterhaltungen teilnehmen im IRC: <a href="%1$s">#nextcloud-mobile</a> - Helfen Sie anderen im <a href="%1$s>Forum</a> - <a href="%1$s>Übersetzen</a> Sie die App Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Verschieben nach… Kopieren nach… diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index acbd801e36..4802d3b049 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -516,8 +516,6 @@ Die Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test auf der eigenen Umgebung hilft uns die Stabilität sicherzustellen. Melde dich als Tester im Play Store an oder suche und installiere die passende Version von F-Droid unter \"Versionen\". Aktiv etwas beitragen An Chats teilnehmen auf IRC: <a href="%1$s">#nextcloud-mobile</a> - Hilf anderen im <a href="%1$s>Forum</a> - <a href="%1$s>Übersetze</a> die App Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Verschieben nach… Kopieren nach… diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 65b26cd427..548599c75d 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -430,8 +430,6 @@ Αναφέρετε σφάλμα στο Github Σας ενδιαφέρει να μας βοηθήσετε να δοκιμάσουμε την επόμενη έκδοση; Δοκιμάστε την έκδοση Beta - Βοηθήστε άλλους στο <a href=\"%1$s>forum</a> - <a href=\"%1$s>Μεταφράστε</a> την εφαρμογή Ρυθμίσεις %d επιλέχθηκε diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index d27f614c63..37335c5060 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -515,8 +515,6 @@ The release candidate (RC) is a snapshot of the upcoming release and it is expected to be stable. Testing your individual setup could help to ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid. Actively Contribute Join the chat on IRC: <a href="%1$s">#nextcloud-mobile</a> - Help others on the <a href="%1$s>forum</a> - <a href="%1$s>Translate</a> the app Contribute as a developer, see <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for details Move to… Copy to… diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 489cfd434c..8089fbce9c 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -517,8 +517,6 @@ o La release candidate (RC) es una instantánea de la próxima versión y se espera que sea estable. Probar su configuración individual podría ayudar a asegurar esto. Regístrese para probarla en Play Store o busque manualmente en la sección \"versiones\" de F-Droid. Contribuye activamente Únase a la conversación en IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Ayude a otros en el <a href=\"%1$s>foro</a>. - <a href=\"%1$s>Traduzca</a> la app Contribuya como desarrolador, vea see <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para más detalles Mover a… Copiar a… diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 7d85c5aafa..bc18313571 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -518,8 +518,6 @@ ou La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid. Contribuer activement Rejoingez la discussion sur IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Aidez les autres sur le <a href=\"%1$s\">forum</a>. - <a href=\"%1$s>Traduisez</a> l\'application Développeurs ? Contribuez ! Plus de détails sur la page <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> Déplacer vers… Copier vers… diff --git a/res/values-hu-rHU/strings.xml b/res/values-hu-rHU/strings.xml index f686acbd2d..c6e75952d7 100644 --- a/res/values-hu-rHU/strings.xml +++ b/res/values-hu-rHU/strings.xml @@ -515,8 +515,6 @@ vagy A kiadásra jelölt (RC) változat az egy pillanatképe a közelgő új változatnak, és stabilnak mondható. Az egyedi telepítésekkel segíthet nekünk, hogy ezt biztosítsuk. Jelentkezzen tesztelésre a Play Áruházban vagy manuálisan nézzen bele a verziók részbe F-Droid-on. Aktívan hozzájárul Csatlakozz a beszélgetéshez az IRC-n: <a href=\"%1$s\">#nextcloud-mobile</a> - Segíts másokat a <a href=\"%1$s>fórumban</a> - <a href=\"%1$s>Fordítsd</a> az alkalmazást Működj közre fejlesztőként, részletek: <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> Áthelyezés ide...… Másolás ide...… diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 50315873a9..bf619f9587 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -445,8 +445,6 @@ Forútgáfa Vertu virkur þáttakandi Taktu þátt í spjalli á IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Hjálpaðu öðrum á <a href=\"%1$s>spjallvefnum</a> - <a href=\"%1$s>Þýddu</a> forritið Leggðu þitt af mörkum sem forritari, skoðaðu <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> fyrir nánari upplýsingar Færa í… Afrita í… diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index e24c953b27..b3cd8afb86 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -518,8 +518,6 @@ o Questa candidata al rilascio (RC) è uno snapshot della prossima versione e dovrebbe essere stabile. La prova della tua specifica configurazione potrebbe aiutare ad assicurare che lo sia. Registrati per i test su Google Play o controlla manualmente nella sezione \"versioni\" su F-Droid. Contribuisci attivamente Unisciti alla chat su IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Aiuta gli altri sul <a href=\"%1$s>forum</a> - <a href=\"%1$s>Traduci</a> l\'applicazione Contribuisci come sviluppatore, vedi <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> per i dettagli Sposta in… Copia in… diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index 182c4d60fa..ec146813ca 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -490,8 +490,6 @@ or リリース候補 リリース候補(RC)は、今後のリリースのスナップショット であり、安定性が期待されます。 個々の設定をテストすることで、これを確実にすることができます。 Playストアでのテストに登録するか、F-Droidの「バージョン」セクションを手動で参照してください。 積極的な貢献 - <a href=\"%1$s>フォーラム</a> で他の人を助ける - アプリを<a href=\"%1$s>翻訳する</a> 開発者として貢献には、 <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> をご覧ください。 …に移動 …にコピー diff --git a/res/values-nb-rNO/strings.xml b/res/values-nb-rNO/strings.xml index 2d37861d29..fb0c405bbb 100644 --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@ -518,8 +518,6 @@ eller Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid. Bidra aktivt Delta i chat på IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Hjelp andre i <a href=\"%1$s>forumet</a> - <a href=\"%1$s>Oversett</a> appen Bidra som en utvikler, se <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> for detaljer Flytt til… Kopier til… diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 534493aa1b..9f1bcae8a4 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -519,8 +519,6 @@ of De Release Candidate (RC) is een kopie van de komende release en zou stabiel moeten zijn. Testen van jouw installatie kan ons helpen om dit te bevestigen. Meld je aan om te testen op de Play store en bekijk handmatig de \"versions\" sectie op F-Droid. Actief meedoen Doe mee met de chat op IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Help anderen op het <a href=\"%1$s>forum</a> - <a href=\"%1$s>Vertaal</a> de app Doe mee als ontwikkelaar, zie <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> voor details Verplaats naar… Kopieer naar… diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index df32f37c11..cd8646c5c1 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -518,8 +518,6 @@ lub Release Candidate (RC) jest zarysem nadchodzącego wydania i oczekujemy że będzie stabilne. Testowanie indywidualnej konfiguracji może pomóc, aby to zapewnić. Zapisz się do testowania w sklepie Play lub ręcznie szukaj w sekcji \"wersje\" na F-Droid. Aktywni członkowie projektu Dołącz do chatu (IRC): <a href=\"%1$s\">#nextcloud-mobile</a> - Pomoż innym na <a href=\"%1$s>forum</a> - <a href=\"%1$s>Tłumacz</a> aplikację Wspomóż nas jako programista, po więcej szczegółów odwiedź <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> Przenieś do… Skopiuj do… diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 20d1d64bec..c7f91bfb71 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -518,8 +518,6 @@ O release candidate (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode contribuir para assegurar-la. Registe-se para testar na Play Store ou procurar manualmente na seção \"versões\" na F-Droid. Contribuir ativamente Participe de uma conversa no IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Ajude as outras pessoas no <a href=\"%1$s>fórum</a> - <a href=\"%1$s>Traduzir</a> o aplicativo Contribuir como desenvolvedor, veja <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para detalhes Mover para… Copiar para… diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 3fe816624e..c268b796ae 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -519,8 +519,6 @@ Релиз-кандидат (RC) - это текущее состояние готовящегося выпуска, и, ожидается, что он будет стабильным. Проверка с вашими индивидуальными настройками может помочь убедится в этом. Зарегистрируйтесь для тестирования в Google Play или используйте раздел \"версии\" в каталоге приложений F-Droid. Активное участие Присоединиться к IRC-чату: <a href=\"%1$s\">#nextcloud-mobile</a> - Помочь другим <a href=\"%1$s>на форуме</a> - <a href=\"%1$s>Перевести</a> приложение Участвовать в качестве разработчика: подробности по ссылке <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>. Переместить в… Копировать в… diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index b65c978f3a..f751f2c845 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -475,8 +475,6 @@ Testiraj beta verzijo Kandidat za objavo Aktivni prispevek - Pomagaj drugim na <a href=\"%1$s>forumu</a> - <a href=\"%1$s>Prevedi</a> aplikacijo Prispevaj kot razvijalec, poglej detajle v <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> %d izbran diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index bfb01d8405..5a4d4aabd0 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -514,8 +514,6 @@ ose Lëshimi i kandidatit (RC) është një fragment i lëshimit të ardhshme dhe pritet të jetë i qëndrueshëm. Testimi i setup-it tuaj individuale mund të ndihmojë për ta siguruar këtë. Regjistrohuni për testimin në Play Store ose manualisht shikoni në seksionin \"versionet\" në F-Droid. Kontribim aktiv Bashkohu në bisedat në IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Ndihmo të tjerët në <a href=\"%1$s>forum</a> - <a href=\"%1$s>Translate</a> aplikacioni Kontriboni si një zhvillues, shih<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> për detaje Levizni tek… Kopjojeni tek… diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 53397c00c2..8995214cb5 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -30,8 +30,8 @@ Lösenordslås Visa dolda filer Automatisk uppladdning av kamerabilder - Automatisk uppladning av bilder tagna med kameran - Automatisk uppladning av video + Automatisk uppladdning av bilder tagna med kameran + Automatisk uppladdning av video Automatisk uppladdning av video inspelade med kameran Aktivera loggning Används för att logga problem @@ -83,7 +83,7 @@ Inget program kan hantera denna filtyp Det finns inga filer i den här mappen. Inga nerladdningar tillgängliga - Ladda upp något eller aktivera direktuppladdning! + Ladda upp något eller aktivera automatisk uppladdning! mapp mappar fil @@ -317,7 +317,7 @@ Denna bild kan inte visas %1$s kunde inte kopieras till %2$s lokal mapp - Sökväg för Automatisk uppladning + Sökväg för Automatisk uppladdning Lokal mapp Extern mapp Använd undermappar @@ -411,7 +411,7 @@ Ett fel uppstod, kunde inte kopiera filen eller mappen att kopiera denna fil - Automatiska uppladningar + Automatiska uppladdningar Detaljer Sökväg för uppladdning av video @@ -516,15 +516,13 @@ Release candidate (RC) är en snapshot av den kommande versionen och den förväntas vara stabil. Att du testar din individuella setup skulle kunna hjälpa till att säkerställa detta. Registrera dig på Play Store, eller kolla \"versioner\" manuellt på F-droid. Bidra aktivt Delta i chatten på IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Hjälp andra på <a href=\"%1$s>forumet</a> - <a href=\"%1$s>Översätt</a> appen Bidra som en utvecklare, se <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> för ytterligare detaljer Fllytta till… Kopiera till… Välj mapp… Laddar mappar… Inga mediamappar hittades - Aktivera Automatisk uppladning + Aktivera Automatisk uppladdning Inställningar Direktuppladdning heter numera Automatisk uppladdning och har blivit totalt omgjort. Vänligen se huvudmenyn för att konfigurera Automatisk uppladdning igen. Ledsen för besväret.\n\nNjut av de nya och förbättrade uppladdningsmöjligheterna! Mapp på telefonen: %1$s @@ -553,7 +551,7 @@ Multikonto Anslut alla dina moln - Automatisk uppladning + Automatisk uppladdning Lagra dina foton på ett säkert ställe Hoppa över diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 3cf92376e0..2fac81430b 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -511,8 +511,6 @@ ya da Yayın adayı (Release Candidate, RC) yayınlanacak sürümün bir kopyasıdır ve kararlı olması beklenir. Kişisel olarak kullanmanız kararlı olduğundan emin olmamızı sağlar. Denemek için Play Store üzerinden kayıt olun ya da el ile F-Droid üzerindeki \"sürümlere\" bakın. Etkin Katkıda Bulunun IRC sohbetine katılın: <a href=\"%1$s\">#nextcloud-mobile</a> - <a href=\"%1$s>forum</a> üzerinde başkalarına yardımcı olun - Uygulamayı <a href=\"%1$s>çevirin</a> Yazılımcı olarak katkıda bulunun! Ayrıntılı bilgi almak için <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">KATKIDA BULUNMA</a> sayfasına bakın Taşı… Kopyala… diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 92935f2e9b..0f76b86570 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -516,8 +516,6 @@ 候选发行版(RC)是下一个版本的快照,希望它是稳定的,你可以帮助测试以确认这一点。可以注册登陆在应用商店或手工在F-Droid的版本部分查找,并进行测试。 活跃的候选版 在IRC上加入这个会话: <a href=\"%1$s\">#nextcloud-mobile</a> - 帮助别人在<a href=\"%1$s>forum</a> - <a href=\"%1$s>Translate</a> 这个应用 做为有贡献的开发者,可以看<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>的细节 转移到… 复制到 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index ad69240563..125c9a3f63 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -491,8 +491,6 @@ 最終測試版是新版本發行前的快照,應該相當穩定,您的測試將協助我們確保穩定性,在 Play 商店中註冊成為測試者,或是在 F-Droid 中尋找「版本」區塊 積極貢獻 加入 IRC 討論:<a href=\"%1$s\">#nextcloud-mobile</a> - 在<a href=\"%1$s>論壇</a>中協助大家 - <a href=\"%1$s>翻譯</a>這個 App 貢獻程式碼,細節請見 <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> 移動到… 複製到… From e215e665e24f03df6286d82454ece4fc0db5dcc9 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 1 Feb 2017 01:17:24 +0000 Subject: [PATCH 038/881] [tx-robot] updated from transifex --- res/values-bg-rBG/strings.xml | 10 +- res/values-de-rDE/strings.xml | 2 + res/values-de/strings.xml | 2 + res/values-fr/strings.xml | 2 + res/values-id/strings.xml | 86 ++++- res/values-lv/strings.xml | 662 +++++++++++++++++++++++++--------- res/values-nb-rNO/strings.xml | 3 + res/values-nl/strings.xml | 2 + res/values-pt-rBR/strings.xml | 2 + res/values-ru/strings.xml | 2 + res/values-zh-rCN/strings.xml | 2 + 11 files changed, 590 insertions(+), 185 deletions(-) diff --git a/res/values-bg-rBG/strings.xml b/res/values-bg-rBG/strings.xml index 605c524be5..d7d9733f03 100644 --- a/res/values-bg-rBG/strings.xml +++ b/res/values-bg-rBG/strings.xml @@ -2,7 +2,7 @@ Android приложение за %1$s версия %1$s - Обновяви профила + Обнови профила Качване Съдържание от други приложения Файлове @@ -11,8 +11,8 @@ Настройки Детайли Изпращане - Сортиране - Сортирай по + Сортирай + Сортиране по А - Я Нови - Стари Големи - Малки @@ -77,6 +77,7 @@ Запазване на файла в оригиналната папка Изтриване на файла от оригиналната папка преди секунди + Тук няма файлове Зарежда… Няма намерени приложения за типа фаил В папката няма файлове. @@ -464,6 +465,7 @@ Търсене за потребители и групи %1$s (група) %1$s (отдалечен) + %1$s (имейл) %1$s ( в %2$s ) За съжаление версията на сървъра не позволява споделяне от клиента. @@ -517,6 +519,8 @@ %d избран %d избрани + Име на файла + Тип на файла По подразбиране SD карта %1$d Неизвестно diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 9efbe0e548..92500ea122 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -516,6 +516,8 @@ Die Vorabversion auch Release Candidate (RC) genannt ist ein stabiler Stand der kommenden, finalen Version. Ein Test auf der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version von F-Droid unter \"Versionen\". Aktiv etwas beitragen An Unterhaltungen teilnehmen im IRC: <a href="%1$s">#nextcloud-mobile</a> + Helfen Sie anderen im <a href=\"%1$s\">Forum</a> + Die App <a href=\"%1$s\">Übersetzen</a> Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Verschieben nach… Kopieren nach… diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 4802d3b049..21c5bea3e4 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -516,6 +516,8 @@ Die Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test auf der eigenen Umgebung hilft uns die Stabilität sicherzustellen. Melde dich als Tester im Play Store an oder suche und installiere die passende Version von F-Droid unter \"Versionen\". Aktiv etwas beitragen An Chats teilnehmen auf IRC: <a href="%1$s">#nextcloud-mobile</a> + Hilf anderen im <a href=\"%1$s\">Forum</a> + Die App <a href=\"%1$s\">Übersetzen</a> Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Verschieben nach… Kopieren nach… diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index bc18313571..a143175d3a 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -518,6 +518,8 @@ ou La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid. Contribuer activement Rejoingez la discussion sur IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Aidez les autres sur le <a href="%1$s">forum</a> + <a href="%1$s">Traduisez</a> l'application Développeurs ? Contribuez ! Plus de détails sur la page <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> Déplacer vers… Copier vers… diff --git a/res/values-id/strings.xml b/res/values-id/strings.xml index 1427aa3042..bd894334a3 100644 --- a/res/values-id/strings.xml +++ b/res/values-id/strings.xml @@ -57,6 +57,7 @@ Alamat server https://… Nama Pengguna Sandi + Belum punya server?\\nKlik disini untuk mendapatkannya dari penyedia Berkas Sambungkan Unggah @@ -360,6 +361,26 @@ Memperbarui jalur penyimpanan Selesai + Bersiap untuk migrasi… + Memeriksa tujuan… + Menyimpan konfigurasi akun… + Menunggu sinkronisasi yang belum selesai… + Memindahkan data… + Memperbarui indeks… + Membersihkan… + Memulihkan konfigurasi akun… + Selesai + GALAT: Penyimpanan penuh + GALAT: Berkas tidak dapat ditulis + GALAT: Berkas tidak dapat dibaca + GALAT: Direktori Nextcloud sudah ada + GALAT: Ketika migrasi + GALAT: Ketika memperbarui indeks + + Data folder sudah ada, harus apa? + Menimpa + Gunakan yang ada + Akun Tambah akun Kelola akun @@ -374,7 +395,8 @@ Diperlukan otentikasi Sandi salah Pindah - Tdak ada apapun disini. Anda dapat menambahkan sebuah folder! + Salin + Tdak ada apapun disini. Anda dapat menambahkan sebuah folder! Pilih Tidak dapat memindahkan. Silakan periksa apakah berkas ada @@ -424,6 +446,10 @@ Tersimpan di folder asli Dipindahkan ke folder aplikasi + terhapus + Jalur penyimpanan + Umum + Berbagi Bagikan %1$s Bagikan dengan pengguna atau grup @@ -434,6 +460,7 @@ Lindungi dengan sandi Diamankan Izinkan penyuntingan + Sembunyikan daftar berkas Dapatkan tautan Bagikan kepada … Bagikan dengan %1$s @@ -443,6 +470,7 @@ Cari pengguna dan grup %1$s (grup) %1$s (remote) + %1$s (surel) %1$s ( di %2$s ) Maaf, server Anda tidak mengizinkan untuk berbagi dengan pengguna didalam klien @@ -472,8 +500,62 @@ Berkas tidak ditemukan di sistem berkas lokal Apakah Anda yakin ingin menghapus item terpilih? Apakah Anda yakin ingin menghapus item terpilih dan isinya? + Menunggu perangkat dicas Cari + Ini adalah fitur Nextcloud, harap perbarui. + Pelajari lebih lanjut + Unggah otomatis + Berpartisipasi + Bantu kami menguji + Menemukan kutu? Sesuatu yang aneh? + Laporkan isu di Github + Tertarik dalam membantu kami menguji Versi selanjutnya? + Uji versi Beta + Ini termasuk semua fitur yang akan datang sangat terbaru. Kutu/galat +dapat terjadi dan jika terjadi, harap laporkan ke kami. <br/><a href=\"%2$s\">Unduh APK</a> +atau + Kandidat rilis + Kandidat rilis (RC) adalah potret rilis berikutnya dan diharapkan akan stabil. Uji pengaturan pribadi anda dapat membantu untuk memastikan hal ini. Daftar untuk menguji di Play Store atau secara manual lihat di seksi \"versi\" di F-Droid. + Berkontribusi Aktif + Gabung mengobrol di IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Bantu yang lain di <a href=\"%1$s\">forum</a> + <a href=\"%1$s\">Terjemahkan</a> apl + Kontribusi sebagai pengembang, lihat <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> untuk rinciannya + Pindah ke… + Salin ke… + Pilih folder… + Memuat folder… + Tidak ada folder media yang ditemukan. + Preferensi unggah otomatis + Pengaturan + Unggah instan telah dirubah sepenuhnya. Harap lihat menu utama dan konfigurasi ulang unggah otomatis anda. Maaf untuk gangguannya.\\n\\nNikmati kemampuan unggah otomatis yang lebih jauh dan baru! + Untuk %1$s %d dipilih - + Masukkan tipe berkas dan nama berkas unggahan + Nama berkas + Tipe berkas + Potongan berkas teks(.txt) + Berkas pintasan internet(%s) + Berkas pintasan Google Maps(%s) + + Bawaan + Kartu SD %1$d + Tidak diketahui + + + Apa yang baru di Nextcloud + + + Tempat yang aman untuk semua data anda + Akses, bagikan & jaga berkas anda dirumah dan diperusahaan anda + + Multi akun + Sambung ke semua cloud anda + + Unggah Instan + Jaga foto anda tetap aman + + Lewat + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index b04d14cc72..5a9a543b89 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -1,182 +1,484 @@ - + - versija %1$s - Atsvaidzināt kontu - Augšupielādēt - Saturs no citām lietotnēm - Datnes - Atvērt ar - Jauna mape - Iestatījumi - Detaļas - Sūtīt - Kārtot - Kārtot pēc - - Alfabēta: A-Z - Jaunākie - vecākie - - - - - Visas datnes - - Iestatījumi - Aizvērt - Atvērt - Vispārīgi - Vairāk - Konti - Automātiskā bilžu augšuplāde - Automātiski augšuplādēt tikko uzņemtās bildes - Automātiskā video augšuplāde - Automātiski augšuplādēt tikko uzņemtos video - Šo lieto lai ierakstītu informāciju par problēmām - Šis parāda ierakstu žurnālu - Palīdzība - Ieteikt draugam - Atsauksmes - Izmēģini %1$s uz savu viedtālruni! - Lietotājvārds - Parole - Datnes - Savienoties - Augšupielādēt - Nav atrastu kontu - Iestatīt - Iziet - sekundes atpakaļ - Te vēl nekas nav. Rīkojies, sāc augšupielādēt! - Ielādē… - Šajā mapē nav failu - mape - mapes - fails - fails - Uzsitiet uz datnes, lai redzētu papildinformāciju. - Izmērs: - Tips: - Izveidota: - Modificēta: - Lejupielādēt - Datne tika pārsaukta uz %1$s augšupielādes laikā - Dalīties - - - Labi - Atcelt - Kļūda - Ielādē - Nezināma kļūda - Par - Mainīt paroli - Izveidot kontu - Augšupielādēt no... - Mapes nosaukums - Augšupielādē ... - %1$d%% augšupielādē %2$s - Augšupielāde ir veiksmīga - Neizdevās augšupielādēt - Nevarēja pabeigt %1$s augšupielādēšanu - Pašreizējais - Pabeigts - Nezināma kļūda - Lejupielādē ... - %1$d%% lejupielādē %2$s - Lejupielāde beidzās veiksmīgi - Neizdevās lejupielādēt - Nevarēja pabeigt %1$s lejupielādēšanu - Izvēlieties kontu - Ir atrasti konflikti - Nevarēja sinhronizēt %1$d kept-in-sync datnes - Kept-in-sync datnes cieta neveiksmi - Nevarēja sinhronizēt %1$d datņu saturu (%2$d konflikti) - Nav tīkla savienojumu - Nav pieejams drošs savienojums. - Savienojums ir izveidots - Slikti formatēta servera konfigurācija - Gadījās nezināma kļūda! - Nevarēja atrast datoru - Servera instance nav atrasta - Serveris pārāk ilgi neatbildēja - Neizdevās inicializēt SSL - Neatpazīta servera versija - Nevarēja izveidot savienojumu - Ir izveidots drošs savienojums - Pārsaukt - Izņemt - Tikai lokālos - Veiksmīgi izņemts - Neizdevās izņemt - Ievadīt jaunu nosaukumu - Nevarēja pārsaukt lokālo kopiju; pamēģiniet citu nosaukumu - Nevarēja pabeigt pārsaukšanu - Nevarēja atzīmēt attālinātas datnes - Datnes saturs jau ir sinhronizēts - Mapi nevarēja izveidot - Uzgaidīt brīdi - Negaidīta problēma; lūdzu, izvēlieties datni no citas lietotnes - Netika izvēlēta neviena datne - Šīs vietnes identitāti nevarēja pārbaudīt - - Nav uzticības servera sertifikātam - - Servera sertifikātam ir beidzies termiņš - - Servera sertifikāta datumi ir nākotnē - - URL sertifikātā neatbilst datora nosaukumam - Vai tomēr uzticēties sertifikātam? - Nevarēja saglabāt sertifikātu - Sīkāka informācija - Slēpt - Izsniegts: - Izsniedza: - Kopīgais nosaukums: - Organizācija: - Organizācijas vienība: - Valsts: - Štats: - Vieta: - Derīgums: - No: - Kam: - Paraksts: - Algoritms: - PNG attēls - /TūlītējaAugšupielāde - Paturēt abas - Šo attēlu nevar attēlot - Ievadiet paroli - Jums ir jāievada paroli - Sūtīt - Kopēt saiti - - lai pārsauktu šo datni - lai dzēstu šo datni - lai dalītu šo datni - lai pārtrauktu šis datnes dalīšanu - lai izveidotu datni - Konti - Pievienot kontu - Nepareiza parole - Pārvietot - Šeit nekā nav. Jūs varat pievienot mapi! - Izvēlieties - lai pārvietotu šo datni - lai kopētu šo datni - Detaļas - koplietots - ar jums - Servera adrese - Lietotājvārds - 1 mape - 1 datne - Dalīšanās - Dalīt saiti - Iestaties termiņa datumu - Aizsargāt ar paroli - Meklēt - Var dalīties - var rediģēt - izveidot - dzēst + %1$s Android programma + versija %1$s + Atsvaidzināt kontu + Augšupielādēt + Saturs no citām programmām + Datnes + Atvērt ar + Jauna mape + Iestatījumi + Detaļas + Sūtīt + Kārtot + Kārtot pēc + A - Z + Jaunākie - vecākie + Lielākie - mazākie + Visas datnes + Ierīcē + Iestatījumi + Augšupielādes + %1$s no %2$s lietoti + Aizvērt + Atvērt + Vispārīgi + Vairāk + Konti + Pārvaldīt kontus + Kods bloķēts + Rādīt slēptās datnes + Automātiskā bilžu augšupielāde + Automātiski augšupielādēt tikko uzņemtās bildes + Automātiskā video augšupielāde + Automātiski augšupielādēt tikko uzņemtos video + Iespējot žurnālu + Šo lieto lai ierakstītu informāciju par problēmām + Žurnāla vēsture + Šis parāda ierakstu žurnālu + Dzēst vēsturi + Kontam iestatīt DAVdroid (v1.3.0+) + Palīdzība + Ieteikt draugam + Atsauksmes + Importēt + Izmēģini %1$s uz savu viedtālruni! + Aicinu tevi izmantot %1$s tavā ierīcē!\\nLejupielādē šeit: %2$s + + Pārbaudīt serveri + Servera adrese https://… + Lietotājvārds + Parole + Datnes + Savienoties + Augšupielādēt + Izvēlies augšupielādes mapi + Nav atrastu kontu + Jūsu ierīcē nav neviena %1$s konta. Lūdzu vispirms izveido kontu. + Iestatīt + Iziet + Nav datņu augšupielādei + Saņemtie dati neietver derīgu failu. + Datni nevar augšupielādēt + %1$s nav atļauts lasīt saņemto datni + Augšupielādējamā datne netika atrasta šaja vietā. Lūdzu pārbaudi vai datne eksistē. + Notika kļūda kopējot datni uz pagaidu mapi. Lūdzu mēģini sūtīt vēlreiz. + Augšupielādes opcijas: + Pārvietot failu uz Nextcloud mapi + Saglabāt failu avota mapē + Dzēst failu no avota mapes + sekundes atpakaļ + Šeit nav datņu + Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm! + Ielādē… + Nav programmas šim datnes tipam! + Šajā mapē nav datņu + Augšupielādes nav pieejamas. + mape + mapes + datne + datnes + Uzsit uz datnes, lai redzētu papildinformāciju. + Izmērs: + Tips: + Izveidota: + Modificēta: + Lejupielādēt + Sinhronizēt + Datne tika pārsaukta uz %1$s augšupielādes laikā + Saraksta izkārtojums + Koplietot + + + Labi + Noņemt augšupielādi + Atkārtot augšupielādi + Atsaukt sinhronizāciju + Atcelt + Atpakaļ + Saglabāt + Saglabāt & iziet + Kļūda + Ielādē … + nezināms + Nezināma kļūda + Par + Mainīt paroli + Noņemt kontu + Dzēst kontu %s?\\n\\nDzēšanu nevar atsaukt. + Izveidot kontu + Augšupielādēt no … + Mapes nosaukums + Augšupielādē … + %1$d%% augšupielādē %2$s + Augšupielāde ir veiksmīga + %1$s augšupielādēts + Neizdevās augšupielādēt + Nevarēja pabeigt %1$s augšupielādēšanu + Augšupielāde nesekmīga, jums atkārtoti jāpierakstās + Augšupielādes + Pašreizējais + Nesekmīgi (uzsit lai atkārtotu) + Augšupielādēts + Pabeigts + Atcelts + Apturēts + Savienojuma kļūda + Augšupielāde drīzumā tiks atkārtota + Akreditācijas datu kļūda + Mapes kļūda + Datnes kļūda + Lokālā datne nav atrasta + Pieejas tiesību kļuda + Konflikts + Programma tika aizvērta + Nezināma kļūda + Gaida bezvadu savienojumu + Gaida augšupielādi + Lejupielādē ... + %1$d%% lejupielādē %2$s + Lejupielāde beidzās veiksmīgi + %1$s lejupielādēts + Neizdevās lejupielādēt + Nevarēja pabeigt %1$s lejupielādēšanu + Vēl nav lejupielādēts + Lejupielāde neizdevās, jums atkārtoti jāpierakstās + Izvēlieties kontu + Sinhronizācija neizdevās + Sinhronizācija neizdevās; nepieciešams pieteikties vēlreiz + Nevarēja pabeigt %1$s sinhronizēšanu + %1$s ir nepareiza parole + Ir atrasti konflikti + Nevarēja sinhronizēt %1$d kept-in-sync datnes + Kept-in-sync datnes cieta neveiksmi + Nevarēja sinhronizēt %1$d datņu saturu (%2$d konflikti) + Dažas lokālās datnes tika aizmirstas + %1$d datnes ārpus %2$s mapes nevar kopēt uz + Mape %1$s vairs neeksistē + Pārvietot visu + Visas datnes tika pārvietotas + Dažas datnes nevarēja pārvietot + Lokāli: %1$s + Attālināti: %1$s + Lūdzu, ievadiet piekļuves kodu + + Ievadiet piekļuves kodu + Lūdzu, atkārtoti ievadiet savu piekļuves kodu + Noņemt kodu + Šie piekļuves kodi nav vienādi + Nepareizs piekļuves kods + Kods noņemts + Kods saglabāts + + Nav atrasts neviens multivides fails + Mēģina pieteikties … + Nav tīkla savienojumu + Nav pieejams drošs savienojums. + Savienojums ir izveidots + Notiek savienojuma testēšana + Slikti formatēta servera konfigurācija + Ievadītais lietotājvārds neatbilst šī konta lietotājam. + Gadījās nezināma kļūda! + Nevarēja atrast datoru + Servera instance nav atrasta + Serveris pārāk ilgi neatbildēja + Nepareizs servera adreses formāts + Neizdevās inicializēt SSL + Nevar pārbaudīt SSL servera identitāti + Neatpazīta servera versija + Nevarēja izveidot savienojumu + Ir izveidots drošs savienojums + Nepareizs lietotājvārds vai parole + Neveiksmīga autorizācija + Piekļuvi liedza autorizācijas serveris + Lūdzu, ievadiet pašreizējo paroli + Jūsu sesija ir beigusies. Lūdzu, izveidojiet savienojumu vēlreiz + Savienojas ar autentifikācijas serveri … + Šis serveris neatbalsta šo autentifikācijas metodi + Nevar autentificēt serveri + Konts vēl neeksistē ierīcē + + Iestatīt kā pieejamu bezsaistē + Iestatiet, ka pieejams bezsaistē + Pārsaukt + Izņemt + Vai tiešām vēlaties noņemt %1$s? + Tikai lokālos + Veiksmīgi izņemts + Neizdevās izņemt + Ievadīt jaunu nosaukumu + Nevarēja pārsaukt lokālo kopiju; pamēģiniet citu nosaukumu + Nevarēja pabeigt pārsaukšanu + Nevarēja atzīmēt attālinātas datnes + Datnes saturs jau ir sinhronizēts + Mapi nevarēja izveidot + Aizliegtās rakstzīmes: / \\ < > : \" | ? * + Faila nosaukumā ir vismaz viena nederīga rakstzīme + Datnes nosaukums nevar būt tukšs. + Uzgaidīt brīdi + Netika izvēlēta neviena datne + Sūtīt saiti uz … + Notiek faila kopēšana no privāta krātuves + + Pieteikšanās ar oAuth2 + Savienojas ar oAuth2 serveri… + + Šīs vietnes identitāti nevarēja pārbaudīt + - Nav uzticības servera sertifikātam + - Servera sertifikātam ir beidzies termiņš + - Servera sertifikāta datumi ir nākotnē + - URL sertifikātā neatbilst datora nosaukumam + Vai tomēr uzticēties sertifikātam? + Nevarēja saglabāt sertifikātu + Sīkāka informācija + Slēpt + Izsniegts: + Izsniedza: + Kopīgais nosaukums: + Organizācija: + Organizācijas vienība: + Valsts: + Štats: + Vieta: + Derīgums: + No: + Kam: + Paraksts: + Algoritms: + Šis algoritms nav pieejams jūsu tālrunī. + Radusies problēma, ielādējot sertifikātu. + Sertifikātu nevarēja parādīt. + - Nav informācijas par kļūdu + + placeholder.txt + PNG attēls + 389 KB + 2012/05/18 12:23 PM + 12:23:45 + + Augšupielādēt izmantojot tikai WiFi + Augšupielādēt attēlus, izmantojot tikai WiFi + Augšupielādēt video, izmantojot tikai WiFi + Augšupielādēt tikai uzlādes laikā + Augšupielādēt tikai uzlādes laikā + /TūlītējaAugšupielāde + Fails konfliktē + Kurus failus vēlaties paturēt? Ja atlasīsiet abas versijas, lokālā faila nosaukumam tiks pievienots skaitlis. + Paturēt abas + lokālā versija + servera versija + + Attēla priekšskatījums + Šo attēlu nevar attēlot + + %1$s nevar kopēt uz %2$s lokālo mapi + Tūlītējas augšupielādes mepe + Lokāla mape + Attālinātā mape + Lietot apakšmapi + Atvainojiet, koplietošana nav iespējota jūsu serverī. Lūdzu, sazinieties ar + administratoru. + Nevar koplietot. Lūdzu, pārbaudiet, vai fails pastāv + Nevar atjaunināt. Lūdzu, pārbaudiet, vai fails pastāv + Radās kļūda, mēģinot atjaunināt koplietojumu + Ievadiet paroli + Jums ir jāievada paroli + + Sūtīt + + Kopēt saiti + Nokopēts starpliktuvē + Nav teksta, lai kopētu starpliktuvē + Kopējot starpliktuvē, radās neparedzēta kļūda + Teksts kopēts no %1$s + + Kritiska kļūda: nevar veikt darbību + + Radās kļūda, mēģinot izveidot savienojumu ar serveri. + Radās kļūda, gaidot serveri; darbību nevarēja pabeigt + Radās kļūda, gaidot serveri; darbību nevarēja pabeigt + Darbību nevarēja pabeigt; serveris nav pieejams + Jums nav atļaujas %s + lai pārsauktu šo datni + lai dzēstu šo datni + lai koplietotu šo datni + lai pārtrauktu šīs datnes koplietošanu + lai atjauninātu šo koplietošanu + lai izveidotu datni + augšupielādēt šajā mapē + Fails serverī vairs nav pieejams + + Atjauninot saglabāšanas vietu + Pabeigt + Sagatavojas migrācijai… + Pārbauda galamērķi… + Saglabā kontu konfigurāciju… + Gaidīja nepabeigtām sinhronizācijām… + Datu pārvietošana… + Indeksa atjaunināšana… + Tīrīšana… + Atjauno kontu konfigurāciju… + Pabeigts + Kļūda: Nepietiek vietas + Kļūda: Fails nav rakstāms + Kļūda: Fails nav lasāms + Kļūda: Nextcloud direktorija jau pastāv + KĻŪDA: migrēšanas laikā + KĻŪDA: indeksa atjaunināšanas laikā + + Datu mape jau pastāv, ko darīt? + Ignorēt + Lietot esošo + + Konti + Pievienot kontu + Pārvaldīt kontus + Žurnāl faili + Sūtīt vēsturi + Nav programmas žurnāl failu sūtīšanai. Lūdzu uzstādiet e-pasta programmu. + %1$s Android programmas žurnāli + Ielādē … + + Nepieciešama autentifikācija + Nepareiza parole + Pārvietot + Kopēt + Šeit nekā nav. Jūs varat pievienot mapi! + Izvēlieties + + Nevar pārvietot. Lūdzu, pārbaudiet, vai fails pastāv + Fails mērķa mapē jau pastāv + Radās kļūda, mēģinot pārvietot šo failu vai mapi + lai pārvietotu šo datni + + + Nevar nokopēt. Lūdzu, pārbaudiet, vai fails pastāv + Fails mērķa mapē jau pastāv + Radās kļūda, mēģinot kopēt šo failu vai mapi + lai kopētu šo datni + + Tūlītējas augšupielādes + Detaļas + + Vienā mirklī augšupielādēt video mapi + koplietots + ar jums + + %1$s koplietots \"%2$s\" ar tevi + \"%1$s\" ir bijis kopīgots ar jums + + Atsvaidzināt savienojumu + Servera adrese + Nepietiek atmiņas + + Lietotājvārds + + 1 mape + %1$d mapes + 1 datne + 1 fails, 1 mape + 1 fails, %1$d mapes + %1$d faili + %1$d faili, 1 mapē + %1$d faili, %2$d mapes + Oriģinālais fails tiks… + Oriģinālais fails tiks… + Kopēt failu + Pārvietot failu + Atzīmēt visu + + paturēt sākotnējā mapē + pārvietot uz programmu mapi + dzēsts + Krātuves vieta + Dalīšanās + Koplietot ar lietotājiem vai grupām + Pievienot lietotāju vai grupu + Koplietot saiti + Iestaties termiņa datumu + Aizsargāt ar paroli + Nodrošināts + Atļaut rediģēšanu + Paslēpt datņu sarakstu + Saņemt saiti + Koplietots ar … + Koplietots ar %1$s + + Meklēt + + Meklēt lietotājus un grupas + %1$s (grupa) + %1$s (attālināti) + %1$s (e-pasts) + %1$s ( uz %2$s ) + + var koplietot + var rediģēt + izveidot + mainīt + dzēst + Beigt dalīšanos + pabeigts + + Atkārtošana neizdevās + Notīrīšana neizdevās + Notīrīts sekmīgi + Notīrīt visus pabeigtos + + Režģa izkārtojums + Saraksta izkārtojums + + Pārvaldīt vietu + Iestatījumi, datubāze un servera sertifikāti no %1$s datiem tiks dzēsti pilnībā. \\n\\nLejupielādētās datnes paliks neskartas.\\n\\nŠis proces var aizņemt mazliet laika. + Notīrīt datus + Dažas datnes nevarēja izdzēst. + + Nepieciešamas papildus tiesības, lai augšupielādētu & lejupielādētu datnes. + Datne lokālajā datņu sistēma netika atrasta + Vai tiešām vēlies noņemt izvēlētos? + Vai tiešām vēlies noņemt izvēlētos un to saturu? + Gaida ierīces uzlādi + Meklēt + Uzziniet vairāk + Automātiska augšupielāde + Palīdziet mums testēšanā + Testēt Beta versiju + <a href=\"%1$s\">Tūlkot</a> programmu + Pārvietot uz… + Kopēt uz… + Izvēlies mapi… + Ielāde mapes… + Nav atrasta multivides mape. + Iestatījumi + %1$s + + %d atlasīts + %d atlasīts + %d atlasīts + + Faila nosaukums + Faila tips + Mazs teksta fails(.txt) + Interneta saīsnes fails(%s) + Google Maps īsceļa fails (%s) + + Noklusējuma + SD karte %1$d + Nezināms + + + Kas jauns Nextcloud + + + Droša vieta visiem jūsu datiem + Piekļūsti, dalies & amp; aizsargāt jūsu failus mājās un jūsu uzņēmumā + + Multi konts + Savienoties ar visiem mākoņiem + + Tūlītēja augšupielāde + Glabājiet savus fotoattēlus drošībā + + Izlaist diff --git a/res/values-nb-rNO/strings.xml b/res/values-nb-rNO/strings.xml index fb0c405bbb..070d3ef186 100644 --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@ -57,6 +57,7 @@ Tjeneradresse https://... Brukernavn Passord + Har du ingen tjener enda?\\nKlikk her for å opprette en hos en tilbyder Filer Koble til Last opp @@ -518,6 +519,8 @@ eller Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid. Bidra aktivt Delta i chat på IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Hjelp andre på <a href=\"%1$s\">forumet</a> + <a href=\"%1$s\">Oversette</a> app\'en Bidra som en utvikler, se <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> for detaljer Flytt til… Kopier til… diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 9f1bcae8a4..540fd31913 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -519,6 +519,8 @@ of De Release Candidate (RC) is een kopie van de komende release en zou stabiel moeten zijn. Testen van jouw installatie kan ons helpen om dit te bevestigen. Meld je aan om te testen op de Play store en bekijk handmatig de \"versions\" sectie op F-Droid. Actief meedoen Doe mee met de chat op IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Help andere gebruikers in de <a href=\"%1$s\">forums</a> + <a href=\"%1$s\">Vertaal</a> de app Doe mee als ontwikkelaar, zie <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> voor details Verplaats naar… Kopieer naar… diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index c7f91bfb71..4245339bf6 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -518,6 +518,8 @@ O release candidate (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode contribuir para assegurar-la. Registe-se para testar na Play Store ou procurar manualmente na seção \"versões\" na F-Droid. Contribuir ativamente Participe de uma conversa no IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Ajude outros no <a href=\"%1$s\">forum</a> + <a href=\"%1$s\">Traduza&Isso;/a> the app Contribuir como desenvolvedor, veja <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para detalhes Mover para… Copiar para… diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index c268b796ae..d503b151cc 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -519,6 +519,8 @@ Релиз-кандидат (RC) - это текущее состояние готовящегося выпуска, и, ожидается, что он будет стабильным. Проверка с вашими индивидуальными настройками может помочь убедится в этом. Зарегистрируйтесь для тестирования в Google Play или используйте раздел \"версии\" в каталоге приложений F-Droid. Активное участие Присоединиться к IRC-чату: <a href=\"%1$s\">#nextcloud-mobile</a> + Помогите другим на нашем <a href=\"%1$s\">форуме</a> + <a href=\"%1$s\">Перевести</a> приложение Участвовать в качестве разработчика: подробности по ссылке <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>. Переместить в… Копировать в… diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 0f76b86570..1ec1900faf 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -516,6 +516,8 @@ 候选发行版(RC)是下一个版本的快照,希望它是稳定的,你可以帮助测试以确认这一点。可以注册登陆在应用商店或手工在F-Droid的版本部分查找,并进行测试。 活跃的候选版 在IRC上加入这个会话: <a href=\"%1$s\">#nextcloud-mobile</a> + 帮助他人在 <a href=\"%1$s\">论坛</a> + <a href=\"%1$s\">翻译e&;/a> 应用程序 做为有贡献的开发者,可以看<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>的细节 转移到… 复制到 From 81482f03b4177d9ff60efc2b50e3cd3c3553fd0f Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 1 Feb 2017 11:01:43 +0000 Subject: [PATCH 039/881] [tx-robot] updated from transifex --- res/values-bg-rBG/strings.xml | 2 ++ res/values-cs-rCZ/strings.xml | 3 +++ res/values-de-rDE/strings.xml | 4 ++-- res/values-de/strings.xml | 4 ++-- res/values-en-rGB/strings.xml | 3 +++ res/values-es/strings.xml | 2 ++ res/values-hu-rHU/strings.xml | 6 ++++-- res/values-id/strings.xml | 18 +++++++++--------- res/values-it/strings.xml | 2 ++ res/values-lv/strings.xml | 10 +++++----- res/values-nb-rNO/strings.xml | 10 +++++----- res/values-nl/strings.xml | 10 +++++----- res/values-pl/strings.xml | 7 +++++-- res/values-pt-rBR/strings.xml | 8 ++++---- res/values-ru/strings.xml | 8 ++++---- res/values-sq/strings.xml | 2 ++ res/values-sv/strings.xml | 2 ++ res/values-tr/strings.xml | 2 ++ res/values-zh-rCN/strings.xml | 8 ++++---- 19 files changed, 67 insertions(+), 44 deletions(-) diff --git a/res/values-bg-rBG/strings.xml b/res/values-bg-rBG/strings.xml index d7d9733f03..7435c908ed 100644 --- a/res/values-bg-rBG/strings.xml +++ b/res/values-bg-rBG/strings.xml @@ -507,6 +507,8 @@ Заинтересован сте от възможността да тествате следващата версия? Тестване на бета версия Присъединете се към IRC чата: <a href=\"%1$s\">#nextcloud-mobile</a> + Помогнете на други във <a href="%1$s">форума</a> + <a href="%1$s">Преведете</a> приложението Преместване в… Копиране в… Избери папка… diff --git a/res/values-cs-rCZ/strings.xml b/res/values-cs-rCZ/strings.xml index b9513522da..36eb139613 100644 --- a/res/values-cs-rCZ/strings.xml +++ b/res/values-cs-rCZ/strings.xml @@ -57,6 +57,7 @@ Adresa serveru https://... Uživatelské jméno Heslo + Ještě nemáte server?\nKlikněte sem a získejte ho od poskytovatele Soubory Připojit Nahrát @@ -514,6 +515,8 @@ správce systému. Předběžná verze nebo také Release Candidate (RC) je stabilní stav připravované, finální verze. Přihlas se jako tester v Play store nebo si najdi a instaluj hodící se verzi z F-Droid pod \"Verze\". Aktivně něčím přispět Diskutovat na IRC: <a href="%1$s">#nextcloud-mobile</a> + Pomozte ostatním na <a href="%1$s">fóru</a> + <a href="%1$s">Přeložte</a> aplikaci Přispět jako vývojář, detaily pod <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Přesunout do… Kopírovat do… diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 92500ea122..95b8525a9b 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -516,8 +516,8 @@ Die Vorabversion auch Release Candidate (RC) genannt ist ein stabiler Stand der kommenden, finalen Version. Ein Test auf der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version von F-Droid unter \"Versionen\". Aktiv etwas beitragen An Unterhaltungen teilnehmen im IRC: <a href="%1$s">#nextcloud-mobile</a> - Helfen Sie anderen im <a href=\"%1$s\">Forum</a> - Die App <a href=\"%1$s\">Übersetzen</a> + Helfen Sie anderen im <a href="%1$s">Forum</a> + Die App <a href="%1$s">Übersetzen</a> Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Verschieben nach… Kopieren nach… diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 21c5bea3e4..57ed93463e 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -516,8 +516,8 @@ Die Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test auf der eigenen Umgebung hilft uns die Stabilität sicherzustellen. Melde dich als Tester im Play Store an oder suche und installiere die passende Version von F-Droid unter \"Versionen\". Aktiv etwas beitragen An Chats teilnehmen auf IRC: <a href="%1$s">#nextcloud-mobile</a> - Hilf anderen im <a href=\"%1$s\">Forum</a> - Die App <a href=\"%1$s\">Übersetzen</a> + Hilf anderen im <a href="%1$s">Forum</a> + Die App <a href="%1$s">Übersetzen</a> Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Verschieben nach… Kopieren nach… diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 37335c5060..00276ec159 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -57,6 +57,7 @@ Server address https://… Username Password + Don’t have a server yet?\nClick here to get one from a provider Files Connect Upload @@ -515,6 +516,8 @@ The release candidate (RC) is a snapshot of the upcoming release and it is expected to be stable. Testing your individual setup could help to ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid. Actively Contribute Join the chat on IRC: <a href="%1$s">#nextcloud-mobile</a> + Help others on the <a href="%1$s">forum</a> + <a href="%1$s">Translate</a> the app Contribute as a developer, see <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for details Move to… Copy to… diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 8089fbce9c..0adb994ef1 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -517,6 +517,8 @@ o La release candidate (RC) es una instantánea de la próxima versión y se espera que sea estable. Probar su configuración individual podría ayudar a asegurar esto. Regístrese para probarla en Play Store o busque manualmente en la sección \"versiones\" de F-Droid. Contribuye activamente Únase a la conversación en IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Ayude a otros en el <a href="%1$s">foro</a>. + <a href="%1$s">Traduzca</a> la app Contribuya como desarrolador, vea see <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para más detalles Mover a… Copiar a… diff --git a/res/values-hu-rHU/strings.xml b/res/values-hu-rHU/strings.xml index c6e75952d7..572a13f4e6 100644 --- a/res/values-hu-rHU/strings.xml +++ b/res/values-hu-rHU/strings.xml @@ -514,8 +514,10 @@ vagy Kiadásra jelölt A kiadásra jelölt (RC) változat az egy pillanatképe a közelgő új változatnak, és stabilnak mondható. Az egyedi telepítésekkel segíthet nekünk, hogy ezt biztosítsuk. Jelentkezzen tesztelésre a Play Áruházban vagy manuálisan nézzen bele a verziók részbe F-Droid-on. Aktívan hozzájárul - Csatlakozz a beszélgetéshez az IRC-n: <a href=\"%1$s\">#nextcloud-mobile</a> - Működj közre fejlesztőként, részletek: <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> + Csatlakozz a beszélgetéshez az IRC-n: <a href="%1$s">#nextcloud-mobile</a> + Segíts másokat a <a href="%1$s">fórumban</a> + <a href="%1$s">Fordítsd</a> az alkalmazást + Működj közre fejlesztőként, részletek: <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Áthelyezés ide...… Másolás ide...… Mappa választás… diff --git a/res/values-id/strings.xml b/res/values-id/strings.xml index bd894334a3..3461478fb4 100644 --- a/res/values-id/strings.xml +++ b/res/values-id/strings.xml @@ -57,7 +57,7 @@ Alamat server https://… Nama Pengguna Sandi - Belum punya server?\\nKlik disini untuk mendapatkannya dari penyedia + Belum punya server?\nKlik disini untuk mendapatkannya dari penyedia Berkas Sambungkan Unggah @@ -474,7 +474,7 @@ %1$s ( di %2$s ) Maaf, server Anda tidak mengizinkan untuk berbagi dengan pengguna didalam klien -\\nHubungi administrator Anda +\nHubungi administrator Anda dapat berbagi dapat disunting buat @@ -492,7 +492,7 @@ Tampilan lis Kelola ruang - Pengaturan, database dan sertifikat server dari data %1$s akan dihapus secara permanen. \\n\\nBerkas terunduh akan tetap terjaga.\\n\\nProses ini dapat memakan waktu. + Pengaturan, database dan sertifikat server dari data %1$s akan dihapus secara permanen. \n\nBerkas terunduh akan tetap terjaga.\n\nProses ini dapat memakan waktu. Bersihkan data Beberapa berkas tidak dapat dihapus. @@ -512,15 +512,15 @@ Tertarik dalam membantu kami menguji Versi selanjutnya? Uji versi Beta Ini termasuk semua fitur yang akan datang sangat terbaru. Kutu/galat -dapat terjadi dan jika terjadi, harap laporkan ke kami. <br/><a href=\"%2$s\">Unduh APK</a> +dapat terjadi dan jika terjadi, harap laporkan ke kami. <br/><a href="%2$s">Unduh APK</a> atau Kandidat rilis Kandidat rilis (RC) adalah potret rilis berikutnya dan diharapkan akan stabil. Uji pengaturan pribadi anda dapat membantu untuk memastikan hal ini. Daftar untuk menguji di Play Store atau secara manual lihat di seksi \"versi\" di F-Droid. Berkontribusi Aktif - Gabung mengobrol di IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Bantu yang lain di <a href=\"%1$s\">forum</a> - <a href=\"%1$s\">Terjemahkan</a> apl - Kontribusi sebagai pengembang, lihat <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> untuk rinciannya + Gabung mengobrol di IRC: <a href="%1$s">#nextcloud-mobile</a> + Bantu yang lain di <a href="%1$s">forum</a> + <a href="%1$s">Terjemahkan</a> apl + Kontribusi sebagai pengembang, lihat <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> untuk rinciannya Pindah ke… Salin ke… Pilih folder… @@ -528,7 +528,7 @@ atau Tidak ada folder media yang ditemukan. Preferensi unggah otomatis Pengaturan - Unggah instan telah dirubah sepenuhnya. Harap lihat menu utama dan konfigurasi ulang unggah otomatis anda. Maaf untuk gangguannya.\\n\\nNikmati kemampuan unggah otomatis yang lebih jauh dan baru! + Unggah instan telah dirubah sepenuhnya. Harap lihat menu utama dan konfigurasi ulang unggah otomatis anda. Maaf untuk gangguannya.\n\nNikmati kemampuan unggah otomatis yang lebih jauh dan baru! Untuk %1$s %d dipilih diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index b3cd8afb86..a4b9b33846 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -518,6 +518,8 @@ o Questa candidata al rilascio (RC) è uno snapshot della prossima versione e dovrebbe essere stabile. La prova della tua specifica configurazione potrebbe aiutare ad assicurare che lo sia. Registrati per i test su Google Play o controlla manualmente nella sezione \"versioni\" su F-Droid. Contribuisci attivamente Unisciti alla chat su IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Aiuta gli altri sul <a href=\"%1$s\">forum</a> + <a href=\"%1$s\">Traduci</a> l\'applicazione Contribuisci come sviluppatore, vedi <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> per i dettagli Sposta in… Copia in… diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 5a9a543b89..2cb65f80ed 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -44,7 +44,7 @@ Atsauksmes Importēt Izmēģini %1$s uz savu viedtālruni! - Aicinu tevi izmantot %1$s tavā ierīcē!\\nLejupielādē šeit: %2$s + Aicinu tevi izmantot %1$s tavā ierīcē!\nLejupielādē šeit: %2$s Pārbaudīt serveri Servera adrese https://… @@ -106,7 +106,7 @@ Par Mainīt paroli Noņemt kontu - Dzēst kontu %s?\\n\\nDzēšanu nevar atsaukt. + Dzēst kontu %s?\n\nDzēšanu nevar atsaukt. Izveidot kontu Augšupielādēt no … Mapes nosaukums @@ -430,7 +430,7 @@ Saraksta izkārtojums Pārvaldīt vietu - Iestatījumi, datubāze un servera sertifikāti no %1$s datiem tiks dzēsti pilnībā. \\n\\nLejupielādētās datnes paliks neskartas.\\n\\nŠis proces var aizņemt mazliet laika. + Iestatījumi, datubāze un servera sertifikāti no %1$s datiem tiks dzēsti pilnībā. \n\nLejupielādētās datnes paliks neskartas.\n\nŠis proces var aizņemt mazliet laika. Notīrīt datus Dažas datnes nevarēja izdzēst. @@ -444,7 +444,7 @@ Automātiska augšupielāde Palīdziet mums testēšanā Testēt Beta versiju - <a href=\"%1$s\">Tūlkot</a> programmu + <a href="%1$s">Tūlkot</a> programmu Pārvietot uz… Kopēt uz… Izvēlies mapi… @@ -472,7 +472,7 @@ Droša vieta visiem jūsu datiem - Piekļūsti, dalies & amp; aizsargāt jūsu failus mājās un jūsu uzņēmumā + Piekļūsti, dalies & aizsargāt jūsu failus mājās un jūsu uzņēmumā Multi konts Savienoties ar visiem mākoņiem diff --git a/res/values-nb-rNO/strings.xml b/res/values-nb-rNO/strings.xml index 070d3ef186..7636e95c4c 100644 --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@ -57,7 +57,7 @@ Tjeneradresse https://... Brukernavn Passord - Har du ingen tjener enda?\\nKlikk her for å opprette en hos en tilbyder + Har du ingen tjener enda?\nKlikk her for å opprette en hos en tilbyder Filer Koble til Last opp @@ -518,10 +518,10 @@ eller Release candidate Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid. Bidra aktivt - Delta i chat på IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Hjelp andre på <a href=\"%1$s\">forumet</a> - <a href=\"%1$s\">Oversette</a> app\'en - Bidra som en utvikler, se <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> for detaljer + Delta i chat på IRC: <a href="%1$s">#nextcloud-mobile</a> + Hjelp andre på <a href="%1$s">forumet</a> + <a href="%1$s">Oversette</a> app\'en + Bidra som en utvikler, se <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for detaljer Flytt til… Kopier til… Velg mappe… diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 540fd31913..c28d475588 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -52,7 +52,7 @@ Probeer %1$s op je smartphone! Uitnodiging om %1$s op je smartphone uit te proberen! -Download hier: %2$s +\nDownload hier: %2$s Controleer server Serveradres https://… @@ -518,10 +518,10 @@ of Release candidate De Release Candidate (RC) is een kopie van de komende release en zou stabiel moeten zijn. Testen van jouw installatie kan ons helpen om dit te bevestigen. Meld je aan om te testen op de Play store en bekijk handmatig de \"versions\" sectie op F-Droid. Actief meedoen - Doe mee met de chat op IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Help andere gebruikers in de <a href=\"%1$s\">forums</a> - <a href=\"%1$s\">Vertaal</a> de app - Doe mee als ontwikkelaar, zie <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> voor details + Doe mee met de chat op IRC: <a href="%1$s">#nextcloud-mobile</a> + Help andere gebruikers in de <a href="%1$s">forums</a> + <a href="%1$s">Vertaal</a> de app + Doe mee als ontwikkelaar, zie <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> voor details Verplaats naar… Kopieer naar… Kies map… diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index cd8646c5c1..17c0c50a86 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -57,6 +57,7 @@ Adres serwera https://... Nazwa użytkownika Hasło + Nie masz jeszcze serwera?\\nKliknij tu i zdobądź go od dostawcy Pliki Połącz Wyślij @@ -517,8 +518,10 @@ lub Wydanie kandydujące Release Candidate (RC) jest zarysem nadchodzącego wydania i oczekujemy że będzie stabilne. Testowanie indywidualnej konfiguracji może pomóc, aby to zapewnić. Zapisz się do testowania w sklepie Play lub ręcznie szukaj w sekcji \"wersje\" na F-Droid. Aktywni członkowie projektu - Dołącz do chatu (IRC): <a href=\"%1$s\">#nextcloud-mobile</a> - Wspomóż nas jako programista, po więcej szczegółów odwiedź <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> + Dołącz do chatu (IRC): <a href="%1$s">#nextcloud-mobile</a> + Pomóż innym na <a href="%1$s">forum</a> + <a href="%1$s">Tłumacz</a> aplikację + Wspomóż nas jako programista, po więcej szczegółów odwiedź <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Przenieś do… Skopiuj do… Wybierz folder… diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 4245339bf6..d912b7ee60 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -517,10 +517,10 @@ Release candidate O release candidate (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode contribuir para assegurar-la. Registe-se para testar na Play Store ou procurar manualmente na seção \"versões\" na F-Droid. Contribuir ativamente - Participe de uma conversa no IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Ajude outros no <a href=\"%1$s\">forum</a> - <a href=\"%1$s\">Traduza&Isso;/a> the app - Contribuir como desenvolvedor, veja <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para detalhes + Participe de uma conversa no IRC: <a href="%1$s">#nextcloud-mobile</a> + Ajude outros no <a href="%1$s">forum</a> + <a href="%1$s">Traduza</a> the app + Contribuir como desenvolvedor, veja <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> para detalhes Mover para… Copiar para… Escolha a pasta… diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index d503b151cc..75efdee9c1 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -518,10 +518,10 @@ Кандидат в релизы Релиз-кандидат (RC) - это текущее состояние готовящегося выпуска, и, ожидается, что он будет стабильным. Проверка с вашими индивидуальными настройками может помочь убедится в этом. Зарегистрируйтесь для тестирования в Google Play или используйте раздел \"версии\" в каталоге приложений F-Droid. Активное участие - Присоединиться к IRC-чату: <a href=\"%1$s\">#nextcloud-mobile</a> - Помогите другим на нашем <a href=\"%1$s\">форуме</a> - <a href=\"%1$s\">Перевести</a> приложение - Участвовать в качестве разработчика: подробности по ссылке <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>. + Присоединиться к IRC-чату: <a href="%1$s">#nextcloud-mobile</a> + Помогите другим на нашем <a href="%1$s">форуме</a> + <a href="%1$s">Перевести</a> приложение + Участвовать в качестве разработчика: подробности по ссылке <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a>. Переместить в… Копировать в… Выберите каталог … diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 5a4d4aabd0..d9320b163c 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -514,6 +514,8 @@ ose Lëshimi i kandidatit (RC) është një fragment i lëshimit të ardhshme dhe pritet të jetë i qëndrueshëm. Testimi i setup-it tuaj individuale mund të ndihmojë për ta siguruar këtë. Regjistrohuni për testimin në Play Store ose manualisht shikoni në seksionin \"versionet\" në F-Droid. Kontribim aktiv Bashkohu në bisedat në IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Ndihmo të tjerët në <a href="%1$s">forum</a> + <a href=\"%1$s">Translate</a> aplikacioni Kontriboni si një zhvillues, shih<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> për detaje Levizni tek… Kopjojeni tek… diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 8995214cb5..a4bf1c1443 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -516,6 +516,8 @@ Release candidate (RC) är en snapshot av den kommande versionen och den förväntas vara stabil. Att du testar din individuella setup skulle kunna hjälpa till att säkerställa detta. Registrera dig på Play Store, eller kolla \"versioner\" manuellt på F-droid. Bidra aktivt Delta i chatten på IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Hjälp andra på <a href="%1$s">forumet</a> + <a href="%1$s">Översätt</a> appen Bidra som en utvecklare, se <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> för ytterligare detaljer Fllytta till… Kopiera till… diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 2fac81430b..7e2a03ea61 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -511,6 +511,8 @@ ya da Yayın adayı (Release Candidate, RC) yayınlanacak sürümün bir kopyasıdır ve kararlı olması beklenir. Kişisel olarak kullanmanız kararlı olduğundan emin olmamızı sağlar. Denemek için Play Store üzerinden kayıt olun ya da el ile F-Droid üzerindeki \"sürümlere\" bakın. Etkin Katkıda Bulunun IRC sohbetine katılın: <a href=\"%1$s\">#nextcloud-mobile</a> + <a href="%1$s">forum</a> üzerinde başkalarına yardımcı olun + Uygulamayı <a href="%1$s">çevirin</a> Yazılımcı olarak katkıda bulunun! Ayrıntılı bilgi almak için <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">KATKIDA BULUNMA</a> sayfasına bakın Taşı… Kopyala… diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 1ec1900faf..b5360f8489 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -515,10 +515,10 @@ 发行候选版本 候选发行版(RC)是下一个版本的快照,希望它是稳定的,你可以帮助测试以确认这一点。可以注册登陆在应用商店或手工在F-Droid的版本部分查找,并进行测试。 活跃的候选版 - 在IRC上加入这个会话: <a href=\"%1$s\">#nextcloud-mobile</a> - 帮助他人在 <a href=\"%1$s\">论坛</a> - <a href=\"%1$s\">翻译e&;/a> 应用程序 - 做为有贡献的开发者,可以看<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>的细节 + 在IRC上加入这个会话: <a href="%1$s">#nextcloud-mobile</a> + 帮助他人在 <a href="%1$s">论坛</a> + <a href="%1$s">翻译</a> 应用程序 + 做为有贡献的开发者,可以看<a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a>的细节 转移到… 复制到 选择文件夹… From 4c82c4220926cab80a0b724564f5ba3fbf50be88 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 1 Feb 2017 11:30:43 +0000 Subject: [PATCH 040/881] [tx-robot] updated from transifex --- res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index a143175d3a..2ce5b3b4d7 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -519,7 +519,7 @@ ou Contribuer activement Rejoingez la discussion sur IRC: <a href=\"%1$s\">#nextcloud-mobile</a> Aidez les autres sur le <a href="%1$s">forum</a> - <a href="%1$s">Traduisez</a> l'application + <a href=\"%1$s\">Traduisez</a> l\\\'application Développeurs ? Contribuez ! Plus de détails sur la page <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> Déplacer vers… Copier vers… From eaaa5dbcd8d2b4ed7e91083af042041a9c1225c8 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 1 Feb 2017 17:23:43 +0000 Subject: [PATCH 041/881] [tx-robot] updated from transifex --- res/values-pl/strings.xml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 17c0c50a86..e1cc2711c3 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -33,7 +33,7 @@ Wysyłaj od razu zdjęcia zrobione aparatem Natychmiastowa wysyłka wideo Wysyłaj od razu filmy nakręcone aparatem - Włącz historię logowania + Włącz logowanie To jest używane do logowania problemów Historia logowania To pokazuje zapisane logi @@ -45,13 +45,13 @@ Synchronizacja kontaktów i kalendarza została skonfigurowana Pomoc Poleć znajomemu - Wsparcie + Opinie Stopka - Zapamiętaj położenie udostępnienia + Zapamiętaj lokalizację udostępnienia Zapamiętaj ostatnią lokalizację wgrywania - Wypróbuj %1$s na swoim smartphonie! - Chciałbym zaprosić Cię do używania %1$s na swoim smartfonie!\nŚciągnij tutaj: %2$s + Wypróbuj %1$s na swoim smartfonie! + Zapraszam do użycia %1$s na swoim smartfonie!\\nŚciągnij tutaj: %2$s Sprawdź serwer Adres serwera https://... @@ -61,18 +61,18 @@ Pliki Połącz Wyślij - Wybierz folder do wgrywania plików + Wybierz folder do przesyłania plików Nie znaleziono konta - Brak kont %1$s na Twoim urządzeniu. Załóż konto. + Brak %1$s kont na Twoim urządzeniu. Załóż konto. Ustawienia Wyjdź Brak plików do przesłania - %1$s: Nie można przesłać części tekstu jako pliku. - Odebrane dane nie zawierają jakiegokolwiek prawidłowego pliku. + %1$s nie można przesłać części tekstu jako pliku. + Odebrane dane nie zawierają prawidłowego pliku. Plik nie może być przesłany - %1$s jest nieautoryzowany do odczytu odebranego pliku - Plik do wysłania nie został znaleziony w swojej własnej lokalizacji. Proszę sprawdzić, czy w ogóle istnieje. - Wystąpił błąd podczas kopiowania pliku do folderu tymczasowego. Proszę spróbować go przesłać ponownie. + %1$s nie jest autoryzowany do odczytu odebranego pliku + Plik do wysłania nie został znaleziony w swojej lokalizacji. Proszę sprawdzić czy w ogóle istnieje. + Wystąpił błąd podczas kopiowania pliku do folderu tymczasowego. Proszę spróbować przesłać go ponownie. Opcja wysłania: Przenieś plik do folderu Nextcloud Zachowaj plik w katalogu źródłowym @@ -201,7 +201,7 @@ Błąd zabezpieczeń podczas próby odtworzenia %1$s Błąd wprowadzania podczas próby odtworzenia %1$s Nieoczekiwany błąd podczas próby odtworzenia %1$s - Przycisk przewijania + Przycisk przewijania do tyłu Przycisk odtwarzania / pauzowania Przycisk przewijania do przodu @@ -220,7 +220,7 @@ Serwer zbyt długo nie odpowiadał Nieprawidłowy format adresu serwera Inicjowanie SSL nie powiodło się - Nie można zweryfikować tożsamości SSl serwera + Nie można zweryfikować tożsamości SSL serwera Nie rozpoznano wersji serwera Nie można ustanowić połączenia Nawiązano bezpieczne połączenie @@ -534,6 +534,7 @@ lub %d zaznaczony %d zaznaczone + %d zaznaczonych %d zaznaczonych Wprowadź nazwę i typ wysyłanego pliku From 80059c418b818497c234156b3825377bddc3a793 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Fri, 3 Feb 2017 01:17:53 +0000 Subject: [PATCH 042/881] [tx-robot] updated from transifex --- res/values-ca/strings.xml | 2 ++ res/values-lv/strings.xml | 18 ++++++++++++++++-- res/values-ru/strings.xml | 3 ++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 0a421e1d51..0412a05028 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -57,6 +57,7 @@ Adreça del servidor https://… Nom d\'usuari Contrasenya + No tens un servidor, encara? \\nClica aquí per conseguir-ne un d\\\'un proveïdor Fitxers Connecta Puja @@ -514,6 +515,7 @@ o La versió candidata (RC) és una instantània de la versió següent i se suposa que és estable. Provar la vostra configuració individual pot ajudar a garantir-ho. Registreu-vos a Play Store per fer les proves o bé mireu la secció \"versions\" a F-Droid. Contribuïu activament Uniu-vos al xat a IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Ajuda a altres a <a href=\"%1$s\">forum</a> Contribuïu com a desenvolupador, mireu <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> per detalls Mou a… Copia a… diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 2cb65f80ed..fdb6477bf4 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -43,7 +43,10 @@ Ieteikt draugam Atsauksmes Importēt - Izmēģini %1$s uz savu viedtālruni! + Atcerētis koplietošanas atrašanās vietu + Atcerētis pēdējo koplietošanas augšupielādes atrašanās vietu + + Izmēģini %1$s uz savu viedtālruni! Aicinu tevi izmantot %1$s tavā ierīcē!\nLejupielādē šeit: %2$s Pārbaudīt serveri @@ -171,8 +174,17 @@ Kods noņemts Kods saglabāts + %1$s mūzikas atskaņotājs + %1$s (atskaņot) + %1$s (ielādēt) + %1$s atskaņošana pabeigta Nav atrasts neviens multivides fails - Mēģina pieteikties … + Media failu nevar nolasīt + Mēģinot atskaņot taimauts + Atskaņot vai pauzēt + Patīšanas poga + + Mēģina pieteikties … Nav tīkla savienojumu Nav pieejams drošs savienojums. Savienojums ir izveidots @@ -393,6 +405,7 @@ dzēsts Krātuves vieta Dalīšanās + Koplietots %1$s Koplietot ar lietotājiem vai grupām Pievienot lietotāju vai grupu Koplietot saiti @@ -443,6 +456,7 @@ Uzziniet vairāk Automātiska augšupielāde Palīdziet mums testēšanā + Ziņojiet par problēmu Github Testēt Beta versiju <a href="%1$s">Tūlkot</a> programmu Pārvietot uz… diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 75efdee9c1..6df168e6ed 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -58,7 +58,8 @@ Адрес сервера https://... Имя пользователя Пароль - Еще нет сервера?\nЩёлкните здесь что бы получить от провайдера + Ещё нет сервера? +Щёлкните здесь что бы получить от провайдера Файлы Подключиться Загрузить From 61d578ecc43d8b40f3a0e9159e79c98a4f36f987 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Fri, 3 Feb 2017 18:55:43 +0000 Subject: [PATCH 043/881] [tx-robot] updated from transifex --- res/values-ro/strings.xml | 229 ++++++++++++++++++++++++++++++++++---- 1 file changed, 207 insertions(+), 22 deletions(-) diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 0bf7a3bb74..6ce8633581 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -1,9 +1,8 @@ - %1$s aplicație Android versiunea %1$s - Refresh cont + Reîmprospătare cont Încarcă Conținut de la alte aplicații Fișiere @@ -14,20 +13,22 @@ Expediază Sortare Sortare după - - A-Z - Nou - Vechi - + A - Z + Noi - Vechi + Mari - Mici Toate fișierele + Pe dispozitiv Setări Încărcări - Închide + %1$s din %2$s folosiți + Închide Deschide General Mai mult Conturi Administrare conturi Parolă blocare + Arată fișierele ascunse Încărcare instantă de imagini Încarcă instantant imagini luate cu camera Încărcare instantă de videoclipuri. @@ -37,6 +38,11 @@ Istoric activități jurnalizate Asta arată înregistrările salvate Șterge istoricul + Sincronizați calendarul și contactele + Reglează DAVdroid (v1.3.0+) pentru acest cont + Adresa de server a contului nu a putut fi soluționată pentru DAVdroid + Aplicațiile Google Play sau F-Droid nu sunt instalate + Sincronizarea calendarului și a contactelor a fost configurată cu succes Ajutor Recomandați unui prieten Feedback @@ -51,24 +57,34 @@ Adresa serverului https://... Nume utilizator Parolă - Nou la %1$s? + Nu dețineți un server?\\nClick aici pentru a obține unul de la un furnizor Fișiere Conectare Încărcare + Alege dosarul pentru încărcare Nici un cont găsit Nu există conturi %1$s pe dispozitivul tău. Te rugăm să configurezi unul mai întâi. Configurare Renunță Niciun fișier disponibil pentru încărcare %1$s nu poate încărca o bucată de text ca un fișier. - Datele primite nu includ vreun fișier valid. + Datele primite nu includ un fișier valid Fișierul nu poate fi încărcat %1$s nu are permisiunea de a citi un fișier primit Fișierul de încărcat nu a fost găsit în locația sa. Vă rugăm verificați dacă fișierul există. + A apărut o eroare în timpul copierii fișierului intr-un dosar temporar. Vă rugăm reîncercați să trimiteți. + Opțiune pentru încărcare: + Mutați fișierul în dosarul Nextcloud + Păstrați fișierul in dosarul sursă + Ștergeți fișierul din dosarul sursă secunde în urmă - Nimic aici. Încarcă ceva! + Nu există fișiere + Încărcați conținut sau sincronizați-vă dispozitivele! Se încarcă... + Nici o aplicație găsită pentru acest tip de fișier! În acest folder nu sunt fișiere. + Nu există încărcări disponibile + Încărcați conținut sau activați încărcarea instantă! director directoare fișier @@ -81,6 +97,7 @@ Descarcă Sincronizează Fișierul a fost redenumit %1$s în timpul încărcării + Aranjare în listă Partajează Da Nu @@ -90,10 +107,13 @@ Anuleaza sincronizarea Anulează Înapoi + Salveaza + Salvează și ieși Eroare Se încarcă... necunoscut Eroare necunoscută + În așteptare Despre Schimbă parola Sterge contul @@ -109,6 +129,7 @@ Incarcarea a eșuat, trebuie să te autentifici din nou Încărcări Curent + Eșuat (apasă pentru reîncercare) Încărcat Terminat Anulat @@ -135,7 +156,7 @@ Descarcarea a eșuat, trebuie să te autentifici din nou Alege cont sincronozare esuata - Sincronizarea a eșuat, trebuie să te autentifici din nou + Sincronizarea a eșuat; trebuie să te autentifici din nou sincronizarea lui %1$s nu a putut fi facuta complet Parolă greșită pentru %1$s S-au gasit conflicte @@ -151,8 +172,12 @@ Unele fișiere nu au putut fi mutate Local: %1$s La distanță: %1$s + Nu există spațiu suficient pentru a copia fișierele selectate în %1$s dosar. Doriți să le mutați? + Vă rugăm introduceți parola + Introdu parola Parola va fi solicitată de fiecare dată când deschideți aplicația + Vă rugăm reintroduceți parola Șterge parola Parolele nu se potrivesc Parolă incorectă @@ -179,6 +204,8 @@ Buton de play sau pauză Butonul pentru repede înainte + Se obține autorizația … + Se încearcă autentificarea … Nu exista conexiune Conexiune securizată indisponibilă Conexiune stabilită @@ -190,6 +217,7 @@ Nu a putut gasi host-ul Instanța serverului nu a fost găsită Server-ului i-a luat prea mult timp sa raspunda + Formatul adresei de server este greșit Inițializarea SSL a eșuat Nu s-a putut verifica identitatea serverului SSL Versiune necunoscuta a serverului @@ -198,15 +226,22 @@ Nume de utilizator sau parolă greșită Autorizare nereușită Acces refuzat de serverul de autorizare + Situație neașteptată; vă rugăm să reintroduceți adresa serverului Autorizarea dvs. a expirat. Vă rugăm să autorizați din nou. + Va rugăm să introduceți parola actuală Sesiunea a expirat .Va rugam conectati-va din nou + Se conecteaza la serverul de autentificare ... Serverul nu soporta aceasta metoda de autentificare %1$s nu suporta conturi multiple Server-ul dvs. nu întoarce un ID de utilizator corect, vă rugăm să contactați un administrator - Contul nu există încă în dispozitiv + Nu se poate autentifica la acest server + Contul nu există încă în dispozitiv + Selectează ca disponibil offline + Deselectează ca disponibil offline Redenumește Elimină + Doriți să ștergeți %1$s? Sigur vrei să elimini %1$s și conținutul său? Doar local Eliminat cu succes @@ -221,7 +256,8 @@ Numele fișierului conține măcar un caracter invalid Numele fișierului nu poate fi gol. Așteaptă un moment - Problema neasteptata ; selectati fisierul dintr-o aplicatie diferita + Se verifică datele de autentificare stocate + Problemă neașteptată; vă rugăm să selectați fișierul dintr-o aplicație diferită Nu a fost selectat nici un fișier Trimite link la ... Copiere fișier din stocare privată @@ -251,6 +287,8 @@ Catre: Semnatura: Algoritm: + Amprentă: + Există o problemă la încărcarea certificatului. Certificatul nu a putut fi aratat. - Nu exista nici o informaţie pentru aceasta eroare @@ -261,6 +299,11 @@ 2012/05/18 12:23 PM 12:23:45 + Încărcare doar prin wifi + Încarcă imaginile doar prin wifi + Încarcă înregistrările video doar prin wifi + Încarcă doar în timpul alimentării cu curent + Încarcă doar în timpul alimentării cu curent /Încărcare instantă Conflict de fișiere Care fișiere doriți să păstrați? Dacă selectați „ambele”, fișierului local i se va adăuga un număr numelui său. @@ -272,11 +315,19 @@ Aceasta imagine nu poate fi arătată %1$s nu a putut fi copiat in dosarul local %2$s - Ne pare rău, partajarea nu este activată pe server. Vă rugăm să contactați administratorul dvs. + Dosar pentru încărcare instantă + Dosar local + Dosar la distanță + Folosește subdosare + Stocați in subdosar bazat pe an și lună + + Ne pare rău, partajarea nu este activată pe server. Vă rugăm să contactați administratorul dvs. Imposibil de partajat. Te rugăm să verifici dacă există fișierul. A apărut o eroare în timp ce încerca să partajeze acest fișier sau folder Imposibil de șters partajarea. Te rugăm să verifici dacă există fișierul. A apărut o eroare în timp ce încerca să departajeze sau unshare acest fișier sau folder + Actualizare nereușită. Vă rugăm să verificați existența fișierului + Eroare aparută în timpul actualizării partajării Introduceţi parola Trebuie să introduci o parolă @@ -284,15 +335,16 @@ Link copiat Copiat în clipboard + Nici un text disponibil pentru copiere + Eroare neașteptată în timpul copierii + Text copiat din %1$s + Eroare critică: nu se pot executa operațiunile A apărut o eroare în timp ce se conecta la server - A apărut o eroare în timp ce se aștepta pentru server, operațiunea nu s-a executat - A apărut o eroare în timp ce se aștepta pentru server, operațiunea nu s-a executat - Operațiunea nu a putut fi finalizată, serverul este indisponibil - - - Nu aveți permisiune %s + A apărut o eroare în timp ce se aștepta pentru server; operațiunea nu s-a executat + A apărut o eroare în timp ce se aștepta pentru server; operațiunea nu s-a executat + Operațiunea nu a putut fi finalizată; serverul este indisponibil pentru a redenumi acest fișier pentru a șterge acest fișier de a share acest fișier @@ -301,13 +353,43 @@ pentru a încărca în acest folder Fișierul nu mai este disponibil pe server + Se actualizează calea către mediul de stocare + Finalizare + Se pregătește migrarea… + Se verifică destinația… + Se salvează configurația contului… + Se așteaptă finalizarea sincronizării… + Se mută datele… + Indexul se actualizează… + Curățare… + Se restabilește configurația contului… + Finalizat + EROARE: Spațiu insuficient + EROARE: Fișierul nu poate fi editat + EROARE: Fișierul nu poate fi citit + EROARE: Dosarul Nextcloud există deja + EROARE: În timpul migrării + EROARE: În timpul actualizării indexului + + Dosarul există deja, ce să fac? + Suprascriere + Utilizează-le pe cele existente + Conturi Adaugă cont - Înregistrări + Administrare conturi + Conexiunea securizată este redirecționată printr-o rută nesecurizată. + + Înregistrări + Trimite istoricul + Nu s-a găsit nicio aplicație capabilă să trimită înregistrări. Vă rugăm să instalați o aplicație pentru mail. %1$s înregistrările app-ului Android + Se încarcă … + Autentificare necesară Parolă greșită Mutare + Copiază Nu este nimic aici. Poți adăuga un director! Alege @@ -318,9 +400,18 @@ pentru a muta acest fișier + Nu se poate copia. Vă rugăm să verificați dacă există fișierul + Nu se poate copia un dosar intr-un descendent Fișierul există deja în dosarul de destinație + A apărut o eroare în timpul copierii fișierului sau dosarului + să copiați acest fișier + + Încărcări instantanee Detalii + Dosar pentru încărcări instant de video + Sincronizarea dosarului %1$s nu a putut fi finalizată + partajat cu tine @@ -341,17 +432,111 @@ %1$d fișiere %1$d fișiere, 1 folder %1$d fișiere, %2$d foldere + Fișierul original va fi… + Fișierul original va fi… + Copiază fișierul + Mută fișierul + Selectează tot + + păstrate in dosarul original + mutate în dosarul aplicației + șterge + Calea către spațiul de depozitare Partajare + Partajare %1$s + Partajează cu utilizatori și grupuri + Nu există informatii partajate cu utilizatori + Adaugă utilizator sau grup Partajază legătură Specifică data expirării Protejare cu parolă + Securizat Permite editarea + Ascunde listarea fișierelor + Obține adresa + Partajează cu… + Partajează cu %1$s + Căutare + Caută utilizatori și grupuri + %1$s (grup) + %1$s (remote) + %1$s (email) + %1$s ( la %2$s ) + + Ne cerem scuze, serverul tău nu permite partajarea cu utilizatori care sunt parte a clienților. +\\nVă rugăm contactați admninistratorul dumneavoastră se poate partaja se poate edita creare modifică ștergere Oprește partajarea - + finalizat + + Reîncercare eșuată + Eliminare eșuată + Eliminare reușită + Eliminare completă finalizată + + Afișare în grilă + Afișare în listă + + Administrare spațiu + Setările, bazele de date și certificatele serverului ale %1$s vor fi șterse permanent. \\n\\nFișierele descărcate vor fi păstrate intacte.\\n\\nAcest proces poate dura mai mult timp. + Elimină datele + Unele fișiere nu au putut fi șterse. + + Sunt necesare drepturi adiționale pentru a încărca & descărca fișiere. + Fișierul nu a fost găsit în sistemul local + Doriți să ștergeți elementele selectate? + Doriți să ștergeți elementele selectate și conținutul lor? + Se așteaptă încărcarea dispozitivului + Caută + Aceasta este o funcționalitate Nextcloud, vă rugăm să actulizați aplicația. + Află mai mult + Încărcare automată + Participă + Ajută-ne să testăm + Ai găsit un bug? Se intamplă ceva ciudat? + Raportează o problemă pe Github + Vrei să ne ajuți în testarea următoarei versiuni? + Testează versiunea Beta + Aceasta include toate funcționalitățile viitoare și este foarte avansată. Dacă apar +buguri/erori vă rugăm să ni le raportați. +<br/><a href=\"%2$s\">Descarcă APK</a> +sau + Candidatul pentru lansare + Alătură-te chat-ului pe IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + <a href=\"%1$s\">să Traducă</a> aplicația + Mută în… + Copiază în… + Alege dosar… + Încărcare dosare… + Nu au fost găsite dosare media. + Preferințe pentru încărcare automată + Setări + Funcționalitatea de încărcare automată a fost refăcută complet. Vă rugăm să accesați meniul principal și să refaceți setările de încărcare automată. Ne cerem scuze pentru inconveniență.\\n\\nBucură-te de noile capabilități extinse ale funcției de încărcare automată! + Pentru %1$s + Numele fișierului + Tipul fișierului + Implicit + Card SD %1$d + Necunoscut + + + Ce este nou în Nextcloud + + + O casă sigură pentru toate datele tale + Accesează, partajează & protejează fișierele tale de acasă și din compania ta + + Conturi multiple + Conectează-te la toate cloud-urile tale + + Încărcare instantă + Păstrează-ți fotografiile în siguranță + + Sari peste + From 1164fd1f40acdc822617d21201a94b2b37bb4b97 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sat, 4 Feb 2017 01:18:40 +0000 Subject: [PATCH 044/881] [tx-robot] updated from transifex --- res/values-pl/strings.xml | 4 ++++ res/values-ro/strings.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e1cc2711c3..48a92c41c8 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -540,6 +540,10 @@ lub Wprowadź nazwę i typ wysyłanego pliku Nazwa pliku Typ pliku + Wstawka tekstowa file(.txt) + Skrót internetowy file(%s) + Google Maps skrót file(%s) + Domyślny karta SD %1$d Nieznany diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 6ce8633581..dba74e9d58 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -475,7 +475,7 @@ Oprește partajarea finalizat - Reîncercare eșuată + Reîncearcă încărcarea Eliminare eșuată Eliminare reușită Eliminare completă finalizată From a121e70090be898bb820de7637f51023e0e4fff8 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 5 Feb 2017 01:17:30 +0000 Subject: [PATCH 045/881] [tx-robot] updated from transifex --- res/values-it/strings.xml | 1 + res/values-ro/strings.xml | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index a4b9b33846..1473718dd5 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -57,6 +57,7 @@ Indirizzo server https://... Nome utente Password + Non hai ancora un server?\\nFai clic qui per ottenerne uno da un fornitore. File Connetti Carica diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index dba74e9d58..4462e365db 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -7,7 +7,7 @@ Conținut de la alte aplicații Fișiere Deschideţi cu - Un nou dosar + Dosar nou Setări Detalii Expediază @@ -39,7 +39,7 @@ Asta arată înregistrările salvate Șterge istoricul Sincronizați calendarul și contactele - Reglează DAVdroid (v1.3.0+) pentru acest cont + Setează DAVdroid (v1.3.0+) pentru acest cont Adresa de server a contului nu a putut fi soluționată pentru DAVdroid Aplicațiile Google Play sau F-Droid nu sunt instalate Sincronizarea calendarului și a contactelor a fost configurată cu succes @@ -107,8 +107,8 @@ Anuleaza sincronizarea Anulează Înapoi - Salveaza - Salvează și ieși + Salvează + Salvează & ieși Eroare Se încarcă... necunoscut @@ -287,6 +287,7 @@ Catre: Semnatura: Algoritm: + Algoritmul \'digest\' nu este disponibil pe telefonul tău. Amprentă: Există o problemă la încărcarea certificatului. Certificatul nu a putut fi aratat. @@ -349,6 +350,7 @@ pentru a șterge acest fișier de a share acest fișier de a nu permite accesul la acest fisier + sa actualizezi această partajare pentru a crea fisierul pentru a încărca în acest folder Fișierul nu mai este disponibil pe server @@ -442,6 +444,8 @@ mutate în dosarul aplicației șterge Calea către spațiul de depozitare + General + Partajare Partajare %1$s Partajează cu utilizatori și grupuri @@ -508,8 +512,12 @@ buguri/erori vă rugăm să ni le raportați. <br/><a href=\"%2$s\">Descarcă APK</a> sau Candidatul pentru lansare + Versiunea-candidat (RC - release candidate) pentru lansare este o copie a următoarei versiuni de \'release\' și ar trebui să fie stabilă. Testarea pe sistemul tău ne-ar putea ajuta să ne asigurăm de acest lucru. Înregistrează-te ca tester pe Play Store sau navighează în secțiunea \"versions\" din F-droid. + Contribuie în mod activ Alătură-te chat-ului pe IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - <a href=\"%1$s\">să Traducă</a> aplicația + Ajută-i pe alții pe forum + <a href=\"%1$s\">Tradu</a> aplicația + Contribuie ca și dezvoltator, uită-te în <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> for details Mută în… Copiază în… Alege dosar… From 7d8ee95467e0b77827d35609df0621a8570c1f20 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 5 Feb 2017 15:15:47 +0000 Subject: [PATCH 046/881] [tx-robot] updated from transifex --- res/values-ja-rJP/strings.xml | 8 +++++++- res/values-ro/strings.xml | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index ec146813ca..9570335b9d 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -58,6 +58,7 @@ サーバーアドレス https://… ユーザー名 パスワード + まだサーバーがありませんか?\\nここをクリックして、プロバイダーから取得してください ファイル 接続 アップロード @@ -79,10 +80,12 @@ ファイルをソースフォルダから削除する 数秒前 ファイルがありません。 + 何かコンテンツをアップロードするか、デバイスからファイルを同期してください! 読込中… ファイルタイプ に対応するアプリはありません! このフォルダーにはファイルがありません。 アップロードは利用できません + 何かコンテンツをアップロードするか、自動アップロードを有効にしてください! フォルダー フォルダー ファイル @@ -300,6 +303,7 @@ 2012/05/18 12:23 PM 12:23:45 + WiFi経由でのみアップロード WiFi経由でのみ画像をアップロード WiFi経由でのみ動画をアップロード 充電中のみアップロード @@ -316,6 +320,7 @@ %1$s は、ローカルフォルダー %2$s にコピーできませんでした。 自動アップロードフォルダー + ローカルフォルダー リモートフォルダー サブフォルダーを利用 年と月を元にしたサブフォルダーに保存 @@ -396,7 +401,8 @@ 自動アップロード 詳細 - %1$s フォルダーの同期が完了しませんでした。 + 自動アップロード動画フォルダー + %1$s フォルダーの同期が完了しませんでした。 共有中 あなたと diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 4462e365db..04e6715b70 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -515,7 +515,7 @@ sau Versiunea-candidat (RC - release candidate) pentru lansare este o copie a următoarei versiuni de \'release\' și ar trebui să fie stabilă. Testarea pe sistemul tău ne-ar putea ajuta să ne asigurăm de acest lucru. Înregistrează-te ca tester pe Play Store sau navighează în secțiunea \"versions\" din F-droid. Contribuie în mod activ Alătură-te chat-ului pe IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Ajută-i pe alții pe forum + Ajută-i pe alții pe <a href=\"%1$s\">forum</a> <a href=\"%1$s\">Tradu</a> aplicația Contribuie ca și dezvoltator, uită-te în <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> for details Mută în… From ef1a56f844df6f94cc74b22ee84973fb46a3513b Mon Sep 17 00:00:00 2001 From: justin-sleep Date: Wed, 23 Nov 2016 16:40:14 -0600 Subject: [PATCH 047/881] Fix DavDroid integration (append necessary addition to mURI) --- src/com/owncloud/android/ui/activity/Preferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index 2bb5813cf6..976938a694 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -476,7 +476,7 @@ public class Preferences extends PreferenceActivity if (getPackageManager().resolveActivity(davDroidLoginIntent, 0) != null) { // arguments if (mUri != null) { - davDroidLoginIntent.putExtra("url", mUri.toString()); + davDroidLoginIntent.putExtra("url", mUri.toString() + "/remote.php/dav"); } davDroidLoginIntent.putExtra("username", AccountUtils.getAccountUsername(account.name)); //loginIntent.putExtra("password", "..."); From 66b6436d2b6f48783dd7931c6fd1c20b0c81fbce Mon Sep 17 00:00:00 2001 From: justin-sleep Date: Thu, 24 Nov 2016 22:48:24 -0600 Subject: [PATCH 048/881] Use proper API to get WebDAV path for DAVdroid URI correction --- src/com/owncloud/android/ui/activity/Preferences.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index 976938a694..1c6f808471 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -476,7 +476,9 @@ public class Preferences extends PreferenceActivity if (getPackageManager().resolveActivity(davDroidLoginIntent, 0) != null) { // arguments if (mUri != null) { - davDroidLoginIntent.putExtra("url", mUri.toString() + "/remote.php/dav"); + davDroidLoginIntent.putExtra("url", mUri.toString() + + AccountUtils.getWebdavPath(AccountUtils.getServerVersion(account), MainApp.getAuthTokenType()) + ); } davDroidLoginIntent.putExtra("username", AccountUtils.getAccountUsername(account.name)); //loginIntent.putExtra("password", "..."); From b5ca2cdc9008937f1ef72cc79195584fa3a95637 Mon Sep 17 00:00:00 2001 From: justin-sleep Date: Sat, 26 Nov 2016 01:53:18 -0600 Subject: [PATCH 049/881] Set DAV path in AccountUtils and retrieve it when calling DAVdroid --- src/com/owncloud/android/authentication/AccountUtils.java | 1 + src/com/owncloud/android/ui/activity/Preferences.java | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/com/owncloud/android/authentication/AccountUtils.java b/src/com/owncloud/android/authentication/AccountUtils.java index 93f9628cb4..7a3043bd2e 100644 --- a/src/com/owncloud/android/authentication/AccountUtils.java +++ b/src/com/owncloud/android/authentication/AccountUtils.java @@ -40,6 +40,7 @@ public class AccountUtils { private static final String TAG = AccountUtils.class.getSimpleName(); public static final String WEBDAV_PATH_4_0_AND_LATER = "/remote.php/webdav"; + public static final String DAV_PATH = "/remote.php/dav"; private static final String ODAV_PATH = "/remote.php/odav"; private static final String SAML_SSO_PATH = "/remote.php/webdav"; public static final String STATUS_PATH = "/status.php"; diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index 1c6f808471..bda0ca1258 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -476,9 +476,7 @@ public class Preferences extends PreferenceActivity if (getPackageManager().resolveActivity(davDroidLoginIntent, 0) != null) { // arguments if (mUri != null) { - davDroidLoginIntent.putExtra("url", mUri.toString() - + AccountUtils.getWebdavPath(AccountUtils.getServerVersion(account), MainApp.getAuthTokenType()) - ); + davDroidLoginIntent.putExtra("url", mUri.toString() + AccountUtils.DAV_PATH); } davDroidLoginIntent.putExtra("username", AccountUtils.getAccountUsername(account.name)); //loginIntent.putExtra("password", "..."); From ba5dae93b43259945e69d59d22b6560fd69076ab Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 24 Jan 2017 18:00:00 +0100 Subject: [PATCH 050/881] Quick fix to work with new library updates --- build.gradle | 4 ++-- .../authentication/AuthenticatorActivity.java | 8 ++++---- .../android/operations/GetUserProfileOperation.java | 4 ++-- .../owncloud/android/ui/activity/DrawerActivity.java | 12 +++++++----- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index 8d8836c686..b619ee92a4 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:2.2.3' } } @@ -41,7 +41,7 @@ dependencies { /// dependencies for app building compile name: 'touch-image-view' - compile 'com.github.nextcloud:android-library:1.0.10' + compile 'com.github.nextcloud:android-library:change-userinfo-calls-SNAPSHOT' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' diff --git a/src/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/com/owncloud/android/authentication/AuthenticatorActivity.java index 8de275802f..d421b52635 100644 --- a/src/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -68,6 +68,7 @@ import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.OwnCloudCredentials; import com.owncloud.android.lib.common.OwnCloudCredentialsFactory; +import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.accounts.AccountTypeUtils; import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; import com.owncloud.android.lib.common.accounts.AccountUtils.Constants; @@ -79,7 +80,6 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCo import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation; -import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation.UserInfo; import com.owncloud.android.operations.DetectAuthenticationMethodOperation.AuthenticationMethod; import com.owncloud.android.operations.GetServerInfoOperation; import com.owncloud.android.operations.OAuth2GetAccessToken; @@ -1086,8 +1086,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity if (result.isSuccess()) { boolean success = false; String username; - if (result.getData().get(0) instanceof GetRemoteUserInfoOperation.UserInfo) { - username = ((GetRemoteUserInfoOperation.UserInfo) result.getData().get(0)).mDisplayName; + if (result.getData().get(0) instanceof UserInfo) { + username = ((UserInfo) result.getData().get(0)).getDisplayName(); } else { username = (String) result.getData().get(0); } @@ -1648,7 +1648,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity try { UserInfo userInfo = (UserInfo) authResult.getData().get(0); mAccountMgr.setUserData( - mAccount, Constants.KEY_DISPLAY_NAME, userInfo.mDisplayName + mAccount, Constants.KEY_DISPLAY_NAME, userInfo.getDisplayName() ); } catch (ClassCastException c) { Log_OC.w(TAG, "Couldn't get display name for " + username); diff --git a/src/com/owncloud/android/operations/GetUserProfileOperation.java b/src/com/owncloud/android/operations/GetUserProfileOperation.java index e1a55569d8..9bdcd75ace 100644 --- a/src/com/owncloud/android/operations/GetUserProfileOperation.java +++ b/src/com/owncloud/android/operations/GetUserProfileOperation.java @@ -24,10 +24,10 @@ import android.accounts.AccountManager; import com.owncloud.android.MainApp; import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation; -import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation.UserInfo; import com.owncloud.android.operations.common.SyncOperation; /** @@ -63,7 +63,7 @@ public class GetUserProfileOperation extends SyncOperation { accountManager.setUserData( storedAccount, AccountUtils.Constants.KEY_DISPLAY_NAME, - userInfo.mDisplayName + userInfo.getDisplayName() ); } return result; diff --git a/src/com/owncloud/android/ui/activity/DrawerActivity.java b/src/com/owncloud/android/ui/activity/DrawerActivity.java index c580fe6da9..7bbbbc6b5d 100644 --- a/src/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/com/owncloud/android/ui/activity/DrawerActivity.java @@ -48,10 +48,12 @@ import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.Quota; +import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.users.RemoteGetUserQuotaOperation; +import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation; import com.owncloud.android.ui.TextDrawable; import com.owncloud.android.utils.DisplayUtils; @@ -620,13 +622,13 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU Thread t = new Thread(new Runnable() { public void run() { - RemoteOperation getQuotaInfoOperation = new RemoteGetUserQuotaOperation(); + RemoteOperation getQuotaInfoOperation = new GetRemoteUserInfoOperation(); RemoteOperationResult result = getQuotaInfoOperation.execute( AccountUtils.getCurrentOwnCloudAccount(DrawerActivity.this), DrawerActivity.this); if (result.isSuccess() && result.getData() != null) { - final RemoteGetUserQuotaOperation.Quota quota = - (RemoteGetUserQuotaOperation.Quota) result.getData().get(0); + final UserInfo userInfo = (UserInfo) result.getData().get(0); + final Quota quota = userInfo.getQuota(); final long used = quota.getUsed(); final long total = quota.getTotal(); @@ -637,7 +639,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU @Override public void run() { if (quotaValue > 0 - || quotaValue == RemoteGetUserQuotaOperation.QUOTA_LIMIT_INFO_NOT_AVAILABLE) { + || quotaValue == GetRemoteUserInfoOperation.QUOTA_LIMIT_INFO_NOT_AVAILABLE) { /** * show quota in case * it is available and calculated (> 0) or From 75ba8489998fea0d2d836fd281e20f700951bc0f Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 31 Jan 2017 11:51:51 +0100 Subject: [PATCH 051/881] Use master snapshot --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b619ee92a4..a469293dc9 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ dependencies { /// dependencies for app building compile name: 'touch-image-view' - compile 'com.github.nextcloud:android-library:change-userinfo-calls-SNAPSHOT' + compile 'com.github.nextcloud:android-library:-SNAPSHOT' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' From e2a3da33baf50700f363da2b65615d678f4816a1 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Sun, 5 Feb 2017 19:59:19 +0100 Subject: [PATCH 052/881] lib version 1.0.11 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a469293dc9..786ae6e326 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ dependencies { /// dependencies for app building compile name: 'touch-image-view' - compile 'com.github.nextcloud:android-library:-SNAPSHOT' + compile 'com.github.nextcloud:android-library:1.0.11' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' From 0051b66acd686e8faa311014e77d02bf1ca8f39c Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 6 Feb 2017 01:17:08 +0000 Subject: [PATCH 053/881] [tx-robot] updated from transifex --- res/values-ja-rJP/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index 9570335b9d..79e5d78995 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -51,14 +51,14 @@ 最後に共有アップロードした場所を記憶する スマートフォンで %1$s を試してください! - スマートフォンで %1$s を利用してみませんか! + スマートフォンで %1$s を利用してみませんか!\n ここからダウンロードしてください: %2$s サーバーのチェック サーバーアドレス https://… ユーザー名 パスワード - まだサーバーがありませんか?\\nここをクリックして、プロバイダーから取得してください + まだサーバーがありませんか?\nここをクリックして、プロバイダーから取得してください ファイル 接続 アップロード @@ -504,7 +504,7 @@ or メディアフォルダが見つかりませんでした 自動アップロードの設定 設定 - インスタントアップロードは完全に刷新されました。 メインメニューから自動アップロードを再設定してください。 ご迷惑をおかけして申し訳ありません。\\n\\n新しく拡張された自動アップロード機能をお楽しみください! + インスタントアップロードは完全に刷新されました。 メインメニューから自動アップロードを再設定してください。 ご迷惑をおかけして申し訳ありません。\n\n新しく拡張された自動アップロード機能をお楽しみください! %d選択されています。 From 59b280c86de296f8a2baba8ccc0fb9719cbed17b Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 7 Feb 2017 01:20:00 +0000 Subject: [PATCH 054/881] [tx-robot] updated from transifex --- res/values-el/strings.xml | 4 ++++ res/values-ja-rJP/strings.xml | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 548599c75d..580262b1d5 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -28,6 +28,7 @@ Λογαριασμοί Διαχείριση λογαριασμών Κλείδωμα με κωδικό πρόσβασης + Εμφάνιση κρυφών αρχείων Στιγμιαίες μεταφορτώσεις εικόνων Μεταφορτώστε απευθείας φωτογραφίες από την κάμερα Στιγμιαίες μεταφορτώσεις βίντεο @@ -55,6 +56,7 @@ Αρχεία Σύνδεση Μεταφόρτωση + Επιλογή φακέλου μεταφόρτωσης Δεν βρέθηκε λογαριασμός Δεν υπάρχουν λογαριασμοί %1$s στη συσκευή σας. Παρακαλώ ρυθμίστε πρώτα ένα λογαριασμό. Ρύθμιση @@ -67,6 +69,7 @@ Διατήρηση του αρχείου στον πηγαίο φάκελο Διαγραφή αρχείου από τον πηγαίο φάκελο δευτερόλεπτα πριν + Δεν υπάρχουν αρχεία Φόρτωση… Δεν βρέθηκε εφαρμογή για τον τύπο αρχείου! Δεν υπάρχουν αρχεία σε αυτό τον φάκελο. @@ -90,6 +93,7 @@ Ακύρωση συγχρονισμού Άκυρο Επιστροφή + Αποθήκευση Αποθήκευση & έξοδος Σφάλμα Φόρτωση … diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index 79e5d78995..a4d4dcb422 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -360,13 +360,28 @@ フォルダーをアップロード ファイルはサーバー上で利用できません + ストレージの場所を更新中 完了 + 移行の準備中… + 宛先の確認中… + アカウント設定を保存中… + 未完了の同期を待機中… + データの移動中… + インデックスの更新中… + クリーニング中… + アカウント設定を復元中… + 完了 十分な空き容量がありません ファイルが書き込み可能ではありません。 ファイルが読み取り可能ではありません。 Nextcloudのディレクトリはすでに存在します。 + エラー: 移行中 + エラー: インデックスの更新中 + データフォルダはすでに存在します。どうしますか? 上書き + 既存を使用する + アカウント アカウントを追加 アカウント管理 @@ -456,6 +471,7 @@ ユーザーとグループを検索 %1$s (グループ) %1$s (リモート) + %1$s (メール) %1$s ( %2$s で) 申し訳ありませんが、このサーバーのバージョンではこのクライアントアプリ上で他のユーザーと共有することができません。 @@ -487,15 +503,23 @@ 本当に 洗濯したアイテム およびそのコンテンツを削除してもよろしいですか? デバイスの充電を待機中 検索 + これはNextCloudの機能です。更新してください。 もっと見る 自動アップロード + 参加する + テストを手伝ってください + バグがありましたか? なにか問題がありますか? Githubでエラーを報告する + 次のバージョンのテストに興味がありますか? ベータバージョンを試してみる これは、すべての最新の機能が含まれており、非常に最前端です。 バグやエラーが発生する可能性があり、もしそれが起こった場合、私たちに報告してください。lt;br/><a href=\"%2$s\">APKファイルをダウンロードする</a> or リリース候補 リリース候補(RC)は、今後のリリースのスナップショット であり、安定性が期待されます。 個々の設定をテストすることで、これを確実にすることができます。 Playストアでのテストに登録するか、F-Droidの「バージョン」セクションを手動で参照してください。 積極的な貢献 + IRCでチャットに参加してください: <a href=\"%1$s\">#nextcloud-モバイル</a> + <a href=\"%1$s\">フォーラム</a> で他の人を助けてください + アプリを <a href=\"%1$s\">翻訳する</a> 開発者として貢献には、 <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> をご覧ください。 …に移動 …にコピー @@ -505,21 +529,26 @@ or 自動アップロードの設定 設定 インスタントアップロードは完全に刷新されました。 メインメニューから自動アップロードを再設定してください。 ご迷惑をおかけして申し訳ありません。\n\n新しく拡張された自動アップロード機能をお楽しみください! + %1$s の %d選択されています。 アップロードファイル名とファイルタイプを入力 ファイル名 ファイルタイプ + スニペットテキストファイル(.txt) インターネットショートカットファイル(%s) Googleマップショートカットファイル(%s) デフォルト + SD カード %1$d 不明 Nextcloudの新しい点: + + すべてのデータの安全なホーム アクセス、共有&amp; 自宅や企業でファイルを保護する マルチアカウント From 19c61f682781de5570de4b50b932aebb9b65fc55 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Thu, 9 Feb 2017 01:17:41 +0000 Subject: [PATCH 055/881] [tx-robot] updated from transifex --- res/values-de-rDE/strings.xml | 2 +- res/values-pl/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 95b8525a9b..694c525a68 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -12,7 +12,7 @@ Details Senden Sortieren - Sortieren nach + Sortiere nach A - Z Neueste - Älteste Größte - Kleinste diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 48a92c41c8..6e3a2a824f 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -483,7 +483,7 @@ Cofnij udostępnianie zakończono - Wyślij ponownie nieudane + Wysłanie ponowne się nie udało Wyczyść nieudane Wyczyść udane Wyszyczść wszystkie zakończone From 0acc0d8784caeeada13ed804742d6c90b1750825 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sat, 11 Feb 2017 01:18:09 +0000 Subject: [PATCH 056/881] [tx-robot] updated from transifex --- res/values-de-rDE/strings.xml | 4 ++-- res/values-fr/strings.xml | 2 +- res/values-ru/strings.xml | 2 +- res/values-sq/strings.xml | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 694c525a68..875dda6518 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -517,7 +517,7 @@ Aktiv etwas beitragen An Unterhaltungen teilnehmen im IRC: <a href="%1$s">#nextcloud-mobile</a> Helfen Sie anderen im <a href="%1$s">Forum</a> - Die App <a href="%1$s">Übersetzen</a> + Die App <a href=\"%1$s\">übersetzen</a> Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> Verschieben nach… Kopieren nach… @@ -526,7 +526,7 @@ Keine Medienordner gefunden. Auto Upload Einstellungen Einstellungen - Sofortiger Upload wurde vollständig überarbeitet. Bitte über das Hauptmenü zum Auto Upload gehen und neu configurieren. Bitte entschuldigen Sie die Unannehmlichkeiten.\n\nViel Vergnügen mit den neuen und erweiterten Möglichkeiten des Auto Uploads! + Auto-Upload wurde vollständig überarbeitet. Bitte über das Hauptmenü zum Auto-Upload gehen und neu konfigurieren. Bitte entschuldigen Sie die Unannehmlichkeiten.\\n\\nViel Vergnügen mit den neuen und erweiterten Möglichkeiten des Auto-Uploads! Für %1$s %d ausgewählt diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 2ce5b3b4d7..23d7dd05f9 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -386,7 +386,7 @@ Le connexion sécurisée est redirigée vers une route non-sécurisée. Journaux - Envoyer l\'historique + Envoyer le journal Aucune application n\'a été trouvée pour envoyer les journaux. Merci d\'installer une application de messagerie. Journaux de l\'application Android %1$s Chargement des données … diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6df168e6ed..47d022e14d 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -59,7 +59,7 @@ Имя пользователя Пароль Ещё нет сервера? -Щёлкните здесь что бы получить от провайдера +Щёлкните здесь чтобы получить от провайдера Файлы Подключиться Загрузить diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index d9320b163c..bacf2507d4 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -57,6 +57,7 @@ Adresa e serverit https://… Emër përdoruesi Fjalëkalim + Nuk keni akoma një server?\\nKlikoni këtu për të marrë një nga ofruesit Kartela Lidhuni Ngarkoni @@ -515,7 +516,7 @@ ose Kontribim aktiv Bashkohu në bisedat në IRC: <a href=\"%1$s\">#nextcloud-mobile</a> Ndihmo të tjerët në <a href="%1$s">forum</a> - <a href=\"%1$s">Translate</a> aplikacioni + <a href=\"%1$s\">Përktheni</a> aplikacionin Kontriboni si një zhvillues, shih<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> për detaje Levizni tek… Kopjojeni tek… From 5a9be795ae8fd43efb706b58bc876c2afc7af30c Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 12 Feb 2017 01:17:49 +0000 Subject: [PATCH 057/881] [tx-robot] updated from transifex --- res/values-fr/strings.xml | 18 +++++++++--------- res/values-pt-rBR/strings.xml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 23d7dd05f9..fbe33e39db 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -505,22 +505,22 @@ En apprendre plus Téléversement automatique Participer - Aidez nous à tester + Aidez nous à améliorer NextCloud Vous avez trouvé un bug ? Quelque chose vous semble étrange ? Signaler un problème sur Github - Interessé par nous aider à tester la future Version ? + Vous avez envie de nous aider en testant les futures versions ? Testez la version bêta - Ceci inclut toutes les fonctionnalités à venir qui sont encore toutes fraîches. -Des erreurs peuvent se produire et si c\'est le cas, veuillez nous les reporter s\'il vous plaît. + La version Beta inclut les dernières fonctionnalités qui sont encore toutes fraîches. +Des erreurs peuvent se produire et si c\'est le cas, merci de nous les signaler. <br/><a href=\"%2$s\">Télécharger l\'APK</a> ou - Release candidate + Testez la version Release candidate La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid. Contribuer activement - Rejoingez la discussion sur IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Aidez les autres sur le <a href="%1$s">forum</a> - <a href=\"%1$s\">Traduisez</a> l\\\'application - Développeurs ? Contribuez ! Plus de détails sur la page <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> + Rejoignez la discussion sur IRC <a href=\"%1$s\">#nextcloud-mobile</a>. + Aidez les autres sur le <a href=\"%1$s\">forum</a>. + <a href=\"%1$s\">Traduisez</a> l\'application. + Vous êtes développeur ? Consultez <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>. Déplacer vers… Copier vers… Choisir le dossier… diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index d912b7ee60..ba143db965 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -465,7 +465,7 @@ Compartilhar com … Compartilhar com %1$s - Perquisar + Pesquisar Pesquisar usuários e grupos %1$s (grupo) From d038fd72601fe12f17f92498767d0f2b7719b73d Mon Sep 17 00:00:00 2001 From: carstendev Date: Sun, 12 Feb 2017 04:48:10 +0100 Subject: [PATCH 058/881] Fix for #448. Rotation change in FolderPicker caused app crash. --- src/com/owncloud/android/ui/fragment/OCFileListFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 5938836574..f54eba5edf 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -120,6 +120,7 @@ public class OCFileListFragment extends ExtendedListFragment { mSystemBarColor = getResources().getColor(R.color.primary_dark); mProgressBarActionModeColor = getResources().getColor(R.color.action_mode_background); mProgressBarColor = getResources().getColor(R.color.primary); + mMultiChoiceModeListener = new MultiChoiceModeListener(); } /** @@ -529,7 +530,6 @@ public class OCFileListFragment extends ExtendedListFragment { */ private void setChoiceModeAsMultipleModal(Bundle savedInstanceState) { setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); - mMultiChoiceModeListener = new MultiChoiceModeListener(); if (savedInstanceState != null) { mMultiChoiceModeListener.loadStateFrom(savedInstanceState); } From 52be815204bf84da21b50fe0bed70f452c98a67a Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 13 Feb 2017 01:17:51 +0000 Subject: [PATCH 059/881] [tx-robot] updated from transifex --- res/values-el/strings.xml | 243 ++++++++++++++++++++++++-------------- res/values-tr/strings.xml | 10 ++ 2 files changed, 163 insertions(+), 90 deletions(-) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 580262b1d5..a9ad2af6b7 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -1,6 +1,6 @@ - Εφαρμογή %1$s Android + Εφαρμογή Android %1$s έκδοση %1$s Ανανέωση λογαριασμού Μεταφόρτωση @@ -20,7 +20,7 @@ Στην συσκευή Ρυθμίσεις Μεταφορτώσεις - %1$s από %2$s χρησιμοποιούνται + χρησιμοποιούνται %1$s από %2$s Κλείσιμο Άνοιγμα Γενικά @@ -29,30 +29,35 @@ Διαχείριση λογαριασμών Κλείδωμα με κωδικό πρόσβασης Εμφάνιση κρυφών αρχείων - Στιγμιαίες μεταφορτώσεις εικόνων - Μεταφορτώστε απευθείας φωτογραφίες από την κάμερα - Στιγμιαίες μεταφορτώσεις βίντεο - Άμεση μεταφόρτωση των βίντεο από την φωτογραφική μηχανή + Άμεση μεταφόρτωση εικόνων + Άμεση μεταφόρτωση φωτογραφιών από την κάμερα + Άμεση μεταφόρτωση βίντεο + Άμεση μεταφόρτωση των βίντεο από την κάμερα Ενεργοποίηση καταγραφής ιστορικού Χρησιμοποιείται για την καταγραφή προβλημάτων - Ιστορικό καταγραφής - Εδώ μπορείτε να δείτε το καταγεγραμμένο ιστορικό + Καταγραφή ιστορικού + Εμφάνιση του καταγεγραμμένου ιστορικού Διαγραφή ιστορικού + Συγχρονισμός ημερολογίου & επαφών + Ρυθμίστε το DAVdroid (v1.3.0+) για τον τρέχον λογαριασμό + Η διεύθυνση του διακομιστή για τον λογαριασμό δεν μπορεί να καθοριστεί για το DAVdroid Δεν είναι εγκατεστημένα το Google Play ή το F-Droid + Επιτυχής ρύθμιση συγχρονισμού ημερολογίου & επαφών Βοήθεια Προτείνετε σε φίλο - Σχόλια + Aνάδραση Αποτύπωμα - Αποθήκευση σημείου διαμοιρασμού - Αποθήκευση τελευταίου σημείου διαμοιρασμού μεταφόρτωσης + Απομνημόνευση θέσης διαμοιρασμού + Απομνημόνευση τελευταιας θέσης μεταφορτώσεων - Δοκιμάστε %1$s στο κινητό σας! - Θα ήθελα να σε προσκαλέσω να χρησιμοποιήσεις το %1$s στο κινητό σου!\nΛήψη εδώ: %2$s + Δοκιμή %1$s στο κινητό σας! + Θα ήθελα να σε προσκαλέσω να χρησιμοποιήσεις το %1$s στο κινητό σου!\\nΛήψη από εδώ: %2$s Έλεγχος διακομιστή Διεύθυνση διακομιστή https://… Όνομα χρήστη Συνθηματικό + Δεν έχετε ακόμα διακομιστή;\\nΚάντε κλικ εδώ για να πάρετε ένα από ένα πάροχο Αρχεία Σύνδεση Μεταφόρτωση @@ -61,18 +66,25 @@ Δεν υπάρχουν λογαριασμοί %1$s στη συσκευή σας. Παρακαλώ ρυθμίστε πρώτα ένα λογαριασμό. Ρύθμιση Έξοδος - Δεν υπάρχει αρχείο για αποστολή - Το αρχείο δεν μπορεί να αποσταλεί + Δεν υπάρχει αρχείο για μεταφόρτωση + Ο %1$s δεν μπορεί να μεταφορτώσει ένα κομμάτι κειμένου ως αρχείο. + Τα ληφθέντα δεδομένα δεν περιλαμβάνουν έγκυρο αρχείο. + Το αρχείο δεν μπορεί να μεταφορτωθεί + Ο %1$s δεν επιτρέπεται να αναγνώσει ένα ληφθέν αρχείο Το αρχείο προς αποστολή δεν βρέθηκε στην τοποθεσία. Παρακαλώ ελέγξτε εάν υπάρχει το αρχείο. - Επιλογή αποστολής: - Μετακίνηση στον φάκελο Nextcloud + Παρουσιάστηκε σφάλμα κατά την αντιγραφή του αρχείου στον προσωρινό φάκελο. Παρακαλώ δοκιμάστε να στείλετε ξανά. + Επιλογή μεταφόρτωσης: + Μετακίνηση αρχείου στον φάκελο Nextcloud Διατήρηση του αρχείου στον πηγαίο φάκελο Διαγραφή αρχείου από τον πηγαίο φάκελο δευτερόλεπτα πριν Δεν υπάρχουν αρχεία + Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας! Φόρτωση… Δεν βρέθηκε εφαρμογή για τον τύπο αρχείου! Δεν υπάρχουν αρχεία σε αυτό τον φάκελο. + Μη διαθέσιμες μεταφορτώσεις + Μεταφόρτωση περιεχομένου ή ενεργοποίηση άμεσης μεταφόρτωσης! φάκελος φάκελοι αρχείο @@ -85,11 +97,13 @@ Λήψη Συγχρονισμός Το αρχείο μετονομάστηκε σε %1$s κατά τη μεταφόρτωση - Διάταξη Λίστας - Διαμοιράστε + Διάταξη λίστας + Διαμοιρασμός Ναι Όχι ΟΚ + Αφαίρεση μεταφόρτωσης + Επανάληψη μεταφόρτωσης Ακύρωση συγχρονισμού Άκυρο Επιστροφή @@ -100,8 +114,8 @@ άγνωστο Άγνωστο σφάλμα Εκκρεμεί - Σχετικά - Αλλαγή κωδικού πρόσβασης + Περί + Αλλαγή συνθημτικού Αφαίρεση λογαριασμού Διαγραφή λογαριασμού %s?\\n\\nΗ διαγραφή λογαριασμού δεν μπορεί να αναιρεθεί. Δημιουργία λογαριασμού @@ -109,18 +123,20 @@ Όνομα φακέλου Μεταφόρτωση … %1$d%% Μεταφορτώνονται %2$s - Η μεταφόρτωση ολοκληρώθηκε επιτυχώς + Επιτυχημένη μεταφόρτωση Το %1$s μεταφορτώθηκε - Η μεταφόρτωση απέτυχε + Αποτυχημένη μεταφόρτωση Η μεταφόρτωση του %1$s δεν ήταν δυνατόν να ολοκληρωθεί Η μεταφόρτωση απέτυχε, πρέπει να επανασυνδεθείτε Μεταφορτώσεις Τρέχουσα + Απέτυχε (αγγίξτε για επανάληψη) Μεταφορτώθηκε Ολοκληρωμένες Ακυρώθηκαν Παύθηκαν Σφάλμα σύνδεσης + Η μεταφόρτωση θα επαναληφθεί σύντομα Σφάλμα διαπιστευτηρίων Σφάλμα φακέλου Σφάλμα αρχείου @@ -129,26 +145,27 @@ Διένεξη Η εφαρμογή τερματίστηκε Άγνωστο σφάλμα - Αναμονή για ασύρματη σύνδεση + Αναμονή για σύνδεση wifi Αναμονή για μεταφόρτωση - Λήψη … + Λαμβάνονται … %1$d%% Λαμβάνονται %2$s - Η λήψη ολοκληρώθηκε επιτυχώς + Επιτυχημένη λήψη %1$s ελήφθησαν - Η λήψη απέτυχε + Αποτυχημένη λήψη Η λήψη του %1$s δεν μπόρεσε να ολοκληρωθεί Δεν έχει ληφθεί ακόμα Αποτυχία λήψης, πρέπει να εισέλθετε ξανά Επιλογή λογαριασμού Αποτυχία συγχρονισμού + Αποτυχία συγχρονισμού, χρειάζεται να εισέλθετε ξανά Ο συγχρονισμός του %1$s δεν μπόρεσε να ολοκληρωθεί - Λάθος κωδικός για %1$s - Βρέθηκαν συγκρούσεις - %1$d αρχεία σε αναμονή συγχρονισμού δεν μπόρεσαν να συγχρονιστούν - Τα αρχεία σε αναμονή συγχρονισμού απέτυχαν + Μη έγκυρο συνθηματικό για %1$s + Βρέθηκαν διενέξεις + %1$d αρχεία σε αναμονή προς συγχρονισμό δεν μπόρεσαν να συγχρονιστούν + Τα αρχεία σε αναμονή προς συγχρονισμού απέτυχαν Τα περιεχόμενα των %1$d αρχείων δεν μπόρεσαν να συγχρονιστούν (%2$d διενέξεις) Ορισμένα τοπικά αρχεία ξεχάστηκαν - %1$d αρχεία από τον %2$s χώρο αποθήκευσης δεν ήταν δυνατό να αντιγραφούν σε + %1$d αρχεία από τον %2$s φάκελο δεν ήταν δυνατό να αντιγραφούν σε Από την έκδοση 1.3.16, τα αρχεία που μεταφορτώθηκαν από αυτήν τη συσκευή αντιγράφηκαν στον τοπικό φάκελο %1$s για να αποτραπεί η απώλεια δεδομένων όταν ένα αρχείο είναι συγχρονισμένο με πολλαπλούς λογαριασμούς. \n\nΛόγω αυτής της αλλαγής, όλα τα αρχεία που μεταφορτώθηκαν με προηγούμενες εκδόσεις αυτής της εφαρμογής αντιγράφηκαν στον φάκελο %2$s. Ωστόσο, ένα σφάλμα εμπόδισε την ολοκλήρωση αυτής της λειτουργίας κατά το συγχρονισμό του λογαριασμού. Μπορείτε είτε να αφήσετε το(α) αρχείο(α) όπως είναι και να καταργήσετε τη σύνδεση με το %3$s ή να μετακινήσετε τα αρχεία στο φάκελο %1$s και να διατηρήσετε τη σύνδεση με το %4$s. \n\nΑπαριθμημένα πιο κάτω είναι τα τοπικά αρχεία(ο) και τα απομακρυσμένα αρχεία(ο) στο %5$s με τα οποία συνδέονταν. Ο φάκελος %1$s δεν υπάρχει πια Μετακίνηση όλων @@ -157,99 +174,104 @@ Τοπικά: %1$s Απομακρυσμένα: %1$s Δεν υπάρχει αρκετός διαθέσιμος αποθηκευτικός χώρος για να αντιγραφούν τα επιλεγμένα αρχεία στον φάκελο %1$s. Θα θέλατε να τα μετακινήσετε αντί αυτού; + Παρακαλώ εισάγετε τον κωδικό πρόσβασης + Εισάγετε τον κωδικό πρόσβασης Ο κωδικός πρόσβασης θα ζητείται κάθε φορά που εκκινεί η εφαρμογή - Παρακαλώ επανεισάγετε τον κωδικό πρόσβασης σας - Αφαίρεση του κωδικού σας πρόσβασης + Παρακαλώ εισάγετε ξανά τον κωδικό πρόσβασης + Αφαίρεση του κωδικού πρόσβασης Οι κωδικοί πρόσβασης δεν ταιριάζουν Εσφαλμένος κωδικός πρόσβασης Ο κωδικός πρόσβασης αφαιρέθηκε Ο κωδικός πρόσβασης αποθηκεύτηκε - %1$s αναπαραγωγή μουσικής + %1$s αναπαραγωγέας μουσικής %1$s (αναπαραγωγή) %1$s (φόρτωση) %1$s αναπαραγωγή τελείωσε Δεν βρέθηκε αρχείο πολυμέσων Δεν δόθηκε λογαριασμός Το αρχείο δεν βρίσκεται σε έγκυρο λογαριασμό - Αυτή η μορφή κωδικοποιήσης πολυμέσων δεν υποστηρίζεται - Το αρχείο πολυμέσων δεν μπόρεσε να διαβαστεί - Το αρχείο πολυμέσων δεν είναι κωδικοποιημένο σωστά + Δεν υποστηρίζεται η μορφή κωδικοποιήσης πολυμέσων + Αδυναμία ανάγνωσης αρχείου πολυμέσων + Εσφαλμένη κωδικοποίηση αρχείου πολυμέσων Λήξη χρόνου κατά την προσπάθεια αναπαραγωγής Το αρχείο πολυμέσων δεν μπορεί να μεταδοθεί Το αρχείο πολυμέσων δεν μπορεί να αναπαραχθεί με την παρεχόμενη εφαρμογή αναπαραγωγής πολυμέσων Σφάλμα ασφαλείας κατά την προσπάθεια αναπαραγωγής του %1$s Σφάλμα εισόδου κατά την προσπάθεια αναπαραγωγής του %1$s Απροσδόκητο σφάλμα κατά την προσπάθεια αναπαραγωγής του %1$s - Κουμπί επαναφοράς + Κουμπί ταχείας κίνησης πίσω Κουμπί αναπαραγωγής ή παύσης - Κουμπί προώθησης + Κουμπί γρήγορης προώθησης Λήψη πιστοποίησης … Προσπάθεια σύνδεσης … Δεν υπάρχει σύνδεση στο δίκτυο Μη διαθέσιμη ασφαλής σύνδεση. - Επετεύχθη σύνδεση + Εδραίωση σύνδεσης Έλεγχος σύνδεσης - Λανθασμένες ρυθμίσεις διακομιστή + Εσφαλμένες ρυθμίσεις διακομιστή Ένας λογαριασμός για τον ίδιο χρήστη και διακομιστή υπάρχει ήδη στη συσκευή Ο χρήστης που εισάγατε δεν ταιριάζει με το χρήστη αυτού του λογαριασμού Παρουσιάστηκε άγνωστο σφάλμα! - Δεν βρέθηκε κόμβος + Δεν βρέθηκε κεντρικός υπολογιστής Δεν βρέθηκε εγκατεστημένος διακομιστής Ο διακομιστής αργεί πολύ να απαντήσει Εσφαλμένη μορφή διεύθυνσης διακομιστή - Η αρχικοποίηση του SLL απέτυχε + Η αρχικοποίηση του SSL απέτυχε Αδυναμία επιβεβαίωσης της ταυτότητας του διακομιστή SSL - Μη-αναγνωρίσιμη έκδοση διακομιστή - Δεν ήταν δυνατή η σύνδεση + Μη αναγνωρίσιμη έκδοση διακομιστή + Αδυναμία δημιουργίας σύνδεσης Επιτεύχθηκε ασφαλής σύνδεση - Λάθος όνομα χρήστη ή κωδικός - Η πιστοποίηση απέτυχε - Ο διακομιστής πιστοποίησης αρνήθηκε την πρόσβαση - Απρόοπτη κατάσταση - παρακαλώ εισάγετε τη διεύθυνση URL του διακομιστή ξανά + Εσφαλμένο όνομα χρήστη ή συνθηματικό + Ανεπιτυχής πιστοποίηση + Άρνηση πρόσβασης από τον διακομιστή πιστοποίησης + Απροσδόκητη κατάσταση, παρακαλώ εισάγετε ξανά τη διεύθυνση του διακομιστή Η πιστοποιίησή σας έληξε. Παρακαλώ πιστοποιήστε ξανά - Παρακαλώ εισάγετε τον τρέχοντα κωδικό πρόσβασης + Παρακαλώ εισάγετε το τρέχον συνθηματικό Η συνεδρία σας έληξε. Παρακαλώ συνδεθείτε ξανά - Σύνδεση με το διακομιστή πιστοποίησης... + Σύνδεση με το διακομιστή πιστοποίησης ... Ο διακομιστής δεν υποστηρίζει αυτή τη μέθοδο πιστοποίησης Ο %1$s δεν υποστηρίζει πολλαπλούς λογαριασμούς Ο διακομιστής σας δεν επιστρέφει το σωστό αναγνωριστικό χρήστη, παρακαλώ επικοινωνήστε με ένα διαχειριστή ⇥ - Δεν είναι δυνατή η πιστοποίηση με αυτόν το διακομιστή + Αδυαμία πιστοποίησης με αυτόν το διακομιστή Ο λογαριασμός δεν υπάρχει στη συσκευή ακόμα. Ορισμός ως διαθέσιμο εκτός σύνδεσης + Αναίρεση ορισμού ως διαθέσιμο εκτός σύνδεσης Μετονομασία Αφαίρεση - Σίγουρα θέλετε να αφαιρέσετε το %1$s? - Θέλετε στ\' αλήθεια να διαγράψετε το %1$s και τα περιεχόμενά του; + Θέλετε σίγουρα να αφαιρέσετε το %1$s; + Θέλετε σίγουρα να διαγράψετε το %1$s και τα περιεχόμενά του; Μόνο τοπικά - Αφαίρεση επιτυχής - Η αφαίρεση απέτυχε + Επιτυχής αφαίρεση + Αποτυχημένη αφαίρεση Εισάγετε νέο όνομα Το τοπικό αντίγραφο δεν ήταν δυνατόν να μετονομαστεί. Παρακαλώ επιλέξτε ένα διαφορετικό όνομα. Η μετονομασία δεν ήταν επιτυχής Αδυναμία ελέγχου του απομακρυσμένου αρχείου Τα περιεχόμενα του αρχείου έχουν ήδη συγχρονιστεί - Η δημιουργία φακέλου απέτυχε + Ο φάκελος δεν μπορεί να δημιουργηθεί Μη-επιτρεπόμενοι χαρακτήρες: / \\ < > : \" | ? * Το όνομα αρχείου περιέχει έναν τουλάχιστον μη έγκυρο χαρακτήρα - Το όνομα αρχείου δεν μπορεί να είναι κενό. + Το όνομα αρχείου δεν μπορεί να είναι κενό Παρακαλούμε περιμένετε - Δεν επιλέχθηκαν αρχεία + Γίνεται έλεγχος αποθηκευμένων διαπιστευτηρίων + Μη αναμενόμενο πρόβλημα, παρακαλώ ελέγξτε το αρχείο από διαφορετική εφαρμογή + Δεν επιλέχθηκε αρχείο Αποστολή συνδέσμου σε … - Αντιγραφή αρχείου από ιδιωτική αποθήκευση + Γίνεται αντιγραφή αρχείου από ιδιωτικό αποθηκευτικό χώρο Σύνδεση με oAuth2 - Σύνδεση με το διακομιστή oAuth2 σε εξέλιξη... + Γίνεται σύνδεση στο διακομιστή oAuth2... Η ταυτότητα της σελίδας δεν μπορεί να επληθευτεί - Το πιστοποιητικό του διακομιστή δεν είναι έμπιστο - Το πιστοποιητικό του διακομιστή έχει λήξει - Το πιστοποιητικό του διακομιστή είναι πολύ νέο - - Η διεύθυνση URL δεν ταιριάζει με το όνομα του κόμβου στο πιστοποιητικό + - Η URL δεν ταιριάζει το όνομα του συστήματος στο πιστοποιητικό Θέλετε να θεωρείται έμπιστο το πιστοποιητικό αυτό παρ\' όλα αυτά; Το πιστοποιητικό δεν ήταν δυνατόν να αποθηκευτεί Λεπτομέρειες @@ -262,7 +284,7 @@ Χώρα: Πολιτεία: Τοποθεσία: - Περίοδος ισχύος: + Εγκυρότητα: Από: Μέχρι: Υπογραφή: @@ -270,57 +292,94 @@ Ο αλγόριθμος digest δεν είναι διαθέσιμος στο τηλέφωνό σας. Ψηφιακό αποτύπωμα: Πρόβλημα φόρτωσης του πιστοποιητικού. - Δεν μπορεί να εμφανιστεί το πιστοποιητικό. + Αδυναμία εμφάνισης πιστοποιητικού. - Καμμία πληροφορία σχετικά με το σφάλμα - Αυτό είναι ένα σημείο κράτησης θέσης + Αυτό είναι ένα σημείο placeholder placeholder.txt Εικόνα PNG 389 KB 2012/05/18 12:23 PM 12:23:45 + Μεταφόρτωση μόνο μέσω wifi Μεταφόρτωση φωτογραφιών μόνο μέσω wifi Μεταφόρτωση βίντεο μόνο μέσω wifi + Μεταφόρτωση μόνο κατά τη διάρκεια φόρτισης + Μεταφόρτωση μόνο κατά τη διάρκεια φόρτισης /InstantUpload Διένεξη αρχείων - Ποια αρχεία θέλετε να κρατήσετε; Αν επιλέξετε και τις δύο εκδοχές, στο τοπικό αρχείο θα προστεθεί ένας αριθμός στο όνομά του. + Ποια αρχεία θέλετε να διατηρήσετε; Αν επιλέξετε και τις δύο εκδόσεις, στο τοπικό αρχείο θα προστεθεί ένας αριθμός στο όνομά του. Διατήρηση και των δύο τοπική έκδοση έκδοση διακομιστή Προεπισκόπηση εικόνας - Αυτή η εικόνα δεν μπορεί να προβληθεί + Αδυναμία εμφάνισης εικόνας Το %1$s δεν μπόρεσε να αντιγραφεί στον τοπικό φάκελο %2$s + Φάκελος άμεσης μεταφόρτωσης + Τοπικός φάκελος + Μετονομασία φακέλου Χρήση υποφακέλων - Λυπούμαστε, ο διαμοιρασμός δεν επιτρέπεται στο διακομιστή σας. Παρακαλούμε επικοινωνείστε με το + Αποθήκευση σε υποφακέλους με βάση το χρόνο και μήνα + + Λυπούμαστε, ο διαμοιρασμός δεν είναι διαθέσιμος στο διακομιστή σας. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας. - Αδύνατη η κοινή χρήση. Παρακαλώ ελέγξτε αν ο φάκελος υπάρχει - Ένα σφάλμα προέκυψε κατά την προσπάθεια διαμοιρασμού αυτού του αρχείου ή φακέλου + Αδύνατη η κοινή χρήση. Παρακαλώ ελέγξτε αν υπάρχει ο φάκελος + Παρουσιάστηκε σφάλμα κατά την προσπάθεια διαμοιρασμού αυτού του αρχείου ή φακέλου Αδύνατη η διακοπή κοινής χρήσης. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει - Ένα σφάλμα προέκυψε κατά τη διάρκεια ακύρωσης διαμοιρασμού αυτού του αρχείου ή φακέλου + Παρουσιάρτηκε σφάλμα κατά τη διάρκεια ακύρωσης διαμοιρασμού αυτού του αρχείου ή φακέλου Αδύνατη η ενημέρωση. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει - Ένα σφάλμα προέκυψε κατά την προσπάθεια ενημέρωσης του διαμοιρασμού - Εισάγετε ένα κωδικό πρόσβασης. - Πρέπει να εισάγετε ένα κωδικό πρόσβασης. + Παρουσιάστηκε σφάλμα κατά την προσπάθεια ενημέρωσης του διαμοιρασμού + Εισάγετε ένα συνθηματικό + Πρέπει να εισάγετε ένα συνθηματικό Αποστολή Αντιγραφή συνδέσμου Αντιγράφηκε στο πρόχειρο - Κρίσιμο σφάλμα: αδύνατη η εκτέλεση λειτουργειών + Δεν ελήφθη κείμενο για αντιγραφή στο πρόχειρο + Μη αναμενόμενο σφάλμα κατά την αντιγραφή στο πρόχειρο + Κείμενο που αντιγράφηκε από τον %1$s - Ένα σφάλμα προέκυψε κατά τη σύνδεση με το διακομιστή. - Δεν έχετε πρόσβαση %s + Κρίσιμο σφάλμα: αδύνατη η εκτέλεση λειτουργιών + + Παρουσιάστηκε σφάλμα κατά τη σύνδεση με το διακομιστή. + Παρουσιάστηκε σφάλμα κατά την αναμονή για τον διακομιστή. Η λειτουργία δεν μπορεί να ολοκληρωθεί + Παρουσιάστηκε σφάλμα κατά την αναμονή για τον διακομιστή. Η λειτουργία δεν μπορεί να ολοκληρωθεί + Η λειτουργία δεν μπορεί να ολοκληρωθεί. Ο διακομιστής δεν είναι διαθέσιμος + Δεν έχετε δικαιώματα %s για να μετονομάσετε αυτό το αρχείο για να διαγράψετε αυτό το αρχείο - για να μοιραστείτε αυτό το αρχείο + για να διαμοιραστείτε αυτό το αρχείο για να διακόψετε το διαμοιρασμό αυτού του αρχείου για να ενημερώσετε αυτό τον διαμοιρασμό για να δημιουργήσετε το αρχείο για να μεταφορτώσετε σε αυτό το φάκελο - Αυτό το αρχείο δεν είναι πια διαθέσιμο στο διακομιστή + Αυτό το αρχείο δεν είναι πια διαθέσιμο στον διακομιστή + + Ενημέρωση διαδρομής αποθηκευτικού χώρου + Ολοκλήρωση + Προετοιμασία για μεταφορά… + Γίνεται έλεγχος προορισμού… + Γίνεται αποθήκευση ρυθμίσεων λογαριασμών… + Αναμονή για τους ανολοκλήρωτους συγχρονισμούς… + Γίνεται μετακίνηση δεδομένων… + Γίνεται ενημέρωση ευρετηρίου… + Γίνεται εκκαθάριση… + Γίνεται επαναφορά ρυθμίσεων λογαριασμών… + Ολοκληρώθηκε + ΣΦΑΛΜΑ: Ανεπαρκής αποθηκευτικός χώρος + ΣΦΑΛΜΑ: Το αρχείο δεν είναι εγγράψιμο + ΣΦΑΛΜΑ: Το αρχείο δεν είναι αναγνώσιμο + ΣΦΑΛΜΑ: Υπάρχει ήδη ο κατάλογος Nextcloud + ΣΦΑΛΜΑ: Κατά την μεταφορά + ΣΦΑΛΜΑ: Κατά την ενημέρωση ευρετηρίου + + Ο φάκελος των δεδομένων υπάρχει ήδη, τι να κάνω; + Αντικατάσταση + Χρήση υπάρχοντος Λογαριασμοί Προσθήκη λογαριασμού @@ -329,12 +388,12 @@ Αρχεία καταγραφών Αποστολή ιστορικού - Δεν εντοπίστηκε εφαρμογή αποστολής αναφορών συστήματος. Παρακαλώ εγκαταστήστε την εφαρμογή ηλεκτρονικού ταχυδρομείου - %1$s αναφορές της εφαρμογής Android + Δεν εντοπίστηκε εφαρμογή αποστολής ιστορικού συστήματος. Παρακαλώ εγκαταστήστε την εφαρμογή ηλεκτρονικού ταχυδρομείου + %1$s ιστορικό της εφαρμογής Android Φόρτωση δεδομένων … Απαιτείται πιστοποίηση - Εσφαλμένος κωδικός πρόσβασης + Εσφαλμένο συνθηματικό Μετακίνηση Αντιγραφή Δεν υπάρχει τίποτα εδώ. Μπορείτε να προσθέσετε ένα φάκελο! @@ -343,7 +402,7 @@ Αδύνατη η μετακίνηση. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει Δεν είναι δυνατό να μετακινηθεί ο φάκελος σε έναν απογονικό Το αρχείο υπάρχει ήδη στο φάκελο προορισμού - Ένα σφάλμα προέκυψε κατά την προσπάθεια μετακίνησης αυτού του αρχείου ή φακέλου + Παρουσιάστηκε σφάλμα κατά την προσπάθεια μετακίνησης αυτού του αρχείου ή φακέλου για μετακίνηση αυτού του αρχείου @@ -353,16 +412,17 @@ Παρουσιάστηκε σφάλμα κατά την προσπάθεια αντιγραφής αυτού του αρχείου ή φακέλου για αντιγραφή αυτού του αρχείου - Στιγμιαίες μεταφορτώσεις + Άμεσες μεταφορτώσεις Λεπτομέρειες - Ο συγχρονισμός του φακέλου %1$s δεν μπόρεσε να ολοκληρωθεί + Φάκελος άμεσης μεταφόρτωσης βίντεο + Ο συγχρονισμός του φακέλου %1$s δεν μπόρεσε να ολοκληρωθεί διαμοιρασμένα με εσάς Ο %1$s διαμοιράστηκε το \"%2$s\" με εσάς - \"%1$s\" μοιράστηκε μαζί σας + Ο \"%1$s\" διαμοιράστηκε μαζί σας Ανανέωση σύνδεσης Διεύθυνση διακομιστή @@ -384,19 +444,21 @@ Μετακίνηση αρχείου Επιλογή όλων - κρατήθηκε στον πρωτότυπο φάκελο + διατήρηση στον αρχικό φάκελο μετακινήθηκε στον φάκελο εφαρμογών διαγράφηκε - Διαμοιρασμός + Διαδρομή αποθηκευτικού χώρου + Γίνεται διαμοιρασμός Διαμοιρασμός %1$s Διαμοιρασμός με χρήστες και ομάδες Δεν έχουν διαμοιραστεί ακόμα δεδομένα με τους χρήστες Προσθήκη χρήστη ή ομάδας Διαμοιρασμός συνδέσμου - Ορισμός ημ. λήξης + Ορισμός ημερομηνίας λήξης Προστασία συνθηματικού Ασφαλίστηκε Επιτρέπεται η επεξεργασία + Απόκρυψη λίστας αρχείου Λήψη συνδέσμου Διαμοιρασμός με … Διαμοιρασμός με %1$s @@ -406,6 +468,7 @@ Αναζήτηση χρηστών και ομάδων %1$s (ομάδα) %1$s (απομακρυσμένα) + %1$s (ηλ. ταχυδρομείο) %1$s ( στο %2$s ) Δεν επιτρέπεται ο διαμοιρασμός μεταξύ χρηστών μέσω εφαρμογής, σε αυτή την έκδοση. diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 7e2a03ea61..79ee7c8747 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -77,9 +77,12 @@ Dosya kaynak klasörde tutulsun Dosya kaynak klasörden silinsin saniye önce + Burada hiç dosya yok + Bir şeyler yükleyin veya aygıtlarınızla eşitleyin! Yükleniyor… Bu dosya türü için uygulama bulunamadı! Bu klasörde herhangi bir dosya yok. + Herhangi bir yükleme yok klasör klasör dosya @@ -297,6 +300,7 @@ 2012/05/18 12:23 ÖS 12:23:45 + Yalnız kablosuz ağ üzerinden yüklensin Fotoğraflar yalnız kablosuz ağ üzerinden yüklensin Görüntüler yalnız kablosuz ağ üzerinden yüklensin Yalnız şarj edilirken yüklensin @@ -464,6 +468,7 @@ Kullanıcı ve Grup Arama %1$s (grup) %1$s (uzak) + %1$s (Email) %1$s (%2$s üzerinde) Maalesef sunucu sürümünüz istemcilerden kullanıcılar ile paylaşıma izin vermiyor. @@ -527,6 +532,11 @@ ya da %d seçili %d seçili + Dosya ismi + Dosya tipi + internet haritalar kısayol dosya(%s) + Google haritalar kısayol dosya(%s) + Varsayılan SD kart %1$d Bilinmiyor From 4f51fe6c921d27e0ba36cfca3714e23a3e64cbc5 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 13 Feb 2017 09:03:31 +0100 Subject: [PATCH 060/881] A single rejection rejects the PR --- .pullapprove.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pullapprove.yml b/.pullapprove.yml index 44c503ddab..3b24cc7f4d 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -25,6 +25,7 @@ group_defaults: groups: code-review: required: 2 + reject_value: -99 users: - AndyScherzinger - tobiasKaminsky @@ -38,6 +39,7 @@ groups: reset_on_push: enabled: false required: 1 + reject_value: -99 users: - jancborchardt - eppfel From 714b1602e28d7e7598d9295a85af7818fb5d0e2d Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 14 Feb 2017 01:18:39 +0000 Subject: [PATCH 061/881] [tx-robot] updated from transifex --- res/values-el/strings.xml | 61 +++++++++++++++++++++++++++++++++++++-- res/values-fr/strings.xml | 4 +-- res/values-is/strings.xml | 59 +++++++++++++++++++++++++++++++++++-- 3 files changed, 117 insertions(+), 7 deletions(-) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a9ad2af6b7..d988485b55 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -448,6 +448,8 @@ μετακινήθηκε στον φάκελο εφαρμογών διαγράφηκε Διαδρομή αποθηκευτικού χώρου + Κοινές + Γίνεται διαμοιρασμός Διαμοιρασμός %1$s Διαμοιρασμός με χρήστες και ομάδες @@ -471,8 +473,8 @@ %1$s (ηλ. ταχυδρομείο) %1$s ( στο %2$s ) - Δεν επιτρέπεται ο διαμοιρασμός μεταξύ χρηστών μέσω εφαρμογής, σε αυτή την έκδοση. -\nΕπικοινωνήστε με το διαχειριστή του συστήματος + Δεν επιτρέπεται ο διαμοιρασμός μεταξύ χρηστών μέσω εφαρμογής, σε αυτή την έκδοση διακομιστή. +\\nΕπικοινωνήστε με το διαχειριστή δυνατότητα διαμοιρασμού δυνατότητα επεξεργασίας δημιουργία @@ -481,27 +483,80 @@ Διακοπή διαμοιρασμού ολοκληρώθηκε + Αποτυχία επανάληψης + Αποτυχία εκκαθάρισης + Επιτυχία εκκαθάρισης + Ολοκλήρωση εκκαθάρισης όλων + Προβολή πλέγματος Προβολή λίστας Διαχείριση χώρου + Τα πιστοποιητικά ρυθμίσεων, βάσης δεδομένων και διακομιστή από τα δεδομένα %1$s\'s θα διαγραφούν μόνιμα.\\n\\nΤα ληφθέντα αρχεία θα παραμείνουν ανέπαφα.\\n\\nΑυτή η διαδικασία ενδεχομένως να διαρκέσει λίγο. Εκκαθάριση δεδομένων Μερικά αρχεία δεν μπορούν να διαγραφούν. Επιπλέον διακαιώματα απαιτούνται για μεταφόρτωση & λήψη αρχείων. + Το αρχείο δεν βρέθηκε στο τοπικό σύστημα αρχείων + Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα; + Θέλετε ν αφαιρέσετε τα επιλεγμένα αντικείμενα με τα περιεχόμενά τους; + Αναμονή για φόρτιση συσκευής Αναζήτηση + Αυτό είναι χαρακτηριστικό του Nextcloud, παρακαλώ ενημερώστε. Μάθετε περισσότερα + Αυτόματη μεταφόρτωση Συμμετοχή Βοηθήστε μας στις δοκιμές Βρήκατε σφάλμα; Κάτι σας φαίνεται παράξενο; Αναφέρετε σφάλμα στο Github Σας ενδιαφέρει να μας βοηθήσετε να δοκιμάσουμε την επόμενη έκδοση; Δοκιμάστε την έκδοση Beta + Συμπεριλαμβάνει όλες τις επερχόμενες δυνατότητες και είναι πολύ πρωτοποριακό. Μπορεί να +παρουσιαστούν σφάλματα και όταν συμβεί αυτό, παρακαλούμε αναφέρετέ τα σε εμάς. <br/><a href=\"%2$s\">Λήψη του APK</a> +ή + Υποψήφια κυκλοφορία + Η υποψήφια κυκλοφορία (RC) είναι ένα στιγμιότυπο της επερχόμενης έκδοσης και αναμένεται να είναι σταθερό. Η δοκιμή της μεμονωμένης εγκατάστασής σας θα βοηθήσει στην εξασφάλιση αυτού. Εγγραφείτε για δοκιμές στο Play store ή χειροκίνητα αναζητείστε στο τμήμα \"εκδόσεις\" στο F-Droid. + Ενεργή συνεισφορά + Συμμετέχετε στη συνομιλία στο IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Βοηθήστε τους άλλους στο <a href=\"%1$s\">forum</a> + <a href=\"%1$s\">Μετάφραση</a> της εφαρμογής + Συνεισφέρετε ως προγραμματιστής, για περισσότερες λεπτομέρειες δείτε <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">ΣΥΝΕΙΣΦΕΡΕΤΕ.md</a> + Μετακίνηση σε… + Αντιγραφή σε… + Επιλογή φακέλου… + Φόρτωση φακέλων… + Δεν βρέθηκαν φάκελοι πολυμέσων. + Αυτόματη μεταφόρτωση προτιμήσεων Ρυθμίσεις + Η άμεση μεταφόρτωση έχει ανανεωθεί τελείως. Παρακαλώ δείτε το κυρίως μενού και ρυθμίστε ξανά την αυτόματη μεταφόρτωση. Σας ζητούμε συγγνώμη για την ενόχληση\\n\\nΑπολαύστε τις νέες και εκτεταμένες δυνατότητες της αυτόματης μεταφόρτωσης! + Για %1$s %d επιλέχθηκε %d επιλέχθηκαν + Εισαγωγή ονόματος και τύπου αρχείου μεταφόρτωσης Όνομα αρχείου Τύπος αρχείου - + Απόσπασμα αρχείου κειμένου(.txt) + Αρχείο συντόμευσης Internet(%s) + Αρχείο συντόμευσης Google Maps(%s) + + Προεπιλογή + Κάρτα SD %1$d + Άγνωστο + + + Τι νέο υπάρχει στο Nextcloud + + + Μια ασφαλής τοποθεσία για όλα σας τα δεδομένα + Πρόσβαση, διαμοιρασμός & προστασία των αρχείων σας στο σπίτι και στην εταιρία σας + + Πολλαπλός λογαριασμός + Σύνδεση με όλα τα clouds σας + + Άμεση μεταφόρτωση + Διατήρηση των φωτογραφιών σας με ασφάλεια + + Παράλειψη + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index fbe33e39db..c7211218cf 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -505,7 +505,7 @@ En apprendre plus Téléversement automatique Participer - Aidez nous à améliorer NextCloud + Aidez-nous à améliorer Nextcloud Vous avez trouvé un bug ? Quelque chose vous semble étrange ? Signaler un problème sur Github Vous avez envie de nous aider en testant les futures versions ? @@ -516,7 +516,7 @@ Des erreurs peuvent se produire et si c\'est le cas, merci de nous les signaler. ou Testez la version Release candidate La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid. - Contribuer activement + Participez activement Rejoignez la discussion sur IRC <a href=\"%1$s\">#nextcloud-mobile</a>. Aidez les autres sur le <a href=\"%1$s\">forum</a>. <a href=\"%1$s\">Traduisez</a> l\'application. diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index bf619f9587..d7d3b87340 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -28,6 +28,7 @@ Notandaaðgangar Sýsla með notandaaðganga Læsing með lykilorði + Sýna faldar skrár Hlaða strax inn myndum Hlaða strax inn myndum teknum á myndavél Hlaða strax inn myndskeiðum @@ -68,9 +69,13 @@ Halda skrá í upprunamöppu Eyða skrá úr upprunamöppu sek. + Engar skrár hér + Sendu inn eitthvað efni eða samstilltu við tækin þín! Hleð inn… Engin forrit fundust fyrir skráategund! Það eru engar skrár í þessari möppu. + Engar innsendingar tiltækar + Sendu inn eitthvað efni eða virkjaðu beina innsendingu! mappa möppur skrá @@ -93,6 +98,7 @@ Hætta við samstillingu Hætta við Til baka + Vista Vista & fara út Villa Hleð inn … @@ -126,6 +132,7 @@ Skrá finnst ekki á tækinu Villa í heimildum Árekstur + Forritinu var lokað Óþekkt villa Bíð eftir þráðlausri tengingu Bíð eftir að senda inn @@ -139,6 +146,7 @@ Niðurhal mistókst, þú verður að skrá þig inn aftur Veldu aðgang Samstilling mistókst + Samstilling mistókst, þú verður að skrá þig inn aftur Ekki var hægt að ljúka samstillingu á %1$s Ógilt lykilorð fyrir %1$s Árekstrar fundust @@ -154,6 +162,8 @@ Staðvært: %1$s Fjartengt: %1$s Það er ekki nægilegt pláss til að afrita völdu skrárnar í %1$s möppuna. Vilt þú kannski færa þær í staðinn? + Settu inn lykilkóðann þinn + Settu inn lykilorð Lykilorðsins verður krafist í hvert skipti sem appið er ræst Settu aftur inn lykilorðið þitt @@ -234,6 +244,7 @@ Skráarheitið inniheldur að minnsta kosti einn ógildan staf Skráarheiti má ekki vera tómt Bíddu aðeins + Athuga geymd auðkenni Engin skrá var valin Senda tengil til … Afrita skrá úr einkageymslu @@ -275,8 +286,12 @@ 2012/05/18 12:23 PM 12:23:45 + Einungis senda inn um þráðlaus net Senda inn myndir einungis um þráðlaus net Senda inn myndskeið einungis um þráðlaus net + Einungis senda inn þegar verið er að hlaða + Einungis senda inn þegar verið er að hlaða + /BeinInnsending Árekstur skráa Ef þú velur báðar útgáfur, þá mun verða bætt tölustaf aftan við heiti skrárinnar á tölvunni. Halda báðum @@ -288,6 +303,8 @@ %1$s var ekki hægt að afrita í staðværu %2$s möppuna Mappa fyrir beinar innsendingar + Staðvær mappa + Fjartengd mappa Nota undirmöppur Geyma í undirmöppum byggðum á ári og mánuðum @@ -322,6 +339,16 @@ til að senda inn í þessa möppu Skráin er ekki lengur tiltæk á þjóninum + Ljúka + Færi gögn… + Hreinsa… + Lokið + VILLA: Ekki nægilegt pláss + VILLA: Skráin er ekki skrifanleg + VILLA: Skráin er ekki lesanleg + Gagnamappan er þegar til, hvað skal gera? + Nota fyrirliggjandi + Notandaaðgangar Bæta við notandaaðgangi Sýsla með notandaaðganga @@ -354,7 +381,8 @@ Beinar innsendingar Nánar - Ekki var hægt að ljúka samstillingu á %1$s möppunni + Mappa fyrir beinar innsendingar myndskeiða + Ekki var hægt að ljúka samstillingu á %1$s möppunni deilt með þér @@ -385,6 +413,8 @@ áfram í upprunalegri möppu færð í forritsmöppu eytt + Algengt + Deiling Deila %1$s Deila með notendum eða hópum @@ -405,6 +435,7 @@ Leita að notendum eða hópum %1$s (hópur) %1$s (fjartengt) + %1$s (tölvupóstur) %1$s ( á %2$s ) Því miður, deiling gagna með notendum innan forrita er ekki leyfð í þessari útgáfu þjónsins. @@ -445,11 +476,35 @@ Forútgáfa Vertu virkur þáttakandi Taktu þátt í spjalli á IRC: <a href=\"%1$s\">#nextcloud-mobile</a> + Hjálpaðu öðrum á <a href=\"%1$s\">spjallvefnum</a> + <a href=\"%1$s\">Þýða</a> forritið Leggðu þitt af mörkum sem forritari, skoðaðu <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> fyrir nánari upplýsingar Færa í… Afrita í… + Veldu möppu… + Hleð inn möppum… + Engar margmiðlunarmöppur fundust + Stillingar + Fyrir %1$s %d valið %d valið - + Skráarheiti + Skráartegund + Sjálfgefið + SD-minniskort %1$d + Óþekkt + + + Hvað er nýtt í Nextcloud + + + Öruggur staður fyrir öll gögnin þín + Tengdu öll gagnaskýin þín + + Bein innsending + Haltu ljósmyndunum þínum öruggum + + Sleppa + From f8d54b47e6989ed9301483ab6be1c1ddee7b1e73 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 15 Feb 2017 01:18:10 +0000 Subject: [PATCH 062/881] [tx-robot] updated from transifex --- res/values-pl/strings.xml | 8 ++++---- res/values-sk-rSK/strings.xml | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 6e3a2a824f..d4ea7e0c61 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -20,7 +20,7 @@ Na urządzeniu Ustawienia Wysłane - %1$s z %2$s zajęte + Użyto %1$s z %2$s Zamknij Otwórz Ogólne @@ -32,7 +32,7 @@ Natychmiastowa wysyłka obrazów Wysyłaj od razu zdjęcia zrobione aparatem Natychmiastowa wysyłka wideo - Wysyłaj od razu filmy nakręcone aparatem + Wysyłaj od razu filmy nagrane aparatem Włącz logowanie To jest używane do logowania problemów Historia logowania @@ -42,13 +42,13 @@ Skonfiguruj DAVdroid (v1.3.0+) dla obecnego konta Adres serwera dla konta nie mógł został przekonwertowany do DAVdroid Brak aplikacji Google Play lub F-Droida - Synchronizacja kontaktów i kalendarza została skonfigurowana + Synchronizacja kontaktów i kalendarza została skonfigurowana pomyślnie Pomoc Poleć znajomemu Opinie Stopka Zapamiętaj lokalizację udostępnienia - Zapamiętaj ostatnią lokalizację wgrywania + Zapamiętaj ostatnią lokalizację wysyłania Wypróbuj %1$s na swoim smartfonie! Zapraszam do użycia %1$s na swoim smartfonie!\\nŚciągnij tutaj: %2$s diff --git a/res/values-sk-rSK/strings.xml b/res/values-sk-rSK/strings.xml index 46d189dd74..67d145e46e 100644 --- a/res/values-sk-rSK/strings.xml +++ b/res/values-sk-rSK/strings.xml @@ -57,6 +57,7 @@ Adresa servera https://... Používateľské meno Heslo + Ešte nemáte server? \\nKliknite sem pre jeho získanie od poskytovateľa Súbory Pripojiť Nahrať @@ -80,6 +81,7 @@ Aplikácia pre váš typ súboru sa nenašla! V tomto priečinku nie sú žiadne súbory. Žiadne súbory na nahratie nie sú dostupné + Nahrajte nejaký obsah alebo aktivujte okamžité nahrávanie! priečinok priečinky súbor @@ -349,7 +351,13 @@ nahrávať do tohto priečinka Súbor už na serveri nie je dostupný + Aktualizujem cestu k úložisku Dokončiť + Pripravujem na presun… + Ukladám konfiguráciu účtov… + Presúvam dáta… + Aktualizujem zoznam… + Čistenie… Hotovo CHYBA: Nedostatok miesta CHYBA: Súbor nie je zapisovateľný @@ -368,7 +376,10 @@ Zabezpečené spojenie je presmerované nezabezpečenou cestou. Logy + Odoslať históriu %1$s Android app logs + Načítavam dáta … + Vyžaduje sa overenie Nesprávne heslo Presunúť @@ -437,6 +448,7 @@ Chrániť heslom Zabezpečené Povoliť úpravy + Skryť zobrazenie súborov Získať odkaz Sprístupniť pre … Sprístupniť pre %1$s @@ -463,9 +475,11 @@ Zobrazenie mriežky Zobrazenie zoznamu + Spravovať miesto Vyčistiť dáta Niektoré súbory nebolo možné zmazať. + Súbor nebolo možné nájsť na lokálnom úložisku Naozaj chcete odstrániť vybraté položky? Naozaj chcete odstrániť vybraté položky a ich obsah? Čakám na nabíjanie zariadenia @@ -474,8 +488,10 @@ Automatické nahratie Zúčastniť sa Pomôžte nám s testovaním. + Nahlásiť chybu na Githube Testovať Beta verziu Aktívne prispievať + Pomôž ostatným na <a href=\"%1$s\">fóre</a> Presunúť do… Kopírovať do… Vybrať priečinok… @@ -493,6 +509,9 @@ Zadaj meno a typ súboru na nahratie Názov súboru Typ súboru + Internetový odkaz(%s) + Odkaz na Google mapy(%s) + Predvolené SD karta %1$d Neznámy From 6c9d32fad0908b09bc340e24536d7da61dc57142 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Wed, 15 Feb 2017 18:28:09 +0100 Subject: [PATCH 063/881] - #657 renamed PR labels - better description of beta process --- CONTRIBUTING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e14f7b9bb5..a509fa2346 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,10 +44,9 @@ If your issue appears to be a bug, and hasn't been reported, open a new issue. ### Pull request -* 1 to develop -* 2 developing -* 3 to review -* 4 to release +* 1 developing +* 2 to review +* 3 to release ### Issue @@ -131,7 +130,8 @@ Before releasing a new stable version there is at least one release candidate. I ### Development Beta Done as a standalone app that can be installed in parallel to the stable app. -Any PR which is labelled "ready for beta" will be automatically included in the beta app. This label should only set by the main developers. +Any PR which is labelled "ready for beta" will be automatically included in the beta app. This label should only set by the main developers. +Same applies for the android-library. This repository also has a branch called beta which includes all upcoming features. The beta branch on this repository must always use the android-library beta branch. ## Version Name and number ### Stable / Release candidate From d6fa224ffc3133183525ea38fac1f73c7eb1dee6 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Thu, 16 Feb 2017 01:19:20 +0000 Subject: [PATCH 064/881] [tx-robot] updated from transifex --- res/values-sk-rSK/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-sk-rSK/strings.xml b/res/values-sk-rSK/strings.xml index 67d145e46e..9dfd206468 100644 --- a/res/values-sk-rSK/strings.xml +++ b/res/values-sk-rSK/strings.xml @@ -57,7 +57,7 @@ Adresa servera https://... Používateľské meno Heslo - Ešte nemáte server? \\nKliknite sem pre jeho získanie od poskytovateľa + Ešte nemáte server? \nKliknite sem pre jeho získanie od poskytovateľa Súbory Pripojiť Nahrať @@ -114,7 +114,7 @@ O Zmeniť heslo Odstrániť účet - Zmazanie účtu %s?\\n\\nZmazanie nebude možné vrátiť späť. + Zmazanie účtu %s?\n\nZmazanie nebude možné vrátiť späť. Vytvoriť účet Odoslať z ... Názov priečinka @@ -458,7 +458,7 @@ Vyhľadať používateľov alebo skupiny %1$s (skupina) Je nám ľúto, verzia vášho servera neumožňuje sprístupňovanie obsahu používateľom alebo skupinám. -\\nProsím, obráťte sa na svojho správcu +\nProsím, obráťte sa na svojho správcu môže sprístupniť môže upraviť vytvoriť @@ -499,7 +499,7 @@ Neboli nájdené žiadne multimediálne priečinky. Nastavenia automatického nahratia Nastavenia - Okamžité nahrávanie bolo kompletne prepracované. Prezrite si prosím hlavné menu a znovu nastavte automatické nahrávanie. Ospravedlňujeme sa za vzniknuté problémy.\\n\\nUžite si nové, rozšírene možnosti automatického nahrávania! + Okamžité nahrávanie bolo kompletne prepracované. Prezrite si prosím hlavné menu a znovu nastavte automatické nahrávanie. Ospravedlňujeme sa za vzniknuté problémy.\n\nUžite si nové, rozšírene možnosti automatického nahrávania! Pre %1$s %d vybraný From 5de187076cb3f295de5bb46d8a0e8d76afafda78 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Fri, 17 Feb 2017 01:19:23 +0000 Subject: [PATCH 065/881] [tx-robot] updated from transifex --- res/values-lv/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index fdb6477bf4..e93c736f28 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -426,6 +426,8 @@ %1$s (e-pasts) %1$s ( uz %2$s ) + Atvainojiet, jūsu servera versija neļauj koplietot ar lietotājiem klientiem. + \\nLūdzu, sazinieties ar administratoru var koplietot var rediģēt izveidot From 7529084f825ed198da3422cc9d8bdf0949b17a91 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 15 Feb 2017 08:59:28 +0100 Subject: [PATCH 066/881] Set package name on all sticky intents --- .../files/services/FileDownloader.java | 2 + .../android/files/services/FileUploader.java | 4 +- .../operations/RefreshFolderOperation.java | 1 + .../android/services/SyncFolderHandler.java | 2 + .../android/syncadapter/FileSyncAdapter.java | 39 ++++++++++--------- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/com/owncloud/android/files/services/FileDownloader.java b/src/com/owncloud/android/files/services/FileDownloader.java index 40abc46b6e..0c0d0e427e 100644 --- a/src/com/owncloud/android/files/services/FileDownloader.java +++ b/src/com/owncloud/android/files/services/FileDownloader.java @@ -631,6 +631,7 @@ public class FileDownloader extends Service if (unlinkedFromRemotePath != null) { end.putExtra(EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath); } + end.setPackage(getPackageName()); sendStickyBroadcast(end); } @@ -648,6 +649,7 @@ public class FileDownloader extends Service added.putExtra(EXTRA_REMOTE_PATH, download.getRemotePath()); added.putExtra(EXTRA_FILE_PATH, download.getSavePath()); added.putExtra(EXTRA_LINKED_TO_PATH, linkedToRemotePath); + added.setPackage(getPackageName()); sendStickyBroadcast(added); } diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 3859fc42ef..876b8d4ca2 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -1124,6 +1124,7 @@ public class FileUploader extends Service private void sendBroadcastUploadsAdded() { Intent start = new Intent(getUploadsAddedMessage()); // nothing else needed right now + start.setPackage(getPackageName()); sendStickyBroadcast(start); } @@ -1144,6 +1145,7 @@ public class FileUploader extends Service start.putExtra(EXTRA_OLD_FILE_PATH, upload.getOriginalStoragePath()); start.putExtra(ACCOUNT_NAME, upload.getAccount().name); + start.setPackage(getPackageName()); sendStickyBroadcast(start); } @@ -1177,7 +1179,7 @@ public class FileUploader extends Service if (unlinkedFromRemotePath != null) { end.putExtra(EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath); } - + end.setPackage(getPackageName()); sendStickyBroadcast(end); } diff --git a/src/com/owncloud/android/operations/RefreshFolderOperation.java b/src/com/owncloud/android/operations/RefreshFolderOperation.java index 2f1ab9934a..df320f8d94 100644 --- a/src/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/src/com/owncloud/android/operations/RefreshFolderOperation.java @@ -523,6 +523,7 @@ public class RefreshFolderOperation extends RemoteOperation { intent.putExtra(FileSyncAdapter.EXTRA_FOLDER_PATH, dirRemotePath); } intent.putExtra(FileSyncAdapter.EXTRA_RESULT, result); + intent.setPackage(mContext.getPackageName()); mContext.sendStickyBroadcast(intent); //LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent); } diff --git a/src/com/owncloud/android/services/SyncFolderHandler.java b/src/com/owncloud/android/services/SyncFolderHandler.java index e1c7e35cd5..874487a182 100644 --- a/src/com/owncloud/android/services/SyncFolderHandler.java +++ b/src/com/owncloud/android/services/SyncFolderHandler.java @@ -182,6 +182,7 @@ class SyncFolderHandler extends Handler { added.putExtra(FileDownloader.EXTRA_REMOTE_PATH, remotePath); added.putExtra(FileDownloader.EXTRA_FILE_PATH, FileStorageUtils.getSavePath(account.name) + remotePath); + added.setPackage(mService.getPackageName()); mService.sendStickyBroadcast(added); } @@ -197,6 +198,7 @@ class SyncFolderHandler extends Handler { finished.putExtra(FileDownloader.EXTRA_FILE_PATH, FileStorageUtils.getSavePath(account.name) + remotePath); finished.putExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, success); + finished.setPackage(mService.getPackageName()); mService.sendStickyBroadcast(finished); } } diff --git a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java index 8689d25701..f8c5cb83d8 100644 --- a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -22,25 +22,6 @@ package com.owncloud.android.syncadapter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.jackrabbit.webdav.DavException; - -import com.owncloud.android.R; -import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.operations.RefreshFolderOperation; -import com.owncloud.android.operations.UpdateOCVersionOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity; - import android.accounts.Account; import android.accounts.AccountsException; import android.app.NotificationManager; @@ -54,6 +35,25 @@ import android.content.SyncResult; import android.os.Bundle; import android.support.v4.app.NotificationCompat; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.operations.RefreshFolderOperation; +import com.owncloud.android.operations.UpdateOCVersionOperation; +import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity; + +import org.apache.jackrabbit.webdav.DavException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * Implementation of {@link AbstractThreadedSyncAdapter} responsible for synchronizing * ownCloud files. @@ -376,6 +376,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (result != null) { intent.putExtra(FileSyncAdapter.EXTRA_RESULT, result); } + intent.setPackage(getContext().getPackageName()); getContext().sendStickyBroadcast(intent); //LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); } From f3c735050d5d5a9873ec0a1a5804a2460eece202 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 15 Feb 2017 09:42:45 +0100 Subject: [PATCH 067/881] Update one more broadcast --- src/com/owncloud/android/datamodel/FileDataStorageManager.java | 1 + src/com/owncloud/android/files/services/FileUploader.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index cb33f54b72..ce2abfbe78 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -1627,6 +1627,7 @@ public class FileDataStorageManager { if (path != null) { Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent.setData(Uri.fromFile(new File(path))); + intent.setPackage(MainApp.getAppContext().getPackageName()) MainApp.getAppContext().sendBroadcast(intent); } } diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 876b8d4ca2..d797c1d20b 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -54,7 +54,6 @@ import com.owncloud.android.datamodel.UploadsStorageManager; import com.owncloud.android.datamodel.UploadsStorageManager.UploadStatus; import com.owncloud.android.db.OCUpload; import com.owncloud.android.db.UploadResult; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; @@ -64,10 +63,10 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCo import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.status.OwnCloudVersion; -import com.owncloud.android.ui.notifications.NotificationUtils; import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.UploadListActivity; +import com.owncloud.android.ui.notifications.NotificationUtils; import com.owncloud.android.utils.ErrorMessageAdapter; import java.io.File; From db0620bab43e184955f9ff4ff43d47af36d23d7e Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 15 Feb 2017 11:43:53 +0100 Subject: [PATCH 068/881] Add missing ; --- src/com/owncloud/android/datamodel/FileDataStorageManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index ce2abfbe78..7e5c9f3812 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -1627,7 +1627,7 @@ public class FileDataStorageManager { if (path != null) { Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent.setData(Uri.fromFile(new File(path))); - intent.setPackage(MainApp.getAppContext().getPackageName()) + intent.setPackage(MainApp.getAppContext().getPackageName()); MainApp.getAppContext().sendBroadcast(intent); } } From bc0bbd784272f07ffb5a20f9105fd6dd101c4e94 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sun, 19 Feb 2017 19:05:07 +0100 Subject: [PATCH 069/881] Revert "Update one more broadcast" This reverts commit 7abc8f12469cead1394167abe63716cf5e24afe0. # Conflicts: # src/com/owncloud/android/datamodel/FileDataStorageManager.java --- src/com/owncloud/android/datamodel/FileDataStorageManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index 7e5c9f3812..cb33f54b72 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -1627,7 +1627,6 @@ public class FileDataStorageManager { if (path != null) { Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent.setData(Uri.fromFile(new File(path))); - intent.setPackage(MainApp.getAppContext().getPackageName()); MainApp.getAppContext().sendBroadcast(intent); } } From 8b6d441b6a28d661ba1095e4a9211d5623fdf398 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 19 Jan 2017 13:44:51 +0100 Subject: [PATCH 070/881] Fixes #456 --- res/layout/preview_image_fragment.xml | 11 +++++------ .../android/ui/preview/PreviewImageFragment.java | 13 +++++++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/res/layout/preview_image_fragment.xml b/res/layout/preview_image_fragment.xml index 14f24aaabc..1f28690155 100644 --- a/res/layout/preview_image_fragment.xml +++ b/res/layout/preview_image_fragment.xml @@ -31,10 +31,9 @@ android:id="@+id/top" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#000000" - tools:context=".ui.fragment.PreviewImageFragment" > + android:background="#000000"> - - + Date: Thu, 19 Jan 2017 13:48:13 +0100 Subject: [PATCH 071/881] Toggle full screen on image click --- .../owncloud/android/ui/preview/PreviewImageFragment.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index a1da89793a..19caf0b436 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -158,6 +158,13 @@ public class PreviewImageFragment extends FileFragment { } }); + mImageView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + ((PreviewImageActivity) getActivity()).toggleFullScreen(); + } + }); + mMessageView = (TextView)view.findViewById(R.id.message); mMessageView.setVisibility(View.GONE); mProgressWheel = (ProgressBar)view.findViewById(R.id.progressWheel); From 423252d923f4b75d7ce7e4620c6e9627bffac729 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 19 Jan 2017 13:49:51 +0100 Subject: [PATCH 072/881] Add a dot, just in case --- src/com/owncloud/android/ui/preview/PreviewImageFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 19caf0b436..3bdfe1fecb 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -450,7 +450,7 @@ public class PreviewImageFragment extends FileFragment { Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); break; } else { - if (ocFile.getFileName().endsWith("jpg") || ocFile.getFileName().endsWith("jpeg")) { + if (ocFile.getFileName().endsWith(".jpg") || ocFile.getFileName().endsWith(".jpeg")) { // Rotate image, obeying exif tag. result = BitmapUtils.rotateImage(result, storagePath); } From f5c40a1cfa82ac2c68ec4517e436d773c7263233 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 19 Jan 2017 21:41:38 +0100 Subject: [PATCH 073/881] Fix an issue with pinch to zoom --- res/layout/preview_image_fragment.xml | 6 +++-- .../ui/preview/PreviewImageFragment.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/res/layout/preview_image_fragment.xml b/res/layout/preview_image_fragment.xml index 1f28690155..2f698f0f2b 100644 --- a/res/layout/preview_image_fragment.xml +++ b/res/layout/preview_image_fragment.xml @@ -31,7 +31,8 @@ android:id="@+id/top" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#000000"> + android:background="#000000" + android:animateLayoutChanges="true"> + android:src="@drawable/image_fail" + /> Date: Fri, 20 Jan 2017 19:50:46 +0100 Subject: [PATCH 074/881] Few small tweaks --- res/layout/preview_image_fragment.xml | 4 +- .../ui/preview/PreviewImageFragment.java | 49 ++++++++++--------- .../michaelOrtiz/TouchImageViewCustom.java | 4 +- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/res/layout/preview_image_fragment.xml b/res/layout/preview_image_fragment.xml index 2f698f0f2b..f4ffd1dcba 100644 --- a/res/layout/preview_image_fragment.xml +++ b/res/layout/preview_image_fragment.xml @@ -45,8 +45,8 @@ Date: Fri, 20 Jan 2017 19:54:07 +0100 Subject: [PATCH 075/881] Remove useless variables --- src/com/owncloud/android/ui/preview/PreviewImageFragment.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index b6e6cd2698..ab955c1652 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -81,7 +81,6 @@ public class PreviewImageFragment extends FileFragment { private TouchImageViewCustom mImageView; private TextView mMessageView; private ProgressBar mProgressWheel; - private RelativeLayout mRelativeLayout; public Bitmap mBitmap = null; @@ -91,9 +90,6 @@ public class PreviewImageFragment extends FileFragment { private LoadBitmapTask mLoadBitmapTask = null; - private boolean weZoomedAlready; - - /** * Public factory method to create a new fragment that previews an image. * From 6b45af9a91f8f4a5a42d270518ecdfe5f30f7a35 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 20 Jan 2017 19:55:38 +0100 Subject: [PATCH 076/881] Remove a variable --- src/com/owncloud/android/ui/preview/PreviewImageFragment.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index ab955c1652..868bddd39d 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -42,7 +42,6 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; -import android.widget.RelativeLayout; import android.widget.TextView; import com.owncloud.android.R; @@ -154,7 +153,6 @@ public class PreviewImageFragment extends FileFragment { super.onCreateView(inflater, container, savedInstanceState); View view = inflater.inflate(R.layout.preview_image_fragment, container, false); mImageView = (TouchImageViewCustom) view.findViewById(R.id.image); - mRelativeLayout = (RelativeLayout) view.findViewById(R.id.top); mImageView.setVisibility(View.GONE); view.setOnClickListener(new OnClickListener() { From caccef129bab0ba7cf071ea61c4a0b592706896d Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 20 Jan 2017 20:11:19 +0100 Subject: [PATCH 077/881] Remove another variable --- src/com/owncloud/android/ui/preview/PreviewImageFragment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 868bddd39d..76cabcb7c4 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -525,7 +525,6 @@ public class PreviewImageFragment extends FileFragment { if (result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { - Drawable backrepeat = getResources().getDrawable(R.drawable.backrepeat); Resources r = getResources(); Drawable[] layers = new Drawable[2]; layers[0] = r.getDrawable(R.drawable.backrepeat); From f95ffb4886e822cb2381a00827c3462b1cb92e24 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 23 Jan 2017 12:18:25 +0100 Subject: [PATCH 078/881] First step towards nicer empty/error views --- res/layout/preview_image_fragment.xml | 48 ++++---- .../ui/preview/PreviewImageFragment.java | 110 +++++++++--------- 2 files changed, 76 insertions(+), 82 deletions(-) diff --git a/res/layout/preview_image_fragment.xml b/res/layout/preview_image_fragment.xml index f4ffd1dcba..7d8ae1ad7e 100644 --- a/res/layout/preview_image_fragment.xml +++ b/res/layout/preview_image_fragment.xml @@ -27,41 +27,35 @@ android:gravity="center_horizontal" --> + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".ui.fragment.PreviewImageFragment"> - + android:src="@drawable/image_fail"/> + + + + + + + + + + - \ No newline at end of file diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 76cabcb7c4..e06c005150 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -31,6 +31,8 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.DrawableRes; +import android.support.annotation.StringRes; import android.support.v4.app.FragmentStatePagerAdapter; import android.util.DisplayMetrics; import android.view.LayoutInflater; @@ -41,7 +43,9 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.RelativeLayout; import android.widget.TextView; import com.owncloud.android.R; @@ -78,8 +82,14 @@ public class PreviewImageFragment extends FileFragment { private static final String ARG_IGNORE_FIRST = "IGNORE_FIRST"; private TouchImageViewCustom mImageView; - private TextView mMessageView; - private ProgressBar mProgressWheel; + private RelativeLayout mMultiView; + + protected LinearLayout mMultiListContainer; + protected TextView mMultiListMessage; + protected TextView mMultiListHeadline; + protected ImageView mMultiListIcon; + protected ProgressBar mMultiListProgress; + public Bitmap mBitmap = null; @@ -169,14 +179,22 @@ public class PreviewImageFragment extends FileFragment { } }); - mMessageView = (TextView)view.findViewById(R.id.message); - mMessageView.setVisibility(View.GONE); - mProgressWheel = (ProgressBar)view.findViewById(R.id.progressWheel); - mProgressWheel.setVisibility(View.VISIBLE); + mMultiView = (RelativeLayout) view.findViewById(R.id.multi_view); + + setupMultiView(view); + setMultiListLoadingMessage(); return view; } + protected void setupMultiView(View view) { + mMultiListContainer = (LinearLayout) view.findViewById(R.id.empty_list_view); + mMultiListMessage = (TextView) view.findViewById(R.id.empty_list_view_text); + mMultiListHeadline = (TextView) view.findViewById(R.id.empty_list_view_headline); + mMultiListIcon = (ImageView) view.findViewById(R.id.empty_list_icon); + mMultiListProgress = (ProgressBar) view.findViewById(R.id.empty_list_progress); + } + /** * {@inheritDoc} */ @@ -214,7 +232,7 @@ public class PreviewImageFragment extends FileFragment { public void onStart() { super.onStart(); if (getFile() != null) { - mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel); + mLoadBitmapTask = new LoadBitmapTask(mImageView); //mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()}); // mLoadBitmapTask.execute(getFile().getStoragePath()); mLoadBitmapTask.execute(getFile()); @@ -381,29 +399,12 @@ public class PreviewImageFragment extends FileFragment { /** * Weak reference to the target {@link ImageView} where the bitmap will be loaded into. - * + *

* Using a weak reference will avoid memory leaks if the target ImageView is retired from * memory before the load finishes. */ private final WeakReference mImageViewRef; - /** - * Weak reference to the target {@link TextView} where error messages will be written. - * - * Using a weak reference will avoid memory leaks if the target ImageView is retired from - * memory before the load finishes. - */ - private final WeakReference mMessageViewRef; - - - /** - * Weak reference to the target {@link ProgressBar} shown while the load is in progress. - * - * Using a weak reference will avoid memory leaks if the target ImageView is retired from - * memory before the load finishes. - */ - private final WeakReference mProgressWheelRef; - /** * Error message to show when a load fails @@ -416,11 +417,8 @@ public class PreviewImageFragment extends FileFragment { * * @param imageView Target {@link ImageView} where the bitmap will be loaded into. */ - public LoadBitmapTask(ImageViewCustom imageView, TextView messageView, - ProgressBar progressWheel) { + public LoadBitmapTask(ImageViewCustom imageView) { mImageViewRef = new WeakReference(imageView); - mMessageViewRef = new WeakReference(messageView); - mProgressWheelRef = new WeakReference(progressWheel); } @Override @@ -502,14 +500,12 @@ public class PreviewImageFragment extends FileFragment { @Override protected void onPostExecute(LoadImage result) { - hideProgressWheel(); if (result.bitmap != null) { showLoadedImage(result); - } - else { + } else { showErrorMessage(); } - if (result.bitmap != null && mBitmap != result.bitmap) { + if (result.bitmap != null && mBitmap != result.bitmap) { // unused bitmap, release it! (just in case) result.bitmap.recycle(); } @@ -546,36 +542,40 @@ public class PreviewImageFragment extends FileFragment { } imageView.setVisibility(View.VISIBLE); - mBitmap = bitmap; // needs to be kept for recycling when not useful + mBitmap = bitmap; // needs to be kept for recycling when not useful } - final TextView messageView = mMessageViewRef.get(); - if (messageView != null) { - messageView.setVisibility(View.GONE); - } // else , silently finish, the fragment was destroyed + mMultiView.setVisibility(View.GONE); + mImageView.setVisibility(View.VISIBLE); + } private void showErrorMessage() { - final ImageView imageView = mImageViewRef.get(); - if (imageView != null) { - // shows the default error icon - imageView.setVisibility(View.VISIBLE); - } // else , silently finish, the fragment was destroyed - - final TextView messageView = mMessageViewRef.get(); - if (messageView != null) { - messageView.setText(mErrorMessageId); - messageView.setVisibility(View.VISIBLE); - } // else , silently finish, the fragment was destroyed - } - - private void hideProgressWheel() { - final ProgressBar progressWheel = mProgressWheelRef.get(); - if (progressWheel != null) { - progressWheel.setVisibility(View.GONE); + if (getActivity() != null && (getActivity() instanceof PreviewImageActivity)) { + ((PreviewImageActivity) getActivity()).toggleFullScreen(); } + setMessageForMultiList(mErrorMessageId, R.drawable.file_image); } + } + private void setMultiListLoadingMessage() { + if (mMultiView != null) { + mMultiListHeadline.setText(R.string.file_list_loading); + mMultiListMessage.setText(""); + + mMultiListIcon.setVisibility(View.GONE); + mMultiListProgress.setVisibility(View.VISIBLE); + } + } + + public void setMessageForMultiList(@StringRes int headline, @DrawableRes int icon) { + if (mMultiListContainer != null && mMultiListMessage != null) { + mMultiListHeadline.setText(headline); + mMultiListIcon.setImageResource(icon); + + mMultiListIcon.setVisibility(View.VISIBLE); + mMultiListProgress.setVisibility(View.GONE); + } } /** From 1eeb4efc1e434b5e84626be34b7caf1347fd4ffc Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 23 Jan 2017 12:34:47 +0100 Subject: [PATCH 079/881] Add nicer text loading --- res/layout/text_file_preview.xml | 32 ++++++-- .../ui/preview/PreviewTextFragment.java | 74 ++++++++++--------- 2 files changed, 65 insertions(+), 41 deletions(-) diff --git a/res/layout/text_file_preview.xml b/res/layout/text_file_preview.xml index fabac449fa..b95996501e 100644 --- a/res/layout/text_file_preview.xml +++ b/res/layout/text_file_preview.xml @@ -21,11 +21,31 @@ android:layout_height="match_parent" android:fillViewport="true"> - + android:layout_height="match_parent"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/com/owncloud/android/ui/preview/PreviewTextFragment.java index e2953d918d..dd3c07ec77 100644 --- a/src/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -22,15 +22,16 @@ package com.owncloud.android.ui.preview; import android.accounts.Account; import android.os.AsyncTask; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; import android.widget.TextView; import com.owncloud.android.R; @@ -39,7 +40,6 @@ import com.owncloud.android.files.FileMenuFilter; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; -import com.owncloud.android.ui.dialog.LoadingDialog; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.MimeTypeUtil; @@ -63,6 +63,15 @@ public class PreviewTextFragment extends FileFragment { private TextView mTextPreview; private TextLoadAsyncTask mTextLoadTask; + private RelativeLayout mMultiView; + + protected LinearLayout mMultiListContainer; + protected TextView mMultiListMessage; + protected TextView mMultiListHeadline; + protected ImageView mMultiListIcon; + protected ProgressBar mMultiListProgress; + + /** * Creates an empty fragment for previews. *

@@ -91,9 +100,33 @@ public class PreviewTextFragment extends FileFragment { mTextPreview = (TextView) ret.findViewById(R.id.text_preview); + mMultiView = (RelativeLayout) ret.findViewById(R.id.multi_view); + + setupMultiView(ret); + setMultiListLoadingMessage(); + return ret; } + protected void setupMultiView(View view) { + mMultiListContainer = (LinearLayout) view.findViewById(R.id.empty_list_view); + mMultiListMessage = (TextView) view.findViewById(R.id.empty_list_view_text); + mMultiListHeadline = (TextView) view.findViewById(R.id.empty_list_view_headline); + mMultiListIcon = (ImageView) view.findViewById(R.id.empty_list_icon); + mMultiListProgress = (ProgressBar) view.findViewById(R.id.empty_list_progress); + } + + private void setMultiListLoadingMessage() { + if (mMultiView != null) { + mMultiListHeadline.setText(R.string.file_list_loading); + mMultiListMessage.setText(""); + + mMultiListIcon.setVisibility(View.GONE); + mMultiListProgress.setVisibility(View.VISIBLE); + } + } + + /** * {@inheritDoc} */ @@ -166,7 +199,6 @@ public class PreviewTextFragment extends FileFragment { @Override protected void onPreExecute() { - showLoadingDialog(); } @Override @@ -222,39 +254,12 @@ public class PreviewTextFragment extends FileFragment { textView.setVisibility(View.VISIBLE); } - dismissLoadingDialog(); - } - - /** - * Show loading dialog - */ - public void showLoadingDialog() { - // only once - Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); - LoadingDialog loading = null; - if (frag == null) { - // Construct dialog - loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); - FragmentManager fm = getActivity().getSupportFragmentManager(); - FragmentTransaction ft = fm.beginTransaction(); - loading.show(ft, DIALOG_WAIT_TAG); - } else { - loading = (LoadingDialog) frag; - loading.setShowsDialog(true); + if (mMultiView != null) { + mMultiView.setVisibility(View.GONE); } } - /** - * Dismiss loading dialog - */ - public void dismissLoadingDialog() { - final Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); - if (frag != null) { - LoadingDialog loading = (LoadingDialog) frag; - loading.dismissAllowingStateLoss(); - } - } } /** @@ -409,7 +414,6 @@ public class PreviewTextFragment extends FileFragment { Log_OC.e(TAG, "onStop"); if (mTextLoadTask != null) { mTextLoadTask.cancel(Boolean.TRUE); - mTextLoadTask.dismissLoadingDialog(); } } From d9fa7b616b898a95952cfb8f1cac4a5971ee9b6a Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 23 Jan 2017 12:47:30 +0100 Subject: [PATCH 080/881] Change the wording --- res/values-en-rGB/strings.xml | 5 +++-- res/values/strings.xml | 5 +++-- .../owncloud/android/ui/preview/PreviewImageFragment.java | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 00276ec159..0e71f96386 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -313,9 +313,10 @@ Keep both local version server version - + + Sorry about that! Image preview - This image cannot be shown + Image can\'t be shown %1$s could not be copied to %2$s local folder Instant upload folder diff --git a/res/values/strings.xml b/res/values/strings.xml index c946ccd751..33fa8edfab 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -313,9 +313,10 @@ Keep both local version server version - + + Sorry about that! Image preview - This image cannot be shown + Image can\'t be shown %1$s could not be copied to %2$s local folder Instant upload folder diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index e06c005150..29d1c96cc2 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -554,7 +554,7 @@ public class PreviewImageFragment extends FileFragment { if (getActivity() != null && (getActivity() instanceof PreviewImageActivity)) { ((PreviewImageActivity) getActivity()).toggleFullScreen(); } - setMessageForMultiList(mErrorMessageId, R.drawable.file_image); + setMessageForMultiList(mErrorMessageId, R.string.preview_sorry, R.drawable.file_image); } } @@ -568,9 +568,10 @@ public class PreviewImageFragment extends FileFragment { } } - public void setMessageForMultiList(@StringRes int headline, @DrawableRes int icon) { + public void setMessageForMultiList(@StringRes int headline, @StringRes int message, @DrawableRes int icon) { if (mMultiListContainer != null && mMultiListMessage != null) { mMultiListHeadline.setText(headline); + mMultiListMessage.setText(message); mMultiListIcon.setImageResource(icon); mMultiListIcon.setVisibility(View.VISIBLE); From d8395d57b9db201aa5cc8e0d588a5957be80823e Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 23 Jan 2017 13:29:13 +0100 Subject: [PATCH 081/881] Improve video errors and loading --- res/layout/file_preview.xml | 103 +++++++++++------- .../ui/preview/PreviewMediaFragment.java | 78 ++++++++++--- 2 files changed, 123 insertions(+), 58 deletions(-) diff --git a/res/layout/file_preview.xml b/res/layout/file_preview.xml index 887e26ccd9..5e1d67aeaa 100644 --- a/res/layout/file_preview.xml +++ b/res/layout/file_preview.xml @@ -19,46 +19,69 @@ --> + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/top" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + tools:context=".ui.fragment.FilePreviewFragment"> + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - \ No newline at end of file diff --git a/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java index ff2d66bf96..7d00504e1e 100644 --- a/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -23,7 +23,6 @@ import android.accounts.Account; import android.app.Activity; import android.content.ComponentName; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.content.res.Configuration; @@ -37,7 +36,8 @@ import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.os.IBinder; -import android.support.v7.app.AlertDialog; +import android.support.annotation.DrawableRes; +import android.support.annotation.StringRes; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -47,6 +47,10 @@ import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; @@ -69,7 +73,7 @@ import com.owncloud.android.utils.MimeTypeUtil; * * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link Account} values will * produce an {@link IllegalStateException}. - * + * * By now, if the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is * generated on instantiation too. */ @@ -87,6 +91,15 @@ public class PreviewMediaFragment extends FileFragment implements private VideoView mVideoPreview; private int mSavedPlaybackPosition; + private RelativeLayout mMultiView; + private RelativeLayout mPreviewContainer; + + protected LinearLayout mMultiListContainer; + protected TextView mMultiListMessage; + protected TextView mMultiListHeadline; + protected ImageView mMultiListIcon; + protected ProgressBar mMultiListProgress; + private MediaServiceBinder mMediaServiceBinder = null; private MediaControlView mMediaController = null; private MediaServiceConnection mMediaServiceConnection = null; @@ -156,16 +169,50 @@ public class PreviewMediaFragment extends FileFragment implements mView = inflater.inflate(R.layout.file_preview, container, false); + mPreviewContainer = (RelativeLayout) mView.findViewById(R.id.file_preview_container); mImagePreview = (ImageView) mView.findViewById(R.id.image_preview); mVideoPreview = (VideoView) mView.findViewById(R.id.video_preview); mVideoPreview.setOnTouchListener(this); mMediaController = (MediaControlView) mView.findViewById(R.id.media_controller); + mMultiView = (RelativeLayout) mView.findViewById(R.id.multi_view); + setupMultiView(mView); + setMultiListLoadingMessage(); return mView; } + protected void setupMultiView(View view) { + mMultiListContainer = (LinearLayout) view.findViewById(R.id.empty_list_view); + mMultiListMessage = (TextView) view.findViewById(R.id.empty_list_view_text); + mMultiListHeadline = (TextView) view.findViewById(R.id.empty_list_view_headline); + mMultiListIcon = (ImageView) view.findViewById(R.id.empty_list_icon); + mMultiListProgress = (ProgressBar) view.findViewById(R.id.empty_list_progress); + } + + private void setMultiListLoadingMessage() { + if (mMultiView != null) { + mMultiListHeadline.setText(R.string.file_list_loading); + mMultiListMessage.setText(""); + + mMultiListIcon.setVisibility(View.GONE); + mMultiListProgress.setVisibility(View.VISIBLE); + } + } + + public void setMessageForMultiList(String headline, @StringRes int message, @DrawableRes int icon) { + if (mMultiListContainer != null && mMultiListMessage != null) { + mMultiListHeadline.setText(headline); + mMultiListMessage.setText(message); + mMultiListIcon.setImageResource(icon); + + mMultiListIcon.setVisibility(View.VISIBLE); + mMultiListProgress.setVisibility(View.GONE); + } + } + + /** * {@inheritDoc} */ @@ -196,6 +243,7 @@ public class PreviewMediaFragment extends FileFragment implements mAutoplay = savedInstanceState.getBoolean(PreviewMediaFragment.EXTRA_PLAYING); } + if (file != null && file.isDown()) { if (MimeTypeUtil.isVideo(file)) { mVideoPreview.setVisibility(View.VISIBLE); @@ -447,6 +495,8 @@ public class PreviewMediaFragment extends FileFragment implements @Override public void onPrepared(MediaPlayer vp) { Log_OC.v(TAG, "onPrepared"); + mMultiView.setVisibility(View.GONE); + mPreviewContainer.setVisibility(View.VISIBLE); mVideoPreview.seekTo(mSavedPlaybackPosition); if (mAutoplay) { mVideoPreview.start(); @@ -484,20 +534,12 @@ public class PreviewMediaFragment extends FileFragment implements @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log_OC.e(TAG, "Error in video playback, what = " + what + ", extra = " + extra); + mPreviewContainer.setVisibility(View.GONE); if (mVideoPreview.getWindowToken() != null) { String message = MediaService.getMessageForMediaError( getActivity(), what, extra); - new AlertDialog.Builder(getActivity()) - .setMessage(message) - .setPositiveButton(android.R.string.VideoView_error_button, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - dialog.dismiss(); - VideoHelper.this.onCompletion(null); - } - }) - .setCancelable(false) - .show(); + mMultiView.setVisibility(View.VISIBLE); + setMessageForMultiList(message, R.string.preview_sorry, R.drawable.file_movie); } return true; } @@ -548,7 +590,7 @@ public class PreviewMediaFragment extends FileFragment implements if (event.getX() / Resources.getSystem().getDisplayMetrics().density > 24.0) { startFullScreenVideo(); } - return true; + return true; } return false; } @@ -604,11 +646,11 @@ public class PreviewMediaFragment extends FileFragment implements } getActivity().bindService( new Intent(getActivity(), MediaService.class), - mMediaServiceConnection, + mMediaServiceConnection, Context.BIND_AUTO_CREATE); // follow the flow in MediaServiceConnection#onServiceConnected(...) } - + /** Defines callbacks for service binding, passed to bindService() */ private class MediaServiceConnection implements ServiceConnection { @@ -649,7 +691,7 @@ public class PreviewMediaFragment extends FileFragment implements else { Toast.makeText( getActivity(), - "No media controller to release when disconnected from media service", + "No media controller to release when disconnected from media service", Toast.LENGTH_SHORT).show(); } mMediaServiceBinder = null; From 1b6593103d9d4f5f6b480476b76079df38f701c4 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 23 Jan 2017 23:40:41 +0100 Subject: [PATCH 082/881] Initially show system UI for image --- .../ui/preview/PreviewImageActivity.java | 42 +------------------ .../ui/preview/PreviewImageFragment.java | 7 ++-- 2 files changed, 4 insertions(+), 45 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index b232af58cb..b07d3c61de 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -28,9 +28,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.os.IBinder; -import android.os.Message; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; @@ -104,8 +102,6 @@ public class PreviewImageActivity extends FileActivity implements // ActionBar ActionBar actionBar = getSupportActionBar(); updateActionBarTitleAndHomeButton(null); - actionBar.hide(); - mFullScreenAnchorView = getWindow().getDecorView(); // to keep our UI controls visibility in line with system bars visibility @@ -164,43 +160,7 @@ public class PreviewImageActivity extends FileActivity implements mRequestWaitingForBinder = true; } } - - - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - - // Trigger the initial hide() shortly after the activity has been - // created, to briefly hint to the user that UI controls - // are available - delayedHide(INITIAL_HIDE_DELAY); - - } - - Handler mHideSystemUiHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - hideSystemUI(mFullScreenAnchorView); - getSupportActionBar().hide(); - } - }; - - private void delayedHide(int delayMillis) { - mHideSystemUiHandler.removeMessages(0); - mHideSystemUiHandler.sendEmptyMessageDelayed(0, delayMillis); - } - - /// handle Window Focus changes - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - - // When the window loses focus (e.g. the action overflow is shown), - // cancel any pending hide action. - if (!hasFocus) { - mHideSystemUiHandler.removeMessages(0); - } - } - + @Override public void onStart() { super.onStart(); diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 29d1c96cc2..7a951bad03 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -168,7 +168,9 @@ public class PreviewImageFragment extends FileFragment { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - ((PreviewImageActivity) getActivity()).toggleFullScreen(); + if (getActivity() != null && (getActivity() instanceof PreviewImageActivity)) { + ((PreviewImageActivity) getActivity()).toggleFullScreen(); + } } }); @@ -551,9 +553,6 @@ public class PreviewImageFragment extends FileFragment { } private void showErrorMessage() { - if (getActivity() != null && (getActivity() instanceof PreviewImageActivity)) { - ((PreviewImageActivity) getActivity()).toggleFullScreen(); - } setMessageForMultiList(mErrorMessageId, R.string.preview_sorry, R.drawable.file_image); } } From 5ad1b56a47d018454b3b4ecba7a83ab5c1698cde Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 24 Jan 2017 01:17:04 +0100 Subject: [PATCH 083/881] Add magic --- .../ui/preview/PreviewImageActivity.java | 4 + .../ui/preview/PreviewImageFragment.java | 86 ++++++++++++++----- 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index b07d3c61de..9a6a261cf1 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -423,6 +423,10 @@ public class PreviewImageActivity extends FileActivity implements } + public boolean getSystemUIVisible() { + return (mFullScreenAnchorView.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; + } + @SuppressLint("InlinedApi") public void toggleFullScreen() { diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 7a951bad03..3afd5b0cc2 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -70,7 +70,7 @@ import third_parties.michaelOrtiz.TouchImageViewCustom; * * Trying to get an instance with a NULL {@link OCFile} will produce an * {@link IllegalStateException}. - * + * * If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on * instantiation too. */ @@ -123,13 +123,13 @@ public class PreviewImageFragment extends FileFragment { } - + /** * Creates an empty fragment for image previews. - * + * * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically * (for instance, when the device is turned a aside). - * + * * DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful * construction */ @@ -168,9 +168,8 @@ public class PreviewImageFragment extends FileFragment { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - if (getActivity() != null && (getActivity() instanceof PreviewImageActivity)) { - ((PreviewImageActivity) getActivity()).toggleFullScreen(); - } + ((PreviewImageActivity) getActivity()).toggleFullScreen(); + toggleImageBackground(); } }); @@ -178,6 +177,7 @@ public class PreviewImageFragment extends FileFragment { @Override public void onClick(View v) { ((PreviewImageActivity) getActivity()).toggleFullScreen(); + toggleImageBackground(); } }); @@ -396,7 +396,7 @@ public class PreviewImageFragment extends FileFragment { finish(); } - + private class LoadBitmapTask extends AsyncTask { /** @@ -407,6 +407,23 @@ public class PreviewImageFragment extends FileFragment { */ private final WeakReference mImageViewRef; + /** + * Weak reference to the target {@link TextView} where error messages will be written. + * + * Using a weak reference will avoid memory leaks if the target ImageView is retired from + * memory before the load finishes. + */ + private final WeakReference mMessageViewRef; + + + /** + * Weak reference to the target {@link ProgressBar} shown while the load is in progress. + * + * Using a weak reference will avoid memory leaks if the target ImageView is retired from + * memory before the load finishes. + */ + private final WeakReference mProgressWheelRef; + /** * Error message to show when a load fails @@ -523,18 +540,21 @@ public class PreviewImageFragment extends FileFragment { if (result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { - Resources r = getResources(); - Drawable[] layers = new Drawable[2]; - layers[0] = r.getDrawable(R.drawable.backrepeat); - Drawable d = new BitmapDrawable(getResources(), bitmap); - layers[1] = d; - LayerDrawable layerDrawable = new LayerDrawable(layers); - layerDrawable.setLayerHeight(0, (int) convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerHeight(1, (int) convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerWidth(0, (int) convertDpToPixel(bitmap.getWidth(), getActivity())); - layerDrawable.setLayerWidth(1, (int) convertDpToPixel(bitmap.getWidth(), getActivity())); - imageView.setImageDrawable(layerDrawable); - + if (getResources() != null) { + Resources r = getResources(); + Drawable[] layers = new Drawable[2]; + layers[0] = r.getDrawable(R.color.white); + Drawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap); + layers[1] = bitmapDrawable; + LayerDrawable layerDrawable = new LayerDrawable(layers); + layerDrawable.setLayerHeight(0, (int) convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerHeight(1, (int) convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerWidth(0, (int) convertDpToPixel(bitmap.getWidth(), getActivity())); + layerDrawable.setLayerWidth(1, (int) convertDpToPixel(bitmap.getWidth(), getActivity())); + imageView.setImageDrawable(layerDrawable); + } else { + imageView.setImageBitmap(bitmap); + } } if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")) { @@ -581,7 +601,7 @@ public class PreviewImageFragment extends FileFragment { /** * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment} * to be previewed. - * + * * @param file File to test if can be previewed. * @return 'True' if the file can be handled by the fragment. */ @@ -598,6 +618,30 @@ public class PreviewImageFragment extends FileFragment { container.finish(); } + private void toggleImageBackground() { + if (getFile() != null && getFile().getMimetype().equalsIgnoreCase("image/png")) { + if (getActivity() != null && (getActivity() instanceof PreviewImageActivity)) { + PreviewImageActivity previewImageActivity = (PreviewImageActivity) getActivity(); + if (getResources() != null) { + LayerDrawable layerDrawable = (LayerDrawable)mImageView.getDrawable(); + Drawable layerOne; + + if (previewImageActivity.getSystemUIVisible()) { + layerOne = getResources().getDrawable(R.color.white); + } else { + layerOne = getResources().getDrawable(R.drawable.backrepeat); + } + + layerDrawable.setDrawableByLayerId(layerDrawable.getId(0), layerOne); + + mImageView.setImageDrawable(layerDrawable); + } + } + } + } + + + private static float convertDpToPixel(float dp, Context context){ Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); From 9cf274e1ca5045f6de6f44e68e58ae3153c9beb6 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 24 Jan 2017 01:41:05 +0100 Subject: [PATCH 084/881] Make video screen nicer --- res/layout/file_preview.xml | 3 ++- res/layout/media_control.xml | 8 +++++++- src/com/owncloud/android/media/MediaControlView.java | 6 +++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/res/layout/file_preview.xml b/res/layout/file_preview.xml index 5e1d67aeaa..aa63c5234a 100644 --- a/res/layout/file_preview.xml +++ b/res/layout/file_preview.xml @@ -30,7 +30,8 @@ android:id="@+id/file_preview_container" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="invisible"> + android:visibility="invisible" + android:background="@color/black"> + android:layout_alignParentEnd="true" + android:progressDrawable="@color/white" + android:layout_alignParentLeft="true" + android:layout_alignParentRight="true" + android:splitTrack="false"/> diff --git a/src/com/owncloud/android/media/MediaControlView.java b/src/com/owncloud/android/media/MediaControlView.java index 0163f9e0ee..f36048aa9e 100644 --- a/src/com/owncloud/android/media/MediaControlView.java +++ b/src/com/owncloud/android/media/MediaControlView.java @@ -39,12 +39,12 @@ import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; -import java.util.Formatter; -import java.util.Locale; - import com.owncloud.android.R; import com.owncloud.android.utils.DisplayUtils; +import java.util.Formatter; +import java.util.Locale; + /** * View containing controls for a {@link MediaPlayer}. From 90ce5fcea185983efdaff9ac52392b6505c78b10 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 24 Jan 2017 01:48:25 +0100 Subject: [PATCH 085/881] Combine Ifs --- .../ui/preview/PreviewImageFragment.java | 104 +++++++++--------- 1 file changed, 49 insertions(+), 55 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 3afd5b0cc2..651ed35098 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application - * - * @author David A. Velasco - * Copyright (C) 2015 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * ownCloud Android client application * + * @author David A. Velasco + * Copyright (C) 2015 ownCloud Inc. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package com.owncloud.android.ui.preview; @@ -113,7 +112,7 @@ public class PreviewImageFragment extends FileFragment { * {@link FragmentStatePagerAdapter} * ; TODO better solution */ - public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState){ + public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState) { PreviewImageFragment frag = new PreviewImageFragment(); Bundle args = new Bundle(); args.putParcelable(ARG_FILE, imageFile); @@ -123,7 +122,6 @@ public class PreviewImageFragment extends FileFragment { } - /** * Creates an empty fragment for image previews. * @@ -145,9 +143,9 @@ public class PreviewImageFragment extends FileFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); - setFile((OCFile)args.getParcelable(ARG_FILE)); - // TODO better in super, but needs to check ALL the class extending FileFragment; - // not right now + setFile((OCFile) args.getParcelable(ARG_FILE)); + // TODO better in super, but needs to check ALL the class extending FileFragment; + // not right now mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST); setHasOptionsMenu(true); @@ -181,10 +179,10 @@ public class PreviewImageFragment extends FileFragment { } }); - mMultiView = (RelativeLayout) view.findViewById(R.id.multi_view); - - setupMultiView(view); - setMultiListLoadingMessage(); + mMessageView = (TextView) view.findViewById(R.id.message); + mMessageView.setVisibility(View.GONE); + mProgressWheel = (ProgressBar) view.findViewById(R.id.progressWheel); + mProgressWheel.setVisibility(View.VISIBLE); return view; } @@ -273,10 +271,10 @@ public class PreviewImageFragment extends FileFragment { setFile(mContainerActivity.getStorageManager().getFileById(getFile().getFileId())); FileMenuFilter mf = new FileMenuFilter( - getFile(), - mContainerActivity.getStorageManager().getAccount(), - mContainerActivity, - getActivity() + getFile(), + mContainerActivity.getStorageManager().getAccount(), + mContainerActivity, + getActivity() ); mf.filter(menu); } @@ -345,11 +343,11 @@ public class PreviewImageFragment extends FileFragment { mContainerActivity.getFileOperationsHelper().syncFile(getFile()); return true; } - case R.id.action_favorite_file:{ + case R.id.action_favorite_file: { mContainerActivity.getFileOperationsHelper().toggleFavorite(getFile(), true); return true; } - case R.id.action_unfavorite_file:{ + case R.id.action_unfavorite_file: { mContainerActivity.getFileOperationsHelper().toggleFavorite(getFile(), false); return true; } @@ -380,9 +378,9 @@ public class PreviewImageFragment extends FileFragment { if (mBitmap != null) { mBitmap.recycle(); System.gc(); - // putting this in onStop() is just the same; the fragment is always destroyed by - // {@link FragmentStatePagerAdapter} when the fragment in swiped further than the - // valid offscreen distance, and onStop() is never called before than that + // putting this in onStop() is just the same; the fragment is always destroyed by + // {@link FragmentStatePagerAdapter} when the fragment in swiped further than the + // valid offscreen distance, and onStop() is never called before than that } super.onDestroy(); } @@ -559,7 +557,7 @@ public class PreviewImageFragment extends FileFragment { if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")) { imageView.setGIFImageFromStoragePath(result.ocFile.getStoragePath()); - } else if (!result.ocFile.getMimetype().equalsIgnoreCase("image/png")){ + } else if (!result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { imageView.setImageBitmap(bitmap); } @@ -619,33 +617,29 @@ public class PreviewImageFragment extends FileFragment { } private void toggleImageBackground() { - if (getFile() != null && getFile().getMimetype().equalsIgnoreCase("image/png")) { - if (getActivity() != null && (getActivity() instanceof PreviewImageActivity)) { - PreviewImageActivity previewImageActivity = (PreviewImageActivity) getActivity(); - if (getResources() != null) { - LayerDrawable layerDrawable = (LayerDrawable)mImageView.getDrawable(); - Drawable layerOne; + if (getFile() != null && getFile().getMimetype().equalsIgnoreCase("image/png") && getActivity() != null + && getActivity() instanceof PreviewImageActivity && getResources() != null) { + PreviewImageActivity previewImageActivity = (PreviewImageActivity) getActivity(); + LayerDrawable layerDrawable = (LayerDrawable) mImageView.getDrawable(); + Drawable layerOne; - if (previewImageActivity.getSystemUIVisible()) { - layerOne = getResources().getDrawable(R.color.white); - } else { - layerOne = getResources().getDrawable(R.drawable.backrepeat); - } - - layerDrawable.setDrawableByLayerId(layerDrawable.getId(0), layerOne); - - mImageView.setImageDrawable(layerDrawable); - } + if (previewImageActivity.getSystemUIVisible()) { + layerOne = getResources().getDrawable(R.color.white); + } else { + layerOne = getResources().getDrawable(R.drawable.backrepeat); } + + layerDrawable.setDrawableByLayerId(layerDrawable.getId(0), layerOne); + + mImageView.setImageDrawable(layerDrawable); } } - - private static float convertDpToPixel(float dp, Context context){ + private static float convertDpToPixel(float dp, Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); - float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); + float px = dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); return px; } @@ -658,7 +652,7 @@ public class PreviewImageFragment extends FileFragment { private Bitmap bitmap; private OCFile ocFile; - public LoadImage(Bitmap bitmap, OCFile ocFile){ + public LoadImage(Bitmap bitmap, OCFile ocFile) { this.bitmap = bitmap; this.ocFile = ocFile; } From 33bac405638e46276e4688f6c59fc5402a6b0c2d Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 24 Jan 2017 10:12:46 +0100 Subject: [PATCH 086/881] Fix review issues --- .../android/ui/preview/PreviewImageFragment.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 651ed35098..58c8adfe99 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -545,10 +545,10 @@ public class PreviewImageFragment extends FileFragment { Drawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap); layers[1] = bitmapDrawable; LayerDrawable layerDrawable = new LayerDrawable(layers); - layerDrawable.setLayerHeight(0, (int) convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerHeight(1, (int) convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerWidth(0, (int) convertDpToPixel(bitmap.getWidth(), getActivity())); - layerDrawable.setLayerWidth(1, (int) convertDpToPixel(bitmap.getWidth(), getActivity())); + layerDrawable.setLayerHeight(0, convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerHeight(1, convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerWidth(0, convertDpToPixel(bitmap.getWidth(), getActivity())); + layerDrawable.setLayerWidth(1, convertDpToPixel(bitmap.getWidth(), getActivity())); imageView.setImageDrawable(layerDrawable); } else { imageView.setImageBitmap(bitmap); @@ -636,10 +636,10 @@ public class PreviewImageFragment extends FileFragment { } - private static float convertDpToPixel(float dp, Context context) { + private static int convertDpToPixel(float dp, Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); - float px = dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); + int px = (int) (dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT)); return px; } From a241447df08d6961d1c03c16bbba732fd3709f40 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 24 Jan 2017 14:47:42 +0100 Subject: [PATCH 087/881] Fix a small bug --- src/com/owncloud/android/ui/preview/PreviewImageFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 58c8adfe99..58fab60ae5 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -632,6 +632,7 @@ public class PreviewImageFragment extends FileFragment { layerDrawable.setDrawableByLayerId(layerDrawable.getId(0), layerOne); mImageView.setImageDrawable(layerDrawable); + mImageView.invalidate(); } } From cc624b446a574bc1dbfd07478d235c3890df24e6 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Thu, 26 Jan 2017 13:08:24 +0100 Subject: [PATCH 088/881] removed unneeded brackets --- .../ui/preview/PreviewImageFragment.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 58fab60ae5..e0ef7d6a02 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -318,39 +318,39 @@ public class PreviewImageFragment extends FileFragment { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case R.id.action_share_file: { + case R.id.action_share_file: mContainerActivity.getFileOperationsHelper().showShareFile(getFile()); return true; - } - case R.id.action_open_file_with: { + + case R.id.action_open_file_with: openFile(); return true; - } - case R.id.action_remove_file: { + + case R.id.action_remove_file: RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(getFile()); dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); return true; - } - case R.id.action_see_details: { + + case R.id.action_see_details: seeDetails(); return true; - } - case R.id.action_send_file: { + + case R.id.action_send_file: mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile()); return true; - } - case R.id.action_sync_file: { + + case R.id.action_sync_file: mContainerActivity.getFileOperationsHelper().syncFile(getFile()); return true; - } - case R.id.action_favorite_file: { + + case R.id.action_favorite_file: mContainerActivity.getFileOperationsHelper().toggleFavorite(getFile(), true); return true; - } - case R.id.action_unfavorite_file: { + + case R.id.action_unfavorite_file: mContainerActivity.getFileOperationsHelper().toggleFavorite(getFile(), false); return true; - } + default: return super.onOptionsItemSelected(item); } From 8ba4abd17d953556dfa5db8bd2b3a6d2ab8dfb76 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 26 Jan 2017 15:46:02 +0100 Subject: [PATCH 089/881] Fix a merge bug --- .../owncloud/android/ui/preview/PreviewImageFragment.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index e0ef7d6a02..2228b13b85 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -178,11 +178,11 @@ public class PreviewImageFragment extends FileFragment { toggleImageBackground(); } }); + + mMultiView = (RelativeLayout) view.findViewById(R.id.multi_view); - mMessageView = (TextView) view.findViewById(R.id.message); - mMessageView.setVisibility(View.GONE); - mProgressWheel = (ProgressBar) view.findViewById(R.id.progressWheel); - mProgressWheel.setVisibility(View.VISIBLE); + setupMultiView(view); + setMultiListLoadingMessage(); return view; } From 3273ad88bbb76835ea39c5649de9d766b5a49507 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 26 Jan 2017 18:20:36 +0100 Subject: [PATCH 090/881] Fix drawer back arrow --- src/com/owncloud/android/ui/activity/DrawerActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/activity/DrawerActivity.java b/src/com/owncloud/android/ui/activity/DrawerActivity.java index 7bbbbc6b5d..73ad2bb996 100644 --- a/src/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/com/owncloud/android/ui/activity/DrawerActivity.java @@ -507,8 +507,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU super.updateActionBarTitleAndHomeButton(chosenFile); /// set home button properties - if (mDrawerToggle != null) { + if (mDrawerToggle != null && chosenFile != null) { mDrawerToggle.setDrawerIndicatorEnabled(isRoot(chosenFile)); + } else { + mDrawerToggle.setDrawerIndicatorEnabled(false); } } From 1f15ddf707dc866f009503ec40f959c00a126f4c Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 27 Jan 2017 16:09:26 +0100 Subject: [PATCH 091/881] Fix a rotation bug --- .../owncloud/android/ui/preview/PreviewImageActivity.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index 9a6a261cf1..745453a9ba 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -74,6 +74,7 @@ public class PreviewImageActivity extends FileActivity implements public static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW"; private static final String KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER"; + private static final String KEY_SYSTEM_VISIBLE = "TRUE"; private static final int INITIAL_HIDE_DELAY = 0; // immediate hide @@ -128,6 +129,9 @@ public class PreviewImageActivity extends FileActivity implements if (savedInstanceState != null) { mRequestWaitingForBinder = savedInstanceState.getBoolean(KEY_WAITING_FOR_BINDER); + if (!savedInstanceState.getBoolean(KEY_SYSTEM_VISIBLE, true)) { + hideSystemUI(mFullScreenAnchorView); + } } else { mRequestWaitingForBinder = false; } @@ -169,7 +173,8 @@ public class PreviewImageActivity extends FileActivity implements @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putBoolean(KEY_WAITING_FOR_BINDER, mRequestWaitingForBinder); + outState.putBoolean(KEY_WAITING_FOR_BINDER, mRequestWaitingForBinder); + outState.putBoolean(KEY_SYSTEM_VISIBLE, getSystemUIVisible()); } @Override From de1328e380a5f6208954d7c0434a7c5eb36c274a Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 30 Jan 2017 15:22:42 +0100 Subject: [PATCH 092/881] Fix UI bugs --- AndroidManifest.xml | 2 +- res/layout/preview_image_fragment.xml | 9 +++++---- .../android/ui/preview/PreviewImageActivity.java | 7 +------ .../android/ui/preview/PreviewImageFragment.java | 7 ++++++- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e8c1a28421..850380efe3 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -99,7 +99,7 @@ + android:theme="@style/Theme.ownCloud" /> + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/top" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:animateLayoutChanges="true"> = Build.VERSION_CODES.LOLLIPOP) { - getWindow().setStatusBarColor(getResources().getColor(R.color.owncloud_blue_dark_transparent)); - } - + if (savedInstanceState != null) { mRequestWaitingForBinder = savedInstanceState.getBoolean(KEY_WAITING_FOR_BINDER); if (!savedInstanceState.getBoolean(KEY_SYSTEM_VISIBLE, true)) { diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 2228b13b85..df0893ef1a 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -24,6 +24,7 @@ import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.Point; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -89,7 +90,6 @@ public class PreviewImageFragment extends FileFragment { protected ImageView mMultiListIcon; protected ProgressBar mMultiListProgress; - public Bitmap mBitmap = null; private static final String TAG = PreviewImageFragment.class.getSimpleName(); @@ -566,11 +566,15 @@ public class PreviewImageFragment extends FileFragment { } mMultiView.setVisibility(View.GONE); + if (getResources() != null) { + mImageView.setBackgroundColor(getResources().getColor(R.color.black)); + } mImageView.setVisibility(View.VISIBLE); } private void showErrorMessage() { + mImageView.setBackgroundColor(Color.TRANSPARENT); setMessageForMultiList(mErrorMessageId, R.string.preview_sorry, R.drawable.file_image); } } @@ -593,6 +597,7 @@ public class PreviewImageFragment extends FileFragment { mMultiListIcon.setVisibility(View.VISIBLE); mMultiListProgress.setVisibility(View.GONE); + } } From 4a0f85e553a335c8c0501c214b0b257564b15208 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 31 Jan 2017 09:29:26 +0100 Subject: [PATCH 093/881] Fix review issues --- src/com/owncloud/android/ui/preview/PreviewImageFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index df0893ef1a..9b2e9f88aa 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -399,7 +399,7 @@ public class PreviewImageFragment extends FileFragment { /** * Weak reference to the target {@link ImageView} where the bitmap will be loaded into. - *

+ * * Using a weak reference will avoid memory leaks if the target ImageView is retired from * memory before the load finishes. */ @@ -469,7 +469,7 @@ public class PreviewImageFragment extends FileFragment { Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); break; } else { - if (ocFile.getFileName().endsWith(".jpg") || ocFile.getFileName().endsWith(".jpeg")) { + if (ocFile.getMimetype().equalsIgnoreCase("image/jpeg")) { // Rotate image, obeying exif tag. result = BitmapUtils.rotateImage(result, storagePath); } From e92eaf5694f460badd3c8d469c7923d046a9c82e Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 31 Jan 2017 10:35:13 +0100 Subject: [PATCH 094/881] Fix a rebase issue --- .../ui/preview/PreviewImageFragment.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 9b2e9f88aa..16c8b0f133 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -405,24 +405,6 @@ public class PreviewImageFragment extends FileFragment { */ private final WeakReference mImageViewRef; - /** - * Weak reference to the target {@link TextView} where error messages will be written. - * - * Using a weak reference will avoid memory leaks if the target ImageView is retired from - * memory before the load finishes. - */ - private final WeakReference mMessageViewRef; - - - /** - * Weak reference to the target {@link ProgressBar} shown while the load is in progress. - * - * Using a weak reference will avoid memory leaks if the target ImageView is retired from - * memory before the load finishes. - */ - private final WeakReference mProgressWheelRef; - - /** * Error message to show when a load fails */ From 206f3f06f3d226b1050eff183f36efbf058d3589 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 13 Feb 2017 13:42:23 +0100 Subject: [PATCH 095/881] Some progress on fixing bugs --- AndroidManifest.xml | 2 +- res/layout/preview_image_fragment.xml | 4 +- res/values/styles.xml | 2 - .../operations/DownloadFileOperation.java | 16 ++-- .../ui/preview/PreviewImageActivity.java | 96 ++++++------------- .../ui/preview/PreviewImageFragment.java | 16 ++-- 6 files changed, 49 insertions(+), 87 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 850380efe3..e8c1a28421 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -99,7 +99,7 @@ + android:theme="@style/Theme.ownCloud.Overlay" /> + android:layout_height="match_parent" + android:layout_centerInParent="true" + android:layout_margin="@dimen/zero"> @@ -128,7 +127,6 @@ @@ -127,6 +128,7 @@ @@ -150,8 +150,8 @@ @@ -271,7 +271,7 @@ #777777 diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index c44e787130..21ef9054e6 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -35,17 +35,17 @@ true - @color/owncloud_blue + @color/nc_blue #006AA3 - @color/infolevel_critical + @color/nc_blue_accent @color/white #7fC0E3 #FFFFFF #FFFFFF #FFFFFF - @color/infolevel_critical - @color/infolevel_critical - @color/owncloud_blue_accent + #0082c9 + #0082c9 + @color/nc_blue_accent @color/white #D6D7D7 @color/black From 031a9c34a77844b3af95aef7a9967b7ea73e66e5 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 13 Apr 2017 13:42:53 +0200 Subject: [PATCH 615/881] add break to switch --- .../com/owncloud/android/ui/activity/ExternalSiteWebView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java index 33ed91a6af..17625df860 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java +++ b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java @@ -149,6 +149,7 @@ public class ExternalSiteWebView extends FileActivity { default: retval = super.onOptionsItemSelected(item); + break; } return retval; } From f239dfbdb2199576b6e6807c26c83098a0a0c463 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 13 Apr 2017 13:49:58 +0200 Subject: [PATCH 616/881] put icon fetching into DisplayUtils --- .../datamodel/ExternalLinksProvider.java | 52 ------------------ .../android/ui/activity/DrawerActivity.java | 4 +- .../owncloud/android/utils/DisplayUtils.java | 54 +++++++++++++++++++ 3 files changed, 56 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/owncloud/android/datamodel/ExternalLinksProvider.java b/src/main/java/com/owncloud/android/datamodel/ExternalLinksProvider.java index 3784fd15c0..9edd987ebe 100644 --- a/src/main/java/com/owncloud/android/datamodel/ExternalLinksProvider.java +++ b/src/main/java/com/owncloud/android/datamodel/ExternalLinksProvider.java @@ -21,27 +21,15 @@ package com.owncloud.android.datamodel; import android.content.ContentResolver; import android.content.ContentValues; -import android.content.Context; import android.database.Cursor; -import android.graphics.drawable.PictureDrawable; import android.net.Uri; import android.support.annotation.NonNull; -import com.bumptech.glide.GenericRequestBuilder; -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.model.StreamEncoder; -import com.bumptech.glide.load.resource.file.FileToStreamDecoder; -import com.bumptech.glide.request.target.SimpleTarget; -import com.caverock.androidsvg.SVG; import com.owncloud.android.db.ProviderMeta; import com.owncloud.android.lib.common.ExternalLink; import com.owncloud.android.lib.common.ExternalLinkType; import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.utils.svg.SvgDecoder; -import com.owncloud.android.utils.svg.SvgDrawableTranscoder; -import java.io.InputStream; import java.util.ArrayList; /** @@ -182,46 +170,6 @@ public class ExternalLinksProvider { return externalLink; } - private void downloadPNGIcon(Context context, String iconUrl, SimpleTarget imageView, int placeholder) { - Glide - .with(context) - .load(iconUrl) - .centerCrop() - .placeholder(placeholder) - .error(placeholder) - .crossFade() - .into(imageView); - } - - private void downloadSVGIcon(Context context, String iconUrl, SimpleTarget imageView, int placeholder, - int width, int height) { - GenericRequestBuilder requestBuilder = Glide.with(context) - .using(Glide.buildStreamModelLoader(Uri.class, context), InputStream.class) - .from(Uri.class) - .as(SVG.class) - .transcode(new SvgDrawableTranscoder(), PictureDrawable.class) - .sourceEncoder(new StreamEncoder()) - .cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder(height, width))) - .decoder(new SvgDecoder(height, width)) - .placeholder(placeholder) - .error(placeholder) - .animate(android.R.anim.fade_in); - Uri uri = Uri.parse(iconUrl); - requestBuilder - .diskCacheStrategy(DiskCacheStrategy.SOURCE) - .load(uri) - .into(imageView); - } - - - public void downloadIcon(Context context, String iconUrl, SimpleTarget imageView, int placeholder, - int width, int height){ - if (iconUrl.endsWith(".svg")){ - downloadSVGIcon(context, iconUrl, imageView, placeholder, width, height); - } else { - downloadPNGIcon(context, iconUrl, imageView, placeholder); - } - } } diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 578e69ef17..288f9c97f0 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -834,7 +834,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU } }; - externalLinksProvider.downloadIcon(this, firstQuota.iconUrl, target, R.drawable.ic_link_grey, size, size); + DisplayUtils.downloadIcon(this, firstQuota.iconUrl, target, R.drawable.ic_link_grey, size, size); } else { mQuotaTextLink.setVisibility(View.INVISIBLE); @@ -939,7 +939,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU }; - externalLinksProvider.downloadIcon(this, link.iconUrl, target, R.drawable.ic_link_grey, size, size); + DisplayUtils.downloadIcon(this, link.iconUrl, target, R.drawable.ic_link_grey, size, size); } } } diff --git a/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/src/main/java/com/owncloud/android/utils/DisplayUtils.java index c1fbc38028..16584fc1fb 100644 --- a/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -33,6 +33,8 @@ import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; +import android.graphics.drawable.PictureDrawable; +import android.net.Uri; import android.os.Build; import android.support.annotation.ColorInt; import android.support.design.widget.Snackbar; @@ -47,6 +49,13 @@ import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.SeekBar; +import com.bumptech.glide.GenericRequestBuilder; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.model.StreamEncoder; +import com.bumptech.glide.load.resource.file.FileToStreamDecoder; +import com.bumptech.glide.request.target.SimpleTarget; +import com.caverock.androidsvg.SVG; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; @@ -56,7 +65,10 @@ import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.TextDrawable; import com.owncloud.android.ui.activity.ToolbarActivity; +import com.owncloud.android.utils.svg.SvgDecoder; +import com.owncloud.android.utils.svg.SvgDrawableTranscoder; +import java.io.InputStream; import java.math.BigDecimal; import java.net.IDN; import java.text.DateFormat; @@ -507,4 +519,46 @@ public class DisplayUtils { } } } + + public static void downloadIcon(Context context, String iconUrl, SimpleTarget imageView, int placeholder, + int width, int height) { + if (iconUrl.endsWith(".svg")) { + downloadSVGIcon(context, iconUrl, imageView, placeholder, width, height); + } else { + downloadPNGIcon(context, iconUrl, imageView, placeholder); + } + } + + private static void downloadPNGIcon(Context context, String iconUrl, SimpleTarget imageView, int placeholder) { + Glide + .with(context) + .load(iconUrl) + .centerCrop() + .placeholder(placeholder) + .error(placeholder) + .crossFade() + .into(imageView); + } + + private static void downloadSVGIcon(Context context, String iconUrl, SimpleTarget imageView, int placeholder, + int width, int height) { + GenericRequestBuilder requestBuilder = Glide.with(context) + .using(Glide.buildStreamModelLoader(Uri.class, context), InputStream.class) + .from(Uri.class) + .as(SVG.class) + .transcode(new SvgDrawableTranscoder(), PictureDrawable.class) + .sourceEncoder(new StreamEncoder()) + .cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder(height, width))) + .decoder(new SvgDecoder(height, width)) + .placeholder(placeholder) + .error(placeholder) + .animate(android.R.anim.fade_in); + + + Uri uri = Uri.parse(iconUrl); + requestBuilder + .diskCacheStrategy(DiskCacheStrategy.SOURCE) + .load(uri) + .into(imageView); + } } From 8717832fbba22e872eb940c552979497ca0219cd Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 13 Apr 2017 22:54:37 +0200 Subject: [PATCH 617/881] Remove gcm stuff --- src/main/AndroidManifest.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 4ee75a4245..7edaab5356 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -19,9 +19,10 @@ along with this program. If not, see . --> + xmlns:tools="http://schemas.android.com/tools" + package="com.owncloud.android" + android:versionCode="10040299" + android:versionName="1.4.2"> + + Date: Fri, 14 Apr 2017 00:21:31 +0000 Subject: [PATCH 618/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 15 ++ src/main/res/values-nb-rNO/strings.xml | 14 +- src/main/res/values-pt-rBR/strings.xml | 215 ++++++++++++------------- 3 files changed, 129 insertions(+), 115 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 67fec387cf..0f97fe2886 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -16,9 +16,14 @@ Α - Ω Ω - Α Όλα τα αρχεία + Αρχεία + Αγαπημένα + Φωτογραφίες Στην συσκευή + Βίντεο Ρυθμίσεις Μεταφορτώσεις + Δραστηριότητες χρησιμοποιούνται %1$s από %2$s Κλείσιμο Άνοιγμα @@ -551,4 +556,14 @@ Παράλειψη + + Πλήρες όνομα + Ηλεκτρονικό ταχυδρομείο + Αριθμός τηλεφώνου + Διεύθυνση + Ιστοσελίδα + Twitter + + Πληροφορίες χρήστη + diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 81625e6886..a7123345b9 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -135,13 +135,13 @@ Opplasting feilet, du må logge inn på nytt Opplastinger Nåværende - Feilet (trykk for å prøve igjen) + Mislyktes (trykk for å prøve igjen) Opplastet Ferdig Avbrutt Pauset Tilkoblingsfeil - Opplasting vil prøves igjen snart + Nytt forsøk på opplasting vil settes i verk snart Legitimasjonsfeil Mappefeil Filfeil @@ -151,7 +151,7 @@ Applikasjonen ble avsluttet Ukjent feil Venter på trådløstilkobling - Venter på å laste op + Venter på å laste opp Laster ned … %1$d%% Laster ned %2$s Nedlasting fullført @@ -159,7 +159,7 @@ Nedlasting feilet Nedlasting av %1$s kunne ikke fullføres Ikke lastet ned enda - Nedlasting feilet, du må logge inn på nytt + Nedlasting mislyktes, du må logge inn på nytt Velg konto Synkronisering feilet Synkronisering feilet, du må logge inn på nytt @@ -167,7 +167,7 @@ Ugyldig passord for %1$s Konflikter funnet %1$d hold-i-synk filer kunne ikke synkroniseres - Hold i synk filer mislyktes + Holdt-i-synk -filer mislyktes Innholdet av %1$d filer kunne ikke synkroniseres (%2$d konflikter) Noen lokale filer ble glemt %1$d filer fra %2$s mappen kunne ikke kopieres til @@ -197,7 +197,7 @@ Ingen mediafil funnet Ingen konto angitt Filen er ikke i en gyldig konto - Mediakodek er ikke støttet + Ustøttet mediakodek Mediafilen kunne ikke leses Mediafilen er ikke riktig kodet Tidsavbrudd under avspillingsforsøk @@ -271,7 +271,7 @@ Logg inn med oAuth2 Kobler til oAuth2 tjener... - Identiteten til siden kunne ikke verifiseres + Identiteten til siden kunne ikke bekreftes - Tjenerens sertifikat er ikke til å stole på - Tjenerens sertifikat er utløpt - Tjenersertifikatets gyldige datoer er i fremtiden diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index b30064ff7a..c433744542 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -22,8 +22,8 @@ Menores primeiro Todos os arquivos - Files - Home + Arquivos + Início Favoritos Fotos No aparelho @@ -41,14 +41,14 @@ Mais Contas Gerenciar contas - Bloqueio com senha + Bloqueio de código de acesso Mostrar arquivos escondidos - Envio instantâneo de imagens - Envia instantaneamente as fotos tiradas com a câmera - Envio instantâneo de vídeos - Envia instantaneamente os vídeos feitos com a câmera + Envio automático de imagens + Envia automaticamente as fotos tiradas com a câmera + Envio automático de vídeos + Envia automaticamente os vídeos feitos com a câmera Habilitar login - Isto é usado para registrar(log) os problemas + Isto é usado para registrar problemas Histórico de logins Mostra os registros gravados Excluir histórico @@ -60,9 +60,9 @@ Ajuda Recomendar a um amigo Feedback - Imprint - Lembre-se do local de compartilhamento - Lembrar do último local de envio de compartilhamento + Imprimir + Lembrar o local de compartilhamento + Lembrar o último local de envio de compartilhamento Tentar %1$s em seu smartfone! Gostaria de convidá-lo a usar %1$s em seu smartphone!\nBaixe aqui: %2$s @@ -82,7 +82,7 @@ Sair Nenhum arquivo para envio %1$s não pode enviar um pedaço de texto como um arquivo. - Os dados recebidos não incluem qualquer arquivo válido. + Os dados recebidos não incluem um arquivo válido. O arquivo não pode ser enviado %1$s não tem permissão para ler um arquivo recebido Arquivo para envio não foi encontrado em sua localização. Verifique se o arquivo existe. @@ -113,13 +113,13 @@ foram encontrados para sua pesquisa! Nenhum arquivo recentemente adicionado foi encontrado! Nenhum arquivo recentemente adicionado foi encontrado para sua pesquisa! - Envie algumas fotos ou ative o auto-envio! + Envie algumas fotos ou ative o envio automático! Nenhuma foto foi encontrada para sua pesquisa! - Envie alguns vídeos ou ative o auto-envio! + Envie alguns vídeos ou ative o envio automático! Nenhum vídeo encontrado para sua pesquisa! Nenhum envio disponível - Envie algum conteúdo ou ative o envio instantâneo! - Envie algum conteúdo ou ative o auto-envio! + Envie algum conteúdo ou ative o envio automático! + Envie algum conteúdo ou ative o envio automático! pasta pastas arquivo @@ -137,7 +137,7 @@ foram encontrados para sua pesquisa! Sim Não OK - Remover arquivo enviado + Excluir arquivo enviado Tentar enviar de novo Cancelar sincronização Cancelar @@ -151,7 +151,7 @@ foram encontrados para sua pesquisa! Pendente Sobre Alterar senha - Remover conta + Excluir conta Excluir a conta %s?\n\nNão é possível desfazer a exclusão. Criar conta Enviar de … @@ -162,7 +162,7 @@ foram encontrados para sua pesquisa! %1$s enviado Falha no envio O envio de %1$s não pôde ser finalizado - Falha no envio, você precisa se conectar novamente + Falha no envio, você precisa se logar novamente Envios Atual Falha (toque para tentar novamente) @@ -171,10 +171,10 @@ foram encontrados para sua pesquisa! Cancelado Pausado Erro de conexão - O arquivo enviado será recarregado em breve + O envio será retentado em breve Erro de credenciais - Erro de pasta - Erro de arquivo + Erro na pasta + Erro no arquivo Arquivo local não encontrado Erro de permissão Conflito @@ -189,10 +189,10 @@ foram encontrados para sua pesquisa! Download falhou Download de %1$s não pôde ser concluído Ainda não baixado - Falha em baixar o arquivo, você precisa se conectar novamente + Falha em baixar o arquivo, você precisa se logar novamente Escolha a conta Falha na sincronização - Falha na sincronização, você precisa se conectar novamente + Falha na sincronização, você precisa se logar novamente A sincronização de %1$s não pode ser finalizada Senha inválida para %1$s Conflitos encontrados @@ -213,12 +213,12 @@ foram encontrados para sua pesquisa! Digite o código de acesso O código de acesso será solicitado toda vez que o aplicativo for iniciado - Por favor, digite sua senha novamente - Remover seu código de acesso + Por favor, digite seu códigode acesso novamente + Excluir seu código de acesso Os códigos de acesso não são os mesmos Código de acesso incorreto - Código de acesso removido - Código de acesso armazenado + Código de acesso excluído + Código de acesso salvo %1$s reprodutor de música %1$s (reproduzindo) @@ -226,13 +226,13 @@ foram encontrados para sua pesquisa! %1$s reprodução finalizada Nenhum arquivo de mídia encontrado Nenhuma conta fornecida - Arquivo não está em uma conta válida - Codec de mídia não suportado - Arquivo de mídia não pode ser lido - Arquivo de mídia não corretamente codificado - Expirou o tempo durante a tentativa - Arquivo de mídia não pode ser transmitido - Arquivo de mídia não pode ser reproduzido com o stock media player + O arquivo não está em uma conta válida + O codec de mídia não é suportado + O arquivo de mídia não pode ser lido + O arquivo de mídia não está corretamente codificado + Expirou o tempo durante a tentativa de reproduzir + O arquivo de mídia não pode ser transmitido + O arquivo de mídia não pode ser reproduzido com o stock media player Erro de segurança tentando reproduzir %1$s Erro de entrada tentando reproduzir %1$s Erro inesperado tentando reproduzir %1$s @@ -250,7 +250,7 @@ foram encontrados para sua pesquisa! Já existe no dispositivo uma conta para o mesmo usuário e servidor As informações que o usuário digitou não correspondem ao usuário da conta Ocorreu um erro desconhecido! - Não pôde encontrar host + Não pode encontrar host Instância de servidor não encontrada O servidor demorou demais a responder Formato de endereço de servidor errado @@ -259,17 +259,17 @@ foram encontrados para sua pesquisa! Versão do servidor desconhecida Não foi possível estabelecer conexão Conexão segura estabelecida - Nome de usuário e/ou senha está errada! + Nome de usuário ou senha errado Autorização sem sucesso Acesso negado pelo servidor de autorização - Estado inesperado; por favor insira o endereço do servidor novamente - Sua autorização expirou. Por favor, solicite autorizar novamente + Estado inesperado. Insira o endereço do servidor novamente + Sua autorização expirou. Por favor, autorize novamente Por favor, digite a senha atual Sua sessão expirou. Por favor, conecte-se novamente Conectando ao servidor de autenticação ... O servidor não suporta este método de autenticação %1$s não suporta múltiplas contas - Seu servidor não está retornando um id de usuário correto, entre em contato com um administrador + Seu servidor não está retornando um id de usuário correto. Por favor, entre em contato com um administrador Não é possível obter autenticação neste servidor Conta ainda não existe no dispositivo @@ -278,27 +278,27 @@ foram encontrados para sua pesquisa! Marque como favorito Desmarque como favorito Renomear - Remover - Deseja realmente remover %1$s? - Você realmente deseja remover %1$s e seus conteúdos? + Excluir + Deseja realmente excluir %1$s? + Você deseja realmente excluir %1$s e seu conteúdo? Somente local - Removido com sucesso - Erro ao remover + Excluído com sucesso + Erro ao excluir Digite um novo nome - Cópia local não pôde ser renomeada; tente outro nome + Cópia local não pôde ser renomeada. Tente outro nome Renomeação não pôde ser finalizada Arquivo remoto não pode ser verificado Conteúdo do arquivo já foi sincronizado A pasta não pode ser criada Caracteres proibidos: / \\ < > : \" | ? * - O nome do arquivo contem pelo menos um caractere inválido + O nome do arquivo contém pelo menos um caractere inválido O nome do arquivo não pode estar vazio Aguarde um momento Verificando credenciais salvas - Problema inesperado; por favor, tente selecionar o arquivo com outro app + Problema inesperado. Por favor, tente selecionar o arquivo com outro aplicativo Nenhum arquivo foi selecionado Enviar o link para … - Copiando o arquivo de armazenagem privada + Copiando o arquivo da armazenagem privada Login com oAuth2 Conectando-se a oAuth2 servidor ... @@ -306,9 +306,9 @@ foram encontrados para sua pesquisa! A identidade do site não pode ser verificada - O certificado do servidor não é confiável - O certificado do servidor expirou - - O datas de validade do certificado do servidor estão no futuro - - O URL do host não confere com o host do certificado - Você mesmo assim confia nesse certificado? + - A data de validade do certificado do servidor está no futuro + - A URL do host não confere com o host do certificado + Você confia nesse certificado mesmo assim? O certificado não pode ser salvo Detalhes Ocultar @@ -339,11 +339,11 @@ foram encontrados para sua pesquisa! 12:23:45 Enviar somente via wifi - Envio de fotos apenas por Wi-Fi - Envio de vídeos apenas por Wi-Fi + Enviar fotos apenas por Wi-Fi + Enviar vídeos apenas por Wi-Fi Enviar apenas quando solicitado Enviar apenas quando solicitado - /Upload instantâneo + /Upload automático Conflito de arquivo Quais arquivos você deseja manter? Se você selecionar ambas as versões, o arquivo local terá um número adicionado ao seu nome. Manter ambos @@ -355,16 +355,16 @@ foram encontrados para sua pesquisa! Imagem não pode ser mostrada %1$s não pôde ser copiado para pasta local %2$s - Pasta de envio instantâneo + Pasta de envio automático Pasta local Pasta remota Usar subpastas - Armazena em subpastas com base no ano e mês + Armazena em subpastas baseado no ano e mês - Lamentamos, mas o compartilhamento não está ativada no servidor. Entre em contato com o administrador. + Lamentamos, mas o compartilhamento não está ativado no servidor. Entre em contato com o administrador. Não é possível compartilhar. Por favor verifique se o arquivo existe Ocorreu um erro durante a tentativa de compartilhar esse arquivo ou pasta - Não é possível cancelar o compartilhamento. Por favor verifique se o arquivo existe + Não é possível descompartilhar. Por favor verifique se o arquivo existe Ocorreu um erro ao tentar descompartilhar este arquivo ou pasta Não é possível atualizar. Verifique se o arquivo existe Ocorreu um erro enquanto tentava atualizar o compartilhamento @@ -379,23 +379,23 @@ foram encontrados para sua pesquisa! Erro inesperado ao copiar para a área de transferência Texto copiado de %1$s - Erro crítico: não pode executar operações + Erro crítico: não pode executar as operações Ocorreu um erro durante a conexão com o servidor. - Ocorreu um erro enquanto se espera pelo servidor, a operação não poderia ter sido executada - Ocorreu um erro enquanto se espera pelo servidor, a operação não poderia ter sido executada - A operação não pôde ser concluída, o servidor está indisponível - Você não tem premissão %s + Ocorreu um erro enquanto se espera pelo servidor, a operação pode não ter sido executada + Ocorreu um erro enquanto se espera pelo servidor, a operação pode não ter sido executada + A operação não pode ser concluída, o servidor está indisponível + Você não tem permissão %s para renomear este arquivo para excluir este arquivo para compartilhar este arquivo para descompartilhar este arquivo atualizar este compartilhamento para criar este arquivo - para enviar para esta pasta + para enviar a esta pasta Este arquivo não mais está disponível neste servidor - Atualizando caminho do storage + Atualizando caminho do armazenamento Finalizado Preparando para migração… Verificando destino… @@ -409,13 +409,13 @@ foram encontrados para sua pesquisa! ERRO: Espaço Insuficiente ERRO: Arquivo não permite gravação ERRO: Arquivo não permite leitura - ERRO: diretório ou pasta já existe + ERRO: Diretório Nexcloud já existe ERRO: Durante a Migração - ERRO: Durante atualização de indice + ERRO: Durante atualização de índice Pasta de dados já existe, o que fazer? Sobrescrever - Usar existente + Usar a existente Contas Adicionar uma conta @@ -424,11 +424,11 @@ foram encontrados para sua pesquisa! Logs Enviar histórico - Nenhum aplicativo para envio de logs foi encontrado. Por favor, instale um aplicativo de e-mail. + Nenhum aplicativo para envio de logs foi encontrado. Por favor, instale um aplicativo de email. %1$s logs do aplicativo Android Carregando dados … - Autenticação obrigatória + Autenticação necessária Senha incorreta Mover Copiar @@ -446,25 +446,25 @@ foram encontrados para sua pesquisa! Não é possível copiar uma pasta em uma descendente O arquivo já existe na pasta de destino Ocorreu um erro ao tentar copiar este arquivo ou pasta - para copiar este arquivo + copiar este arquivo - Envio instantâneo + Envio automático Detalhes - Pasta de envio instantâneo de vídeos + Pasta de envio automático de vídeos A sincronização da pasta %1$s não pode ser finalizada compartilhado com você - %1$s compartilhado \"%2$s\" com você + %1$s compartilhou \"%2$s\" com você \"%1$s\" foi compartilhado com você Reinicializar conexão Endereço do servidor - Não há memoria suficiente + Não há memória suficiente - Nome do Usuário + Nome do usuário 1 pasta %1$d pastas @@ -481,9 +481,9 @@ foram encontrados para sua pesquisa! Selecionar tudo mantido na pasta original - movido para a pasta app + movido para a pasta aplicativos excluído - Caminho do storage + Caminho do armazenamento Comum Compartilhamento @@ -494,7 +494,7 @@ foram encontrados para sua pesquisa! Compartilhar link Definir data de expiração Proteger com senha - Asegurado + Seguro Permitir edição Ocultar a listagem de arquivos Obter link @@ -509,38 +509,37 @@ foram encontrados para sua pesquisa! %1$s (email) %1$s ( em %2$s ) - Lamentamos, mas a versão do seu servidor não permite partilhar com utilizadores nos clientes. -Contacte o administrador + Lamentamos, mas a versão do seu servidor não permite compartilhar com utilizadores nos clientes.\nPor favor contacte o administrador pode compartilhar pode editar criar - mudança + alterar excluir Parar compartilhamento finalizado - Falha, tentar novamente - Limpar falha - Limpado com sucesso + Retentar falhou + Limpeza falhou + Limpo com sucesso Limpar tudo finalizado Grade de exibição Lista de visualização Gerenciar o espaço - Definições, certificados de banco de dados e servidor de dados %1$s serão excluído permanentemente. \n\nArquivos baixados serão mantidos inalterados. \n\nEste processo pode demorar algum tempo. + Definições, certificados de banco de dados e servidor de dados %1$s serão excluídos permanentemente. \n\nArquivos baixados serão mantidos inalterados. \n\nEste processo pode demorar algum tempo. Limpar dados Alguns arquivos não puderam ser excluídos. Permissões adicionais são necessárias para se enviar e baixar arquivos & . O arquivo não foi encontrado no sistema de arquivos local - Deseja realmente remover os itens selecionados? - Deseja realmente remover os itens selecionados e seus conteúdos? - À espera de carregamento do dispositivo + Deseja realmente excluir os itens selecionados? + Deseja realmente excluir os itens selecionados e seus conteúdos? + Esperando o carregamento do dispositivo Pesquisar - Este é um recurso do Nextcloud, atualize. - Aprender mais - Upload automatico + Este é um recurso do Nextcloud. Por favor, atualize. + Saiba mais + Envio automático Participar Ajude-nos a testar Encontrou um erro? Algo está estranho? @@ -548,8 +547,8 @@ Contacte o administrador Está interessado em ajudar-nos a testar a próxima versão? Teste a versão beta Isso inclui todos os próximos recursos. Erros pode ocorrer e irão. Por favor, reporte-os a nós. - Release candidate - O release candidate (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode ajudar a garantir isso. Registre-se para testar na Play Store ou procure manualmente na seção \"versões\" na F-Droid. + Candidato a versão + O candidato à versão (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode ajudar a garantir isso. Registre-se para testar na Play Store ou procure manualmente na seção \"versões\" na F-Droid. Contribuir ativamente Participe de uma conversa no IRC: <a href="%1$s">#nextcloud-mobile</a> Ajude outros no <a href="%1$s">forum</a> @@ -559,10 +558,10 @@ Contacte o administrador Copiar para… Escolha a pasta… Carregando pastas… - Nenhuma pasta de media encontrada. - Preferencias de upload automatico + Nenhuma pasta de mídia encontrada. + Preferências do envio automático Configurações - Upload instantaneo foi completamente renovado. Favor veja o menu principal e reconfigure o seu auto upload. Desculpe o inconveniente. \n\nAproveite o novo e mais completo auto upload + O envio automático foi completamente renovado. Por favor veja o menu principal e reconfigure o seu envio automático. Desculpe o inconveniente. \n\nAproveite as novas e extendidas capacidades do envio automático! Para %1$s %d selecionado @@ -572,29 +571,29 @@ Contacte o administrador Carregando atividades… Nenhuma atividade encontrada. - Forneça o nome e o tipo de arquivo que será enviado + Forneça o nome e o tipo de arquivo a enviar Nome do Arquivo Tipo do Arquivo - Fragmento de texto arquivo(.txt) - Atalho da Internet arquivo(%s) - Atalho da Internet Google Maps arquivo(%s) + Fragmento de arquivo texto (.txt) + Arquivo de atalho da internet (%s) + Arquivo de atalho do Google Maps (%s) Padrão Cartão SD %1$d Desconhecido - O que há denovo no Nextcloud + O que há de novo no Nextcloud - Uma casa segura para todos os seus dados - Acesso, compartilhamento & proteja seus dados em casa e em sua empresa + Um local seguro para seus dados + Acesse, compartilhe & proteja seus dados em casa e na sua empresa Multi contas - Conectar em todos os seus clouds + Conectar em todas as suas Nuvens - Upload Instantaneo - Guarde suas fotos de forma segura + Envio automático + Mantenha seguras as suas fotos Pular From c5744c61b533fe0b4ef1cfaec2333ce575be2843 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sat, 15 Apr 2017 00:22:23 +0000 Subject: [PATCH 619/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 53 ++++++-- src/main/res/values-es/strings.xml | 170 ++++++++++++------------- src/main/res/values-nb-rNO/strings.xml | 35 ++++- 3 files changed, 159 insertions(+), 99 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 0f97fe2886..e11fd861ca 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -13,13 +13,22 @@ Αποστολή Ταξινόμηση Ταξινόμηση κατά + Ταξινόμηση κατά Α - Ω Ω - Α + Νεότερο πρώτα + Παλαιότερο πρώτα + Μεγαλύτερο πρώτα + Μικρότερο πρώτα + Όλα τα αρχεία Αρχεία Αγαπημένα Φωτογραφίες Στην συσκευή + Προστέθηκαν πρόσφατα + Τροποποιήθηκαν πρόσφατα + Κοινόχρηστα Βίντεο Ρυθμίσεις Μεταφορτώσεις @@ -52,7 +61,7 @@ Aνάδραση Αποτύπωμα Απομνημόνευση θέσης διαμοιρασμού - Απομνημόνευση τελευταιας θέσης μεταφορτώσεων + Απομνημόνευση τελευταιας τοποθεσίας διαμοιρασμού μεταφορτώσεων Δοκιμή %1$s στο κινητό σας! Θα ήθελα να σε προσκαλέσω να χρησιμοποιήσεις το %1$s στο κινητό σου!\\nΛήψη από εδώ: %2$s @@ -61,7 +70,7 @@ Διεύθυνση διακομιστή https://… Όνομα χρήστη Συνθηματικό - Δεν έχετε ακόμα διακομιστή;\\nΚάντε κλικ εδώ για να πάρετε ένα από ένα πάροχο + Δεν έχετε ακόμα διακομιστή;\\nΚάντε κλικ εδώ για να πάρετε έναν από ένα πάροχο Αρχεία Σύνδεση Μεταφόρτωση @@ -70,13 +79,13 @@ Δεν υπάρχουν λογαριασμοί %1$s στη συσκευή σας. Παρακαλώ ρυθμίστε πρώτα ένα λογαριασμό. Ρύθμιση Έξοδος - Δεν υπάρχει αρχείο για μεταφόρτωση + Κανένα αρχείο για μεταφόρτωση Ο %1$s δεν μπορεί να μεταφορτώσει ένα κομμάτι κειμένου ως αρχείο. Τα ληφθέντα δεδομένα δεν περιλαμβάνουν έγκυρο αρχείο. Το αρχείο δεν μπορεί να μεταφορτωθεί Ο %1$s δεν επιτρέπεται να αναγνώσει ένα ληφθέν αρχείο Το αρχείο προς αποστολή δεν βρέθηκε στην τοποθεσία. Παρακαλώ ελέγξτε εάν υπάρχει το αρχείο. - Παρουσιάστηκε σφάλμα κατά την αντιγραφή του αρχείου στον προσωρινό φάκελο. Παρακαλώ δοκιμάστε να στείλετε ξανά. + Παρουσιάστηκε σφάλμα κατά την αντιγραφή του αρχείου στον προσωρινό φάκελο. Παρακαλούμε δοκιμάστε να στείλετε ξανά. Επιλογή μεταφόρτωσης: Μετακίνηση αρχείου στον φάκελο Nextcloud Διατήρηση του αρχείου στον πηγαίο φάκελο @@ -84,15 +93,35 @@ δευτερόλεπτα πριν Δεν υπάρχουν αρχεία Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας! + Σημειώστε ως αγαπημένα ορισμένα αρχεία ή συγχρονίστε τα με τις συσκευές σας! + Τα αρχεία ή οι φάκελοι που σημειώσατε ως αγαπημένα θα εμφανιστούν εδώ + Δεν βρέθηκαν αρχεία σημειωμένα ως αγαπημένα για το ερώτημά σας! Φόρτωση… Δεν βρέθηκε εφαρμογή για τον τύπο αρχείου! Δεν υπάρχουν αρχεία σε αυτό τον φάκελο. + Κανενα αποτέλεσμα σε αυτον τον φάκελο + Κανένα αποτέλεσμα + Κανένα αγαπημένο + Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανίζονται εδώ + Κανένα βίντεο + Καμιά φωτογραφία + Θα δοκιμάστε αναζήτηση και σε άλλο φάκελο; + Δεν βρέθηκαν αρχεία που να έχουν τροποποιηθεί τις τελευταίες 7 ημέρες + Δεν βρέθηκαν αρχεία για το αίτημά σας που να έχουν τροποποιηθεί + τις τελευταίες 7 ημέρες! + Δεν βρέθηκαν πρόσφατα προστεθημένα αρχεία + Δεν βρέθηκαν πρόσφατα προστεθημένα αρχεία για το αίτημά σας! + Μεταφόρτωση μερικών φωτογραφιών ή ενεργοποιήστε την αυτόματη μεταφόρτωση! + Δεν βρέθηκαν φωτογραφίες για το αίτημά σας! + Μεταφορτώστε μερικά βίντεο ή ενεργοποιήστε την αυτόματη μεταφόρτωση! + Δεν βρέθηκε βίντεο για το αίτημά σας! Μη διαθέσιμες μεταφορτώσεις - Μεταφόρτωση περιεχομένου ή ενεργοποίηση άμεσης μεταφόρτωσης! + Μεταφορτώστε περιεχόμενο ή ενεργοποιήστε την άμεση μεταφόρτωση! + Μεταφορτώστε περιεχόμενο ή ενεργοποιήστε την αυτόματη μεταφόρτωση! φάκελος φάκελοι αρχείο - αρχείο + αρχεία Αγγίξτε κάποιο αρχείο για να προβάλετε περισσότερες πληροφορίες. Μέγεθος: Τύπος: @@ -105,11 +134,11 @@ Διαμοιρασμός Ναι Όχι - ΟΚ + Εντάξει Αφαίρεση μεταφόρτωσης Επανάληψη μεταφόρτωσης Ακύρωση συγχρονισμού - Άκυρο + Ακύρωση Επιστροφή Αποθήκευση Αποθήκευση & έξοδος @@ -129,7 +158,7 @@ %1$d%% Μεταφορτώνονται %2$s Επιτυχημένη μεταφόρτωση Το %1$s μεταφορτώθηκε - Η μεταφορά απέτυχε + Η μεταφόρτωση απέτυχε Η μεταφόρτωση του %1$s δεν ήταν δυνατόν να ολοκληρωθεί Η μεταφόρτωση απέτυχε, πρέπει να επανασυνδεθείτε Μεταφορτώσεις @@ -178,11 +207,11 @@ Τοπικά: %1$s Απομακρυσμένα: %1$s Δεν υπάρχει αρκετός διαθέσιμος αποθηκευτικός χώρος για να αντιγραφούν τα επιλεγμένα αρχεία στον φάκελο %1$s. Θα θέλατε να τα μετακινήσετε αντί αυτού; - Παρακαλώ εισάγετε τον κωδικό πρόσβασης + Παρακαλούμε εισάγετε τον κωδικό πρόσβασης Εισάγετε τον κωδικό πρόσβασης Ο κωδικός πρόσβασης θα ζητείται κάθε φορά που εκκινεί η εφαρμογή - Παρακαλώ εισάγετε ξανά τον κωδικό πρόσβασης + Παρακαλούμε εισάγετε ξανά τον κωδικό πρόσβασης Αφαίρεση του κωδικού πρόσβασης Οι κωδικοί πρόσβασης δεν ταιριάζουν Εσφαλμένος κωδικός πρόσβασης @@ -193,7 +222,7 @@ %1$s (αναπαραγωγή) %1$s (φόρτωση) %1$s αναπαραγωγή τελείωσε - Δεν βρέθηκε αρχείο πολυμέσων + Δεν βρέθηκαν αρχεία πολυμέσων Δεν δόθηκε λογαριασμός Το αρχείο δεν βρίσκεται σε έγκυρο λογαριασμό Δεν υποστηρίζεται η μορφή κωδικοποιήσης πολυμέσων diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 1e77e1c1c8..1356bca3e6 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -19,7 +19,7 @@ El más reciente primero El más viejo primero El más grande primero - El más pequeno primero + El más pequeño primero Todos los archivos Archivos @@ -55,47 +55,47 @@ Sincronizar calendario y contactos Configurar DAVdroid (v1.3.0 +) de la cuenta actual La dirección del Servidor para su cuenta no ha podido ser resuelta por DAVdroid - No está instalada ni la aplicación de Google Play ni la de F-Droid + No está instalada la aplicación de Google Play ni la de F-Droid Calendario & contactos se ha sincronizado exitosamente Ayuda Recomendar a un amigo - Mensajes de retroalimentación - pie de imprenta + Observaciones + Pie de imprenta Recordar la ubicación de los archivos compartidos Recordar la ubicación de los últimos archivos compartidos subidos ¡Prueba %1$s en su smarthphone! - ¡Quiero invitarle a usar %1$s en su smartphone!\nDescárguelo aquí: %2$s + ¡Quiero invitarle a usar %1$s en su smartphone!\nDescárgalo aquí: %2$s Verificar servidor Dirección del servidor https://… Nombre de usuario Contraseña - ¿No tiene un servidor aun?\nHaga click aquí para obtener uno de un proveedor + ¿No tiene un servidor aun?\nHaga click aquí para obtener uno desde un proveedor Archivos Conectar Subir Elige carpeta de subida No se encontró la cuenta - No hay %1$s cuentas en tu dispositivo. Por favor añade una cuenta primero. + No hay %1$s cuentas en su dispositivo. Por favor añada una cuenta primero. Configuración Salir Ningún archivo para subir - %1$s No puedo subir un texto como si fuera un archivo. + %1$s No se puede subir un texto como si fuera un archivo. No hay ningún archivo válido en los datos recibidos. No se puede subir el archivo %1$s No está autorizado a leer el archivo. - El archivo a subir no se localiza. Compruebe que el archivo existe. + El archivo a subir no se encuentra. Compruebe que el archivo existe. Ha ocurrido un error al copiar a la carpeta temporal. Por favor intentelo de nuevo. Configuraciones de subida: - Mover el fichero a la carpeta de Nextcloud - Mantener el fichero en la carpeta original - Borrar fichero de la carpeta original + Mover el archivo a la carpeta de Nextcloud + Mantener el archivo en la carpeta original + Borrar archivo de la carpeta original hace segundos No hay archivos aquí ¡Suba algun contenido o sincronice con sus dispositivos! - ¡Marque archivos como favoritos o sincronice con sus dispositivos! - Archivos y carpetas que marque como favoritos aparecerán aquí + ¡Marque algun archivos como favoritos o sincronice con sus dispositivos! + Los archivos y carpetas que marque como favoritos aparecerán aquí ¡No se encontraron archivos favoritos en su consulta! Cargando… ¡Aplicación no encontrada para el tipo de archivo! @@ -104,13 +104,13 @@ Sin resultados Sin favoritos Aún no hay nada compartido - Aquí aparecerán archivos y carpetas que usted comparta + Aquí aparecerán los archivos y carpetas que usted comparta No hay videos No hay fotos ¿A intentado buscar en otra carpeta? No se modificaron archivos en los últimos 7 días - ¡No se encontraron archivos para su consulta que fueran modificados - en los últimos 7 días! + ¡No se encontraron para su consulta, archivos que + fueran modificados en los últimos 7 días! No se encontraron archivos agregados recientemente ¡No se encontraron archivos agregados recientemente para su consulta! ¡Suba algunos archivos o active la subida automática! @@ -122,8 +122,8 @@ ¡Suba con tenido o active la subida automática! carpeta carpetas - fichero - ficheros + archivo + archivos Pulsa sobre un archivo para mostrar información adicional. Tamaño: Tipo: @@ -131,8 +131,8 @@ Modificado: Descargar Sincronizar - El fichero fue renombrado como %1$s durante la subida - Listar fuente + El archivo fue renombrado como %1$s durante la subida + Listar diseño Compartir No @@ -174,7 +174,7 @@ La subida se volverá a intentar en breve Error de credenciales Error de carpeta - Error de fichero + Error de archivo Archivo local no encontrado Error de permisos Conflicto @@ -196,12 +196,12 @@ La sincronización de %1$s no pudo ser completada Contraseña no válida para %1$s Se encontraron conflictos - Falló la sincronización de contenidos de %1$d ficheros + No se pudo mantener sincronizados los contenidos de %1$d archivos Fallos en la sincronización de contenidos Los contenidos de %1$d archivos no pudieron sincronizarse (%2$d conflictos) Algunos archivos locales se han perdido %1$d archivos en la carpeta %2$s no pudieron ser copiados a - A partir de la versión 1.3.16, los ficheros subidos desde este dispositivo se copian en la carpeta local %1$s para evitar la pérdida de datos cuando se sincroniza un único archivo con varias cuentas.\n\nDebido a este cambio, todos los ficheros subidos con versiones anteriores de esta aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error impidió que se completara esta operación durante la sincronización de la cuenta. Puede dejar los archivos tal y como están y eliminar el enlace a %3$s o mover los archivos a la carpeta %1$s y mantener el enlace a %4$s.\n\nDebajo se muestran los archivos locales y los archivos remotos en %5$s a los que fueron enlazados. + A partir de la versión 1.3.16, los archivos subidos desde este dispositivo se copian en la carpeta local %1$s para evitar la pérdida de datos cuando se sincroniza un único archivo con varias cuentas.\n\nDebido a este cambio, todos los archivos subidos con versiones anteriores de esta aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error impidió que se completara esta operación durante la sincronización de la cuenta. Puede dejar los archivos tal cual como están y eliminar el enlace hacia %3$s o mover los archivos a la carpeta %1$s y mantener el enlace hacia %4$s.\n\nAbajo se muestran los archivos locales y los archivos remotos en %5$s a los que fueron enlazados. La carpeta local %1$s no existe. Mover todo Todos los archivos fueron movidos @@ -211,27 +211,27 @@ No hay suficiente espacio para copiar los archivos seleccionados en la carpeta %1$s. En su lugar, ¿le gustaría moverlos? Por favor introduzca su código - Introduzca su contraseña - La contraseña será requerida cada vez que la aplicación sea iniciada + Introduzca su código + El código será requerida cada vez que la aplicación sea iniciada Por favor reintroduzca su código - Borre su contraseña + Borre su código Los códigos de acceso no son idénticos Código de acceso incorrecto Código de acceso borrado - Contraseña almacenada + Código almacenado Reproductor de música %1$s %1$s (reproduciendo) %1$s (cargando) %1$s reproducción finalizada No se encontró el archivo multimedia - No se ha proporcionado cuenta + No se ha proporcionado una cuenta El archivo no está en una cuenta válida - Codec no soportado + Códec no soportado El archivo de medios no pudo ser leído Archivo no codificado correctamente Tiempo de espera agotado en el intento de reproducción - Archivo de medio no puede ser transmitido + El archivo de medios no puede ser transmitido El archivo de medios no se puede reproducir con el reproductor de medios por defecto Error de seguridad al intentar reproducir %1$s Error de entrada al intentar reproducir %1$s @@ -247,7 +247,7 @@ Conexión establecida Comprobando la conexión Configuración de servidor en formato incorrecto - Ya existe una cuenta en este dispositivo con los mismos datos de Usuario y Servidor + Ya existe una cuenta en este dispositivo con los mismos datos de usuario y servidor El usuario introducido no concuerda con el usuario de esta cuenta Ocurrió un error desconocido Error: no se pudo encontrar el host @@ -260,34 +260,34 @@ No se ha podido establecer la conexión Conexión segura establecida Nombre de usuario o contraseña incorrectos - Autorización no satisfactoria - Acceso denegado por servidor de autorización + Autorización fallida + Acceso denegado por el servidor de autorización Estado inesperado; por favor introduzca su dirección de correo de nuevo Su autorización ha expirado. Por favor, autorice de nuevo Por favor introduzca su contraseña actual - Su sesión ha expirado. Favor de conectarse de nuevo + Su sesión ha expirado. Por favor conéctese de nuevo Conectando al servidor de autentificación El servidor no soporta este método de autenticación %1$s no soporta cuentas múltiples Su servidor no está retornando una identificación de usuario correcta; contacte a un administrador - No se puedo autenticar a este servidor + No puede autenticarse a este servidor Aún no existe la cuenta en el dispositivo - Marcar como disponible offline - Desmarcar como disponible offline + Marcar el modo disponible a desconectado + Desmarcar el modo disponible de desconectado Marque como favorito Desmarque como favorito Renombrar Borrar - ¿Está seguro de que quiere elimintar %1$s? + ¿Está seguro que quiere eliminar %1$s? ¿Realmente desea eliminar %1$s y todo su contenido? Sólo local Borrado correctamente El borrado no se pudo completar Introduzca un nombre nuevo - No se pudo cambiar el nombre de la copia local, trata con un nombre differente + No se pudo cambiar el nombre de la copia local, trate con un nombre differente No se pudo cambiar el nombre - No se ha podido comprobar el fichero remoto + No se ha podido comprobar el archivo remoto Ya está sincronizado No se pudo crear la carpeta Caracteres ilegales: / \\ < > : \" | ? * @@ -296,7 +296,7 @@ Espere un momento Comprobando las credenciales guardadas Problema inesperado; por favor, pruebe otra app para seleccionar el archivo - No hay ficheros seleccionados. + No hay archivos seleccionados. Enviar enlace a … Copiando el archivo desde el almacenamiento privado. @@ -326,13 +326,13 @@ Firma: Algoritmo: Este algoritmo no está disponible en tu teléfono. - Firma: + Huella dactilar: Existe un problema al cargar el certificado. No se ha podido mostrar el certificado - No hay información acerca del error Esto es un marcador de posición - marcadordeposición.txt + placeholder.txt Imagen PNG 389 KB 2012/05/18 12:23 PM @@ -343,7 +343,7 @@ Subir archivos por wifi únicamente Subir solo al cargar Subir solo al cargar - /SubidasInstantáneas + /InstantUpload Conflicto con archivo ¿Qué archivos desea mantener? Si selecciona ambas versiones, el archivo local tendrá un número añadido a su nombre. Mantener ambos @@ -352,7 +352,7 @@ ¡Lo sentimos! Previsualización de imagen - El foto no puede ser mostrado. + La foto no puede ser mostrada. %1$s se pudo copiar a la carpeta local %2$s Carpeta para subida instantánea @@ -361,11 +361,11 @@ Usar subcarpetas Archivar en subcarpetas basadas en año y mes. - La función Compartir no está activada en su servidor. Contacte a su administrador. + Lo siento, la función compartir no está activada en su servidor. Contacte a su administrador. No se puede compartir. Revise si el archivo existe Ocurrió un error al tratar de compartir este archivo o carpeta No se puede dejar de compartir. Revise si el archivo existe - Ocurrió un error al tratar de ya no compartir este archivo o carpeta + Ocurrió un error al tratar de descompartir este archivo o carpeta No se puede actualizar. Revise si el archivo existe Un error ha ocurrido mientras se intentaba actualizar el archivo compartido Introduzca una contraseña @@ -389,7 +389,7 @@ para renombrar este archivo para eliminar este archivo para compartir este archivo - para dejar de compartir este archivo + para descompartir este archivo para actualizar este comparto para crear el archivo para subir archivos a esta carpeta @@ -424,40 +424,40 @@ Registros Mandar historial. - Aplicación para enviar registros no encontrada. Por favor instale una aplicación de correo. - Se han encontrado %1$s logs de la app Android + Aplicación para enviar registros no fue encontrada. Por favor instale una aplicación de correo. + Se han encontrado %1$s aplicaciones de registros para Android Cargando datos … Se necesita autenticación Contraseña incorrecta Mover Copiar - Aquí no hay nada. ¡Puede agregar una carpeta! + Nada por aquí. ¡Puede agregar una carpeta! Elegir No se puede mover. Revise si el archivo existe No se puede mover una carpeta dentro de una de sus subcarpetas. El archivo ya existe en la carpeta de destino Hubo un error al tratar de mover este archivo o carpeta - para mover este archivo + mover este archivo No se puede copiar. Revise si existe el archivo No se puede copiar una carpeta dentro de una de sus subcarpetas. - El fichero ya existe en el directorio de destino + El archivo ya existe en el directorio de destino Hubo un error al tratar de copiar este archivo o carpeta - para copiar este archivo + copiar este archivo Subidas instantáneas Detalles - Carpeta para subida instantáneo de vídeos + Carpeta para subida instantánea de vídeos La sincronización de la carpeta %1$s no se pudo completar compartido con usted - %1$s compartió \"%2$s\" conmigo + %1$s compartió \"%2$s\" con usted \"%1$s\" ha sido compartido con usted. Refrescar la conexión @@ -481,7 +481,7 @@ Seleccionar todo dejado en la carpeta original - movido a la carpeta apps + movido a la carpeta app borrado Ruta de almacenamiento Común @@ -506,62 +506,62 @@ Buscar usuarios y grupos %1$s (grupo) %1$s (remoto) - %1$s (email) + %1$s (correo electrónico) %1$s ( en %2$s ) - Lo sentimos, su versión de servidor no permite compartir con usuarios desde los clientes.\nPor favor, contacte con su administrador + Lo siento, su versión de servidor no permite compartir con usuarios desde los clientes.\nPor favor, contacte con su administrador puede compartir puede editar crear - cambio + cambiar borrar Parar de compatir hecho Reintento fallido - Limpiar fallido - Limpiar exitoso - Limpiar todo lo terminado + Limpieza fallida + Limpieza exitosa + Limpiar todo al finalizar - Vista de rejilla + Vista en cuadrícula Ver lista Gestionar espacio - Las opciones, certificados y Bases de Datos de %1$s\'s serán borrados permanentemente.\n\nLos archibos bajados no serán tocados.\n\nEste proceso tardará algún tiempo. + Las opciones, certificados y bases de datos de %1$s serán borrados permanentemente.\n\nLos archivos bajados no se tocarán.\n\nEste proceso tardará algún tiempo. Limpiar datos No se han podido eliminar algunos archivos Se requieren permisos adicionales para subir & y descargar archivos. El archivo no se encuentra en el servidor local de archivos. ¿Está seguro de que quiere eliminar los elementos seleccionados? - ¿Está sguro de que quiere eliminar los elementos seleccionados y sus contenidos? - Esperando a la carga del dispositivo + ¿Está seguro de que quiere eliminar los elementos seleccionados y sus contenidos? + Esperando la carga del dispositivo Buscar Esta es una característica de Nextcloud. Por favor, actualice. - Aprender mas + Aprender más Subida automática Participar - Ayúdanos a hacer pruebas + Ayúdanos a realizar pruebas ¿Encontró un error? ¿Algo está mal? - Informa de un problema en Github - ¿Interesado en ayudarnos a probar la próxima versión? - Pruebe la versión \"nightly\" - Esto incluye todas las características por llegar y está al filo de la novedad. Pueden ocurrir fallos y errores y, si sucede, por favor infórmanos. - Release candidate - La release candidate (RC) es una instantánea de la próxima versión y se espera que sea estable. Probar su configuración individual podría ayudar a asegurar esto. Regístrese para probarla en Play Store o busque manualmente en la sección \"versiones\" de F-Droid. - Contribuye activamente + Informar de un problema en Github + ¿Está interesado en ayudarnos a probar la próxima versión? + Pruebar la versión \"nightly\" (de pruebas) + Esto incluye todas las características por llegar y está muy avazado en lo último. Pueden ocurrir fallos y errores, que si sucede, por favor infórmanos. + Versión a ser liberada + La versión a ser liberada (release candidate - RC) es una instantánea de la próxima versión y se espera que sea estable. Probar su configuración individual podría ayudar a asegurar esto. Regístrese para probarla en Play Store o busque manualmente en la sección \"versiones\" de F-Droid. + Colabore activamente Únase a la conversación en IRC: <a href=\"%1$s\">#nextcloud-mobile</a> - Ayude a otros en el <a href="%1$s">foro</a>. - <a href="%1$s">Traduzca</a> la app - Contribuya como desarrolador, vea see <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para más detalles + Ayude a otros en el foro <a href=\"%1$s\"></a>. + <a href=\"%1$s\">Traducen</a> la app + Contribuya como desarrollador, vea <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para más detalles Mover a… Copiar a… - Escoja carpeta… + Elija carpeta… Cargando carpetas… No se han encnotrado carpetas de medios. Preferencias de subida automática Configuración - La subida instantánea ha sido completamente renovada. Por favor, vaya al menú principal y reconfigure sus subidas instantáneas. Disculpe las molestias.\n\n¡Disfrute las capacidades de la subida automática, nuevas y extendidas! + La subida instantánea ha sido completamente renovada. Por favor, vaya al menú principal y reconfigure sus subidas instantáneas. Disculpe las molestias.\n\n¡Disfrute las nuevas y extendidas capacidades de la subida automática! Durante %1$s %d seleccionado @@ -574,7 +574,7 @@ Ingrese nombre y tipo de archivo de subida Nombre de archivo Tipo de archivo - Archivo de texto pequeño (.txt) + Archivo de texto recortado (.txt) Archivo de atajo a internet (%s) Archivo de atajo a Google Maps(%s) @@ -602,14 +602,14 @@ Correo electrónico Número de teléfono Dirección - Sitio web + Página web Twitter Información de usuario Aun no hay actividad - Este flujo le mostrará eventos como\nagregados, cambios& recursos compartidos + Esta secuencia le mostrará eventos como\nagregados, cambios& recursos compartidos diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index a7123345b9..1379538576 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -14,15 +14,26 @@ Sorter Sorter etter Sorter etter + A - Z + Z - A Nyeste først Eldste først Største først + Minste først + Alle filer Filer Hjem + Favoritter + Bilder På enheten + Nylig lagt til + Nylig endret + Delt + Videoer Innstillinger Opplastinger + Aktiviteter %1$s av %2$s brukt Lukk Åpne @@ -87,6 +98,10 @@ Ingen applikasjon funnet for filtypen! Det er ingen filer i denne mappen. Ingen resultater i denne mappen + Ingen favoritter + Ingenting delt enda + Ingen videoer + Ingen bilder Vil du prøve i en annen mappe? Ingen opplastinger tilgjengelig Last opp innhold eller aktiver umiddelbar opplasting. @@ -318,6 +333,7 @@ lokal versjon tjenerversjon + Beklager! Bildeforhåndsvisning %1$s kunne ikke kopieres til lokal mappe %2$s Mappe for umiddelbar opplasting @@ -547,7 +563,7 @@ Et trygt hjem for alle dine data - Ha tilgang til, del & beskytt filene dine hjemme og i bedriften + Benytt, del & beskytt filene dine hjemme og i din bedrift Multi-konto Foren alle skyene dine @@ -557,4 +573,19 @@ Hopp over - + + Fullt navn + E-post + Telefonnummer + Adresse + Nettsted + Twitter + + Brukerinformasjon + + + Ingen aktivitet enda + Denne strømmen vil vise hendelser som\nf.eks. innlegging, endring og deling + + + From d024dceb9e92ee281237799f81b7b6d9c11bb722 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 16 Apr 2017 00:20:42 +0000 Subject: [PATCH 620/881] [tx-robot] updated from transifex --- src/main/res/values-da/strings.xml | 66 +++++++++++++++++++++++++++++- src/main/res/values-el/strings.xml | 22 +++++----- 2 files changed, 76 insertions(+), 12 deletions(-) diff --git a/src/main/res/values-da/strings.xml b/src/main/res/values-da/strings.xml index 8d44bf181b..24116c46f9 100644 --- a/src/main/res/values-da/strings.xml +++ b/src/main/res/values-da/strings.xml @@ -13,9 +13,27 @@ Send Sortér Sortér efter + Sortér efter + A - Z + Z - A + Nyeste først + Ældste først + Største først + Mindste først + Alle filer + Filer + Hjem + Favoritter + Fotos + På enhed + Tilføjet for nylig + Ændret for nylig + Delt + Videoer Indstillinger Uploade filer + Aktiviteter %1$s af %2$s brugt Luk Åbn @@ -36,6 +54,9 @@ Slet historik Synkroniser kalender & kontakter Indstil DAVdroid (v1.3.0+) for aktiv konto + Serveradresse for konto kunne ikke afgøres for DAVdroid + Ingen Google Play-butik eller F-Droid-app er installeret + Synkronisering af kalender & kontakter er nu på plads Hjælp Anbefal til en ven Feedback @@ -50,26 +71,44 @@ Serveradresse https://… Brugernavn Kodeord + Har du ikke en server endnu?\nKlik her for at skaffe en udbyder Filer Tilslut Upload Vælg upload mappe Ingen konto fundet + Der er ingen %1$s-konti på din enhed. Angiv venligst en konto først. Opsætning Afslut Ingen filer til upload + %1$s kan ikke uploade et tekststykke som en fil. + Modtagne data indeholdt ikke en gyldig fil. Filen kan ikke uploades + %1$s har ikke tilladelse til at læse en modtaget fil + Filen som skulle uploades blev ikke fundet på dens placering. Tjek venligst om filen findes. + Der opstod en fejl under kopiering af filen til midlertidig mappe. Forsøg venligst at sende igen. Upload muligheder Flyt fil til Nextcloud mappe Behold filen i source-mappen Slet filen fra source-mappen sekunder siden Ingen filer her + Upload indhold eller synkronisér med dine enheder! + Gør filer til favoritter eller synkronisér med dine enheder! + Filer og mapper som markeres som favoritter vil blive vist her + Fandt ingen favoritter ud fra din søgning! Indlæser... Ingen apps fundet til denne filetype! Der er ingen filer i denne mappe. Intet resultat for denne mappe + Ingen resultater + Ingen favoritter + Intet er delt endnu + Filer og mapper du deler vil blive vist her + Ingen videoer + Ingen fotos Prøve at kigge i en anden mappe? + Fandt ikke filer som var ændret i seneste 7 dage mappe mapper fil @@ -113,6 +152,7 @@ Upload af %1$s kunne ikke gennemføres Uploade filer Nuværende + Mislykkedes (tryk for forsøge igen) Sendt Fuldført Annulléret @@ -124,7 +164,9 @@ Lokal fil blev ikke fundet Manglende rettigheder Konflikt + App blev afsluttet Ukendt fejl + Venter på wifi-forbindelse Venter med upload Downloader ... %1$d%% Downloader %2$s @@ -133,9 +175,11 @@ Download fejlede Download af %1$s kunne ikke fuldføres Endnu ikke downloadet + Download mislykkedes, du skal logge ind igen Vælg konto Sync fejlede Synkronisering fejlede. Du er nød til at logge ind igen + Synk. af %1$s kunne ikke fuldføres Ugyldig adgangskode for %1$s Konflikter fundet %1$d hold-synkroniseret filer kunne ikke synkroniseres @@ -209,6 +253,8 @@ %1$s understøtter ikke flere konti Kontoen findes endnu ikke på enheden + Angiv som favorit + Fjern som favorit Omdøb Fjern Er du sikker på at du vil fjerne %1$s ? @@ -278,17 +324,21 @@ lokal version serverversion + Beklager! Forhåndsvisning af billede - Dette billede kan ikke vises + Billede kan ikke vises %1$s kunne ikke kopieres til %2$s lokale mappe Lokal mappe Ekstern mappe Benyt undermapper - Kan ikke dele. Tjek venligst om filen findes. + Beklager, deling er ikke slået til på din server. Kontakt venligst din administrator. + Kan ikke dele. Tjek venligst om filen findes. Der opstod en fejl ved deling af denne fil eller mappe Kan ikke fjerne deling. Tjek venligst om filen findes. Der opstod en fejl ved stopning af deling af denne mappe. + Kan ikke opdatere. Tjek venligst om filen findes. + Der opstod en fejl under forsøg på at opdatering det delte Angiv et kodeord Du skal angive et kodeord @@ -319,6 +369,10 @@ FEJL: Fil er ikke skrivbar FEJL: File ikke læselig FEJL: Nextcloud mappe eksisterer allerede + FEJL: Under migrering + FEJL: Under opdatering af indeks + + Datamappen findes allerede, hvad skal der ske? Overskriv Benyt eksiterende @@ -451,4 +505,12 @@ Fulde navn E-post Telefonnummer + Adresse + Website + Twitter + + Brugerinformation + + + Endnu ingen aktiviteter diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index e11fd861ca..f70011e05e 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -260,29 +260,31 @@ Εσφαλμένο όνομα χρήστη ή συνθηματικό Ανεπιτυχής πιστοποίηση Άρνηση πρόσβασης από τον διακομιστή πιστοποίησης - Απροσδόκητη κατάσταση, παρακαλώ εισάγετε ξανά τη διεύθυνση του διακομιστή - Η πιστοποιίησή σας έληξε. Παρακαλώ πιστοποιήστε ξανά - Παρακαλώ εισάγετε το τρέχον συνθηματικό - Η συνεδρία σας έληξε. Παρακαλώ συνδεθείτε ξανά + Απροσδόκητη κατάσταση, παρακαλoύμε εισάγετε ξανά τη διεύθυνση του διακομιστή + Η πιστοποιίησή σας έληξε. Παρακαλούμε εξουσιοδοτήστε ξανά + Παρακαλούμε εισάγετε το τρέχον συνθηματικό + Η συνεδρία σας έληξε. Παρακαλούμε συνδεθείτε ξανά Σύνδεση με το διακομιστή πιστοποίησης ... Ο διακομιστής δεν υποστηρίζει αυτή τη μέθοδο πιστοποίησης Ο %1$s δεν υποστηρίζει πολλαπλούς λογαριασμούς - Ο διακομιστής σας δεν επιστρέφει το σωστό αναγνωριστικό χρήστη, παρακαλώ επικοινωνήστε με ένα διαχειριστή + Ο διακομιστής σας δεν επιστρέφει το σωστό αναγνωριστικό χρήστη, παρακαλούμε επικοινωνήστε τον διαχειριστή Αδυαμία πιστοποίησης με αυτόν το διακομιστή - Ο λογαριασμός δεν υπάρχει στη συσκευή ακόμα. + Ο λογαριασμός δεν υπάρχει ακόμα στη συσκευή Ορισμός ως διαθέσιμο εκτός σύνδεσης Αναίρεση ορισμού ως διαθέσιμο εκτός σύνδεσης + Ορισμός ως αγαπημένο + Αναίρεση ορισμού ως αγαπημένο Μετονομασία Αφαίρεση - Θέλετε σίγουρα να αφαιρέσετε το %1$s; - Θέλετε σίγουρα να διαγράψετε το %1$s και τα περιεχόμενά του; + Θέλετε να αφαιρέσετε το %1$s; + Θέλετε να αφαιρέσετε το %1$s και τα περιεχόμενά του; Μόνο τοπικά Επιτυχής αφαίρεση Αποτυχημένη αφαίρεση Εισάγετε νέο όνομα - Το τοπικό αντίγραφο δεν ήταν δυνατόν να μετονομαστεί. Παρακαλώ επιλέξτε ένα διαφορετικό όνομα. - Η μετονομασία δεν ήταν επιτυχής + Το τοπικό αντίγραφο δεν ήταν δυνατόν να μετονομαστεί. Παρακαλούμε επιλέξτε ένα διαφορετικό όνομα. + Η μετονομασία δεν μπόρεσε να ολοκληρωθεί Αδυναμία ελέγχου του απομακρυσμένου αρχείου Τα περιεχόμενα του αρχείου έχουν ήδη συγχρονιστεί Ο φάκελος δεν μπορεί να δημιουργηθεί From 8d3617a742c5fae66b02ddd2d77cfd3248555e0d Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 17 Apr 2017 00:20:39 +0000 Subject: [PATCH 621/881] [tx-robot] updated from transifex --- src/main/res/values-hu-rHU/strings.xml | 18 +++++++++++++++++- src/main/res/values-ja-rJP/strings.xml | 2 ++ src/main/res/values-nb-rNO/strings.xml | 10 ++++++++++ src/main/res/values-ru/strings.xml | 4 ++-- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/res/values-hu-rHU/strings.xml b/src/main/res/values-hu-rHU/strings.xml index f85cd4b78a..ea5ff6232b 100644 --- a/src/main/res/values-hu-rHU/strings.xml +++ b/src/main/res/values-hu-rHU/strings.xml @@ -95,11 +95,14 @@ pár másodperce Itt nincsenek fájlok Tölts fel néhány tartalmat, vagy szinkronizálj az eszközöddel! + Jelölj kedvencnek néhány fájlt vagy szinkronizálj az eszközeiddel! A kedvencnek jelölt fájlokat és mappákat itt találod meg + Nincsenek a kérésednek megfelelő kedvenc fájlok! Betöltés… Nem található alkalmazás a fálj típushoz. Nincs fájl ebben a mappában. Nincsenek eredmények ebben a mappában + Nincsenek eredmények Nincsenek kedvencek Nincs semmi megosztva Az Ön által megosztott fájlok és mappák itt jelennek meg @@ -107,8 +110,13 @@ Nincsenek képek Megpróbálsz másik mappában keresni? Nem talátam az utóbbi 7 napban módosított fájlt + Tölts fel néhány fényképet vagy aktiváld az automatikus feltöltést! + Nincsenek a kérésednek megfelelő fényképek! + Tölts fel néhány videót vagy aktiváld az automatikus feltöltést! + Nincsenek a kérésednek megfelelő videók! Nincsenek feltöltések Tölts fel valami tartalmat vagy kapcsold be az azonnali feltöltést! + Tölts fel néhány tartalmat vagy aktiváld az automatikus feltöltést! mappa mappák fájl @@ -341,6 +349,8 @@ Elnézést kérek! Előnézeti kép + A két nem jeleníthető meg + %1$s nem lehet másolni a %2$s helyi mappába Azonnali feltöltés mappa Helyi mappa @@ -554,6 +564,9 @@ %d kiválasztott + Tevékenységek betöltése… + Nincsenek tevékenységek. + Add meg a feltöltendő fájl nevét és típusát Fájlnév Fájl típus @@ -592,4 +605,7 @@ Nincs még tevékenység - + Ez a folyam olyan eseményeket mutat mint\nbővítmények, változások és megosztások + + + diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index 09507215e1..9f68fec0fa 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -353,6 +353,8 @@ 申し訳ありません! イメージプレビュー + 画像を表示できません + %1$s は、ローカルフォルダー %2$s にコピーできませんでした。 自動アップロードフォルダー ローカルフォルダー diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 1379538576..3db1c3dc77 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -98,11 +98,14 @@ Ingen applikasjon funnet for filtypen! Det er ingen filer i denne mappen. Ingen resultater i denne mappen + Ingen resultater Ingen favoritter Ingenting delt enda + Filer og mapper som du deler vil bli vist her Ingen videoer Ingen bilder Vil du prøve i en annen mappe? + Last opp noen bilder eller aktiver automatisk opplasting! Ingen opplastinger tilgjengelig Last opp innhold eller aktiver umiddelbar opplasting. mappe @@ -260,6 +263,7 @@ Sett som tilgjengelig frakoblet Fjern som tilgjengelig frakoblet + Sett som favoritt Endre navn Fjern Vil du virkelig fjerne %1$s? @@ -335,6 +339,8 @@ Beklager! Bildeforhåndsvisning + Bildet kan ikke vises + %1$s kunne ikke kopieres til lokal mappe %2$s Mappe for umiddelbar opplasting Lokal mappe @@ -526,6 +532,8 @@ Funnet en feil? Føles noe rart? Meld en feil på Github Er du interessert i å hjelpe oss å teste ned neste versjonen? + Test nattskiftversjonen + Dette inkluderer alle kommende funksjoner og er helt på kanten. Feil/feilmeldinger kan oppstå og i sådant fall, meld fra om dem til oss. Release candidate Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid. Bidra aktivt @@ -547,6 +555,8 @@ %d valgte + Ingen aktiviteter funnet. + Legg inn filnavn og -type for opplasting Filnavn Filtype diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index f221cc9ef5..d52336ea8e 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -11,7 +11,7 @@ Настройки Подробно Отправить - Сортировать + Сортировка Сортировать по Порядок сортировки А–Я @@ -328,7 +328,7 @@ Подпись: Алгоритм: Этот хэш алгоритм не доступен на этом телефоне. - Слепок: + Отпечаток: Проблема при загрузке сертификата. Сертификат не может быть показан. - Нет информации об ошибке From 4efc1c0d8319cc215c1f9161d1deaf0c7f3d706f Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 27 Mar 2017 00:55:03 +0200 Subject: [PATCH 622/881] notifications icon work --- drawable_resources/ic_notification.svg | 58 ++++++++++++++++++ .../res/drawable-hdpi/ic_notification.png | Bin 0 -> 623 bytes .../res/drawable-mdpi/ic_notification.png | Bin 0 -> 450 bytes .../res/drawable-xhdpi/ic_notification.png | Bin 0 -> 719 bytes .../res/drawable-xxhdpi/ic_notification.png | Bin 0 -> 1033 bytes .../res/drawable-xxxhdpi/ic_notification.png | Bin 0 -> 1317 bytes 6 files changed, 58 insertions(+) create mode 100644 drawable_resources/ic_notification.svg create mode 100644 src/main/res/drawable-hdpi/ic_notification.png create mode 100644 src/main/res/drawable-mdpi/ic_notification.png create mode 100644 src/main/res/drawable-xhdpi/ic_notification.png create mode 100644 src/main/res/drawable-xxhdpi/ic_notification.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_notification.png diff --git a/drawable_resources/ic_notification.svg b/drawable_resources/ic_notification.svg new file mode 100644 index 0000000000..bfcd35b2d4 --- /dev/null +++ b/drawable_resources/ic_notification.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/main/res/drawable-hdpi/ic_notification.png b/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..deac351b3fe7a831ce4d23bd27b31b3f0e620f61 GIT binary patch literal 623 zcmV-#0+9WQP)LS<anof%`^42Q#)yfH*(61_#6bmqEhNdR?zBhec#`7kO6?3{eFMLCTKhU#||<803v#1ld~0C zac~*2Y7?>*y6PY@;+jp!R_Kz0NUjd2Pe&P4LRn-AMNzaitIce>rV2$-bRWRGSqTBy z3&Zf?w7|qqN2}FZ5<+|g;LlJ90KOYzZpU%_Y24z(2@%ot5@Z0tzvv#z+@uB1^UjSi zMiZ_c^>)&TGQ zB~TG6&@IdIVzyYB^Rg^Q!2JRNc<)Dx_?CidU0Z7>)GWI^&v)CrsxkH6Kh>1$Y87a9 s4RIXbPN!3hG3Wn*aU9=iyeqWg7osRwaER7p!~g&Q07*qoM6N<$g4gS~UH||9 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_notification.png b/src/main/res/drawable-xhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..d035a62131673da1ae41971fd6d688ab5c3d5c8e GIT binary patch literal 719 zcmV;=0x@~8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10!&FnK~!jg?U}KQ6G0Tlzb`SONxihoD(P;F5$8Mwd{t*<47HWJyH&_;b3kh}^AIDlb~C)>l(C zjTrDe?-YPl0CxaX4hi1{umNB#2!hXfYv(rLy6$C?PXNqoO23K7?QXaGGEe<-99}^8`H4TLSPL`456bM6PC?L?#1Dsna6z7W&KPZ)}k~ z-|2Kd>IyS`dm{1(=9&k9xyfYmFpE%o0!pbfBJv)GpEkPeCP{L(*Xw=I5ou3AM6Sbp z^8ipOm&;dlMcM{PUewiS%o;5NN-4jfK7Ql6Zd)fl_49yI$`_GU{g(6~dBJg<<6#)SN)w;Tz_gm*L&rp_ zB{a?E_aM2FChq^*#1_jxh_S0h*LAl^)>DRm4}#!?iMqx%G0Art;X1JgV)7K)OdCk@ znW>`242;L)bpXQ@p~Gsmx^AkjF$4X6|3@6hi#XWCFplFzlW%HrUGDB@Fc@q%8jZ(s z9De~YFCudQc1XS^*{RiP%k6f1%VbT9#bTK)KLPK5x%EC71(pB+002ovPDHLkV1i1w BL&N|8 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/ic_notification.png b/src/main/res/drawable-xxhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f289646c3cfc3c95a36a90e1bd768c3eaf6787 GIT binary patch literal 1033 zcmV+k1or!hP)#8KAri0Dx`VCNrM}U;+RUjTQ=p^8*6|^_;8aFUYp- z0|2f7nDfU^--zh2=Xp1BsP&Uv1-Y)<69mB+fJH5ad}=nEYiqUIr!0H@N+GX527oXO zccZl&09afs7I$UUXC`tL#LO$&7_%yiF0IJr6tgUABM}_}a0I}bh~cjQTw&&GzVAOx zyW5{+D#*6&?EoqOHph&36o#QYI5_xFu+~4xM3Cb+D*+5Kv($QWtJ!Rxs?}=mgz{RF zx**%Ow-eFTcGjB?c~3+~JockL_n&Gx>9|v#~z`_*b=L0xmn&zu|z5XPHd;lp5 zvMg&a5naaLH-M590PHbM^Lf2qf0o7{q;iT`meof@!vMO|$e)3)M6}KGyvNeP;`c%2 za(ONhT|{%x%>D)G0Zy3fo=}^&A%yFER%sd95D4E*< zU#Fhk#4i7$M-VfgL4I-opu4N9>$GH`*b!7Nmy3-?;~jt{QkgONI59D?VrXcnDG?@i z1T`9sKIAV40G9Uj^lXv}6B9&4JEgLc5(I%*7coK1yhSQY08=VRa*@vUz0I!>kysZ= zLCXZQlCoSXNK(-Mus~0IAia-TLpn@V$K@o@u za$R?gM2;j;SDOPZ7Dg;}Xo>J7v2K7hnUQsT8?7&|JJ z%FDO`u?5WnInyMP6id)7k~2+gNwL--WFeZ z2xMfoi5$pS5HnvB$ha=irCl-=UF)c`<5Zvc!;eIu6XnxiO+q9}@@C~ff__=g4#FJf4N00000NkvXXu0mjf D^d`aH literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_notification.png b/src/main/res/drawable-xxxhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e93fbd217701804de0b13f8d6fa47b1756d6cb GIT binary patch literal 1317 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ zL`(%?#+$k3mw|$kC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6F6~-(X zojdo->a9;-$+aLthcDe|Cacn}^4Z?!%B|+Azxw*C>uT#;=PafhKhFMtSKoHObl=si z-X*E(73;(|L`xq(=XaRB;djx_JKe{`mw09|DJy~1+f%=a$^Zzs-O z@6{H6*k8;8h7Ufitr@E)2oJ!P}1){^4s_JT0ou*=4!b)KjkBf44ogVYvTY zUUd;afqC7vhOhJgS1b&O$TN|;zdNE~vhs=$EnBt(#=Q3Zk+VDcLbayq=bCSmbJ!WP z&$w$*F+<*lyVdN|jc1|@ z8$ZK!<`221n>R6^ditq1P-HE`iJLE$ADs2P^03*zyp&XSm%tLPmy&i2PiFqKliq7Qx;b?-Feq;^KV#XIb>UH@kb-jiDSU)b+fwz4yDp-G+`l)4PX7()JxK;g{}b zTv<_l!mQ{1&f6Rc*$dk>ug}Pv&}E+X)tK{uAs)1tk;QR=&$aCbzyHmg{Iz$lwG{`` z(KG2jSGTuz$mxl2?Q~oGacbu;H>MZUAC}MLaja(eYxYMkSTTclL45oDR3(;N#xK7= z>@I0v@HX)l#%`H~$Bl z_uMV(Yt z-=Y~a{m-2{_ix$4X=Uf^wiT&+dwbi9bG4p!`C{>{Zod%oj5T4a-)F_l3hUf0cw393 zNquIe+<{Wty4P9_8-Y&!ekOhMk#`O2jvhTK@9yq?KjoPt1AoHvWaG4FKmC>$?+IHy zck_lLwVr?YZs>3{IiL9>A}E{u?C_Zy4u*~wN)1nYt2_KB{m5~LlntN)qNAR{H7NYc U3V-L1z#@&o)78&qol`;+01s(f)Bpeg literal 0 HcmV?d00001 From e2c0688beb19ecc9d93478a613a91b1022f125f7 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 27 Mar 2017 00:55:20 +0200 Subject: [PATCH 623/881] WiP activity for notifications --- src/main/AndroidManifest.xml | 1 + .../android/ui/activity/DrawerActivity.java | 5 +- .../ui/activity/NotificationsActivity.java | 78 +++++++++++++++ src/main/res/layout/notifications_layout.xml | 95 +++++++++++++++++++ src/main/res/menu/drawer_menu.xml | 5 + src/main/res/values/strings.xml | 4 + 6 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java create mode 100644 src/main/res/layout/notifications_layout.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 4ee75a4245..374f5d728e 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -76,6 +76,7 @@ + diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index b698306179..d05361570a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -405,7 +405,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU activityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(activityIntent); break; - case R.id.nav_folder_sync: + case R.id.nav_notifications: + Intent notificationsIntent = new Intent(getApplicationContext(), NotificationsActivity.class); + startActivity(notificationsIntent); + break; case R.id.nav_folder_sync: Intent folderSyncIntent = new Intent(getApplicationContext(), FolderSyncActivity.class); startActivity(folderSyncIntent); break; diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java new file mode 100644 index 0000000000..61466c1140 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -0,0 +1,78 @@ +/** + * Nextcloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2017 Andy Scherzinger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.ui.activity; + +import android.os.Bundle; +import android.view.MenuItem; + +import com.owncloud.android.R; +import com.owncloud.android.lib.common.utils.Log_OC; + +/** + * Activity displaying all server side stored activity items. + */ +public class NotificationsActivity extends FileActivity { + + private static final String TAG = NotificationsActivity.class.getSimpleName(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + Log_OC.v(TAG, "onCreate() start"); + super.onCreate(savedInstanceState); + + setContentView(R.layout.notifications_layout); + + // setup toolbar + setupToolbar(); + + // setup drawer + setupDrawer(R.id.nav_notifications); + getSupportActionBar().setTitle(getString(R.string.drawer_item_notifications)); + + setupContent(); + } + + /** + * sets up the UI elements and loads all activity items. + */ + private void setupContent() { + // TODO add all (recycler) view relevant code + data loading + adapter etc. + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval; + + switch (item.getItemId()) { + case android.R.id.home: + if (isDrawerOpen()) { + closeDrawer(); + } else { + openDrawer(); + } + + default: + retval = super.onOptionsItemSelected(item); + } + + return retval; + } +} diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml new file mode 100644 index 0000000000..adc1717207 --- /dev/null +++ b/src/main/res/layout/notifications_layout.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/res/menu/drawer_menu.xml b/src/main/res/menu/drawer_menu.xml index 20e9df53ee..065c24d15e 100644 --- a/src/main/res/menu/drawer_menu.xml +++ b/src/main/res/menu/drawer_menu.xml @@ -73,6 +73,11 @@ android:orderInCategory="0" android:title="@string/drawer_item_recently_modified" android:visible="false"/> + Settings Uploads Activities + Notifications %1$s of %2$s used Close Open @@ -580,6 +581,9 @@ Loading activities… No activities found. + Loading notifications… + No notifications. + Input upload filename and filetype Filename Filetype From 63241a158696bb6cd9cc30d2e8e470a6f9a1fb47 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 27 Mar 2017 19:10:47 +0200 Subject: [PATCH 624/881] empty list icon, use latest empty list layout and butterknife --- .../ic_list_empty_upload_backup.svg | 57 +++++++++++++++++ .../ic_notification_light_grey.svg | 58 +++++++++++++++++ .../notification-icon_backup.svg | 50 +++++++++++++++ .../ui/activity/NotificationsActivity.java | 59 ++++++++++++++++++ .../ic_notification_light_grey.png | Bin 0 -> 1158 bytes .../ic_notification_light_grey.png | Bin 0 -> 805 bytes .../ic_notification_light_grey.png | Bin 0 -> 1490 bytes .../ic_notification_light_grey.png | Bin 0 -> 2186 bytes .../ic_notification_light_grey.png | Bin 0 -> 2959 bytes src/main/res/layout/notifications_layout.xml | 33 +--------- src/main/res/values/strings.xml | 3 +- 11 files changed, 227 insertions(+), 33 deletions(-) create mode 100644 drawable_resources/ic_list_empty_upload_backup.svg create mode 100644 drawable_resources/ic_notification_light_grey.svg create mode 100644 drawable_resources/notification-icon_backup.svg create mode 100644 src/main/res/drawable-hdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-mdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-xhdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-xxhdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_notification_light_grey.png diff --git a/drawable_resources/ic_list_empty_upload_backup.svg b/drawable_resources/ic_list_empty_upload_backup.svg new file mode 100644 index 0000000000..02ecad0b38 --- /dev/null +++ b/drawable_resources/ic_list_empty_upload_backup.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/drawable_resources/ic_notification_light_grey.svg b/drawable_resources/ic_notification_light_grey.svg new file mode 100644 index 0000000000..762dbee58a --- /dev/null +++ b/drawable_resources/ic_notification_light_grey.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/drawable_resources/notification-icon_backup.svg b/drawable_resources/notification-icon_backup.svg new file mode 100644 index 0000000000..abe3ee0fed --- /dev/null +++ b/drawable_resources/notification-icon_backup.svg @@ -0,0 +1,50 @@ + +image/svg+xml \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 61466c1140..b59603479a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -21,11 +21,22 @@ package com.owncloud.android.ui.activity; import android.os.Bundle; +import android.support.v7.widget.RecyclerView; import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +import butterknife.BindString; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Unbinder; + /** * Activity displaying all server side stored activity items. */ @@ -33,12 +44,39 @@ public class NotificationsActivity extends FileActivity { private static final String TAG = NotificationsActivity.class.getSimpleName(); + @BindView(R.id.empty_list_view) + public LinearLayout emptyContentContainer; + + @BindView(R.id.empty_list_view_text) + public TextView emptyContentMessage; + + @BindView(R.id.empty_list_view_headline) + public TextView emptyContentHeadline; + + @BindView(R.id.empty_list_icon) + public ImageView emptyContentIcon; + + @BindView(R.id.empty_list_progress) + public ProgressBar emptyContentProgressBar; + + @BindView(android.R.id.list) + public RecyclerView recyclerView; + + @BindString(R.string.notifications_no_results_headline) + public String noResultsHeadline; + + @BindString(R.string.notifications_no_results_message) + public String noResultsMessage; + + private Unbinder unbinder; + @Override protected void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); super.onCreate(savedInstanceState); setContentView(R.layout.notifications_layout); + unbinder = ButterKnife.bind(this); // setup toolbar setupToolbar(); @@ -54,6 +92,9 @@ public class NotificationsActivity extends FileActivity { * sets up the UI elements and loads all activity items. */ private void setupContent() { + emptyContentIcon.setImageResource(R.drawable.ic_notification_light_grey); + setEmptyContent(noResultsHeadline,noResultsMessage); + // TODO add all (recycler) view relevant code + data loading + adapter etc. } @@ -75,4 +116,22 @@ public class NotificationsActivity extends FileActivity { return retval; } + + private void setLoadingMessage() { + emptyContentHeadline.setText(R.string.file_list_loading); + emptyContentMessage.setText(""); + + emptyContentIcon.setVisibility(View.GONE); + emptyContentProgressBar.setVisibility(View.VISIBLE); + } + + private void setEmptyContent(String headline, String message) { + if (emptyContentContainer != null && emptyContentMessage != null) { + emptyContentHeadline.setText(headline); + emptyContentMessage.setText(message); + + emptyContentProgressBar.setVisibility(View.GONE); + emptyContentIcon.setVisibility(View.VISIBLE); + } + } } diff --git a/src/main/res/drawable-hdpi/ic_notification_light_grey.png b/src/main/res/drawable-hdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..174aef918c57fc72deac98b9f212de8d495266fc GIT binary patch literal 1158 zcmV;11bO?3P)k+O$y=HT8v|tsNB| zNhw7tf`6csjzpa(J`kL!1F=5Af(kycwN`A<=wRPlOK3>%&E9M6b?)yoNdh-#t&?BQ z$=>IloDCu(A|fIpA|fIp(l`U&4P^Eq@Hw!u{q-~8E->TPQD#jEtOa}vOp`+Uw;A99 za1NL??kl@N?*=j$0uBRT@!$J12&@Ojfos59yVmk+LSP4gE&tiEIOu4R=30B(ALkC^ z7qXNzPkRgePOwp9qk6sG%%?~ZGmk8eg>9!Hv)V>>gNgY*twT~)D+lO(rK`!o?5^r;3@FPxfh_GAI=2u z6Ln5%2Y^Y^>G7F!FI5D#8aP5a1=XqrYy@rqFTES_Gz9!e9e=YHvV?RNaQ(&dKEn2s zPB&3}M7k8__MV#O5jFmeXj`6j(3{EEokAi~B_>D6n7@STL4>HSxl4 zhuOYa{WHWMaENBU;|%FGf$JDN-p?YiPFPxZy9OhPLeSU-i;Q9QI# zf%Rip9YsSc5m-Nm)ln?85`i5g_(LQ!874i@?AM$dEin&k;=PBx%Ko#^m5yK(STG7K z7zGxL0t=?Z{~C{B_XN?}y#gM1Hz6V-A|g!};Soa9!1qSAP68K=YV{<-#MyF9lI~Jb1Tj~H!0rQo8`PO0z*UI|fxRZJg;LtBcCD&K2n^C1U!`3&sIh2K0=ohH zR&e|GfSU!kpG}m&08RmK3T*ccX*eH(_d)~Rcn-WE|H1^vNk?!9kpcsFNLra8*Fz;Q z0OvDp%S5!m0Pc_`xD)h#N}mNz0B3VGWhG)@kdCxFq(`cEd+*;p;24>2@U#-)TH-<` zNy{HjF#np)Go%G>t`KB2IG-j2)-go7pJWB^*Li*c{6V^cQT?P?L_|bHL_|bHL`3@3 YJAFrSvrSwSa{vGU07*qoM6N<$f_`@XMF0Q* literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_notification_light_grey.png b/src/main/res/drawable-mdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..5da4e5e8f9193685a504ce7c84c3f4cb9d25d8a4 GIT binary patch literal 805 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!EX7WqAsj$Z!;#Vf4nJ zI2C{}W8SCuT%e$2iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}Ci#%N% zLn`LHoxL|J#8IMc{vVCk$4tGr9Ipuk|7h-DTfA}8r65;UZteAlr9T915#Y|vZHZ~> z;_@s>UYPNa-*6+R<};ayWV7OLXRM9YKiHmix>5Q4?(>v%v&ohT5^aefWNk2Mx5Gh` zf~^%SFBsQ1T+Qj_nx*hUr$Aid?zhjr4>UiRRW7#MHr?wi~(>-hawpRcx7Kn0J{T zU(cl9=)cOzE{OBh1GVIl@eb7$+;{qC-1pba?Bpm8>RD~gcSlPu z*pTlI+qad?$uSRK@6et#%k14>9c|~U`yFK;Y_cep5EEEGEz6Pn$?r10cZXGp6D08N?d`gh*jZneNp*65N@%i~p}?Ey@Z*W%P-*4J+B9cUf@dk~TUJX|$4RgJE)~DwwN#ya z;HMRH?#%BHBTN6+-(wb=>MC^MbnF2Gp5%xidFHwf>u8BX@ed|0@Kz1d|GZynQsB%h zO(Nd8o1C9ah`W&Ocud;SEj5TciY<)kSUr!7y@}<&D;0ga4O1hob#L@MSvaqN`A3g+ zM%>pM@2ozs{194wMWIM`#~;o;hwq9#y&V(JC^y-W&*bsEtC4qVS6|-It6RWSy~ES? h<(y<_;+cAbNk75ek1u`68(@-V@O1TaS?83{1OW1EPX+)0 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_notification_light_grey.png b/src/main/res/drawable-xhdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b930f0aff2a56e6f478a69c842061bb5f0a958b0 GIT binary patch literal 1490 zcma)+Yc!Mz7{}jtUSq~}P#Cu%xo;E^GBz|#Lm~HZS&{p7rlDrck{MLQpb{masl=iN z6^TsR+`0^B?WEk^uo>B0mSOj(>~!{={jz=7|2hBXf1cm-<@xZOC+~>IK?PY&SpWbO zTuB6PNfv)KT3S+PiBoNokV`~7f1a?WW>>EmqkW7ENMvYPiF-?Q+b zbnF@EY>jz^7uc_CB$BGHrCEKpqAy&Dlhgl(n$9$!sIiJ{cF~C3vHt z4Zec9YOrSN=JTL7qx8wt+=v|h=<<#?aZINazK(L$KInzN^`X*o++fzlq{#X?&^>_1 z30-`9PPoeIVP=xdNBjJLfr9RaX?6MWIEgmPNuQFtpRGjj4S4lgNrjZpe{JD;Jy~lW zx_LMvl^#5h$MYIEc0(%7PXOIlU}{ z?Xo1UiC!L;WpEC0!Q_876Nva=Ofh?l5K3KH&5hJT4j09BFQNmRaZ;b8hKbAa-R=Y& zBK`*BWcLAr5WMe&w|ud^S-zGtRhJb<@c#<@tn&NxtM{BUMqbSQpeUKR)~)4!2qh)H z?&vZKYDkHh@aG!t{^mY}e`U~kA=7pvVI*_ZySIuzFWi6g$RCXbC+5L+M)@soLsaTZ zCd(qA5kwNpc3@|YW<9zvDmRPB-M0-#*>=_dce+M6& z-{x&rQdc1opVJ#-GQ|q61XinWsSs&w7qVpDsGeo!Uj}5nnQgKJ^1<1mZ;i( z(3#vr25?}FXp@ns;(uA76sqPpW@S0F%4&B9QgW(xGnB9>;)5?q*QgH1IMj$$1ah)c eN%_C3dp)Vf%=fWCkozV77jQk`LAc`*mi0GkgMD`Z literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/ic_notification_light_grey.png b/src/main/res/drawable-xxhdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..026fb801206a9fe319063c5f5c942dc02480cb12 GIT binary patch literal 2186 zcmb_ec~sKd7G@|Q#VAe1IjdV)Sqj&ok_N>TP3xkj7!-!XHT61BVyN|_Nli`bnx!NT zXuZ3f$kd$uX$d|D400+n$;v5BER)K_OZWbF-&$|IKi*kqpYMG8?DNOoXYFsDq@(Um z8fyA#5C}wrnVX?wZb`jIamT1D{;k4jm_E#Z&l)iWei_tetOeBK`N7V{y&+ z!1fm!hS1fJAz(&*d1;&6L}nO)h}nM1wp0w(O)|hw;48~z<$mBKG~AQx{QeYu7^e|u z6muqLd09_(AFL8?mR>zf#N;VvU`Vp)E!*urM9VfuG_^894s#2T*qT!C znYPKYt^7cnXkZ(9NB^^o+svv^#6H^GT$LI;`E218hFyQFWhEM({As=XsJbYtD69B) zUnD&F*&*s$k(7qsA+9d`8#8s%tcFJ)oY93RGi%!zw9|7wb;%|_KMGf~B~rwd^+k+V zzF(Ny-qDpEee*Meu(-Q>713^p?#N4f73n!bFGZi84{Z@RLe8`gTg`iS!e(p!5=V1* zW-u}eCm3^sIGJ^3L?e1|Wu4%vj!_x6NN7E>iZg?~Q`?1B7@*QT_ zL1F4vzxbrRv4Qi$c5>Xi_-s{OtOIrBumDVI${27v!XxJ_Uhp|<1rNT@LD{1j4lRc@ z=Tor~eeB?iZrBK9fryb-sDnp<3x_b$E$5%wHLaCXWXIp0E3eWy&bbdLfM#Tm)Bs`4 zBXvZd&fU1|+IlM#wwiowJh#ouv=}Go3*(2nFfG{WtFwxxhhubDWxh8!rJ=h5%I#lNuf3JU>7f%>V;diMELF{vX5%EUg` zL{#^lmksp}&zNyZ9i45Tu+Nd$LF7#92=%=c>3Pc(TJA32k>f{ay*yHzXZfV3Cc7dA zKN(EjfyNFNn00iv=9h~9<(D1hF_}BZ#KDitt@@X9sJ^EcTXP5a$fQ7ez}KFK5{FHd z$eLErdlYl-IVQtklOch4*%T3tvNa?;fe_qZ zHM(Y6Jpp;C#&nR!pbvSX%>|D^Cw>A}5RaY~_L;7Oxn#kI z))D|=<^omkPTl&MtF~Ei*I22h%i?1TCO!CwuYGWj*BE$@k9;~PW>C^UwPAp-@-U~)C6^TuT{H7O~~)XzT)hA&gP>QXYnlP z{vK<7oBlocZwXuS~_H#ON_xUv%Y=aAztXfq^ z+>h}slm_>6?l0EEL&SefK=m^wYcH!5tPAR0knk(0{W4sjlJ2`hU^rhzSH+zh#KJ@R zbAe)sLnvq$fnz5gMwd`*fRj#`2hd$`8-7Cj6EK^lX{$?kvZo7L?ufaO%ITX^|5oL* zpfBIhq&Q8jj=fViN|T)gwIr8PCLN>74y_8Jf2OXu2P{c0m5gf3`X)>(aDqB96c4_d zIG7o!7GuUv>_V3`J<~#3 zECfDUpa&Q!Yq@H&s21@01Bt3!Cj{&Kh_#TYb++hG+W4CWx7xg@n;*$fld&!6lGsBT zieHgH0+5r@`TZF;5M#EK*`d3g2!#q3nFA`ZqvG Mj_$-Vd-}yc0qn~B*#H0l literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_notification_light_grey.png b/src/main/res/drawable-xxxhdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..653be22635bcfc065e9b3ab5904697a2e90dd283 GIT binary patch literal 2959 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 literal 0 HcmV?d00001 diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml index adc1717207..73cccf8b52 100644 --- a/src/main/res/layout/notifications_layout.xml +++ b/src/main/res/layout/notifications_layout.xml @@ -49,39 +49,8 @@ android:layout_marginLeft="-3dp" android:layout_marginBottom="-3dp"/> - + - - - - - - diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 310a0cdbda..f7179a768b 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -582,7 +582,8 @@ No activities found. Loading notifications… - No notifications. + No notifications + Please check back later. Input upload filename and filetype Filename From 71d089a96f2924e9a2fd51c4c45c6a3cd2a2ab19 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 27 Mar 2017 22:01:56 +0200 Subject: [PATCH 625/881] WiP data fetching --- .../ui/activity/NotificationsActivity.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index b59603479a..6b41f159a8 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -20,6 +20,7 @@ package com.owncloud.android.ui.activity; +import android.accounts.Account; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.view.MenuItem; @@ -30,7 +31,12 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.Notification; import butterknife.BindString; import butterknife.BindView; @@ -96,6 +102,42 @@ public class NotificationsActivity extends FileActivity { setEmptyContent(noResultsHeadline,noResultsMessage); // TODO add all (recycler) view relevant code + data loading + adapter etc. + fetchAndSetData(); + } + + private void populateList(Notification notifications) { + + } + + private void fetchAndSetData() { + Thread t = new Thread(new Runnable() { + public void run() { + Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); + RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); + RemoteOperationResult result = + getRemoteNotificationOperation.execute(account, NotificationsActivity.this); + + if (result.isSuccess() && result.getData() != null) { + final Notification notifications = (Notification) result.getData().get(0); + + runOnUiThread(new Runnable() { + @Override + public void run() { + populateList(notifications); + + emptyContentContainer.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } + }); + } else { + // show error + setEmptyContent(noResultsHeadline, result.getLogMessage()); + Log_OC.d(TAG, result.getLogMessage()); + } + } + }); + + t.start(); } @Override From b1cc47d9cfddf4c6840a291f3cd6c0733f82d7f5 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 27 Mar 2017 22:56:39 +0200 Subject: [PATCH 626/881] Try to fix --- .../android/ui/activity/NotificationsActivity.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 6b41f159a8..3f9d8898d1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -2,7 +2,9 @@ * Nextcloud Android client application * * @author Andy Scherzinger + * @author Mario Danic * Copyright (C) 2017 Andy Scherzinger + * Copyright (C) 2017 Mario Danic * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -36,7 +38,9 @@ import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; -import com.owncloud.android.lib.resources.notifications.Notification; +import com.owncloud.android.lib.resources.notifications.models.Notification; + +import java.util.List; import butterknife.BindString; import butterknife.BindView; @@ -105,7 +109,7 @@ public class NotificationsActivity extends FileActivity { fetchAndSetData(); } - private void populateList(Notification notifications) { + private void populateList(List notifications) { } @@ -118,7 +122,7 @@ public class NotificationsActivity extends FileActivity { getRemoteNotificationOperation.execute(account, NotificationsActivity.this); if (result.isSuccess() && result.getData() != null) { - final Notification notifications = (Notification) result.getData().get(0); + final List notifications = result.getNotificationData(); runOnUiThread(new Runnable() { @Override From 2f2f0b971a64d9a6c0e54551b0e147448375f2c1 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 28 Mar 2017 00:11:56 +0200 Subject: [PATCH 627/881] enforce refresh of SNAPSHOT lib dependencies --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 4469ed7ed9..68bd544bf2 100644 --- a/build.gradle +++ b/build.gradle @@ -221,6 +221,10 @@ dependencies { } +configurations.all { + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + tasks.withType(Test) { /// increased logging for tests testLogging { From afe2448153c2802fc2ef72870d5821fc6fb3ce6e Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 10:32:37 +0200 Subject: [PATCH 628/881] Fix notifications --- .../android/operations/GetServerInfoOperation.java | 5 +++-- .../android/ui/activity/NotificationsActivity.java | 13 +++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java b/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java index 1b4b7a9bb4..d12e5459a0 100644 --- a/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java +++ b/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java @@ -21,7 +21,7 @@ package com.owncloud.android.operations; -import java.util.ArrayList; +import android.content.Context; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.lib.common.OwnCloudClient; @@ -33,7 +33,7 @@ import com.owncloud.android.lib.resources.status.GetRemoteStatusOperation; import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.operations.DetectAuthenticationMethodOperation.AuthenticationMethod; -import android.content.Context; +import java.util.ArrayList; /** * Get basic information from an ownCloud server given its URL. @@ -78,6 +78,7 @@ public class GetServerInfoOperation extends RemoteOperation { // first: check the status of the server (including its version) GetRemoteStatusOperation getStatus = new GetRemoteStatusOperation(mContext); + RemoteOperationResult result = getStatus.execute(client); if (result.isSuccess()) { diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 3f9d8898d1..47717f0074 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -118,10 +118,10 @@ public class NotificationsActivity extends FileActivity { public void run() { Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); - RemoteOperationResult result = + final RemoteOperationResult result = getRemoteNotificationOperation.execute(account, NotificationsActivity.this); - if (result.isSuccess() && result.getData() != null) { + if (result.isSuccess() && result.getNotificationData() != null) { final List notifications = result.getNotificationData(); runOnUiThread(new Runnable() { @@ -134,9 +134,14 @@ public class NotificationsActivity extends FileActivity { } }); } else { - // show error - setEmptyContent(noResultsHeadline, result.getLogMessage()); Log_OC.d(TAG, result.getLogMessage()); + // show error + runOnUiThread(new Runnable() { + @Override + public void run() { + setEmptyContent(noResultsHeadline, result.getLogMessage()); + } + }); } } }); From ce14cc852ce3e94dd083143fcef0d2bc122ef377 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 12:29:59 +0200 Subject: [PATCH 629/881] Basics of push --- .../authentication/AccountAuthenticator.java | 49 +++++++++--- .../files/services/FileDownloader.java | 12 ++- .../android/files/services/FileUploader.java | 10 ++- .../android/syncadapter/FileSyncAdapter.java | 11 ++- .../android/ui/activity/FileActivity.java | 9 ++- .../android/ui/activity/UserInfoActivity.java | 11 ++- src/main/res/values/setup.xml | 2 +- src/modified/AndroidManifest.xml | 74 +++++++++++++++++++ .../ModifiedAuthenticatorActivity.java | 41 ++++++++++ .../firebase/NCFirebaseInstanceIDService.java | 47 ++++++++++++ .../firebase/NCFirebaseMessagingService.java | 71 ++++++++++++++++++ .../android/utils/GooglePlayUtils.java | 49 ++++++++++++ src/modified/res/values/setup.xml | 1 + 13 files changed, 371 insertions(+), 16 deletions(-) create mode 100644 src/modified/AndroidManifest.xml create mode 100644 src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java create mode 100644 src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java create mode 100644 src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java create mode 100644 src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index 2c8c68903f..d6f0d1b084 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -21,16 +21,19 @@ package com.owncloud.android.authentication; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; - -import android.accounts.*; +import android.accounts.AbstractAccountAuthenticator; +import android.accounts.Account; +import android.accounts.AccountAuthenticatorResponse; +import android.accounts.AccountManager; +import android.accounts.NetworkErrorException; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.widget.Toast; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; import com.owncloud.android.lib.common.accounts.AccountTypeUtils; import com.owncloud.android.lib.common.utils.Log_OC; @@ -90,8 +93,15 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { + e.getMessage(), e); return e.getFailureBundle(); } - - final Intent intent = new Intent(mContext, AuthenticatorActivity.class); + + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -134,7 +144,15 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Log_OC.e(TAG, "Failed to validate account type " + account.type + ": " + e.getMessage(), e); return e.getFailureBundle(); } - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -185,7 +203,13 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - final Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -215,7 +239,14 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { - final Intent intent = new Intent(mContext, AuthenticatorActivity.class); + + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index ff0a660103..8ee6c468ec 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,6 +41,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -51,10 +52,10 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.FileUtils; -import com.owncloud.android.ui.notifications.NotificationUtils; import com.owncloud.android.operations.DownloadFileOperation; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.ui.notifications.NotificationUtils; import com.owncloud.android.ui.preview.PreviewImageActivity; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.utils.ErrorMessageAdapter; @@ -579,7 +580,14 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index 3d23bdff57..8b2b647c61 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,6 +48,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1080,7 +1081,14 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + // let the user update credentials with one click + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 1213e19175..36160edafa 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,6 +37,7 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -399,7 +400,15 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { ); if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + // let the user update credentials with one click + Intent updateAccountCredentials; + if (!getContext().getResources().getBoolean(R.bool.push_enabled) + && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index a6b61ae320..1a7e9b0c02 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,6 +40,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -396,7 +397,13 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 513770bd4c..0317d3aaf2 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,6 +48,7 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -284,7 +285,15 @@ public class UserInfoActivity extends FileActivity { } private void changeAccountPassword(Account account) { - Intent updateAccountCredentials = new Intent(UserInfoActivity.this, AuthenticatorActivity.class); + // let the user update credentials with one click + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 8198e0851a..b22897f3ef 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -110,7 +110,7 @@ false - + false false diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml new file mode 100644 index 0000000000..10d6d06550 --- /dev/null +++ b/src/modified/AndroidManifest.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java new file mode 100644 index 0000000000..618578891a --- /dev/null +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -0,0 +1,41 @@ +package com.owncloud.android.authentication; + +import android.os.Bundle; + +import com.owncloud.android.utils.GooglePlayUtils; + +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GooglePlayUtils.checkPlayServices(this); + } + + @Override + protected void onResume() { + super.onResume(); + GooglePlayUtils.checkPlayServices(this); + } + +} \ No newline at end of file diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java new file mode 100644 index 0000000000..5d98057250 --- /dev/null +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -0,0 +1,47 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.owncloud.android.services.firebase; + +import android.util.Log; + +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.iid.FirebaseInstanceIdService; + +public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { + private static final String TAG = "NCFirebaseInstanceID"; + + @Override + public void onTokenRefresh() { + + //Getting registration token + String refreshedToken = FirebaseInstanceId.getInstance().getToken(); + + //Displaying token on logcat + Log.d(TAG, "Refreshed token: " + refreshedToken); + + } + + private void sendRegistrationToServer(String token) { + //You can implement this method to store the token on your server + //Not required for current project + } + +} + diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java new file mode 100644 index 0000000000..c5de8530d5 --- /dev/null +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -0,0 +1,71 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.owncloud.android.services.firebase; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; +import android.util.Log; + +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; +import com.owncloud.android.R; +import com.owncloud.android.ui.activity.FileDisplayActivity; + +public class NCFirebaseMessagingService extends FirebaseMessagingService { + private static final String TAG = "NCFirebaseMessaging"; + + @Override + public void onMessageReceived(RemoteMessage remoteMessage) { + Log.d(TAG, "From: " + remoteMessage.getFrom()); + Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); + + //Calling method to generate notification + sendNotification(remoteMessage.getNotification().getBody()); + } + + //This method is only generating push notification + //It is same as we did in earlier posts + private void sendNotification(String messageBody) { + Intent intent = new Intent(this, FileDisplayActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, + PendingIntent.FLAG_ONE_SHOT); + + Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("Firebase Push Notification") + .setContentText(messageBody) + .setAutoCancel(true) + .setSound(defaultSoundUri) + .setContentIntent(pendingIntent); + + NotificationManager notificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + + notificationManager.notify(0, notificationBuilder.build()); + } + +} \ No newline at end of file diff --git a/src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java b/src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java new file mode 100644 index 0000000000..9dd560a126 --- /dev/null +++ b/src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java @@ -0,0 +1,49 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.utils; + +import android.app.Activity; +import android.util.Log; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; + +public class GooglePlayUtils { + private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; + private static final String TAG = "GooglePlayUtils"; + + public static boolean checkPlayServices(Activity activity) { + GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); + int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity); + if (resultCode != ConnectionResult.SUCCESS) { + if (apiAvailability.isUserResolvableError(resultCode)) { + apiAvailability.getErrorDialog(activity, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) + .show(); + } else { + Log.i(TAG, "This device is not supported."); + activity.finish(); + } + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 6860913222..81cdb6a16b 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -103,6 +103,7 @@ false + true true From bb1c2eb4946041d90cfdba4f5ad7b85d8dafa9a8 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 13:02:02 +0200 Subject: [PATCH 630/881] Improve custom handling --- .../authentication/AccountAuthenticator.java | 34 +++---------------- .../files/services/FileDownloader.java | 10 +----- .../android/files/services/FileUploader.java | 9 +---- .../android/syncadapter/FileSyncAdapter.java | 10 +----- .../android/ui/activity/FileActivity.java | 9 +---- .../android/ui/activity/UserInfoActivity.java | 10 +----- src/modified/AndroidManifest.xml | 15 ++++++-- .../ModifiedAuthenticatorActivity.java | 2 ++ src/modified/res/values/setup.xml | 2 +- 9 files changed, 24 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index d6f0d1b084..8bcee0be43 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -94,14 +94,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -145,14 +138,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -203,13 +189,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -240,13 +220,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Account account, String authTokenType, Bundle options) throws NetworkErrorException { - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index 8ee6c468ec..eb1065a677 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,7 +41,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -580,14 +579,7 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index 8b2b647c61..f4a98663c5 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,7 +48,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1082,13 +1081,7 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 36160edafa..d34c979e09 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,7 +37,6 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -401,14 +400,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getContext().getResources().getBoolean(R.bool.push_enabled) - && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 1a7e9b0c02..a6b61ae320 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,7 +40,6 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -397,13 +396,7 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 0317d3aaf2..d6fe3dc334 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,7 +48,6 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -286,14 +285,7 @@ public class UserInfoActivity extends FileActivity { private void changeAccountPassword(Account account) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml index 10d6d06550..15c87dde3d 100644 --- a/src/modified/AndroidManifest.xml +++ b/src/modified/AndroidManifest.xml @@ -17,9 +17,10 @@ along with this program. If not, see . --> + xmlns:tools="http://schemas.android.com/tools" + package="com.owncloud.android" + android:versionCode="10040299" + android:versionName="1.4.2"> + + + diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 618578891a..02b0f8116b 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,6 +1,7 @@ package com.owncloud.android.authentication; import android.os.Bundle; +import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -29,6 +30,7 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 81cdb6a16b..b52d58a528 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -103,7 +103,7 @@ false - true + false true From d1740b959d6616cb3f48371077f6eb0684e51e8c Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 14:51:46 +0200 Subject: [PATCH 631/881] Remove push enabled --- src/main/res/values/setup.xml | 1 - src/modified/res/values/setup.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index b22897f3ef..02ef320d48 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -110,7 +110,6 @@ false - false false diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index b52d58a528..6860913222 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -103,7 +103,6 @@ false - false true From d9ec73ead992d51d2e3609f07bc4ad1968d8ed3d Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 14:55:21 +0200 Subject: [PATCH 632/881] Remove Mario --- .../android/authentication/ModifiedAuthenticatorActivity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 02b0f8116b..618578891a 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,7 +1,6 @@ package com.owncloud.android.authentication; import android.os.Bundle; -import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -30,7 +29,6 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } From 859bd589f12b569c9ca8a00d9048ad7898f07768 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 28 Mar 2017 17:50:28 +0200 Subject: [PATCH 633/881] initial UI implementation displaying notifications --- .../ui/activity/NotificationsActivity.java | 30 ++++-- .../ui/adapter/NotificationListAdapter.java | 91 +++++++++++++++++++ src/main/res/layout/notifications_layout.xml | 5 +- 3 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 47717f0074..987efcec59 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -24,6 +24,7 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.MenuItem; import android.view.View; @@ -39,6 +40,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; import com.owncloud.android.lib.resources.notifications.models.Notification; +import com.owncloud.android.ui.adapter.NotificationListAdapter; import java.util.List; @@ -80,6 +82,8 @@ public class NotificationsActivity extends FileActivity { private Unbinder unbinder; + private NotificationListAdapter adapter; + @Override protected void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); @@ -98,19 +102,27 @@ public class NotificationsActivity extends FileActivity { setupContent(); } + public void onDestroy() { + super.onDestroy(); + unbinder.unbind(); + } + /** * sets up the UI elements and loads all activity items. */ private void setupContent() { emptyContentIcon.setImageResource(R.drawable.ic_notification_light_grey); - setEmptyContent(noResultsHeadline,noResultsMessage); + setLoadingMessage(); + + adapter = new NotificationListAdapter(this); + recyclerView.setAdapter(adapter); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); - // TODO add all (recycler) view relevant code + data loading + adapter etc. fetchAndSetData(); } private void populateList(List notifications) { - + adapter.setNotificationItems(notifications); } private void fetchAndSetData() { @@ -118,6 +130,7 @@ public class NotificationsActivity extends FileActivity { public void run() { Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); + Log_OC.d(TAG, "BEFORE getRemoteNotificationOperation.execute"); final RemoteOperationResult result = getRemoteNotificationOperation.execute(account, NotificationsActivity.this); @@ -127,10 +140,13 @@ public class NotificationsActivity extends FileActivity { runOnUiThread(new Runnable() { @Override public void run() { - populateList(notifications); - - emptyContentContainer.setVisibility(View.GONE); - recyclerView.setVisibility(View.VISIBLE); + if (notifications.size() > 0) { + populateList(notifications); + emptyContentContainer.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } else { + setEmptyContent(noResultsHeadline, noResultsMessage); + } } }); } else { diff --git a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java new file mode 100644 index 0000000000..728c242d13 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java @@ -0,0 +1,91 @@ +/** + * ownCloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2016 ownCloud Inc. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.ui.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.owncloud.android.R; +import com.owncloud.android.lib.resources.notifications.models.Notification; +import com.owncloud.android.utils.DisplayUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * This Adapter populates a ListView with all notifications for an account within the app. + */ +public class NotificationListAdapter extends RecyclerView.Adapter { + private List mValues; + private Context context; + + public NotificationListAdapter(Context context) { + this.mValues = new ArrayList<>(); + this.context = context; + } + + public void setNotificationItems(List notificationItems) { + mValues.clear(); + mValues.addAll(notificationItems); + notifyDataSetChanged(); + } + + @Override + public NotificationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list_item, parent, false); + return new NotificationViewHolder(v); + } + + @Override + public void onBindViewHolder(NotificationViewHolder holder, int position) { + Notification notification = mValues.get(position); + holder.dateTime.setText(DisplayUtils.getRelativeTimestamp(context, notification.getDatetime().getTime())); + holder.subject.setText(notification.getSubject()); + holder.message.setText(notification.getMessage()); + + // Todo set proper action icon (to be clarified how to pick) + holder.activityIcon.setImageResource(R.drawable.ic_notification); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + static class NotificationViewHolder extends RecyclerView.ViewHolder { + private final ImageView activityIcon; + private final TextView subject; + private final TextView message; + private final TextView dateTime; + + private NotificationViewHolder(View itemView) { + super(itemView); + activityIcon = (ImageView) itemView.findViewById(R.id.activity_icon); + subject = (TextView) itemView.findViewById(R.id.activity_subject); + message = (TextView) itemView.findViewById(R.id.activity_message); + dateTime = (TextView) itemView.findViewById(R.id.activity_datetime); + } + } +} \ No newline at end of file diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml index 73cccf8b52..adb428ac2a 100644 --- a/src/main/res/layout/notifications_layout.xml +++ b/src/main/res/layout/notifications_layout.xml @@ -44,10 +44,7 @@ android:clipToPadding="false" android:scrollbarStyle="outsideOverlay" android:scrollbars="vertical" - android:visibility="visible" - android:layout_marginRight="-3dp" - android:layout_marginLeft="-3dp" - android:layout_marginBottom="-3dp"/> + android:visibility="visible"/> From 1f240a3424f978b190d1062b8b7c9fc7782d9af7 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 28 Mar 2017 17:55:15 +0200 Subject: [PATCH 634/881] add item divider via decorator --- .../android/ui/activity/NotificationsActivity.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 987efcec59..55a3252eb8 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -24,6 +24,7 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.os.Bundle; +import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.MenuItem; @@ -116,7 +117,13 @@ public class NotificationsActivity extends FileActivity { adapter = new NotificationListAdapter(this); recyclerView.setAdapter(adapter); - recyclerView.setLayoutManager(new LinearLayoutManager(this)); + + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), + layoutManager.getOrientation()); + + recyclerView.setLayoutManager(layoutManager); + recyclerView.addItemDecoration(dividerItemDecoration); fetchAndSetData(); } From 027be72fb3230fcef563eece2e513e0a9de5fbc5 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 29 Mar 2017 18:57:18 +0200 Subject: [PATCH 635/881] Make notifications single instance --- src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 374f5d728e..257d8791b3 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -76,7 +76,7 @@ - + From da4f2cd0b283dd06f61019aba9a81063345884ab Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 30 Mar 2017 16:07:26 +0200 Subject: [PATCH 636/881] Fix drawer menu item --- src/main/AndroidManifest.xml | 2 +- .../android/ui/activity/NotificationsActivity.java | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 257d8791b3..fc34abfe5d 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -76,7 +76,7 @@ - + diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 55a3252eb8..56971b8555 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -23,6 +23,7 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; +import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; @@ -108,6 +109,14 @@ public class NotificationsActivity extends FileActivity { unbinder.unbind(); } + @Override + public void showFiles(boolean onDeviceOnly) { + super.showFiles(onDeviceOnly); + Intent i = new Intent(getApplicationContext(), FileDisplayActivity.class); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(i); + } + /** * sets up the UI elements and loads all activity items. */ From fae4040f383d477af7af19adce654de6bbfbc2e0 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 30 Mar 2017 17:38:24 +0200 Subject: [PATCH 637/881] Fix bunch of stuff --- .../ui/activity/NotificationsActivity.java | 120 ++++++++++++++---- src/main/res/layout/notifications_layout.xml | 39 ++++-- 2 files changed, 123 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 56971b8555..94671ce9ac 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -23,8 +23,12 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -35,8 +39,12 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; @@ -44,6 +52,7 @@ import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOp import com.owncloud.android.lib.resources.notifications.models.Notification; import com.owncloud.android.ui.adapter.NotificationListAdapter; +import java.io.IOException; import java.util.List; import butterknife.BindString; @@ -61,6 +70,12 @@ public class NotificationsActivity extends FileActivity { @BindView(R.id.empty_list_view) public LinearLayout emptyContentContainer; + @BindView(R.id.swipe_containing_list) + public SwipeRefreshLayout swipeListRefreshLayout; + + @BindView(R.id.swipe_containing_empty) + public SwipeRefreshLayout swipeEmptyListRefreshLayout; + @BindView(R.id.empty_list_view_text) public TextView emptyContentMessage; @@ -101,6 +116,23 @@ public class NotificationsActivity extends FileActivity { setupDrawer(R.id.nav_notifications); getSupportActionBar().setTitle(getString(R.string.drawer_item_notifications)); + swipeListRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + setLoadingMessage(); + fetchAndSetData(); + } + }); + + swipeEmptyListRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + setLoadingMessage(); + fetchAndSetData(); + + } + }); + setupContent(); } @@ -142,45 +174,79 @@ public class NotificationsActivity extends FileActivity { } private void fetchAndSetData() { + final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()); + final Context context = MainApp.getAppContext(); + Thread t = new Thread(new Runnable() { public void run() { - Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); - RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); - Log_OC.d(TAG, "BEFORE getRemoteNotificationOperation.execute"); - final RemoteOperationResult result = - getRemoteNotificationOperation.execute(account, NotificationsActivity.this); + OwnCloudAccount ocAccount = null; + try { + ocAccount = new OwnCloudAccount( + currentAccount, + context + ); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, MainApp.getAppContext()); + mClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount)); - if (result.isSuccess() && result.getNotificationData() != null) { - final List notifications = result.getNotificationData(); + RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); + final RemoteOperationResult result = + getRemoteNotificationOperation.execute(mClient); - runOnUiThread(new Runnable() { - @Override - public void run() { - if (notifications.size() > 0) { - populateList(notifications); - emptyContentContainer.setVisibility(View.GONE); - recyclerView.setVisibility(View.VISIBLE); - } else { - setEmptyContent(noResultsHeadline, noResultsMessage); + if (result.isSuccess() && result.getNotificationData() != null) { + final List notifications = result.getNotificationData(); + + runOnUiThread(new Runnable() { + @Override + public void run() { + if (notifications.size() > 0) { + populateList(notifications); + swipeEmptyListRefreshLayout.setVisibility(View.GONE); + swipeListRefreshLayout.setVisibility(View.VISIBLE); + } else { + setEmptyContent(noResultsHeadline, noResultsMessage); + } } - } - }); - } else { - Log_OC.d(TAG, result.getLogMessage()); - // show error - runOnUiThread(new Runnable() { - @Override - public void run() { - setEmptyContent(noResultsHeadline, result.getLogMessage()); - } - }); + }); + } else { + Log_OC.d(TAG, result.getLogMessage()); + // show error + runOnUiThread(new Runnable() { + @Override + public void run() { + setEmptyContent(noResultsHeadline, result.getLogMessage()); + } + }); + } + + hideRefreshLayoutLoader(); + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.e(TAG, "Account not found", e); + } catch (IOException e) { + Log_OC.e(TAG, "IO error", e); + } catch (OperationCanceledException e) { + Log_OC.e(TAG, "Operation has been canceled", e); + } catch (AuthenticatorException e) { + Log_OC.e(TAG, "Authentication Exception", e); } } }); t.start(); + } + private void hideRefreshLayoutLoader() { + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeListRefreshLayout.setRefreshing(false); + swipeEmptyListRefreshLayout.setRefreshing(false); + } + }); + } + + @Override public boolean onOptionsItemSelected(MenuItem item) { boolean retval; diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml index adb428ac2a..5916db6ae2 100644 --- a/src/main/res/layout/notifications_layout.xml +++ b/src/main/res/layout/notifications_layout.xml @@ -3,6 +3,7 @@ Nextcloud Android client application Copyright (C) 2017 Andy Scherzinger + Copyright (C) 2017 Mario Danic This program is free software; you can redistribute it and/or modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -17,8 +18,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - - + android:footerDividersEnabled="false" + android:visibility="visible"> - + + + + + + + + From 14527e861039b19f976a8f7a0686d1d15ce01e7a Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Sun, 26 Mar 2017 00:53:28 +0100 Subject: [PATCH 638/881] WiP use notifications library branch --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 68bd544bf2..e87996e5c3 100644 --- a/build.gradle +++ b/build.gradle @@ -178,6 +178,7 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' + compile 'com.github.nextcloud:android-library:notifications-SNAPSHOT' compile 'com.github.nextcloud:android-library:1.0.14' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" From 856f8c4095cb2db97a60f1351a8ac3d1a63fc8f7 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 27 Mar 2017 00:55:20 +0200 Subject: [PATCH 639/881] WiP activity for notifications --- src/main/AndroidManifest.xml | 2 +- .../java/com/owncloud/android/ui/activity/DrawerActivity.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index fc34abfe5d..374f5d728e 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -76,7 +76,7 @@ - + diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index d05361570a..fa3af89196 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -408,7 +408,8 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU case R.id.nav_notifications: Intent notificationsIntent = new Intent(getApplicationContext(), NotificationsActivity.class); startActivity(notificationsIntent); - break; case R.id.nav_folder_sync: + break; + case R.id.nav_folder_sync: Intent folderSyncIntent = new Intent(getApplicationContext(), FolderSyncActivity.class); startActivity(folderSyncIntent); break; From 1673cf42f4ec4f331600e6a306c53f4b4ca05061 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 27 Mar 2017 22:01:56 +0200 Subject: [PATCH 640/881] WiP data fetching --- .../com/owncloud/android/ui/activity/NotificationsActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 94671ce9ac..c3149100df 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -167,6 +167,7 @@ public class NotificationsActivity extends FileActivity { recyclerView.addItemDecoration(dividerItemDecoration); fetchAndSetData(); + fetchAndSetData(); } private void populateList(List notifications) { From efc6c2bd26ecc5f774d45a2c52df317cc0c9d42b Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 12:29:59 +0200 Subject: [PATCH 641/881] Basics of push --- .../authentication/AccountAuthenticator.java | 34 ++++++++++++++++--- .../files/services/FileDownloader.java | 10 +++++- .../android/files/services/FileUploader.java | 9 ++++- .../android/syncadapter/FileSyncAdapter.java | 10 +++++- .../android/ui/activity/FileActivity.java | 9 ++++- .../android/ui/activity/UserInfoActivity.java | 10 +++++- src/main/res/values/setup.xml | 2 ++ src/modified/res/values/setup.xml | 1 + 8 files changed, 76 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index 8bcee0be43..d6f0d1b084 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -94,7 +94,14 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -138,7 +145,14 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -189,7 +203,13 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -220,7 +240,13 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Account account, String authTokenType, Bundle options) throws NetworkErrorException { - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index eb1065a677..8ee6c468ec 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,6 +41,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -579,7 +580,14 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index f4a98663c5..8b2b647c61 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,6 +48,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1081,7 +1082,13 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index d34c979e09..36160edafa 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,6 +37,7 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -400,7 +401,14 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getContext().getResources().getBoolean(R.bool.push_enabled) + && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index a6b61ae320..1a7e9b0c02 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,6 +40,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -396,7 +397,13 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index d6fe3dc334..0317d3aaf2 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,6 +48,7 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -285,7 +286,14 @@ public class UserInfoActivity extends FileActivity { private void changeAccountPassword(Account account) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 02ef320d48..f67de5bb1e 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -110,6 +110,8 @@ false + false + false diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 6860913222..81cdb6a16b 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -103,6 +103,7 @@ false + true true From f0d129e54f2bc98491602271d49ffcfc638df840 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 13:02:02 +0200 Subject: [PATCH 642/881] Improve custom handling --- .../authentication/AccountAuthenticator.java | 34 +++---------------- .../files/services/FileDownloader.java | 10 +----- .../android/files/services/FileUploader.java | 9 +---- .../android/syncadapter/FileSyncAdapter.java | 10 +----- .../android/ui/activity/FileActivity.java | 9 +---- .../android/ui/activity/UserInfoActivity.java | 10 +----- .../ModifiedAuthenticatorActivity.java | 2 ++ src/modified/res/values/setup.xml | 2 +- 8 files changed, 12 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index d6f0d1b084..8bcee0be43 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -94,14 +94,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -145,14 +138,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -203,13 +189,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -240,13 +220,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Account account, String authTokenType, Bundle options) throws NetworkErrorException { - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index 8ee6c468ec..eb1065a677 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,7 +41,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -580,14 +579,7 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index 8b2b647c61..f4a98663c5 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,7 +48,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1082,13 +1081,7 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 36160edafa..d34c979e09 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,7 +37,6 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -401,14 +400,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getContext().getResources().getBoolean(R.bool.push_enabled) - && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 1a7e9b0c02..a6b61ae320 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,7 +40,6 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -397,13 +396,7 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 0317d3aaf2..d6fe3dc334 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,7 +48,6 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -286,14 +285,7 @@ public class UserInfoActivity extends FileActivity { private void changeAccountPassword(Account account) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 618578891a..02b0f8116b 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,6 +1,7 @@ package com.owncloud.android.authentication; import android.os.Bundle; +import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -29,6 +30,7 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 81cdb6a16b..b52d58a528 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -103,7 +103,7 @@ false - true + false true From 657a0947c0099ee9de21731cd66b255f2dba7f7b Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 14:51:46 +0200 Subject: [PATCH 643/881] Remove push enabled --- src/main/res/values/setup.xml | 1 - src/modified/res/values/setup.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index f67de5bb1e..8198e0851a 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -110,7 +110,6 @@ false - false false diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index b52d58a528..6860913222 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -103,7 +103,6 @@ false - false true From 5d6e79c2a060e99da58d6fd25b9a1872773f897b Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 28 Mar 2017 14:55:21 +0200 Subject: [PATCH 644/881] Remove Mario --- .../android/authentication/ModifiedAuthenticatorActivity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 02b0f8116b..618578891a 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,7 +1,6 @@ package com.owncloud.android.authentication; import android.os.Bundle; -import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -30,7 +29,6 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } From 0a941126dfc76c6d2bbd89f02ef718258575a073 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 29 Mar 2017 18:57:18 +0200 Subject: [PATCH 645/881] Make notifications single instance --- src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 374f5d728e..257d8791b3 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -76,7 +76,7 @@ - + From 6a45bffaf30f5d767088fc650078a2e8090401e5 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 30 Mar 2017 16:07:26 +0200 Subject: [PATCH 646/881] Fix drawer menu item --- src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 257d8791b3..fc34abfe5d 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -76,7 +76,7 @@ - + From aa684831aabdb147d63f9f445479c837e413c721 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 31 Mar 2017 16:36:23 +0200 Subject: [PATCH 647/881] fix double method call --- .../com/owncloud/android/ui/activity/NotificationsActivity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index c3149100df..94671ce9ac 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -167,7 +167,6 @@ public class NotificationsActivity extends FileActivity { recyclerView.addItemDecoration(dividerItemDecoration); fetchAndSetData(); - fetchAndSetData(); } private void populateList(List notifications) { From dd5ee70353448d14aece2b64bfafb5ae6f44ffa3 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 7 Apr 2017 08:44:16 +0200 Subject: [PATCH 648/881] clear up notifications --- .../firebase/NCFirebaseMessagingService.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java index c5de8530d5..09f9f2193d 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -31,7 +31,7 @@ import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import com.owncloud.android.R; -import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.lib.resources.notifications.models.Notification; public class NCFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "NCFirebaseMessaging"; @@ -41,14 +41,11 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); - //Calling method to generate notification - sendNotification(remoteMessage.getNotification().getBody()); + sendNotification(remoteMessage.getNotification().ge); } - //This method is only generating push notification - //It is same as we did in earlier posts - private void sendNotification(String messageBody) { - Intent intent = new Intent(this, FileDisplayActivity.class); + private void sendNotification(String contentTitle) { + Intent intent = new Intent(this, NotificationsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); @@ -56,9 +53,7 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) - .setContentTitle("Firebase Push Notification") - .setContentText(messageBody) - .setAutoCancel(true) + .setContentTitle(contentTitle) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); From 035a4bc93983015a11125b2bf2b6ae6378776893 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 7 Apr 2017 14:20:34 +0200 Subject: [PATCH 649/881] Work a bit more on notifications --- build.gradle | 4 +- src/main/res/values/setup.xml | 2 + .../firebase/NCFirebaseInstanceIDService.java | 79 +++++++- .../firebase/NCFirebaseMessagingService.java | 6 +- .../com/owncloud/android/utils/PushUtils.java | 170 ++++++++++++++++++ src/modified/res/values/setup.xml | 5 + 6 files changed, 253 insertions(+), 13 deletions(-) create mode 100644 src/modified/java/com/owncloud/android/utils/PushUtils.java diff --git a/build.gradle b/build.gradle index e87996e5c3..3dad14a9a0 100644 --- a/build.gradle +++ b/build.gradle @@ -178,8 +178,8 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' - compile 'com.github.nextcloud:android-library:notifications-SNAPSHOT' - compile 'com.github.nextcloud:android-library:1.0.14' + + compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 8198e0851a..fc4db1d6a2 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -114,6 +114,8 @@ false + + diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index 5d98057250..4b6c5e6638 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -19,28 +19,89 @@ */ package com.owncloud.android.services.firebase; -import android.util.Log; +import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; +import android.text.TextUtils; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; +import com.owncloud.android.lib.resources.notifications.models.PushResponse; +import com.owncloud.android.utils.PushUtils; + +import java.io.IOException; +import java.security.PublicKey; public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "NCFirebaseInstanceID"; @Override public void onTokenRefresh() { + //You can implement this method to store the token on your server + if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { + PushUtils.generateRsa2048KeyPair(); + } - //Getting registration token - String refreshedToken = FirebaseInstanceId.getInstance().getToken(); - - //Displaying token on logcat - Log.d(TAG, "Refreshed token: " + refreshedToken); - + sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); } private void sendRegistrationToServer(String token) { - //You can implement this method to store the token on your server - //Not required for current project + String pushTokenHash = PushUtils.generateSHA512Hash(token); + PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); + if (devicePublicKey != null) { + String publicKey = devicePublicKey.toString(); + + Context context = MainApp.getAppContext(); + for (Account account : AccountUtils.getAccounts(context)) { + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); + + RemoteOperation registerAccountDeviceForNotificationsOperation = + new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, + publicKey, context.getResources().getString(R.string.push_server_url)); + + RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. + execute(mClient); + + if (remoteOperationResult.isSuccess()) { + PushResponse pushResponse = remoteOperationResult.getPushResponseData(); + + RemoteOperation registerAccountDeviceForProxyOperation = new + RegisterAccountDeviceForProxyOperation( + context.getResources().getString(R.string.push_server_url), + token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey()); + + remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); + } + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + + } + + } + } } diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java index 09f9f2193d..a3eff0d268 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -31,17 +31,18 @@ import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import com.owncloud.android.R; -import com.owncloud.android.lib.resources.notifications.models.Notification; +import com.owncloud.android.ui.activity.NotificationsActivity; public class NCFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "NCFirebaseMessaging"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { + super.onMessageReceived(remoteMessage); Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); - sendNotification(remoteMessage.getNotification().ge); + sendNotification(remoteMessage.getNotification().getTitle()); } private void sendNotification(String contentTitle) { @@ -55,6 +56,7 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(contentTitle) .setSound(defaultSoundUri) + .setAutoCancel(true) .setContentIntent(pendingIntent); NotificationManager notificationManager = diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java new file mode 100644 index 0000000000..a0dcbc5a3b --- /dev/null +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -0,0 +1,170 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.utils; + +import android.util.Base64; +import android.util.Log; + +import com.owncloud.android.MainApp; +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Key; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +public class PushUtils { + + private static final String TAG = "PushUtils"; + private static final String KEYPAIR_FOLDER = "nc-keypair"; + private static final String KEYPAIR_FILE_NAME = "push_key"; + private static final String KEYPAIR_PUB_EXTENSION = ".pub"; + + public static String generateSHA512Hash(String pushToken) { + MessageDigest messageDigest = null; + try { + messageDigest = MessageDigest.getInstance("SHA-512"); + byte[] byteData = messageDigest.digest(pushToken.getBytes("UTF-8")); + String base64 = Base64.encodeToString(byteData, Base64.NO_WRAP); + return base64; + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "SHA-512 algorithm not supported"); + } catch (UnsupportedEncodingException e) { + Log_OC.d(TAG, "Unsupported encoding"); + } + + return ""; + } + + public static int generateRsa2048KeyPair() { + String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + + KEYPAIR_FOLDER;; + + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; + File keyPathFile = new File(keyPath); + if (!new File(privateKeyPath).exists() && !new File(publicKeyPath).exists()) { + try { + Log.d("MARIO", keyPathFile.getAbsolutePath()); + keyPathFile.createNewFile(); + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + + KeyPair pair = keyGen.generateKeyPair(); + int statusPrivate = saveKeyToFile(pair.getPrivate(), privateKeyPath); + int statusPublic = saveKeyToFile(pair.getPublic(), publicKeyPath); + + if (statusPrivate == 0 && statusPublic == 0) { + // all went well + return 0; + } else { + return -2; + } + } catch (IOException e) { + Log_OC.d(TAG, "Failed to generate a keypair folder path" + e.getLocalizedMessage()); + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "RSA algorithm not supported"); + } + } else { + // we already have the key + return -1; + } + + // we failed to generate the key + return -2; + } + + public static Key readKeyFromFile(boolean readPublicKey) { + String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + + KEYPAIR_FOLDER;; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; + + String path; + + if (readPublicKey) { + path = publicKeyPath; + } else { + path = privateKeyPath; + } + + FileInputStream fileInputStream = null; + try { + fileInputStream = new FileInputStream(path); + byte[] bytes = new byte[fileInputStream.available()]; + fileInputStream.read(bytes); + fileInputStream.close(); + + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + + if (readPublicKey) { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); + PublicKey key = keyFactory.generatePublic(keySpec); + return key; + } else { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); + PrivateKey key = keyFactory.generatePrivate(keySpec); + return key; + } + + } catch (FileNotFoundException e) { + Log_OC.d(TAG, "Failed to find path while reading the Key"); + } catch (IOException e) { + Log_OC.d(TAG, "IOException while reading the key"); + } catch (InvalidKeySpecException e) { + Log_OC.d(TAG, "InvalidKeySpecException while reading the key"); + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "RSA algorithm not supported"); + } + + return null; + } + + private static int saveKeyToFile(Key key, String path) { + byte[] encoded = key.getEncoded(); + FileOutputStream keyFileOutputStream = null; + try { + keyFileOutputStream = new FileOutputStream(path); + keyFileOutputStream.write(encoded); + keyFileOutputStream.close(); + return 0; + } catch (FileNotFoundException e) { + Log_OC.d(TAG, "Failed to save key to file"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed to save key to file via IOException"); + } + + return -1; + } +} diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 6860913222..7b1eebaf4e 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -100,6 +100,9 @@ cloud + + false @@ -107,6 +110,8 @@ true + + From 56f9f05e361d562a6925752885d2c04ac11cbc2a Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sun, 9 Apr 2017 10:38:37 +0200 Subject: [PATCH 650/881] Fix a few things --- build.gradle | 12 +++++------- src/main/res/values/setup.xml | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 3dad14a9a0..af4097f0f7 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:2.3.0' + classpath 'com.android.tools.build:gradle:2.3.1' classpath 'com.google.gms:google-services:3.0.0' } } @@ -37,14 +37,12 @@ ext { preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) } -configurations.all { - // Check for updates every build - resolutionStrategy.cacheChangingModulesFor 0, 'seconds' -} - repositories { jcenter() maven { url "https://jitpack.io" } + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } flatDir { dirs 'libs' @@ -103,7 +101,7 @@ android { // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure dexOptions { - // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. + // Skip pre-dexing whe`n running on Travis CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !travisBuild } diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index fc4db1d6a2..10037f476d 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -115,7 +115,7 @@ false - + From c360a41a5080c02ccee1e37a043dfdb57e36a715 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sun, 9 Apr 2017 11:03:15 +0200 Subject: [PATCH 651/881] Fix sha512 magic --- .../com/owncloud/android/utils/PushUtils.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index a0dcbc5a3b..ad52adff4a 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -20,9 +20,6 @@ package com.owncloud.android.utils; -import android.util.Base64; -import android.util.Log; - import com.owncloud.android.MainApp; import com.owncloud.android.lib.common.utils.Log_OC; @@ -31,15 +28,12 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; @@ -55,18 +49,23 @@ public class PushUtils { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("SHA-512"); - byte[] byteData = messageDigest.digest(pushToken.getBytes("UTF-8")); - String base64 = Base64.encodeToString(byteData, Base64.NO_WRAP); - return base64; + messageDigest.update(pushToken.getBytes()); + return bytesToHex(messageDigest.digest()); } catch (NoSuchAlgorithmException e) { Log_OC.d(TAG, "SHA-512 algorithm not supported"); - } catch (UnsupportedEncodingException e) { - Log_OC.d(TAG, "Unsupported encoding"); } - return ""; } + private static String bytesToHex(byte[] bytes) { + StringBuilder result = new StringBuilder(); + for (byte individualByte : bytes) { + result.append(Integer.toString((individualByte & 0xff) + 0x100, 16) + .substring(1)); + } + return result.toString(); + } + public static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER;; @@ -76,8 +75,9 @@ public class PushUtils { File keyPathFile = new File(keyPath); if (!new File(privateKeyPath).exists() && !new File(publicKeyPath).exists()) { try { - Log.d("MARIO", keyPathFile.getAbsolutePath()); - keyPathFile.createNewFile(); + if (!keyPathFile.exists()) { + keyPathFile.createNewFile(); + } KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); @@ -130,12 +130,10 @@ public class PushUtils { if (readPublicKey) { X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); - PublicKey key = keyFactory.generatePublic(keySpec); - return key; + return keyFactory.generatePublic(keySpec); } else { PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); - PrivateKey key = keyFactory.generatePrivate(keySpec); - return key; + return keyFactory.generatePrivate(keySpec); } } catch (FileNotFoundException e) { From 9bb99e55a7a700269e014f650d3d7bdd18aee47e Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sun, 9 Apr 2017 11:20:15 +0200 Subject: [PATCH 652/881] Only send registration if all is well --- .../android/services/firebase/NCFirebaseInstanceIDService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index 4b6c5e6638..d772cd3a9f 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -52,9 +52,8 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { //You can implement this method to store the token on your server if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { PushUtils.generateRsa2048KeyPair(); + sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); } - - sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); } private void sendRegistrationToServer(String token) { From ce2fe719c7c6719b71168b51d4ce07032b190010 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 12 Apr 2017 23:59:30 +0200 Subject: [PATCH 653/881] Work --- .../android/db/PreferenceManager.java | 32 +++++++ .../ui/activity/FileDisplayActivity.java | 13 +++ .../android/ui/events/TokenPushEvent.java | 27 ++++++ src/main/res/values/strings.xml | 2 + .../firebase/NCFirebaseInstanceIDService.java | 73 ++------------- .../firebase/NCFirebaseMessagingService.java | 6 +- .../com/owncloud/android/utils/PushUtils.java | 93 +++++++++++++++++-- 7 files changed, 169 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java diff --git a/src/main/java/com/owncloud/android/db/PreferenceManager.java b/src/main/java/com/owncloud/android/db/PreferenceManager.java index d680082f2b..32313dbddc 100644 --- a/src/main/java/com/owncloud/android/db/PreferenceManager.java +++ b/src/main/java/com/owncloud/android/db/PreferenceManager.java @@ -46,7 +46,33 @@ public abstract class PreferenceManager { private static final String PREF__INSTANT_VIDEO_UPLOAD_PATH_USE_SUBFOLDERS = "instant_video_upload_path_use_subfolders"; private static final String PREF__LEGACY_CLEAN = "legacyClean"; private static final String PREF__AUTO_UPLOAD_UPDATE_PATH = "autoUploadPathUpdate"; + private static final String PREF__PUSH_TOKEN = "pushToken"; + private static final String PREF__PUSH_TOKEN_UPDATE_TIME = "pushTokenLastUpdated"; + private static final String PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME = "pushTokenLastSent"; + public static void setPushTokenLastSentTime(Context context, long time) { + saveLongPreference(context, PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME, time); + } + + public static long getPushTokenLastSentTime(Context context) { + return getDefaultSharedPreferences(context).getLong(PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME, -1); + } + + public static void setPushToken(Context context, String pushToken) { + saveStringPreference(context, PREF__PUSH_TOKEN, pushToken); + } + + public static String getPushToken(Context context) { + return getDefaultSharedPreferences(context).getString(PREF__PUSH_TOKEN, ""); + } + + public static void setPushTokenUpdateTime(Context context, long time) { + saveLongPreference(context, PREF__PUSH_TOKEN_UPDATE_TIME, time); + } + + public static long getPushTokenUpdateTime(Context context) { + return getDefaultSharedPreferences(context).getLong(PREF__PUSH_TOKEN_UPDATE_TIME, -1); + } public static boolean instantPictureUploadEnabled(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_UPLOADING, false); @@ -267,6 +293,12 @@ public abstract class PreferenceManager { appPreferences.apply(); } + private static void saveLongPreference(Context context, String key, long value) { + SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit(); + appPreferences.putLong(key, value); + appPreferences.apply(); + } + public static SharedPreferences getDefaultSharedPreferences(Context context) { return android.preference.PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); } diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 237baec695..79fc7c6dbd 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -82,6 +82,8 @@ import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; +import com.owncloud.android.ui.events.SearchEvent; +import com.owncloud.android.ui.events.TokenPushEvent; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; @@ -97,6 +99,11 @@ import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.PermissionUtil; +import com.owncloud.android.utils.PushUtils; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.util.ArrayList; @@ -306,6 +313,11 @@ public class FileDisplayActivity extends HookActivity } } + @Subscribe(threadMode = ThreadMode.BACKGROUND) + public void onMessageEvent(TokenPushEvent event) { + PushUtils.pushRegistrationToServer(); + } + @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { @@ -315,6 +327,7 @@ public class FileDisplayActivity extends HookActivity if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted + EventBus.getDefault().post(new TokenPushEvent()); startSynchronization(); // toggle on is save since this is the only scenario this code gets accessed } else { diff --git a/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java b/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java new file mode 100644 index 0000000000..9794c09d29 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java @@ -0,0 +1,27 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.owncloud.android.ui.events; + +/** + * Event to send push token where it belongs + */ + +public class TokenPushEvent { +} diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index f7179a768b..2c93cf5441 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -625,5 +625,7 @@ No activity yet This stream will show events like\nadditions, changes & shares + + New notification received diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index d772cd3a9f..b21ddfb661 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -19,31 +19,16 @@ */ package com.owncloud.android.services.firebase; -import android.accounts.Account; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.content.Context; import android.text.TextUtils; +import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; import com.owncloud.android.MainApp; import com.owncloud.android.R; -import com.owncloud.android.authentication.AccountUtils; -import com.owncloud.android.lib.common.OwnCloudAccount; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; -import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; -import com.owncloud.android.lib.resources.notifications.models.PushResponse; +import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.utils.PushUtils; -import java.io.IOException; -import java.security.PublicKey; - public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "NCFirebaseInstanceID"; @@ -51,57 +36,13 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { public void onTokenRefresh() { //You can implement this method to store the token on your server if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { - PushUtils.generateRsa2048KeyPair(); - sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); - } - } - - private void sendRegistrationToServer(String token) { - String pushTokenHash = PushUtils.generateSHA512Hash(token); - PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); - if (devicePublicKey != null) { - String publicKey = devicePublicKey.toString(); - - Context context = MainApp.getAppContext(); - for (Account account : AccountUtils.getAccounts(context)) { - try { - OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); - OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). - getClientFor(ocAccount, context); - - RemoteOperation registerAccountDeviceForNotificationsOperation = - new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, - publicKey, context.getResources().getString(R.string.push_server_url)); - - RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. - execute(mClient); - - if (remoteOperationResult.isSuccess()) { - PushResponse pushResponse = remoteOperationResult.getPushResponseData(); - - RemoteOperation registerAccountDeviceForProxyOperation = new - RegisterAccountDeviceForProxyOperation( - context.getResources().getString(R.string.push_server_url), - token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), - pushResponse.getPublicKey()); - - remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); - } - } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { - Log_OC.d(TAG, "Failed to find an account"); - } catch (AuthenticatorException e) { - Log_OC.d(TAG, "Failed via AuthenticatorException"); - } catch (IOException e) { - Log_OC.d(TAG, "Failed via IOException"); - } catch (OperationCanceledException e) { - Log_OC.d(TAG, "Failed via OperationCanceledException"); - } - - } - + PreferenceManager.setPushToken(MainApp.getAppContext(), FirebaseInstanceId.getInstance().getToken()); + PreferenceManager.setPushTokenUpdateTime(MainApp.getAppContext(), System.currentTimeMillis()); } + if (PreferenceManager.getPushTokenLastSentTime(MainApp.getAppContext()) != -1) { + PushUtils.pushRegistrationToServer(); + } } - } diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java index a3eff0d268..0a641cd45c 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -26,10 +26,10 @@ import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; -import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.ui.activity.NotificationsActivity; @@ -39,10 +39,8 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); - Log.d(TAG, "From: " + remoteMessage.getFrom()); - Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); - sendNotification(remoteMessage.getNotification().getTitle()); + sendNotification(MainApp.getAppContext().getString(R.string.new_notification_received)); } private void sendNotification(String contentTitle) { diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index ad52adff4a..43d363e58d 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -20,8 +20,27 @@ package com.owncloud.android.utils; +import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; + import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; +import com.owncloud.android.lib.resources.notifications.models.PushResponse; import java.io.File; import java.io.FileInputStream; @@ -34,6 +53,7 @@ import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; @@ -43,6 +63,7 @@ public class PushUtils { private static final String TAG = "PushUtils"; private static final String KEYPAIR_FOLDER = "nc-keypair"; private static final String KEYPAIR_FILE_NAME = "push_key"; + private static final String KEYPAIR_PRIV_EXTENSION = ".priv"; private static final String KEYPAIR_PUB_EXTENSION = ".pub"; public static String generateSHA512Hash(String pushToken) { @@ -68,15 +89,17 @@ public class PushUtils { public static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator - + KEYPAIR_FOLDER;; + + KEYPAIR_FOLDER; + ; - String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; File keyPathFile = new File(keyPath); + if (!new File(privateKeyPath).exists() && !new File(publicKeyPath).exists()) { try { if (!keyPathFile.exists()) { - keyPathFile.createNewFile(); + keyPathFile.mkdir(); } KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); @@ -91,8 +114,6 @@ public class PushUtils { } else { return -2; } - } catch (IOException e) { - Log_OC.d(TAG, "Failed to generate a keypair folder path" + e.getLocalizedMessage()); } catch (NoSuchAlgorithmException e) { Log_OC.d(TAG, "RSA algorithm not supported"); } @@ -105,10 +126,65 @@ public class PushUtils { return -2; } + public static void pushRegistrationToServer() { + String token = PreferenceManager.getPushToken(MainApp.getAppContext()); + if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && + !TextUtils.isEmpty(token)) { + PushUtils.generateRsa2048KeyPair(); + String pushTokenHash = PushUtils.generateSHA512Hash(token).toUpperCase(); + PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); + if (devicePublicKey != null) { + byte[] publicKeyBytes = Base64.encode(devicePublicKey.getEncoded(), 0); + String publicKey = new String(publicKeyBytes); + + Context context = MainApp.getAppContext(); + for (Account account : AccountUtils.getAccounts(context)) { + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); + + RemoteOperation registerAccountDeviceForNotificationsOperation = + new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, + publicKey, context.getResources().getString(R.string.push_server_url)); + + RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. + execute(mClient); + + if (remoteOperationResult.isSuccess()) { + PushResponse pushResponse = remoteOperationResult.getPushResponseData(); + + RemoteOperation registerAccountDeviceForProxyOperation = new + RegisterAccountDeviceForProxyOperation( + context.getResources().getString(R.string.push_server_url), + token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey()); + + remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); + Log.d("THIS IS MARIO", "MARIO"); + PreferenceManager.setPushTokenLastSentTime(MainApp.getAppContext(), + System.currentTimeMillis()); + + } + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + } + } + } + } + public static Key readKeyFromFile(boolean readPublicKey) { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator - + KEYPAIR_FOLDER;; - String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + + KEYPAIR_FOLDER; + ; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; String path; @@ -153,6 +229,9 @@ public class PushUtils { byte[] encoded = key.getEncoded(); FileOutputStream keyFileOutputStream = null; try { + if (!new File(path).exists()) { + new File(path).createNewFile(); + } keyFileOutputStream = new FileOutputStream(path); keyFileOutputStream.write(encoded); keyFileOutputStream.close(); From c90354af175832a51c32d733c981772df4fd2462 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 17 Apr 2017 19:25:12 +0200 Subject: [PATCH 654/881] For pending, failed, etc. show the item count --- .../android/ui/adapter/ExpandableUploadListAdapter.java | 7 ++++++- src/main/res/values/strings.xml | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java index e38d4e0921..4c2aa22e29 100755 --- a/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java @@ -90,6 +90,10 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple return name; } + public int getGroupItemCount() { + return items == null ? 0 : items.length; + } + public Comparator comparator = new Comparator() { @Override @@ -702,7 +706,8 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple convertView = inflaInflater.inflate(R.layout.upload_list_group, null); } TextView tv = (TextView) convertView.findViewById(R.id.uploadListGroupName); - tv.setText(group.getGroupName()); + tv.setText(String.format(mParentActivity.getString(R.string.uploads_view_group_header), + group.getGroupName(), group.getGroupItemCount())); return convertView; } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 2c2d649c10..ede1df8973 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -182,6 +182,7 @@ Unknown error Waiting for wifi connectivity Waiting to upload + %1$s (%2$d) Downloading … %1$d%% Downloading %2$s Download succeeded From d1d01db7a1a42fb41aed00b3e01318d781622ae9 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Wed, 12 Apr 2017 14:34:43 +0200 Subject: [PATCH 655/881] contact backup & import --- build.gradle | 2 + src/main/AndroidManifest.xml | 4 + .../android/services/ContactsBackupJob.java | 210 +++++++ .../android/services/ContactsImportJob.java | 77 +++ .../android/services/NCJobCreator.java | 10 +- .../ui/activity/ContactListFragment.java | 353 +++++++++++ .../activity/ContactsPreferenceActivity.java | 350 +++++++++++ .../android/ui/activity/DrawerActivity.java | 8 + .../android/ui/activity/FileActivity.java | 16 +- .../ui/activity/FileDisplayActivity.java | 27 +- .../ui/fragment/ExtendedListFragment.java | 18 +- .../ui/fragment/OCFileListFragment.java | 3 + .../owncloud/android/utils/MimeTypeUtil.java | 16 + .../android/utils/PermissionUtil.java | 36 +- .../ezvcard_android/AndroidCustomField.java | 114 ++++ .../ezvcard_android/ContactOperations.java | 567 ++++++++++++++++++ .../ezvcard_android/DataMappings.java | 292 +++++++++ src/main/res/layout/contactlist_fragment.xml | 44 ++ src/main/res/layout/contactlist_list_item.xml | 52 ++ src/main/res/layout/contacts_preference.xml | 117 ++++ src/main/res/menu/drawer_menu.xml | 5 + src/main/res/values/setup.xml | 5 + src/main/res/values/strings.xml | 19 + src/modified/res/values/setup.xml | 7 +- 24 files changed, 2337 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/owncloud/android/services/ContactsBackupJob.java create mode 100644 src/main/java/com/owncloud/android/services/ContactsImportJob.java create mode 100644 src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java create mode 100644 src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java create mode 100644 src/main/java/third_parties/ezvcard_android/AndroidCustomField.java create mode 100644 src/main/java/third_parties/ezvcard_android/ContactOperations.java create mode 100644 src/main/java/third_parties/ezvcard_android/DataMappings.java create mode 100644 src/main/res/layout/contactlist_fragment.xml create mode 100644 src/main/res/layout/contactlist_list_item.xml create mode 100644 src/main/res/layout/contacts_preference.xml diff --git a/build.gradle b/build.gradle index 4469ed7ed9..441fb4942a 100644 --- a/build.gradle +++ b/build.gradle @@ -118,6 +118,7 @@ android { packagingOptions { exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/LICENSE' } task checkstyle(type: Checkstyle) { @@ -191,6 +192,7 @@ dependencies { compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' compile 'org.greenrobot:eventbus:3.0.0' + compile 'com.googlecode.ez-vcard:ez-vcard:0.10.2' compile 'org.parceler:parceler-api:1.1.6' annotationProcessor 'org.parceler:parceler:1.1.6' diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 4ee75a4245..40353bfcb3 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -35,6 +35,9 @@ See note in http://developer.android.com/intl/es/reference/android/Manifest.permission.html#GET_ACCOUNTS --> + + + @@ -80,6 +83,7 @@ + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + *

+ * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.services; + +import android.accounts.Account; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.provider.ContactsContract; +import android.support.annotation.NonNull; +import android.text.format.DateFormat; + +import com.evernote.android.job.Job; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.operations.UploadFileOperation; +import com.owncloud.android.ui.activity.ContactsPreferenceActivity; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Vector; + +/** + * Job that backup contacts to /Contacts-Backup and deletes files older than x days + */ + +public class ContactsBackupJob extends Job { + public static final String TAG = "ContactsBackupJob"; + public static final String ACCOUNT = "account"; + public static final String FORCE = "force"; + + + @NonNull + @Override + protected Result onRunJob(Params params) { + final Context context = MainApp.getAppContext(); + PersistableBundleCompat bundle = params.getExtras(); + + boolean force = bundle.getBoolean(FORCE, false); + + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + Long lastExecution = sharedPreferences.getLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, -1); + + if (force || (lastExecution + 24 * 60 * 60 * 1000) < Calendar.getInstance().getTimeInMillis()) { + Log_OC.d(TAG, "start contacts backup job"); + + final Account account = AccountUtils.getOwnCloudAccountByName(context, bundle.getString(ACCOUNT, "")); + String backupFolder = getContext().getResources().getString(R.string.contacts_backup_folder) + + OCFile.PATH_SEPARATOR; + Integer daysToExpire = getContext().getResources().getInteger(R.integer.contacts_backup_expire); + + backupContact(account, backupFolder); + + expireFiles(daysToExpire, backupFolder, account); + + // store execution date + sharedPreferences.edit().putLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, + Calendar.getInstance().getTimeInMillis()).apply(); + + } else { + Log_OC.d(TAG, "last execution less than 24h ago"); + } + + return Result.SUCCESS; + } + + private void backupContact(Account account, String backupFolder) { + ArrayList vCard = new ArrayList<>(); + try { + + Cursor cursor = getContext().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, + null, null, null); + + if (cursor != null && cursor.getCount() > 0) { + cursor.moveToFirst(); + for (int i = 0; i < cursor.getCount(); i++) { + + vCard.add(getContactFromCursor(cursor)); + cursor.moveToNext(); + } + } + + String filename = DateFormat.format("yyyy-MM-dd_HH-mm-ss", Calendar.getInstance()).toString() + ".vcf"; + Log_OC.d(TAG, "Storing: " + filename); + File file = new File(getContext().getCacheDir(), filename); + + FileWriter fw = null; + try { + fw = new FileWriter(file); + + for (String card : vCard) { + fw.write(card); + } + + } catch (IOException e) { + Log_OC.d(TAG, "Error ", e); + } finally { + if (fw != null) { + try { + fw.close(); + } catch (IOException e) { + Log_OC.d(TAG, "Error closing file writer ", e); + } + } + } + + FileUploader.UploadRequester requester = new FileUploader.UploadRequester(); + requester.uploadNewFile( + getContext(), + account, + file.getAbsolutePath(), + backupFolder + filename, + FileUploader.LOCAL_BEHAVIOUR_MOVE, + null, + true, + UploadFileOperation.CREATED_BY_USER + ); + + } catch (Exception e) { + Log_OC.d(TAG, e.getMessage()); + } + } + + private void expireFiles(Integer daysToExpire, String backupFolderString, Account account) { + // -1 disables expiration + if (daysToExpire > -1) { + FileDataStorageManager storageManager = new FileDataStorageManager(account, getContext().getContentResolver()); + OCFile backupFolder = storageManager.getFileByPath(backupFolderString); + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_YEAR, -daysToExpire); + Long timestampToExpire = cal.getTimeInMillis(); + + Log_OC.d(TAG, "expire: " + daysToExpire + " " + backupFolder.getFileName()); + + Vector backups = storageManager.getFolderContent(backupFolder, false); + + for (OCFile backup : backups) { + if (timestampToExpire > backup.getModificationTimestamp()) { + Log_OC.d(TAG, "delete " + backup.getRemotePath()); + + // delete backups + Intent service = new Intent(getContext(), OperationsService.class); + service.setAction(OperationsService.ACTION_REMOVE); + service.putExtra(OperationsService.EXTRA_ACCOUNT, account); + service.putExtra(OperationsService.EXTRA_REMOTE_PATH, backup.getRemotePath()); + service.putExtra(OperationsService.EXTRA_REMOVE_ONLY_LOCAL, false); + + getContext().startService(service); + } + } + } + } + + private String getContactFromCursor(Cursor cursor) { + String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); + Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey); + ParcelFileDescriptor fd; + + String vCard = ""; + try { + fd = getContext().getContentResolver().openFileDescriptor(uri, "r"); + FileInputStream fis; + if (fd != null) { + fis = new FileInputStream(fd.getFileDescriptor()); + byte[] buf = new byte[fis.available()]; + fis.read(buf); + vCard = new String(buf); + } + + return vCard; + + } catch (IOException e) { + Log_OC.d(TAG, e.getMessage()); + } + return vCard; + } +} diff --git a/src/main/java/com/owncloud/android/services/ContactsImportJob.java b/src/main/java/com/owncloud/android/services/ContactsImportJob.java new file mode 100644 index 0000000000..a02b8281fe --- /dev/null +++ b/src/main/java/com/owncloud/android/services/ContactsImportJob.java @@ -0,0 +1,77 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + *

+ * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.services; + +import android.support.annotation.NonNull; + +import com.evernote.android.job.Job; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.io.File; +import java.util.ArrayList; + +import ezvcard.Ezvcard; +import ezvcard.VCard; +import third_parties.ezvcard_android.ContactOperations; + +/** + * Job to import contacts + */ + +public class ContactsImportJob extends Job { + public static final String TAG = "ContactsImportJob"; + + public static final String ACCOUNT_TYPE = "account_type"; + public static final String ACCOUNT_NAME = "account_name"; + public static final String VCARD_FILE_PATH = "vcard_file_path"; + public static final String CHECKED_ITEMS_ARRAY = "checked_items_array"; + + @NonNull + @Override + protected Result onRunJob(Params params) { + PersistableBundleCompat bundle = params.getExtras(); + + String vCardFilePath = bundle.getString(VCARD_FILE_PATH, ""); + String accountName = bundle.getString(ACCOUNT_NAME, ""); + String accountType = bundle.getString(ACCOUNT_TYPE, ""); + int[] intArray = bundle.getIntArray(CHECKED_ITEMS_ARRAY); + + File file = new File(vCardFilePath); + ArrayList vCards = new ArrayList<>(); + + try { + ContactOperations operations = new ContactOperations(getContext(), accountName, accountType); + vCards.addAll(Ezvcard.parse(file).all()); + + for (int i = 0; i < intArray.length; i++ ){ + if (intArray[i] == 1){ + operations.insertContact(vCards.get(i)); + } + } + } catch (Exception e) { + Log_OC.e(TAG, e.getMessage()); + } + + return Result.SUCCESS; + } +} diff --git a/src/main/java/com/owncloud/android/services/NCJobCreator.java b/src/main/java/com/owncloud/android/services/NCJobCreator.java index 688adc5bef..db9ef4dbb1 100644 --- a/src/main/java/com/owncloud/android/services/NCJobCreator.java +++ b/src/main/java/com/owncloud/android/services/NCJobCreator.java @@ -4,17 +4,17 @@ * @author Mario Danic * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Nextcloud GmbH - * + *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. - * + *

* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. - * + *

* You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ @@ -33,6 +33,10 @@ public class NCJobCreator implements JobCreator { switch (tag) { case AutoUploadJob.TAG: return new AutoUploadJob(); + case ContactsBackupJob.TAG: + return new ContactsBackupJob(); + case ContactsImportJob.TAG: + return new ContactsImportJob(); default: return null; } diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java new file mode 100644 index 0000000000..21eb330598 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -0,0 +1,353 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + *

+ * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.ui.activity; + +import android.Manifest; +import android.accounts.Account; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AlertDialog; +import android.util.SparseBooleanArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckedTextView; +import android.widget.ListView; +import android.widget.QuickContactBadge; +import android.widget.TextView; + +import com.evernote.android.job.JobRequest; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.files.services.FileDownloader; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.services.ContactsImportJob; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.PermissionUtil; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import ezvcard.Ezvcard; +import ezvcard.VCard; +import ezvcard.property.StructuredName; + +/** + * This fragment shows all contacts from a file and allows to import them. + */ + +public class ContactListFragment extends FileFragment { + public static final String TAG = ContactListFragment.class.getSimpleName(); + + public static final String FILE_NAME = "FILE_NAME"; + public static final String ACCOUNT = "ACCOUNT"; + + private ListView listView; + private ArrayList vCards; + + public static ContactListFragment newInstance(OCFile file, Account account) { + ContactListFragment frag = new ContactListFragment(); + Bundle arguments = new Bundle(); + arguments.putParcelable(FILE_NAME, file); + arguments.putParcelable(ACCOUNT, account); + frag.setArguments(arguments); + + return frag; + } + + public ContactListFragment() { + super(); + } + + @Override + public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.contactlist_fragment, null); + + vCards = new ArrayList<>(); + + try { + OCFile ocFile = getArguments().getParcelable(FILE_NAME); + setFile(ocFile); + Account account = getArguments().getParcelable(ACCOUNT); + + if (!ocFile.isDown()) { + Intent i = new Intent(getContext(), FileDownloader.class); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); + i.putExtra(FileDownloader.EXTRA_FILE, ocFile); + getContext().startService(i); + } else { + File file = new File(ocFile.getStoragePath()); + vCards.addAll(Ezvcard.parse(file).all()); + } + } catch (IOException e) { + e.printStackTrace(); + } + + final Button restoreContacts = (Button) view.findViewById(R.id.contactlist_restore_selected); + restoreContacts.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (checkAndAskForContactsWritePermission()) { + getAccountForImport(); + } + } + }); + + ContactListAdapter contactListAdapter = new ContactListAdapter(getContext(), vCards); + + listView = (ListView) view.findViewById(R.id.contactlist_listview); + listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + listView.setAdapter(contactListAdapter); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + CheckedTextView tv = (CheckedTextView) view.findViewById(R.id.contactlist_item_name); + + if (listView.getCheckedItemPositions().get(position)) { + tv.setChecked(true); + } else { + listView.getCheckedItemPositions().delete(position); + tv.setChecked(false); + } + + if (listView.getCheckedItemPositions().size() > 0) { + restoreContacts.setEnabled(true); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); + } else { + restoreContacts.setEnabled(false); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); + } + } + }); + + return view; + } + + static class ContactItemViewHolder { + QuickContactBadge badge; + TextView name; + } + + private void importContacts(ContactAccount account) { + SparseBooleanArray checkedArray = listView.getCheckedItemPositions(); + int[] intArray = new int[vCards.size()]; + + for (int i = 0; i < vCards.size(); i++) { + if (checkedArray.get(i)) { + intArray[i] = 1; + } + } + + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsImportJob.ACCOUNT_NAME, account.name); + bundle.putString(ContactsImportJob.ACCOUNT_TYPE, account.type); + bundle.putString(ContactsImportJob.VCARD_FILE_PATH, getFile().getStoragePath()); + bundle.putIntArray(ContactsImportJob.CHECKED_ITEMS_ARRAY, intArray); + + new JobRequest.Builder(ContactsImportJob.TAG) + .setExtras(bundle) + .setExecutionWindow(3_000L, 10_000L) + .setRequiresCharging(false) + .setPersisted(false) + .setUpdateCurrent(false) + .build() + .schedule(); + + + Snackbar.make(listView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); + } + + private void getAccountForImport() { + final ArrayList accounts = new ArrayList<>(); + + // add local one + accounts.add(new ContactAccount("Local contacts", null, null)); + + Cursor cursor = null; + try { + cursor = getContext().getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, + new String[]{ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE}, + null, + null, + null); + + if (cursor != null && cursor.getCount() > 0) { + while (cursor.moveToNext()) { + String name = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)); + String type = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); + + ContactAccount account = new ContactAccount(name, name, type); + + if (!accounts.contains(account)) { + accounts.add(account); + } + } + + cursor.close(); + } + } catch (Exception e) { + Log_OC.d(TAG, e.getMessage()); + } finally { + cursor.close(); + } + + if (accounts.size() == 1) { + importContacts(accounts.get(0)); + } else { + + ArrayAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, accounts); + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(R.string.contactlist_account_chooser_title) + .setAdapter(adapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + importContacts(accounts.get(which)); + } + }).show(); + } + } + + private boolean checkAndAskForContactsWritePermission() { + // check permissions + if (!PermissionUtil.checkSelfPermission(getContext(), Manifest.permission.WRITE_CONTACTS)) { + PermissionUtil.requestWriteContactPermission(this); + return false; + } else { + return true; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == PermissionUtil.PERMISSIONS_WRITE_CONTACTS) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.WRITE_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + getAccountForImport(); + } else { + Snackbar.make(getView(), R.string.contactlist_no_permission, Snackbar.LENGTH_LONG).show(); + } + break; + } + } + } + } + + private class ContactAccount { + String displayName; + String name; + String type; + + ContactAccount(String displayName, String name, String type) { + this.displayName = displayName; + this.name = name; + this.type = type; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ContactAccount) { + ContactAccount other = (ContactAccount) obj; + return this.name.equalsIgnoreCase(other.name) && this.type.equalsIgnoreCase(other.type); + } else { + return false; + } + } + + @Override + public String toString() { + return displayName; + } + } +} + +class ContactListAdapter extends ArrayAdapter { + private List vCards; + + ContactListAdapter(Context context, List vCards) { + super(context, 0, R.id.contactlist_item_name, vCards); + + this.vCards = vCards; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + ContactListFragment.ContactItemViewHolder viewHolder; + + if (convertView == null) { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.contactlist_list_item, parent, false); + viewHolder = new ContactListFragment.ContactItemViewHolder(); + + viewHolder.badge = (QuickContactBadge) convertView.findViewById(R.id.contactlist_item_icon); + viewHolder.name = (TextView) convertView.findViewById(R.id.contactlist_item_name); + + convertView.setTag(viewHolder); + } else { + viewHolder = (ContactListFragment.ContactItemViewHolder) convertView.getTag(); + } + + VCard vcard = vCards.get(position); + + if (vcard != null) { + // photo + if (vcard.getPhotos().size() > 0) { + byte[] data = vcard.getPhotos().get(0).getData(); + + Drawable drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)); + + viewHolder.badge.setImageDrawable(drawable); + } + + // name + StructuredName name = vcard.getStructuredName(); + String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; + String last = (name.getFamily() == null) ? "" : name.getFamily(); + viewHolder.name.setText(first + last); + } + + return convertView; + } +} diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java new file mode 100644 index 0000000000..52f051f4c7 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -0,0 +1,350 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + *

+ * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.ui.activity; + +import android.Manifest; +import android.accounts.Account; +import android.app.DatePickerDialog; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.SwitchCompat; +import android.view.MenuItem; +import android.view.View; +import android.widget.CompoundButton; +import android.widget.DatePicker; +import android.widget.TextView; +import android.widget.Toast; + +import com.evernote.android.job.JobManager; +import com.evernote.android.job.JobRequest; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.services.ContactsBackupJob; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.PermissionUtil; + +import java.util.Calendar; +import java.util.Comparator; +import java.util.Set; +import java.util.Vector; + +/** + * This activity shows all settings for contact backup/restore + */ + +public class ContactsPreferenceActivity extends FileActivity implements FileFragment.ContainerActivity { + public static final String TAG = ContactsPreferenceActivity.class.getSimpleName(); + + public static final String PREFERENCE_CONTACTS_AUTOMATIC_BACKUP = "PREFERENCE_CONTACTS_AUTOMATIC_BACKUP"; + public static final String PREFERENCE_CONTACTS_LAST_BACKUP = "PREFERENCE_CONTACTS_LAST_BACKUP"; + + private SwitchCompat backupSwitch; + private SharedPreferences sharedPreferences; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.contacts_preference); + + // setup toolbar + setupToolbar(); + + // setup drawer + setupDrawer(R.id.nav_contacts); + + getSupportActionBar().setTitle(R.string.actionbar_contacts); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + + backupSwitch = (SwitchCompat) findViewById(R.id.contacts_automatic_backup); + backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); + + backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked && checkAndAskForContactsReadPermission()) { + // store value + setAutomaticBackup(backupSwitch, true); + + // enable daily job + startContactBackupJob(getAccount()); + } else { + setAutomaticBackup(backupSwitch, false); + + // cancel pending jobs + cancelContactBackupJob(getBaseContext()); + } + } + }); + + // display last backup + TextView lastBackup = (TextView) findViewById(R.id.contacts_last_backup_timestamp); + Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); + + if (lastBackupTimestamp == -1) { + lastBackup.setText(R.string.contacts_preference_backup_never); + } else { + lastBackup.setText(DisplayUtils.getRelativeTimestamp(getBaseContext(), lastBackupTimestamp)); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + setAutomaticBackup(backupSwitch, true); + } else { + setAutomaticBackup(backupSwitch, false); + } + + break; + } + } + } + } + + public void backupContacts(View v) { + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsBackupJob.ACCOUNT, getAccount().name); + bundle.putBoolean(ContactsBackupJob.FORCE, true); + + new JobRequest.Builder(ContactsBackupJob.TAG) + .setExtras(bundle) + .setExecutionWindow(3_000L, 10_000L) + .setRequiresCharging(false) + .setPersisted(false) + .setUpdateCurrent(false) + .build() + .schedule(); + + Snackbar.make(findViewById(R.id.contacts_linear_layout), R.string.contacts_preferences_backup_scheduled, + Snackbar.LENGTH_LONG).show(); + } + + private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { + backupSwitch.setChecked(bool); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); + editor.apply(); + } + + private boolean checkAndAskForContactsReadPermission() { + // check permissions + if ((PermissionUtil.checkSelfPermission(this, Manifest.permission.READ_CONTACTS))) { + return true; + } else { + // Check if we should show an explanation + if (PermissionUtil.shouldShowRequestPermissionRationale(ContactsPreferenceActivity.this, + android.Manifest.permission.READ_CONTACTS)) { + // Show explanation to the user and then request permission + Snackbar snackbar = Snackbar.make(findViewById(R.id.contacts_linear_layout), R.string.contacts_read_permission, + Snackbar.LENGTH_INDEFINITE) + .setAction(R.string.common_ok, new View.OnClickListener() { + @Override + public void onClick(View v) { + PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this); + } + }); + + DisplayUtils.colorSnackbar(this, snackbar); + + snackbar.show(); + + return false; + } else { + // No explanation needed, request the permission. + PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this); + + return false; + } + } + } + + public void openDate(View v) { + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); + + Vector backupFiles = getStorageManager().getFolderContent(backupFolder, false); + + backupFiles.sort(new Comparator() { + @Override + public int compare(OCFile o1, OCFile o2) { + if (o1.getModificationTimestamp() == o2.getModificationTimestamp()) { + return 0; + } + + if (o1.getModificationTimestamp() > o2.getModificationTimestamp()) { + return 1; + } else { + return -1; + } + } + }); + + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH) + 1; + int day = cal.get(Calendar.DAY_OF_MONTH); + DatePickerDialog datePickerDialog = new DatePickerDialog(this, dateSetListener, year, month, day); + datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); + datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); + + datePickerDialog.show(); + } + + DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); + Vector backupFiles = getStorageManager().getFolderContent(backupFolder, false); + + // find file with modification with date and time between 00:00 and 23:59 + // if more than one file exists, take oldest + Calendar date = Calendar.getInstance(); + date.set(year, month, dayOfMonth); + + // start + date.set(Calendar.HOUR, 0); + date.set(Calendar.MINUTE, 0); + date.set(Calendar.SECOND, 1); + date.set(Calendar.MILLISECOND, 0); + date.set(Calendar.AM_PM, Calendar.AM); + Long start = date.getTimeInMillis(); + + // end + date.set(Calendar.HOUR, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + Long end = date.getTimeInMillis(); + + OCFile backupToRestore = null; + + for (OCFile file : backupFiles) { + if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { + if (backupToRestore == null) { + backupToRestore = file; + } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { + backupToRestore = file; + } + } + } + + if (backupToRestore != null) { + Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, getAccount()); + + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.contacts_linear_layout, contactListFragment); + transaction.commit(); + } else { + Toast.makeText(ContactsPreferenceActivity.this, R.string.contacts_preferences_no_file_found, + Toast.LENGTH_SHORT).show(); + } + } + }; + + public static void startContactBackupJob(Account account) { + Log_OC.d(TAG, "start daily contacts backup job"); + + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsBackupJob.ACCOUNT, account.name); + + new JobRequest.Builder(ContactsBackupJob.TAG) + .setExtras(bundle) + .setRequiresCharging(false) + .setPersisted(true) + .setUpdateCurrent(true) + .setPeriodic(24 * 60 * 60 * 1000) + .build() + .schedule(); + } + + public static void cancelContactBackupJob(Context context) { + Log_OC.d(TAG, "disabling contacts backup job"); + + JobManager jobManager = JobManager.create(context); + Set jobs = jobManager.getAllJobRequestsForTag(ContactsBackupJob.TAG); + + for (JobRequest jobRequest : jobs) { + jobManager.cancel(jobRequest.getJobId()); + } + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval; + switch (item.getItemId()) { + case android.R.id.home: + if (isDrawerOpen()) { + closeDrawer(); + } else { + openDrawer(); + } + retval = true; + break; + + default: + retval = super.onOptionsItemSelected(item); + } + return retval; + } + + @Override + public void showFiles(boolean onDeviceOnly) { + super.showFiles(onDeviceOnly); + Intent fileDisplayActivity = new Intent(getApplicationContext(), FileDisplayActivity.class); + fileDisplayActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(fileDisplayActivity); + } + + @Override + public void showDetails(OCFile file) { + + } + + @Override + public void onBrowsedDownTo(OCFile folder) { + + } + + @Override + public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { + + } +} \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index b698306179..74a2f6d919 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -328,6 +328,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU navigationView.getMenu().removeItem(R.id.nav_shared); } + if (!getResources().getBoolean(R.bool.contacts_backup)) { + navigationView.getMenu().removeItem(R.id.nav_contacts); + } + if (AccountUtils.hasSearchSupport(account)) { if (!getResources().getBoolean(R.bool.recently_added_enabled)) { navigationView.getMenu().removeItem(R.id.nav_recently_added); @@ -409,6 +413,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU Intent folderSyncIntent = new Intent(getApplicationContext(), FolderSyncActivity.class); startActivity(folderSyncIntent); break; + case R.id.nav_contacts: + Intent contactsIntent = new Intent(getApplicationContext(), ContactsPreferenceActivity.class); + startActivity(contactsIntent); + break; case R.id.nav_settings: Intent settingsIntent = new Intent(getApplicationContext(), Preferences.class); startActivity(settingsIntent); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index a6b61ae320..0cf3dd4d6a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -28,6 +28,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -41,7 +42,7 @@ import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.ui.helpers.FileOperationsHelper; +import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader; @@ -68,6 +69,7 @@ import com.owncloud.android.services.OperationsService.OperationsServiceBinder; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.LoadingDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; +import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.utils.ErrorMessageAdapter; @@ -159,6 +161,8 @@ public abstract class FileActivity extends DrawerActivity setAccount(account, savedInstanceState != null); + checkContactsBackupJob(); + mOperationsServiceConnection = new OperationsServiceConnection(); bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection, Context.BIND_AUTO_CREATE); @@ -234,6 +238,16 @@ public abstract class FileActivity extends DrawerActivity } } + private void checkContactsBackupJob() { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + + if (sharedPreferences.getBoolean(ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)) { + ContactsPreferenceActivity.startContactBackupJob(getAccount()); + } else { + ContactsPreferenceActivity.cancelContactBackupJob(getBaseContext()); + } + } + /** * Getter for the main {@link OCFile} handled by the activity. diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 237baec695..6ab27e3f00 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -96,6 +96,7 @@ import com.owncloud.android.ui.preview.PreviewVideoActivity; import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; +import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.PermissionUtil; import java.io.File; @@ -141,7 +142,7 @@ public class FileDisplayActivity extends HookActivity private static final String TAG = FileDisplayActivity.class.getSimpleName(); private static final String TAG_LIST_OF_FILES = "LIST_OF_FILES"; - private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT"; + public static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT"; private OCFile mWaitingToPreview; @@ -170,10 +171,10 @@ public class FileDisplayActivity extends HookActivity /// Load of saved instance state if (savedInstanceState != null) { - mWaitingToPreview = (OCFile) savedInstanceState.getParcelable( + mWaitingToPreview = savedInstanceState.getParcelable( FileDisplayActivity.KEY_WAITING_TO_PREVIEW); mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); - mWaitingToSend = (OCFile) savedInstanceState.getParcelable( + mWaitingToSend = savedInstanceState.getParcelable( FileDisplayActivity.KEY_WAITING_TO_SEND); searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY); } else { @@ -222,7 +223,7 @@ public class FileDisplayActivity extends HookActivity protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - if (PermissionUtil.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + if (!PermissionUtil.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // Check if we should show an explanation if (PermissionUtil.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { @@ -323,6 +324,8 @@ public class FileDisplayActivity extends HookActivity } return; } + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @@ -406,7 +409,9 @@ public class FileDisplayActivity extends HookActivity updateActionBarTitleAndHomeButton(file); } else { cleanSecondFragment(); - if (file.isDown() && PreviewTextFragment.canBePreviewed(file)) { + if (file.isDown() && MimeTypeUtil.isVCard(file.getMimetype())){ + startContactListFragment(file); + } else if (file.isDown() && PreviewTextFragment.canBePreviewed(file)) { startTextPreview(file); } } @@ -563,6 +568,9 @@ public class FileDisplayActivity extends HookActivity if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) { startMediaPreview(mWaitingToPreview, 0, true); detailsFragmentChanged = true; + } else if (MimeTypeUtil.isVCard(mWaitingToPreview.getMimetype())){ + startContactListFragment(mWaitingToPreview); + detailsFragmentChanged = true; } else if (PreviewTextFragment.canBePreviewed(mWaitingToPreview)) { startTextPreview(mWaitingToPreview); detailsFragmentChanged = true; @@ -1901,6 +1909,15 @@ public class FileDisplayActivity extends HookActivity setFile(file); } + public void startContactListFragment(OCFile file) { + Fragment contactListFragment = ContactListFragment.newInstance(file, getAccount()); + + setSecondFragment(contactListFragment); + updateFragmentsVisibility(true); + updateActionBarTitleAndHomeButton(file); + setFile(file); + } + /** * Requests the download of the received {@link OCFile} , updates the UI * to monitor the download progress and prepares the activity to preview diff --git a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 1cab83fbac..6128d96b3f 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -282,14 +282,24 @@ public class ExtendedListFragment extends Fragment } public boolean onQueryTextChange(final String query) { - performSearch(query, false); - return true; + if (getFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT) + instanceof ExtendedListFragment){ + performSearch(query, false); + return true; + } else { + return false; + } } @Override public boolean onQueryTextSubmit(String query) { - performSearch(query, true); - return true; + if (getFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT) + instanceof ExtendedListFragment){ + performSearch(query, true); + return true; + } else { + return false; + } } private void performSearch(final String query, boolean isSubmit) { diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 00738fbca3..563f4d0b45 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -89,6 +89,7 @@ import com.owncloud.android.ui.preview.PreviewMediaFragment; import com.owncloud.android.ui.preview.PreviewTextFragment; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.FileStorageUtils; +import com.owncloud.android.utils.MimeTypeUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -799,6 +800,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi if (PreviewImageFragment.canBePreviewed(file)) { // preview image - it handles the download, if needed ((FileDisplayActivity) mContainerActivity).startImagePreview(file); + } else if (file.isDown() && MimeTypeUtil.isVCard(file)){ + ((FileDisplayActivity) mContainerActivity).startContactListFragment(file); } else if (PreviewTextFragment.canBePreviewed(file)) { ((FileDisplayActivity) mContainerActivity).startTextPreview(file); } else if (file.isDown()) { diff --git a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java index 8b80c7b5e1..6b11b75f94 100644 --- a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java +++ b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java @@ -149,6 +149,13 @@ public class MimeTypeUtil { return (mimeType != null && mimeType.toLowerCase().startsWith("text/")); } + /** + * @return 'True' if mime type defines vcard + */ + public static boolean isVCard(String mimeType) { + return "text/vcard".equalsIgnoreCase(mimeType); + } + /** * Checks if file passed is a video. * @@ -203,6 +210,15 @@ public class MimeTypeUtil { || MimeTypeUtil.isText(getMimeTypeFromPath(file.getRemotePath()))); } + + /** + * @param file the file to be analyzed + * @return 'True' if the file is a vcard + */ + public static boolean isVCard(OCFile file) { + return isVCard(file.getMimetype()) || isVCard(getMimeTypeFromPath(file.getRemotePath())); + } + /** * Extracts the mime type for the given file. * diff --git a/src/main/java/com/owncloud/android/utils/PermissionUtil.java b/src/main/java/com/owncloud/android/utils/PermissionUtil.java index 84effda723..5e8945422b 100644 --- a/src/main/java/com/owncloud/android/utils/PermissionUtil.java +++ b/src/main/java/com/owncloud/android/utils/PermissionUtil.java @@ -11,6 +11,8 @@ import android.support.v4.content.ContextCompat; */ public class PermissionUtil { public static final int PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1; + public static final int PERMISSIONS_READ_CONTACTS = 2; + public static final int PERMISSIONS_WRITE_CONTACTS = 3; /** * Wrapper method for ContextCompat.checkSelfPermission(). @@ -22,7 +24,7 @@ public class PermissionUtil { */ public static boolean checkSelfPermission(Context context, String permission) { return ContextCompat.checkSelfPermission(context, permission) - != android.content.pm.PackageManager.PERMISSION_GRANTED; + == android.content.pm.PackageManager.PERMISSION_GRANTED; } /** @@ -50,4 +52,36 @@ public class PermissionUtil { new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSIONS_WRITE_EXTERNAL_STORAGE); } + + /** + * request the read permission for contacts + * + * @param activity The target activity. + */ + public static void requestReadContactPermission(Activity activity) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.READ_CONTACTS}, + PERMISSIONS_READ_CONTACTS); + } + + /** + * request the write permission for contacts + * + * @param activity The target activity. + */ + public static void requestWriteContactPermission(Activity activity) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.WRITE_CONTACTS}, + PERMISSIONS_WRITE_CONTACTS); + } + + /** + * request the write permission for contacts + * + * @param fragment The target fragment. + */ + public static void requestWriteContactPermission(android.support.v4.app.Fragment fragment) { + fragment.requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS}, + PERMISSIONS_WRITE_CONTACTS); + } } diff --git a/src/main/java/third_parties/ezvcard_android/AndroidCustomField.java b/src/main/java/third_parties/ezvcard_android/AndroidCustomField.java new file mode 100644 index 0000000000..a207850d7f --- /dev/null +++ b/src/main/java/third_parties/ezvcard_android/AndroidCustomField.java @@ -0,0 +1,114 @@ +package third_parties.ezvcard_android; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import ezvcard.property.VCardProperty; + +/* + Copyright (c) 2014-2015, Michael Angstadt + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of the FreeBSD Project. + */ + +/** + * Represents an "X-ANDROID-CUSTOM" property. + * @author Michael Angstadt + */ +public class AndroidCustomField extends VCardProperty { + private String type; + private boolean dir; + private List values = new ArrayList(); + + /** + * Creates an "item" field. + * @param type the type + * @param value the value + * @return the property + */ + public static AndroidCustomField item(String type, String value) { + AndroidCustomField property = new AndroidCustomField(); + property.dir = false; + property.type = type; + property.values.add(value); + return property; + } + + /** + * Creates a "dir" field. + * @param type the type + * @param values the values + * @return the property + */ + public static AndroidCustomField dir(String type, String... values) { + AndroidCustomField property = new AndroidCustomField(); + property.dir = true; + property.type = type; + Collections.addAll(property.values, values); + return property; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getValues() { + return values; + } + + public boolean isDir() { + return dir; + } + + public void setDir(boolean dir) { + this.dir = dir; + } + + public boolean isItem() { + return !isDir(); + } + + public void setItem(boolean item) { + setDir(!item); + } + + public boolean isNickname() { + return "nickname".equals(type); + } + + public boolean isContactEvent() { + return "contact_event".equals(type); + } + + public boolean isRelation() { + return "relation".equals(type); + } +} diff --git a/src/main/java/third_parties/ezvcard_android/ContactOperations.java b/src/main/java/third_parties/ezvcard_android/ContactOperations.java new file mode 100644 index 0000000000..46d45370b3 --- /dev/null +++ b/src/main/java/third_parties/ezvcard_android/ContactOperations.java @@ -0,0 +1,567 @@ +package third_parties.ezvcard_android; + +import android.content.ContentProviderOperation; +import android.content.ContentValues; +import android.content.Context; +import android.content.OperationApplicationException; +import android.os.RemoteException; +import android.provider.ContactsContract; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import ezvcard.VCard; +import ezvcard.property.Address; +import ezvcard.property.Birthday; +import ezvcard.property.Email; +import ezvcard.property.FormattedName; +import ezvcard.property.Impp; +import ezvcard.property.Nickname; +import ezvcard.property.Note; +import ezvcard.property.Organization; +import ezvcard.property.Photo; +import ezvcard.property.RawProperty; +import ezvcard.property.StructuredName; +import ezvcard.property.Telephone; +import ezvcard.property.Title; +import ezvcard.property.Url; +import ezvcard.property.VCardProperty; +import ezvcard.util.TelUri; + +import static android.text.TextUtils.isEmpty; + +/* + Copyright (c) 2014-2015, Michael Angstadt + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of the FreeBSD Project. + */ + +/** + * Inserts a {@link VCard} into an Android database. + * + * @author Pratyush + * @author Michael Angstadt + */ +public class ContactOperations { + private static final int rawContactID = 0; + + private final Context context; + private final NonEmptyContentValues account; + + public ContactOperations(Context context) { + this(context, null, null); + } + + public ContactOperations(Context context, String accountName, String accountType) { + this.context = context; + + account = new NonEmptyContentValues(); + account.put(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType); + account.put(ContactsContract.RawContacts.ACCOUNT_NAME, accountName); + } + + public void insertContact(VCard vcard) throws RemoteException, OperationApplicationException { + // TODO handle Raw properties - Raw properties include various extension which start with "X-" like X-ASSISTANT, X-AIM, X-SPOUSE + + List contentValues = new ArrayList(); + convertName(contentValues, vcard); + convertNickname(contentValues, vcard); + convertPhones(contentValues, vcard); + convertEmails(contentValues, vcard); + convertAddresses(contentValues, vcard); + convertIms(contentValues, vcard); + + // handle Android Custom fields..This is only valid for Android generated Vcards. As the Android would + // generate NickName, ContactEvents other than Birthday and RelationShip with this "X-ANDROID-CUSTOM" name + convertCustomFields(contentValues, vcard); + + // handle Iphone kinda of group properties. which are grouped together. + convertGroupedProperties(contentValues, vcard); + + convertBirthdays(contentValues, vcard); + + convertWebsites(contentValues, vcard); + convertNotes(contentValues, vcard); + convertPhotos(contentValues, vcard); + convertOrganization(contentValues, vcard); + + ArrayList operations = new ArrayList(contentValues.size()); + ContentValues cv = account.getContentValues(); + //ContactsContract.RawContact.CONTENT_URI needed to add account, backReference is also not needed + ContentProviderOperation operation = + ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValues(cv) + .build(); + operations.add(operation); + for (NonEmptyContentValues values : contentValues) { + cv = values.getContentValues(); + if (cv.size() == 0) { + continue; + } + + //@formatter:off + operation = + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID) + .withValues(cv) + .build(); + //@formatter:on + operations.add(operation); + } + + // Executing all the insert operations as a single database transaction + context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations); + } + + private void convertName(List contentValues, VCard vcard) { + NonEmptyContentValues values = new NonEmptyContentValues(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + + String firstName = null, lastName = null, namePrefix = null, nameSuffix = null; + StructuredName n = vcard.getStructuredName(); + if (n != null) { + firstName = n.getGiven(); + values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstName); + + lastName = n.getFamily(); + values.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastName); + + List prefixes = n.getPrefixes(); + if (!prefixes.isEmpty()) { + namePrefix = prefixes.get(0); + values.put(ContactsContract.CommonDataKinds.StructuredName.PREFIX, namePrefix); + } + + List suffixes = n.getSuffixes(); + if (!suffixes.isEmpty()) { + nameSuffix = suffixes.get(0); + values.put(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, nameSuffix); + } + } + + FormattedName fn = vcard.getFormattedName(); + String formattedName = (fn == null) ? null : fn.getValue(); + + String displayName; + if (isEmpty(formattedName)) { + StringBuilder sb = new StringBuilder(); + if (!isEmpty(namePrefix)){ + sb.append(namePrefix).append(' '); + } + if (!isEmpty(firstName)){ + sb.append(firstName).append(' '); + } + if (!isEmpty(lastName)){ + sb.append(lastName).append(' '); + } + if (!isEmpty(nameSuffix)){ + if (sb.length() > 0){ + sb.deleteCharAt(sb.length()-1); //delete space character + sb.append(", "); + } + sb.append(nameSuffix); + } + + displayName = sb.toString().trim(); + } else { + displayName = formattedName; + } + values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); + + RawProperty xPhoneticFirstName = vcard.getExtendedProperty("X-PHONETIC-FIRST-NAME"); + String firstPhoneticName = (xPhoneticFirstName == null) ? null : xPhoneticFirstName.getValue(); + values.put(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_GIVEN_NAME, firstPhoneticName); + + RawProperty xPhoneticLastName = vcard.getExtendedProperty("X-PHONETIC-LAST-NAME"); + String lastPhoneticName = (xPhoneticLastName == null) ? null : xPhoneticLastName.getValue(); + values.put(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, lastPhoneticName); + + contentValues.add(values); + } + + private void convertNickname(List contentValues, VCard vcard) { + for (Nickname nickname : vcard.getNicknames()) { + List nicknameValues = nickname.getValues(); + if (nicknameValues.isEmpty()) { + continue; + } + + for (String nicknameValue : nicknameValues) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, nicknameValue); + contentValues.add(cv); + } + } + } + + private void convertPhones(List contentValues, VCard vcard) { + for (Telephone telephone : vcard.getTelephoneNumbers()) { + String value = telephone.getText(); + TelUri uri = telephone.getUri(); + if (isEmpty(value)) { + if (uri == null) { + continue; + } + value = uri.toString(); + } + + int phoneKind = DataMappings.getPhoneType(telephone); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Phone.NUMBER, value); + cv.put(ContactsContract.CommonDataKinds.Phone.TYPE, phoneKind); + contentValues.add(cv); + } + } + + private void convertEmails(List contentValues, VCard vcard) { + for (Email email : vcard.getEmails()) { + String value = email.getValue(); + if (isEmpty(value)) { + continue; + } + + int emailKind = DataMappings.getEmailType(email); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Email.ADDRESS, value); + cv.put(ContactsContract.CommonDataKinds.Email.TYPE, emailKind); + contentValues.add(cv); + } + } + + private void convertAddresses(List contentValues, VCard vcard) { + for (Address address : vcard.getAddresses()) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + + String street = address.getStreetAddress(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, street); + + String poBox = address.getPoBox(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.POBOX, poBox); + + String city = address.getLocality(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, city); + + String state = address.getRegion(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, state); + + String zipCode = address.getPostalCode(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, zipCode); + + String country = address.getCountry(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, country); + + String label = address.getLabel(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.LABEL, label); + + int addressKind = DataMappings.getAddressType(address); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, addressKind); + + contentValues.add(cv); + } + } + + private void convertIms(List contentValues, VCard vcard) { + //handle extended properties + for (Map.Entry entry : DataMappings.getImPropertyNameMappings().entrySet()) { + String propertyName = entry.getKey(); + Integer protocolType = entry.getValue(); + List rawProperties = vcard.getExtendedProperties(propertyName); + for (RawProperty rawProperty : rawProperties) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + + String value = rawProperty.getValue(); + cv.put(ContactsContract.CommonDataKinds.Im.DATA, value); + + cv.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, protocolType); + + contentValues.add(cv); + } + } + + //handle IMPP properties + for (Impp impp : vcard.getImpps()) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + + String immpAddress = impp.getHandle(); + cv.put(ContactsContract.CommonDataKinds.Im.DATA, immpAddress); + + int immpProtocolType = DataMappings.getIMTypeFromProtocol(impp.getProtocol()); + cv.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, immpProtocolType); + + contentValues.add(cv); + } + } + + private void convertCustomFields(List contentValues, VCard vcard) { + for (AndroidCustomField customField : vcard.getProperties(AndroidCustomField.class)) { + List values = customField.getValues(); + if (values.isEmpty()) { + continue; + } + + NonEmptyContentValues cv; + if (customField.isNickname()) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, values.get(0)); + } else if (customField.isContactEvent()) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, values.get(0)); + cv.put(ContactsContract.CommonDataKinds.Event.TYPE, values.get(1)); + } else if (customField.isRelation()) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Relation.NAME, values.get(0)); + cv.put(ContactsContract.CommonDataKinds.Relation.TYPE, values.get(1)); + } else { + continue; + } + + contentValues.add(cv); + } + } + + private void convertGroupedProperties(List contentValues, VCard vcard) { + List extendedProperties = vcard.getExtendedProperties(); + Map> orderedByGroup = orderPropertiesByGroup(extendedProperties); + final int ABDATE = 1, ABRELATEDNAMES = 2; + + for (List properties : orderedByGroup.values()) { + if (properties.size() == 1) { + continue; + } + + String label = null; + String val = null; + int mime = 0; + for (RawProperty property : properties) { + String name = property.getPropertyName(); + + if (name.equalsIgnoreCase("X-ABDATE")) { + label = property.getValue(); //date + mime = ABDATE; + continue; + } + + if (name.equalsIgnoreCase("X-ABRELATEDNAMES")) { + label = property.getValue(); //name + mime = ABRELATEDNAMES; + continue; + } + + if (name.equalsIgnoreCase("X-ABLABEL")) { + val = property.getValue(); // type of value ..Birthday,anniversary + continue; + } + } + + NonEmptyContentValues cv = null; + switch (mime) { + case ABDATE: + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + + cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, label); + + int type = DataMappings.getDateType(val); + cv.put(ContactsContract.CommonDataKinds.Event.TYPE, type); + + break; + + case ABRELATEDNAMES: + if (val != null) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, label); + + if (!val.equals("Nickname")) { + type = DataMappings.getNameType(val); + cv.put(ContactsContract.CommonDataKinds.Relation.TYPE, type); + } + } + + break; + + default: + continue; + } + + contentValues.add(cv); + } + } + + private void convertBirthdays(List contentValues, VCard vcard) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + for (Birthday birthday : vcard.getBirthdays()) { + Date date = birthday.getDate(); + if (date == null) { + continue; + } + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY); + cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, df.format(date)); + contentValues.add(cv); + } + } + + private void convertWebsites(List contentValues, VCard vcard) { + for (Url url : vcard.getUrls()) { + String urlValue = url.getValue(); + if (isEmpty(urlValue)) { + continue; + } + + int type = DataMappings.getWebSiteType(url.getType()); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Website.URL, urlValue); + cv.put(ContactsContract.CommonDataKinds.Website.TYPE, type); + contentValues.add(cv); + } + } + + private void convertNotes(List contentValues, VCard vcard) { + for (Note note : vcard.getNotes()) { + String noteValue = note.getValue(); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Note.NOTE, noteValue); + contentValues.add(cv); + } + } + + private void convertPhotos(List contentValues, VCard vcard) { + for (Photo photo : vcard.getPhotos()) { + byte[] data = photo.getData(); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Photo.PHOTO, data); + contentValues.add(cv); + } + } + + private void convertOrganization(List contentValues, VCard vcard) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + + Organization organization = vcard.getOrganization(); + if (organization != null) { + List values = organization.getValues(); + String keys[] = { ContactsContract.CommonDataKinds.Organization.COMPANY, ContactsContract.CommonDataKinds.Organization.DEPARTMENT, ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION }; + for (int i = 0; i < values.size(); i++) { + String key = keys[i]; + String value = values.get(i); + cv.put(key, value); + } + } + + List titleList = vcard.getTitles(); + if (!titleList.isEmpty()) { + cv.put(ContactsContract.CommonDataKinds.Organization.TITLE, titleList.get(0).getValue()); + } + + contentValues.add(cv); + } + + /** + * Groups properties by their group name. + * @param properties the properties to group + * @return a map where the key is the group name (null for no group) and the + * value is the list of properties that belong to that group + */ + private <T extends VCardProperty> Map<String, List<T>> orderPropertiesByGroup(List<T> properties) { + Map<String, List<T>> groupedProperties = new HashMap<String, List<T>>(); + + for (T property : properties) { + String group = property.getGroup(); + if (isEmpty(group)) { + continue; + } + + List<T> groupPropertiesList = groupedProperties.get(group); + if (groupPropertiesList == null) { + groupPropertiesList = new ArrayList<T>(); + groupedProperties.put(group, groupPropertiesList); + } + groupPropertiesList.add(property); + } + + return groupedProperties; + } + + /** + * A wrapper for {@link ContentValues} that only adds values which are + * non-null and non-empty (in the case of Strings). + */ + private static class NonEmptyContentValues { + private final ContentValues contentValues = new ContentValues(); + private final String contentItemType; + + public NonEmptyContentValues() { + this(null); + } + + /** + * @param contentItemType the MIME type (value of + * {@link ContactsContract.Contacts.Data#MIMETYPE}) + */ + public NonEmptyContentValues(String contentItemType) { + this.contentItemType = contentItemType; + } + + public void put(String key, String value) { + if (isEmpty(value)) { + return; + } + contentValues.put(key, value); + } + + public void put(String key, int value) { + contentValues.put(key, value); + } + + public void put(String key, byte[] value) { + if (value == null) { + return; + } + contentValues.put(key, value); + } + + /** + * Gets the wrapped {@link ContentValues} object, adding the MIME type + * entry if the values map is not empty. + * @return the wrapped {@link ContentValues} object + */ + public ContentValues getContentValues() { + if (contentValues.size() > 0 && contentItemType != null) { + put(ContactsContract.Contacts.Data.MIMETYPE, contentItemType); + } + return contentValues; + } + } +} diff --git a/src/main/java/third_parties/ezvcard_android/DataMappings.java b/src/main/java/third_parties/ezvcard_android/DataMappings.java new file mode 100644 index 0000000000..bb0948a548 --- /dev/null +++ b/src/main/java/third_parties/ezvcard_android/DataMappings.java @@ -0,0 +1,292 @@ +package third_parties.ezvcard_android; + +import android.provider.ContactsContract; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import ezvcard.parameter.AddressType; +import ezvcard.parameter.EmailType; +import ezvcard.parameter.TelephoneType; +import ezvcard.property.Address; +import ezvcard.property.Email; +import ezvcard.property.Impp; +import ezvcard.property.Telephone; + +/* + Copyright (c) 2014-2015, Michael Angstadt + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of the FreeBSD Project. + */ + +/** + * Maps between vCard contact data types and Android {@link ContactsContract} + * data types. + * + * @author Pratyush + * @author Julien Garrigou + * @author Michael Angstadt + */ +public class DataMappings { + private static final Map<TelephoneType, Integer> phoneTypeMappings; + static { + Map<TelephoneType, Integer> m = new HashMap<TelephoneType, Integer>(); + m.put(TelephoneType.BBS, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM); + m.put(TelephoneType.CAR, ContactsContract.CommonDataKinds.Phone.TYPE_CAR); + m.put(TelephoneType.CELL, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); + m.put(TelephoneType.FAX, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME); + m.put(TelephoneType.HOME, ContactsContract.CommonDataKinds.Phone.TYPE_HOME); + m.put(TelephoneType.ISDN, ContactsContract.CommonDataKinds.Phone.TYPE_ISDN); + m.put(TelephoneType.MODEM, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + m.put(TelephoneType.PAGER, ContactsContract.CommonDataKinds.Phone.TYPE_PAGER); + m.put(TelephoneType.MSG, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); + m.put(TelephoneType.PCS, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + m.put(TelephoneType.TEXT, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); + m.put(TelephoneType.TEXTPHONE, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); + m.put(TelephoneType.VIDEO, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + m.put(TelephoneType.WORK, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); + m.put(TelephoneType.VOICE, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + phoneTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> websiteTypeMappings; + static { + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("home", ContactsContract.CommonDataKinds.Website.TYPE_HOME); + m.put("work", ContactsContract.CommonDataKinds.Website.TYPE_WORK); + m.put("homepage", ContactsContract.CommonDataKinds.Website.TYPE_HOMEPAGE); + m.put("profile", ContactsContract.CommonDataKinds.Website.TYPE_PROFILE); + websiteTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<EmailType, Integer> emailTypeMappings; + static { + Map<EmailType, Integer> m = new HashMap<EmailType, Integer>(); + m.put(EmailType.HOME, ContactsContract.CommonDataKinds.Email.TYPE_HOME); + m.put(EmailType.WORK, ContactsContract.CommonDataKinds.Email.TYPE_WORK); + emailTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<AddressType, Integer> addressTypeMappings; + static { + Map<AddressType, Integer> m = new HashMap<AddressType, Integer>(); + m.put(AddressType.HOME, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME); + m.put(AddressType.get("business"), ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK); + m.put(AddressType.WORK, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK); + m.put(AddressType.get("other"), ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER); + addressTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> abRelatedNamesMappings; + static { + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("father", ContactsContract.CommonDataKinds.Relation.TYPE_FATHER); + m.put("spouse", ContactsContract.CommonDataKinds.Relation.TYPE_SPOUSE); + m.put("mother", ContactsContract.CommonDataKinds.Relation.TYPE_MOTHER); + m.put("brother", ContactsContract.CommonDataKinds.Relation.TYPE_BROTHER); + m.put("parent", ContactsContract.CommonDataKinds.Relation.TYPE_PARENT); + m.put("sister", ContactsContract.CommonDataKinds.Relation.TYPE_SISTER); + m.put("child", ContactsContract.CommonDataKinds.Relation.TYPE_CHILD); + m.put("assistant", ContactsContract.CommonDataKinds.Relation.TYPE_ASSISTANT); + m.put("partner", ContactsContract.CommonDataKinds.Relation.TYPE_PARTNER); + m.put("manager", ContactsContract.CommonDataKinds.Relation.TYPE_MANAGER); + abRelatedNamesMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> abDateMappings; + static { + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("anniversary", ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY); + m.put("other", ContactsContract.CommonDataKinds.Event.TYPE_OTHER); + abDateMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> imPropertyNameMappings; + static{ + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("X-AIM", ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM); + m.put("X-ICQ", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); + m.put("X-QQ", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); + m.put("X-GOOGLE-TALK", ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM); + m.put("X-JABBER", ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER); + m.put("X-MSN", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); + m.put("X-MS-IMADDRESS", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); + m.put("X-YAHOO", ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO); + m.put("X-SKYPE", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); + m.put("X-SKYPE-USERNAME", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); + m.put("X-TWITTER", ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM); + imPropertyNameMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> imProtocolMappings; + static{ + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("aim", ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM); + m.put("icq", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); + m.put("msn", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); + m.put("ymsgr", ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO); + m.put("skype", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); + imProtocolMappings = Collections.unmodifiableMap(m); + } + + /** + * Maps the value of a URL property's TYPE parameter to the appropriate + * Android {@link ContactsContract.CommonDataKinds.Website} value. + * @param type the TYPE parameter value (can be null) + * @return the Android type + */ + public static int getWebSiteType(String type) { + if (type == null){ + return ContactsContract.CommonDataKinds.Website.TYPE_CUSTOM; + } + + type = type.toLowerCase(); + Integer value = websiteTypeMappings.get(type); + return (value == null) ? ContactsContract.CommonDataKinds.Website.TYPE_CUSTOM : value; + } + + /** + * Maps the value of a X-ABLABEL property to the appropriate + * Android {@link ContactsContract.CommonDataKinds.Event} value. + * @param type the property value + * @return the Android type + */ + public static int getDateType(String type) { + if (type == null) { + return ContactsContract.CommonDataKinds.Event.TYPE_OTHER; + } + + type = type.toLowerCase(); + for (Map.Entry<String, Integer> entry : abDateMappings.entrySet()){ + if (type.contains(entry.getKey())){ + return entry.getValue(); + } + } + return ContactsContract.CommonDataKinds.Event.TYPE_OTHER; + } + + /** + * Maps the value of a X-ABLABEL property to the appropriate + * Android {@link ContactsContract.CommonDataKinds.Relation} value. + * @param type the property value + * @return the Android type + */ + public static int getNameType(String type) { + if (type == null) { + return ContactsContract.CommonDataKinds.Relation.TYPE_CUSTOM; + } + + type = type.toLowerCase(); + for (Map.Entry<String, Integer> entry : abRelatedNamesMappings.entrySet()){ + if (type.contains(entry.getKey())){ + return entry.getValue(); + } + } + return ContactsContract.CommonDataKinds.Relation.TYPE_CUSTOM; + } + + /** + * Gets the mappings that associate an extended property name (e.g. "X-AIM") + * with its appropriate Android {@link ContactsContract.CommonDataKinds.Im} + * value. + * @return the mappings (the key is the property name, the value is the Android value) + */ + public static Map<String, Integer> getImPropertyNameMappings(){ + return imPropertyNameMappings; + } + + /** + * Converts an IM protocol from a {@link Impp} property (e.g. "aim") to the + * appropriate Android {@link ContactsContract.CommonDataKinds.Im} value. + * @param protocol the IM protocol (e.g. "aim", can be null) + * @return the Android value + */ + public static int getIMTypeFromProtocol(String protocol) { + if (protocol == null){ + return ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM; + } + + protocol = protocol.toLowerCase(); + Integer value = imProtocolMappings.get(protocol); + return (value == null) ? ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM : value; + } + + /** + * Determines the appropriate Android + * {@link ContactsContract.CommonDataKinds.Phone} value for a + * {@link Telephone} property. + * @param property the property + * @return the Android type value + */ + public static int getPhoneType(Telephone property) { + for (TelephoneType type : property.getTypes()){ + Integer androidType = phoneTypeMappings.get(type); + if (androidType != null){ + return androidType; + } + } + return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; + } + + /** + * Determines the appropriate Android + * {@link ContactsContract.CommonDataKinds.Email} value for an {@link Email} + * property. + * @param property the property + * @return the Android type value + */ + public static int getEmailType(Email property) { + for (EmailType type : property.getTypes()){ + Integer androidType = emailTypeMappings.get(type); + if (androidType != null){ + return androidType; + } + } + return ContactsContract.CommonDataKinds.Email.TYPE_OTHER; + } + + /** + * Determines the appropriate Android + * {@link ContactsContract.CommonDataKinds.StructuredPostal} value for an + * {@link Address} property. + * @param property the property + * @return the Android type value + */ + public static int getAddressType(Address property) { + for (AddressType type : property.getTypes()){ + Integer androidType = addressTypeMappings.get(type); + if (androidType != null){ + return androidType; + } + } + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_CUSTOM; + } + + private DataMappings(){ + //hide constructor + } +} diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml new file mode 100644 index 0000000000..61b0d42b6f --- /dev/null +++ b/src/main/res/layout/contactlist_fragment.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <ListView + android:id="@+id/contactlist_listview" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_margin="10dp" + android:choiceMode="multipleChoice" + android:layout_weight="1" /> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contactlist_restore_selected" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:enabled="false" + android:text="@string/contaclist_restore_selected" + android:background="@color/standard_grey" + android:theme="@style/Button.Primary"/> + +</LinearLayout> \ No newline at end of file diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml new file mode 100644 index 0000000000..5a90135ae0 --- /dev/null +++ b/src/main/res/layout/contactlist_list_item.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <QuickContactBadge + android:id="@+id/contactlist_item_icon" + android:layout_width="?android:attr/listPreferredItemHeight" + android:layout_height="?android:attr/listPreferredItemHeight" + android:layout_margin="5dp" + android:scaleType="centerCrop" + android:src="@drawable/ic_user"/> + + <CheckedTextView + android:id="@+id/contactlist_item_name" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:checkMark="?android:attr/listChoiceIndicatorMultiple" + android:ellipsize="marquee" + android:gravity="center_vertical" + android:maxLines="1" + android:textAppearance="?android:attr/textAppearanceLarge"/> + + <!--<CheckBox--> + <!--android:id="@+id/checkBox"--> + <!--android:layout_width="wrap_content"--> + <!--android:layout_height="match_parent"--> + <!--android:padding="10dp"--> + <!--/>--> + +</LinearLayout> \ No newline at end of file diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml new file mode 100644 index 0000000000..d223b425b2 --- /dev/null +++ b/src/main/res/layout/contacts_preference.xml @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/drawer_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clickable="true" + android:fitsSystemWindows="true"> + + <!-- The main content view --> + <LinearLayout + android:id="@+id/contacts_linear_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <include + layout="@layout/toolbar_standard"/> + + <TextView + android:id="@+id/contacts_header_backup" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:text="@string/contacts_header_backup" + android:textColor="@color/primary"/> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/contacts_automatic_backup" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:text="@string/contacts_automatic_backup" + android:textAppearance="?android:attr/textAppearanceMedium"/> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <TextView + android:id="@+id/contacts_last_backup" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:layout_weight="1" + android:text="@string/contacts_last_backup" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="@color/black"/> + + <TextView + android:id="@+id/contacts_last_backup_timestamp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:layout_weight="1" + android:text="2017 / 03 / 10 - 11:33am" + android:textAppearance="?android:attr/textAppearanceMedium"/> + </LinearLayout> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contacts_backup_now" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:onClick="backupContacts" + android:text="@string/contacts_backup_button" + android:theme="@style/Button.Primary"/> + + <TextView + android:id="@+id/contacts_header_restore" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:text="@string/contacts_header_restore" + android:textColor="@color/primary"/> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contacts_datepacker" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:onClick="openDate" + android:text="@string/contacts_preference_choose_date" + android:theme="@style/Button.Primary"/> + + </LinearLayout> + + <include + layout="@layout/drawer" + android:layout_width="@dimen/drawer_width" + android:layout_height="match_parent" + android:layout_gravity="start"/> + +</android.support.v4.widget.DrawerLayout> \ No newline at end of file diff --git a/src/main/res/menu/drawer_menu.xml b/src/main/res/menu/drawer_menu.xml index 20e9df53ee..ccbca84053 100644 --- a/src/main/res/menu/drawer_menu.xml +++ b/src/main/res/menu/drawer_menu.xml @@ -109,6 +109,11 @@ <group android:id="@+id/drawer_menu_bottom" android:checkableBehavior="single"> + <item + android:id="@+id/nav_contacts" + android:icon="@drawable/ic_user" + android:orderInCategory="3" + android:title="@string/actionbar_contacts"/> <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings" diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 8198e0851a..993127d04b 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -37,6 +37,11 @@ <bool name = "share_via_link_feature">true</bool> <bool name = "share_with_users_feature">true</bool> <bool name="show_whats_new">true</bool> + + // Contacts backup + <bool name="contacts_backup">true</bool> + <string name="contacts_backup_folder">/Contacts-Backup</string> + <integer name="contacts_backup_expire">-1</integer> <!-- Colors --> <color name="login_text_color">@color/white</color> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 2c2d649c10..1892f6431b 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -620,5 +620,24 @@ <string name="activities_no_results_headline">No activity yet</string> <string name="activities_no_results_message">This stream will show events like\nadditions, changes & shares</string> + <string name="actionbar_contacts">Contacts backup</string> + <string name="contacts_backup_button">Backup now</string> + <string name="contacts_restore_button">Restore last backup</string> + <string name="contacts_header_restore">Restore</string> + <string name="contacts_header_backup">Backup</string> + <string name="contacts_automatic_backup">Contacts backup</string> + <string name="contacts_last_backup">Last backup</string> + <string name="contacts_read_permission">Read permission of contacts is needed</string> + <string name="contacts_write_permission">Write permission for contacts is needed</string> + <string name="contactlist_title">Restore contacts</string> + <string name="contaclist_restore_selected">Restore selected contacts</string> + <string name="contactlist_account_chooser_title">Choose account for import</string> + <string name="contactlist_no_permission">No permission, nothing imported!</string> + <string name="contacts_preference_choose_date">Choose date</string> + <string name="contacts_preference_backup_never">never</string> + <string name="contacts_preferences_no_file_found">No file found</string> + <string name="contacts_preferences_backup_scheduled">Backup scheduled and will start shortly</string> + <string name="contacts_preferences_import_scheduled">Import scheduled and will start shortly</string> + </resources> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 6860913222..950aeb2de7 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -24,7 +24,7 @@ <bool name="show_welcome_link">false</bool> <string name="welcome_link_url">"https://nextcloud.com/providers"</string> <string name="share_api_link"></string> - + <!-- Flags to setup the authentication methods available in the app --> <string name="auth_method_oauth2">off</string> <string name="auth_method_saml_web_sso">off</string> @@ -34,6 +34,11 @@ <bool name = "share_via_link_feature">true</bool> <bool name = "share_with_users_feature">true</bool> + // Contacts backup + <bool name="contacts_backup">true</bool> + <string name="contacts_backup_folder">/Contacts-Backup</string> + <integer name="contacts_backup_expire">30</integer> + <!-- Colors --> <color name="login_text_color">@color/white</color> <color name="login_text_hint_color">#7fC0E3</color> From 778c4e9ec2441ff48aa182fe231f06c4c30ffb9e Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 12 Apr 2017 14:59:20 +0200 Subject: [PATCH 656/881] fix showing wrong badges --- .../com/owncloud/android/ui/activity/ContactListFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index 21eb330598..5290a67e3a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -339,6 +339,8 @@ class ContactListAdapter extends ArrayAdapter<VCard> { Drawable drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)); viewHolder.badge.setImageDrawable(drawable); + } else { + viewHolder.badge.setImageToDefault(); } // name From 9d1f2666cd583d95529b55947bef31b9a85c0e4a Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 12 Apr 2017 14:59:54 +0200 Subject: [PATCH 657/881] fix showing wrong jobs, only autoUploadJobs should be shown in UploadActivity --- .../com/owncloud/android/datamodel/UploadsStorageManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java b/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java index cdcc4c339d..86c7680c69 100644 --- a/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -38,6 +38,7 @@ import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.UploadFileOperation; +import com.owncloud.android.services.AutoUploadJob; import java.util.ArrayList; import java.util.Calendar; @@ -396,7 +397,7 @@ public class UploadsStorageManager extends Observable { @RequiresApi(Build.VERSION_CODES.LOLLIPOP) private List<OCUpload> getPendingJobs() { - Set<JobRequest> jobRequests = JobManager.create(mContext).getAllJobRequests(); + Set<JobRequest> jobRequests = JobManager.create(mContext).getAllJobRequestsForTag(AutoUploadJob.TAG); ArrayList<OCUpload> list = new ArrayList<>(); From 07e3fc524d925d411697ddc25ad5a434c04ca0c1 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 12 Apr 2017 15:46:14 +0200 Subject: [PATCH 658/881] expire files on daily backup is now working --- .../android/services/ContactsBackupJob.java | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java index a93a7256db..8f53cf140f 100644 --- a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java +++ b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java @@ -22,11 +22,14 @@ package com.owncloud.android.services; import android.accounts.Account; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.ServiceConnection; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; +import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.provider.ContactsContract; import android.support.annotation.NonNull; @@ -61,6 +64,8 @@ public class ContactsBackupJob extends Job { public static final String TAG = "ContactsBackupJob"; public static final String ACCOUNT = "account"; public static final String FORCE = "force"; + private OperationsServiceConnection operationsServiceConnection; + private OperationsService.OperationsServiceBinder operationsServiceBinder; @NonNull @@ -84,7 +89,12 @@ public class ContactsBackupJob extends Job { backupContact(account, backupFolder); - expireFiles(daysToExpire, backupFolder, account); + // bind to Operations Service + operationsServiceConnection = new OperationsServiceConnection(daysToExpire, backupFolder, account); + + getContext().startService(new Intent(getContext(), OperationsService.class)); + getContext().bindService(new Intent(getContext(), OperationsService.class), operationsServiceConnection, + OperationsService.BIND_AUTO_CREATE); // store execution date sharedPreferences.edit().putLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, @@ -177,10 +187,11 @@ public class ContactsBackupJob extends Job { service.putExtra(OperationsService.EXTRA_ACCOUNT, account); service.putExtra(OperationsService.EXTRA_REMOTE_PATH, backup.getRemotePath()); service.putExtra(OperationsService.EXTRA_REMOVE_ONLY_LOCAL, false); - - getContext().startService(service); + operationsServiceBinder.queueNewOperation(service); } } + + getContext().unbindService(operationsServiceConnection); } } @@ -207,4 +218,39 @@ public class ContactsBackupJob extends Job { } return vCard; } + + /** + * Implements callback methods for service binding. + */ + private class OperationsServiceConnection implements ServiceConnection { + private Integer daysToExpire; + private String backupFolder; + private Account account; + + OperationsServiceConnection(Integer daysToExpire, String backupFolder, Account account) { + this.daysToExpire = daysToExpire; + this.backupFolder = backupFolder; + this.account = account; + } + + @Override + public void onServiceConnected(ComponentName component, IBinder service) { + Log_OC.d(TAG, "service connected"); + + operationsServiceBinder = (OperationsService.OperationsServiceBinder) service; + + if (component.equals(new ComponentName(getContext(), OperationsService.class))) { + expireFiles(daysToExpire, backupFolder, account); + } + } + + @Override + public void onServiceDisconnected(ComponentName component) { + Log_OC.d(TAG, "service disconnected"); + + if (component.equals(new ComponentName(getContext(), OperationsService.class))) { + operationsServiceBinder = null; + } + } + } } From 9c37334ef744f15b54f64419bba1ae06ebcaeb66 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 10:49:13 +0200 Subject: [PATCH 659/881] make headlines bold set initial state of last backup to "never" --- src/main/res/layout/contacts_preference.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml index d223b425b2..d29de1b32a 100644 --- a/src/main/res/layout/contacts_preference.xml +++ b/src/main/res/layout/contacts_preference.xml @@ -43,7 +43,8 @@ android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="@string/contacts_header_backup" - android:textColor="@color/primary"/> + android:textColor="@color/primary" + android:textStyle="bold"/> <android.support.v7.widget.SwitchCompat android:id="@+id/contacts_automatic_backup" @@ -74,7 +75,7 @@ android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_weight="1" - android:text="2017 / 03 / 10 - 11:33am" + android:text="@string/contacts_preference_backup_never" android:textAppearance="?android:attr/textAppearanceMedium"/> </LinearLayout> @@ -95,7 +96,8 @@ android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="@string/contacts_header_restore" - android:textColor="@color/primary"/> + android:textColor="@color/primary" + android:textStyle="bold"/> <android.support.v7.widget.AppCompatButton android:id="@+id/contacts_datepacker" From 16296153de4b383cb93985d6bd800ea6daec21b4 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 11:14:36 +0200 Subject: [PATCH 660/881] contact list: text is now in line with header round images --- .../ui/activity/ContactListFragment.java | 17 ++++++++++------- src/main/res/layout/contactlist_fragment.xml | 9 ++++++--- src/main/res/layout/contactlist_list_item.xml | 9 +++++---- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index 5290a67e3a..cf09890612 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -27,14 +27,14 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; +import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.provider.ContactsContract; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v7.app.AlertDialog; import android.util.SparseBooleanArray; import android.view.LayoutInflater; @@ -45,8 +45,8 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; +import android.widget.ImageView; import android.widget.ListView; -import android.widget.QuickContactBadge; import android.widget.TextView; import com.evernote.android.job.JobRequest; @@ -57,6 +57,7 @@ import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsImportJob; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.PermissionUtil; import java.io.File; @@ -164,7 +165,7 @@ public class ContactListFragment extends FileFragment { } static class ContactItemViewHolder { - QuickContactBadge badge; + ImageView badge; TextView name; } @@ -321,7 +322,7 @@ class ContactListAdapter extends ArrayAdapter<VCard> { convertView = LayoutInflater.from(getContext()).inflate(R.layout.contactlist_list_item, parent, false); viewHolder = new ContactListFragment.ContactItemViewHolder(); - viewHolder.badge = (QuickContactBadge) convertView.findViewById(R.id.contactlist_item_icon); + viewHolder.badge = (ImageView) convertView.findViewById(R.id.contactlist_item_icon); viewHolder.name = (TextView) convertView.findViewById(R.id.contactlist_item_name); convertView.setTag(viewHolder); @@ -336,11 +337,13 @@ class ContactListAdapter extends ArrayAdapter<VCard> { if (vcard.getPhotos().size() > 0) { byte[] data = vcard.getPhotos().get(0).getData(); - Drawable drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)); + Bitmap thumbnail = BitmapFactory.decodeByteArray(data, 0, data.length); + RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(getContext().getResources(), + thumbnail); viewHolder.badge.setImageDrawable(drawable); } else { - viewHolder.badge.setImageToDefault(); + viewHolder.badge.setImageResource(R.drawable.ic_user); } // name diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml index 61b0d42b6f..f0441c17e3 100644 --- a/src/main/res/layout/contactlist_fragment.xml +++ b/src/main/res/layout/contactlist_fragment.xml @@ -27,9 +27,12 @@ android:id="@+id/contactlist_listview" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_margin="10dp" - android:choiceMode="multipleChoice" - android:layout_weight="1" /> + android:layout_marginBottom="10dp" + android:layout_marginEnd="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:layout_weight="1" + android:choiceMode="multipleChoice"/> <android.support.v7.widget.AppCompatButton android:id="@+id/contactlist_restore_selected" diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml index 5a90135ae0..bdeec1b661 100644 --- a/src/main/res/layout/contactlist_list_item.xml +++ b/src/main/res/layout/contactlist_list_item.xml @@ -23,11 +23,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <QuickContactBadge + <ImageView android:id="@+id/contactlist_item_icon" - android:layout_width="?android:attr/listPreferredItemHeight" - android:layout_height="?android:attr/listPreferredItemHeight" - android:layout_margin="5dp" + android:layout_width="72dp" + android:layout_height="72dp" + android:layout_margin="0dp" + android:padding="7dp" android:scaleType="centerCrop" android:src="@drawable/ic_user"/> From b5a9813cbcf9dd111540fa0c0e77c1d28305c9f4 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 12:38:09 +0200 Subject: [PATCH 661/881] use recyclerview --- .../ui/activity/ContactListFragment.java | 157 +++++++++++------- src/main/res/layout/contactlist_fragment.xml | 4 +- src/main/res/layout/contactlist_list_item.xml | 11 +- 3 files changed, 100 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index cf09890612..e37092cd5b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -32,22 +32,18 @@ import android.graphics.BitmapFactory; import android.os.Bundle; import android.provider.ContactsContract; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v7.app.AlertDialog; -import android.util.SparseBooleanArray; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; @@ -63,7 +59,9 @@ import com.owncloud.android.utils.PermissionUtil; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import ezvcard.Ezvcard; import ezvcard.VCard; @@ -79,8 +77,8 @@ public class ContactListFragment extends FileFragment { public static final String FILE_NAME = "FILE_NAME"; public static final String ACCOUNT = "ACCOUNT"; - private ListView listView; - private ArrayList<VCard> vCards; + private RecyclerView recyclerView; + private Set<Integer> checkedVCards; public static ContactListFragment newInstance(OCFile file, Account account) { ContactListFragment frag = new ContactListFragment(); @@ -101,7 +99,8 @@ public class ContactListFragment extends FileFragment { View view = inflater.inflate(R.layout.contactlist_fragment, null); - vCards = new ArrayList<>(); + ArrayList<VCard> vCards = new ArrayList<>(); + checkedVCards = new HashSet<>(); try { OCFile ocFile = getArguments().getParcelable(FILE_NAME); @@ -132,26 +131,12 @@ public class ContactListFragment extends FileFragment { } }); - ContactListAdapter contactListAdapter = new ContactListAdapter(getContext(), vCards); + recyclerView = (RecyclerView) view.findViewById(R.id.contactlist_recyclerview); - listView = (ListView) view.findViewById(R.id.contactlist_listview); - listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); - listView.setAdapter(contactListAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - - CheckedTextView tv = (CheckedTextView) view.findViewById(R.id.contactlist_item_name); - - if (listView.getCheckedItemPositions().get(position)) { - tv.setChecked(true); - } else { - listView.getCheckedItemPositions().delete(position); - tv.setChecked(false); - } - - if (listView.getCheckedItemPositions().size() > 0) { + ContactListAdapter.OnVCardClickListener vCardClickListener = new ContactListAdapter.OnVCardClickListener() { + private void setRestoreButton() { + if (checkedVCards.size() > 0) { restoreContacts.setEnabled(true); restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); } else { @@ -159,24 +144,56 @@ public class ContactListFragment extends FileFragment { restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); } } - }); + + @Override + public void onVCardCheck(int position) { + checkedVCards.add(position); + Log_OC.d(TAG, position + " checked"); + + setRestoreButton(); + } + + @Override + public void onVCardUncheck(int position) { + checkedVCards.remove(position); + Log_OC.d(TAG, position + " unchecked"); + + setRestoreButton(); + } + }; + + ContactListAdapter contactListAdapter = new ContactListAdapter(getContext(), vCards, vCardClickListener); + recyclerView.setAdapter(contactListAdapter); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); return view; } - static class ContactItemViewHolder { + static class ContactItemViewHolder extends RecyclerView.ViewHolder { ImageView badge; - TextView name; + CheckedTextView name; + + ContactItemViewHolder(View itemView) { + super(itemView); + + badge = (ImageView) itemView.findViewById(R.id.contactlist_item_icon); + name = (CheckedTextView) itemView.findViewById(R.id.contactlist_item_name); + + itemView.setTag(this); + } + + void setVCardListener(View.OnClickListener onClickListener) { + itemView.setOnClickListener(onClickListener); + } } private void importContacts(ContactAccount account) { - SparseBooleanArray checkedArray = listView.getCheckedItemPositions(); - int[] intArray = new int[vCards.size()]; + int[] intArray = new int[checkedVCards.size()]; - for (int i = 0; i < vCards.size(); i++) { - if (checkedArray.get(i)) { - intArray[i] = 1; - } + int i = 0; + for (Integer checkedVCard : checkedVCards) { + intArray[i] = checkedVCard; + i++; } PersistableBundleCompat bundle = new PersistableBundleCompat(); @@ -195,7 +212,7 @@ public class ContactListFragment extends FileFragment { .schedule(); - Snackbar.make(listView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); + Snackbar.make(recyclerView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); } private void getAccountForImport() { @@ -304,33 +321,28 @@ public class ContactListFragment extends FileFragment { } } -class ContactListAdapter extends ArrayAdapter<VCard> { +class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.ContactItemViewHolder> { private List<VCard> vCards; + private Context context; + private OnVCardClickListener vCardClickListener; - ContactListAdapter(Context context, List<VCard> vCards) { - super(context, 0, R.id.contactlist_item_name, vCards); - + ContactListAdapter(Context context, List<VCard> vCards, OnVCardClickListener vCardClickListener) { this.vCards = vCards; + this.context = context; + this.vCardClickListener = vCardClickListener; } - @NonNull + @Override - public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { - ContactListFragment.ContactItemViewHolder viewHolder; + public ContactListFragment.ContactItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.contactlist_list_item, parent, false); - if (convertView == null) { - convertView = LayoutInflater.from(getContext()).inflate(R.layout.contactlist_list_item, parent, false); - viewHolder = new ContactListFragment.ContactItemViewHolder(); + return new ContactListFragment.ContactItemViewHolder(view); + } - viewHolder.badge = (ImageView) convertView.findViewById(R.id.contactlist_item_icon); - viewHolder.name = (TextView) convertView.findViewById(R.id.contactlist_item_name); - - convertView.setTag(viewHolder); - } else { - viewHolder = (ContactListFragment.ContactItemViewHolder) convertView.getTag(); - } - - VCard vcard = vCards.get(position); + @Override + public void onBindViewHolder(final ContactListFragment.ContactItemViewHolder holder, final int position) { + final VCard vcard = vCards.get(holder.getAdapterPosition()); if (vcard != null) { // photo @@ -338,21 +350,44 @@ class ContactListAdapter extends ArrayAdapter<VCard> { byte[] data = vcard.getPhotos().get(0).getData(); Bitmap thumbnail = BitmapFactory.decodeByteArray(data, 0, data.length); - RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(getContext().getResources(), + RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(context.getResources(), thumbnail); - viewHolder.badge.setImageDrawable(drawable); + holder.badge.setImageDrawable(drawable); } else { - viewHolder.badge.setImageResource(R.drawable.ic_user); + holder.badge.setImageResource(R.drawable.ic_user); } + // Checkbox + holder.setVCardListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + holder.name.setChecked(!holder.name.isChecked()); + + if (holder.name.isChecked()) { + vCardClickListener.onVCardCheck(holder.getAdapterPosition()); + } else { + vCardClickListener.onVCardUncheck(holder.getAdapterPosition()); + } + } + }); + // name StructuredName name = vcard.getStructuredName(); String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; String last = (name.getFamily() == null) ? "" : name.getFamily(); - viewHolder.name.setText(first + last); + holder.name.setText(first + last); } + } - return convertView; + @Override + public int getItemCount() { + return vCards.size(); + } + + interface OnVCardClickListener { + void onVCardCheck(int position); + + void onVCardUncheck(int position); } } diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml index f0441c17e3..f375b8d836 100644 --- a/src/main/res/layout/contactlist_fragment.xml +++ b/src/main/res/layout/contactlist_fragment.xml @@ -23,8 +23,8 @@ android:layout_height="match_parent" android:orientation="vertical"> - <ListView - android:id="@+id/contactlist_listview" + <android.support.v7.widget.RecyclerView + android:id="@+id/contactlist_recyclerview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginBottom="10dp" diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml index bdeec1b661..7408118d0b 100644 --- a/src/main/res/layout/contactlist_list_item.xml +++ b/src/main/res/layout/contactlist_list_item.xml @@ -21,7 +21,7 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="72dp"> <ImageView android:id="@+id/contactlist_item_icon" @@ -35,7 +35,7 @@ <CheckedTextView android:id="@+id/contactlist_item_name" android:layout_width="0dp" - android:layout_height="match_parent" + android:layout_height="72dp" android:layout_weight="1" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:ellipsize="marquee" @@ -43,11 +43,4 @@ android:maxLines="1" android:textAppearance="?android:attr/textAppearanceLarge"/> - <!--<CheckBox--> - <!--android:id="@+id/checkBox"--> - <!--android:layout_width="wrap_content"--> - <!--android:layout_height="match_parent"--> - <!--android:padding="10dp"--> - <!--/>--> - </LinearLayout> \ No newline at end of file From 5c01f75c6415dfc519f25f2023390e267874c283 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 13:41:19 +0200 Subject: [PATCH 662/881] satisfy codacy ;-) --- .../ui/activity/ContactListFragment.java | 42 ++++--- .../activity/ContactsPreferenceActivity.java | 110 +++++++++--------- 2 files changed, 83 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index e37092cd5b..a66db9880c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -90,10 +90,6 @@ public class ContactListFragment extends FileFragment { return frag; } - public ContactListFragment() { - super(); - } - @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -170,8 +166,8 @@ public class ContactListFragment extends FileFragment { } static class ContactItemViewHolder extends RecyclerView.ViewHolder { - ImageView badge; - CheckedTextView name; + private ImageView badge; + private CheckedTextView name; ContactItemViewHolder(View itemView) { super(itemView); @@ -182,9 +178,25 @@ public class ContactListFragment extends FileFragment { itemView.setTag(this); } - void setVCardListener(View.OnClickListener onClickListener) { + public void setVCardListener(View.OnClickListener onClickListener) { itemView.setOnClickListener(onClickListener); } + + public ImageView getBadge() { + return badge; + } + + public void setBadge(ImageView badge) { + this.badge = badge; + } + + public CheckedTextView getName() { + return name; + } + + public void setName(CheckedTextView name) { + this.name = name; + } } private void importContacts(ContactAccount account) { @@ -294,9 +306,9 @@ public class ContactListFragment extends FileFragment { } private class ContactAccount { - String displayName; - String name; - String type; + private String displayName; + private String name; + private String type; ContactAccount(String displayName, String name, String type) { this.displayName = displayName; @@ -353,18 +365,18 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(context.getResources(), thumbnail); - holder.badge.setImageDrawable(drawable); + holder.getBadge().setImageDrawable(drawable); } else { - holder.badge.setImageResource(R.drawable.ic_user); + holder.getBadge().setImageResource(R.drawable.ic_user); } // Checkbox holder.setVCardListener(new View.OnClickListener() { @Override public void onClick(View v) { - holder.name.setChecked(!holder.name.isChecked()); + holder.getName().setChecked(!holder.getName().isChecked()); - if (holder.name.isChecked()) { + if (holder.getName().isChecked()) { vCardClickListener.onVCardCheck(holder.getAdapterPosition()); } else { vCardClickListener.onVCardUncheck(holder.getAdapterPosition()); @@ -376,7 +388,7 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac StructuredName name = vcard.getStructuredName(); String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; String last = (name.getFamily() == null) ? "" : name.getFamily(); - holder.name.setText(first + last); + holder.getName().setText(first + last); } } diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 52f051f4c7..59b1e32a87 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -220,6 +220,58 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); + Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); + + // find file with modification with date and time between 00:00 and 23:59 + // if more than one file exists, take oldest + Calendar date = Calendar.getInstance(); + date.set(year, month, dayOfMonth); + + // start + date.set(Calendar.HOUR, 0); + date.set(Calendar.MINUTE, 0); + date.set(Calendar.SECOND, 1); + date.set(Calendar.MILLISECOND, 0); + date.set(Calendar.AM_PM, Calendar.AM); + Long start = date.getTimeInMillis(); + + // end + date.set(Calendar.HOUR, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + Long end = date.getTimeInMillis(); + + OCFile backupToRestore = null; + + for (OCFile file : backupFiles) { + if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { + if (backupToRestore == null) { + backupToRestore = file; + } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { + backupToRestore = file; + } + } + } + + if (backupToRestore != null) { + Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, getAccount()); + + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.contacts_linear_layout, contactListFragment); + transaction.commit(); + } else { + Toast.makeText(ContactsPreferenceActivity.this, R.string.contacts_preferences_no_file_found, + Toast.LENGTH_SHORT).show(); + } + } + }; + DatePickerDialog datePickerDialog = new DatePickerDialog(this, dateSetListener, year, month, day); datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); @@ -227,57 +279,6 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag datePickerDialog.show(); } - DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); - Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); - - // find file with modification with date and time between 00:00 and 23:59 - // if more than one file exists, take oldest - Calendar date = Calendar.getInstance(); - date.set(year, month, dayOfMonth); - - // start - date.set(Calendar.HOUR, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 1); - date.set(Calendar.MILLISECOND, 0); - date.set(Calendar.AM_PM, Calendar.AM); - Long start = date.getTimeInMillis(); - - // end - date.set(Calendar.HOUR, 23); - date.set(Calendar.MINUTE, 59); - date.set(Calendar.SECOND, 59); - Long end = date.getTimeInMillis(); - - OCFile backupToRestore = null; - - for (OCFile file : backupFiles) { - if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { - if (backupToRestore == null) { - backupToRestore = file; - } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { - backupToRestore = file; - } - } - } - - if (backupToRestore != null) { - Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, getAccount()); - - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.replace(R.id.contacts_linear_layout, contactListFragment); - transaction.commit(); - } else { - Toast.makeText(ContactsPreferenceActivity.this, R.string.contacts_preferences_no_file_found, - Toast.LENGTH_SHORT).show(); - } - } - }; - public static void startContactBackupJob(Account account) { Log_OC.d(TAG, "start daily contacts backup job"); @@ -321,6 +322,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag default: retval = super.onOptionsItemSelected(item); + break; } return retval; } @@ -335,16 +337,16 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag @Override public void showDetails(OCFile file) { - + // not needed } @Override public void onBrowsedDownTo(OCFile folder) { - + // not needed } @Override public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { - + // not needed } } \ No newline at end of file From 708a261409415844cca869a4a94d7fb2ada5ab93 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 17 Apr 2017 20:12:27 +0200 Subject: [PATCH 663/881] minor material design layout fixes --- src/main/res/layout/contactlist_fragment.xml | 6 +---- src/main/res/layout/contactlist_list_item.xml | 9 ++++---- src/main/res/layout/contacts_preference.xml | 22 +++++++++---------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml index f375b8d836..f9543f808d 100644 --- a/src/main/res/layout/contactlist_fragment.xml +++ b/src/main/res/layout/contactlist_fragment.xml @@ -27,10 +27,6 @@ android:id="@+id/contactlist_recyclerview" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginBottom="10dp" - android:layout_marginEnd="10dp" - android:layout_marginRight="10dp" - android:layout_marginTop="10dp" android:layout_weight="1" android:choiceMode="multipleChoice"/> @@ -38,7 +34,7 @@ android:id="@+id/contactlist_restore_selected" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="10dp" + android:layout_margin="@dimen/standard_margin" android:enabled="false" android:text="@string/contaclist_restore_selected" android:background="@color/standard_grey" diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml index 7408118d0b..9b1bb08196 100644 --- a/src/main/res/layout/contactlist_list_item.xml +++ b/src/main/res/layout/contactlist_list_item.xml @@ -21,12 +21,12 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="72dp"> + android:layout_height="@dimen/standard_list_item_size"> <ImageView android:id="@+id/contactlist_item_icon" - android:layout_width="72dp" - android:layout_height="72dp" + android:layout_width="@dimen/standard_list_item_size" + android:layout_height="@dimen/standard_list_item_size" android:layout_margin="0dp" android:padding="7dp" android:scaleType="centerCrop" @@ -35,7 +35,8 @@ <CheckedTextView android:id="@+id/contactlist_item_name" android:layout_width="0dp" - android:layout_height="72dp" + android:layout_height="@dimen/standard_list_item_size" + android:layout_marginRight="@dimen/standard_margin" android:layout_weight="1" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:ellipsize="marquee" diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml index d29de1b32a..884730fb8e 100644 --- a/src/main/res/layout/contacts_preference.xml +++ b/src/main/res/layout/contacts_preference.xml @@ -39,9 +39,9 @@ android:id="@+id/contacts_header_backup" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="10dp" - android:layout_marginTop="10dp" + android:layout_marginLeft="@dimen/standard_margin" + android:layout_marginRight="@dimen/standard_margin" + android:layout_marginTop="@dimen/standard_margin" android:text="@string/contacts_header_backup" android:textColor="@color/primary" android:textStyle="bold"/> @@ -50,7 +50,7 @@ android:id="@+id/contacts_automatic_backup" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="10dp" + android:layout_margin="@dimen/standard_margin" android:text="@string/contacts_automatic_backup" android:textAppearance="?android:attr/textAppearanceMedium"/> @@ -63,7 +63,7 @@ android:id="@+id/contacts_last_backup" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="10dp" + android:layout_margin="@dimen/standard_margin" android:layout_weight="1" android:text="@string/contacts_last_backup" android:textAppearance="?android:attr/textAppearanceMedium" @@ -73,7 +73,7 @@ android:id="@+id/contacts_last_backup_timestamp" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="10dp" + android:layout_margin="@dimen/standard_margin" android:layout_weight="1" android:text="@string/contacts_preference_backup_never" android:textAppearance="?android:attr/textAppearanceMedium"/> @@ -83,7 +83,7 @@ android:id="@+id/contacts_backup_now" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="10dp" + android:layout_margin="@dimen/standard_margin" android:onClick="backupContacts" android:text="@string/contacts_backup_button" android:theme="@style/Button.Primary"/> @@ -92,9 +92,9 @@ android:id="@+id/contacts_header_restore" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="10dp" - android:layout_marginTop="10dp" + android:layout_marginLeft="@dimen/standard_margin" + android:layout_marginRight="@dimen/standard_margin" + android:layout_marginTop="@dimen/standard_margin" android:text="@string/contacts_header_restore" android:textColor="@color/primary" android:textStyle="bold"/> @@ -103,7 +103,7 @@ android:id="@+id/contacts_datepacker" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="10dp" + android:layout_margin="@dimen/standard_margin" android:onClick="openDate" android:text="@string/contacts_preference_choose_date" android:theme="@style/Button.Primary"/> From 538ca93c5afc2559288b6590aefa70cb648c0a0a Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Tue, 18 Apr 2017 00:20:54 +0000 Subject: [PATCH 664/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 75 +++++++++++++++----------- src/main/res/values-nb-rNO/strings.xml | 1 + 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index f70011e05e..68593e7691 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -23,6 +23,7 @@ <string name="drawer_item_all_files">Όλα τα αρχεία</string> <string name="drawer_item_files">Αρχεία</string> + <string name="drawer_item_home">Αρχική</string> <string name="drawer_item_favorites">Αγαπημένα</string> <string name="drawer_item_photos">Φωτογραφίες</string> <string name="drawer_item_on_device">Στην συσκευή</string> @@ -102,6 +103,7 @@ <string name="file_list_empty_headline_search">Κανενα αποτέλεσμα σε αυτον τον φάκελο</string> <string name="file_list_empty_headline_server_search">Κανένα αποτέλεσμα</string> <string name="file_list_empty_favorite_headline">Κανένα αγαπημένο</string> + <string name="file_list_empty_shared_headline">Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής</string> <string name="file_list_empty_shared">Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανίζονται εδώ</string> <string name="file_list_empty_headline_server_search_videos">Κανένα βίντεο</string> <string name="file_list_empty_headline_server_search_photos">Καμιά φωτογραφία</string> @@ -288,7 +290,7 @@ <string name="sync_file_fail_msg">Αδυναμία ελέγχου του απομακρυσμένου αρχείου</string> <string name="sync_file_nothing_to_do_msg">Τα περιεχόμενα του αρχείου έχουν ήδη συγχρονιστεί</string> <string name="create_dir_fail_msg">Ο φάκελος δεν μπορεί να δημιουργηθεί</string> - <string name="filename_forbidden_characters">Μη-επιτρεπόμενοι χαρακτήρες: / \\ < > : \" | ? *</string> + <string name="filename_forbidden_characters">Απαγορευμένοι χαρακτήρες: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Το όνομα αρχείου περιέχει έναν τουλάχιστον μη έγκυρο χαρακτήρα</string> <string name="filename_empty">Το όνομα αρχείου δεν μπορεί να είναι κενό</string> <string name="wait_a_moment">Παρακαλούμε περιμένετε</string> @@ -304,9 +306,9 @@ <string name="ssl_validator_header">Η ταυτότητα της σελίδας δεν μπορεί να επληθευτεί</string> <string name="ssl_validator_reason_cert_not_trusted">- Το πιστοποιητικό του διακομιστή δεν είναι έμπιστο</string> <string name="ssl_validator_reason_cert_expired">- Το πιστοποιητικό του διακομιστή έχει λήξει</string> - <string name="ssl_validator_reason_cert_not_yet_valid">- Το πιστοποιητικό του διακομιστή είναι πολύ νέο</string> - <string name="ssl_validator_reason_hostname_not_verified">- Η URL δεν ταιριάζει το όνομα του συστήματος στο πιστοποιητικό</string> - <string name="ssl_validator_question">Θέλετε να θεωρείται έμπιστο το πιστοποιητικό αυτό παρ\' όλα αυτά;</string> + <string name="ssl_validator_reason_cert_not_yet_valid">- Οι έγκυρες ημερομηνίες του πιστοποιητικού του διακομιστή είναι στο μέλλον</string> + <string name="ssl_validator_reason_hostname_not_verified">- Η URL δεν ταιριάζει με το όνομα του συστήματος στο πιστοποιητικό</string> + <string name="ssl_validator_question">Θέλετε να θεωρείται έμπιστο το πιστοποιητικό παρ\' όλα αυτά;</string> <string name="ssl_validator_not_saved">Το πιστοποιητικό δεν ήταν δυνατόν να αποθηκευτεί</string> <string name="ssl_validator_btn_details_see">Λεπτομέρειες</string> <string name="ssl_validator_btn_details_hide">Απόκρυψη</string> @@ -314,7 +316,7 @@ <string name="ssl_validator_label_issuer">Εκδόθηκε από:</string> <string name="ssl_validator_label_CN">Κοινό όνομα:</string> <string name="ssl_validator_label_O">Οργανισμός:</string> - <string name="ssl_validator_label_OU">Μονάδα Οργανισμού:</string> + <string name="ssl_validator_label_OU">Μονάδα οργανισμού:</string> <string name="ssl_validator_label_C">Χώρα:</string> <string name="ssl_validator_label_ST">Πολιτεία:</string> <string name="ssl_validator_label_L">Τοποθεσία:</string> @@ -343,12 +345,15 @@ <string name="instant_upload_on_charging">Μεταφόρτωση μόνο κατά τη διάρκεια φόρτισης</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Διένεξη αρχείων</string> - <string name="conflict_message">Ποια αρχεία θέλετε να διατηρήσετε; Αν επιλέξετε και τις δύο εκδόσεις, στο τοπικό αρχείο θα προστεθεί ένας αριθμός στο όνομά του.</string> + <string name="conflict_message">Ποια αρχεία θέλετε να διατηρήσετε; Αν επιλέξετε και τις δύο εκδόσεις, θα προστεθεί ένας αριθμός στο όνομα του τοπικού αρχείου.</string> <string name="conflict_keep_both">Διατήρηση και των δύο</string> <string name="conflict_use_local_version">τοπική έκδοση</string> <string name="conflict_use_server_version">έκδοση διακομιστή</string> + <string name="preview_sorry">Σας ζητούμε συγγνώμη γι\'αυτό!</string> <string name="preview_image_description">Προεπισκόπηση εικόνας</string> + <string name="preview_image_error_unknown_format">Αδυναμία προβολής εικόνας</string> + <string name="error__upload__local_file_not_copied">Το %1$s δεν μπόρεσε να αντιγραφεί στον τοπικό φάκελο %2$s</string> <string name="prefs_instant_upload_path_title">Φάκελος άμεσης μεταφόρτωσης</string> <string name="prefs_folder_sync_local_path_title">Τοπικός φάκελος</string> @@ -356,12 +361,12 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Χρήση υποφακέλων</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Αποθήκευση σε υποφακέλους με βάση το χρόνο και μήνα</string> - <string name="share_link_no_support_share_api">Λυπούμαστε, ο διαμοιρασμός δεν είναι διαθέσιμος στο διακομιστή σας. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας.</string> - <string name="share_link_file_no_exist">Αδύνατη η κοινή χρήση. Παρακαλώ ελέγξτε αν υπάρχει ο φάκελος</string> + <string name="share_link_no_support_share_api">Λυπούμαστε, ο διαμοιρασμός δεν είναι διαθέσιμος στο διακομιστή σας. Παρακαλούμε επικοινωνήστε με τον διαχειριστή.</string> + <string name="share_link_file_no_exist">Αδυναμία διαμοιρασμού. Παρακαλούμε ελέγξτε αν υπάρχει ο φάκελος</string> <string name="share_link_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια διαμοιρασμού αυτού του αρχείου ή φακέλου</string> - <string name="unshare_link_file_no_exist">Αδύνατη η διακοπή κοινής χρήσης. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> - <string name="unshare_link_file_error">Παρουσιάρτηκε σφάλμα κατά τη διάρκεια ακύρωσης διαμοιρασμού αυτού του αρχείου ή φακέλου</string> - <string name="update_link_file_no_exist">Αδύνατη η ενημέρωση. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> + <string name="unshare_link_file_no_exist">Αδυναμία αναίρεσης κοινής χρήσης. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> + <string name="unshare_link_file_error">Παρουσιάστηκε σφάλμα κατά τη διάρκεια αναίρεσης διαμοιρασμού αυτού του αρχείου ή φακέλου</string> + <string name="update_link_file_no_exist">Αδυναμία ενημέρωσης. Παρακαλούμε ελέγξτε αν το αρχείο υπάρχει</string> <string name="update_link_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια ενημέρωσης του διαμοιρασμού</string> <string name="share_link_password_title">Εισάγετε ένα συνθηματικό</string> <string name="share_link_empty_password">Πρέπει να εισάγετε ένα συνθηματικό</string> @@ -384,7 +389,7 @@ <string name="forbidden_permissions_rename">για να μετονομάσετε αυτό το αρχείο</string> <string name="forbidden_permissions_delete">για να διαγράψετε αυτό το αρχείο</string> <string name="share_link_forbidden_permissions">για να διαμοιραστείτε αυτό το αρχείο</string> - <string name="unshare_link_forbidden_permissions">για να διακόψετε το διαμοιρασμό αυτού του αρχείου</string> + <string name="unshare_link_forbidden_permissions">για να αναιρέσετε το διαμοιρασμό αυτού του αρχείου</string> <string name="update_link_forbidden_permissions">για να ενημερώσετε αυτό τον διαμοιρασμό</string> <string name="forbidden_permissions_create">για να δημιουργήσετε το αρχείο</string> <string name="uploader_upload_forbidden_permissions">για να μεταφορτώσετε σε αυτό το φάκελο</string> @@ -395,7 +400,7 @@ <string name="file_migration_preparing">Προετοιμασία για μεταφορά…</string> <string name="file_migration_checking_destination">Γίνεται έλεγχος προορισμού…</string> <string name="file_migration_saving_accounts_configuration">Γίνεται αποθήκευση ρυθμίσεων λογαριασμών…</string> - <string name="file_migration_waiting_for_unfinished_sync">Αναμονή για τους ανολοκλήρωτους συγχρονισμούς…</string> + <string name="file_migration_waiting_for_unfinished_sync">Αναμονή για τους μη ολοκληρωμένους συγχρονισμούς…</string> <string name="file_migration_migrating">Γίνεται μετακίνηση δεδομένων…</string> <string name="file_migration_updating_index">Γίνεται ενημέρωση ευρετηρίου…</string> <string name="file_migration_cleaning">Γίνεται εκκαθάριση…</string> @@ -415,11 +420,11 @@ <string name="prefs_category_accounts">Λογαριασμοί</string> <string name="prefs_add_account">Προσθήκη λογαριασμού</string> <string name="drawer_manage_accounts">Διαχείριση λογαριασμών</string> - <string name="auth_redirect_non_secure_connection_title">Ασφαλής σύνδεση ανακατευθύνεται μέσω μιας μη ασφαλούς διαδρομής.</string> + <string name="auth_redirect_non_secure_connection_title">Η ασφαλής σύνδεση ανακατευθύνεται μέσω μιας μη ασφαλούς διαδρομής.</string> <string name="actionbar_logger">Αρχεία καταγραφών</string> <string name="log_send_history_button">Αποστολή ιστορικού</string> - <string name="log_send_no_mail_app">Δεν εντοπίστηκε εφαρμογή αποστολής ιστορικού συστήματος. Παρακαλώ εγκαταστήστε την εφαρμογή ηλεκτρονικού ταχυδρομείου</string> + <string name="log_send_no_mail_app">Δεν εντοπίστηκε εφαρμογή αποστολής ιστορικού συστήματος. Παρακαλούμε εγκαταστήστε μια εφαρμογή ηλεκτρονικού ταχυδρομείου.</string> <string name="log_send_mail_subject">%1$s ιστορικό της εφαρμογής Android</string> <string name="log_progress_dialog_text">Φόρτωση δεδομένων …</string> @@ -437,8 +442,8 @@ <string name="forbidden_permissions_move">για μετακίνηση αυτού του αρχείου</string> - <string name="copy_file_not_found">Αδύνατη η αντιγραφή. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> - <string name="copy_file_invalid_into_descendent">Δεν είναι δυνατό να αντιγραφεί ο φάκελος σε παράγωγό του φάκελο</string> + <string name="copy_file_not_found">Αδυναμία αντιγραφής. Παρακαλούμε ελέγξτε αν το αρχείο υπάρχει</string> + <string name="copy_file_invalid_into_descendent">Δεν είναι δυνατό να αντιγραφεί ο φάκελος σε απογονικό</string> <string name="copy_file_invalid_overwrite">Το αρχείο υπάρχει ήδη στο φάκελο προορισμού</string> <string name="copy_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια αντιγραφής αυτού του αρχείου ή φακέλου</string> <string name="forbidden_permissions_copy">για αντιγραφή αυτού του αρχείου</string> @@ -479,7 +484,7 @@ <string name="pref_behaviour_entries_move">μετακινήθηκε στον φάκελο εφαρμογών</string> <string name="pref_behaviour_entries_delete_file">διαγράφηκε</string> <string name="prefs_storage_path">Διαδρομή αποθηκευτικού χώρου</string> - <string name="prefs_common">Κοινές</string> + <string name="prefs_common">Κοινό</string> <string name="share_dialog_title">Γίνεται διαμοιρασμός</string> <string name="share_file">Διαμοιρασμός %1$s</string> @@ -504,7 +509,7 @@ <string name="share_email_clarification">%1$s (ηλ. ταχυδρομείο)</string> <string name="share_known_remote_clarification">%1$s ( στο %2$s )</string> - <string name="share_sharee_unavailable">Δεν επιτρέπεται ο διαμοιρασμός μεταξύ χρηστών μέσω εφαρμογής, σε αυτή την έκδοση διακομιστή. \nΕπικοινωνήστε με το διαχειριστή</string> + <string name="share_sharee_unavailable">Δεν επιτρέπεται ο διαμοιρασμός μεταξύ χρηστών μέσω πελατών, σε αυτή την έκδοση διακομιστή. \nΕπικοινωνήστε με το διαχειριστή</string> <string name="share_privilege_can_share">δυνατότητα διαμοιρασμού</string> <string name="share_privilege_can_edit">δυνατότητα επεξεργασίας</string> <string name="share_privilege_can_edit_create">δημιουργία</string> @@ -522,17 +527,17 @@ <string name="action_switch_list_view">Προβολή λίστας</string> <string name="manage_space_title">Διαχείριση χώρου</string> - <string name="manage_space_description">Τα πιστοποιητικά ρυθμίσεων, βάσης δεδομένων και διακομιστή από τα δεδομένα %1$s\'s θα διαγραφούν μόνιμα.\\n\\nΤα ληφθέντα αρχεία θα παραμείνουν ανέπαφα.\\n\\nΑυτή η διαδικασία ενδεχομένως να διαρκέσει λίγο.</string> + <string name="manage_space_description">Τα πιστοποιητικά ρυθμίσεων, βάσης δεδομένων και διακομιστή από τα δεδομένα %1$s\'s θα διαγραφούν μόνιμα.\n\nΤα ληφθέντα αρχεία θα παραμείνουν ανέπαφα.\n\nΑυτή η διαδικασία ενδεχομένως να διαρκέσει αρκετά.</string> <string name="manage_space_clear_data">Εκκαθάριση δεδομένων</string> <string name="manage_space_error">Μερικά αρχεία δεν μπορούν να διαγραφούν.</string> <string name="permission_storage_access">Επιπλέον διακαιώματα απαιτούνται για μεταφόρτωση & λήψη αρχείων.</string> <string name="local_file_not_found_toast">Το αρχείο δεν βρέθηκε στο τοπικό σύστημα αρχείων</string> <string name="confirmation_remove_files_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα;</string> - <string name="confirmation_remove_folders_alert">Θέλετε ν αφαιρέσετε τα επιλεγμένα αντικείμενα με τα περιεχόμενά τους;</string> + <string name="confirmation_remove_folders_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα με τα περιεχόμενά τους;</string> <string name="uploads_view_upload_status_waiting_for_charging">Αναμονή για φόρτιση συσκευής</string> <string name="actionbar_search">Αναζήτηση</string> - <string name="files_drop_not_supported">Αυτό είναι χαρακτηριστικό του Nextcloud, παρακαλώ ενημερώστε.</string> + <string name="files_drop_not_supported">Αυτό είναι χαρακτηριστικό του Nextcloud, παρακαλούμε ενημερώστε.</string> <string name="learn_more">Μάθετε περισσότερα</string> <string name="drawer_folder_sync">Αυτόματη μεταφόρτωση</string> <string name="drawer_participate">Συμμετοχή</string> @@ -540,27 +545,32 @@ <string name="participate_testing_bug_text">Βρήκατε σφάλμα; Κάτι σας φαίνεται παράξενο;</string> <string name="participate_testing_report_text">Αναφέρετε σφάλμα στο Github</string> <string name="participate_testing_version_text">Σας ενδιαφέρει να μας βοηθήσετε να δοκιμάσουμε την επόμενη έκδοση;</string> - <string name="participate_release_candidate_headline">Υποψήφια κυκλοφορία</string> - <string name="participate_release_candidate_text">Η υποψήφια κυκλοφορία (RC) είναι ένα στιγμιότυπο της επερχόμενης έκδοσης και αναμένεται να είναι σταθερό. Η δοκιμή της μεμονωμένης εγκατάστασής σας θα βοηθήσει στην εξασφάλιση αυτού. Εγγραφείτε για δοκιμές στο Play store ή χειροκίνητα αναζητείστε στο τμήμα \"εκδόσεις\" στο F-Droid.</string> + <string name="participate_beta_headline">Δοκιμάστε την έκδοση nightly</string> + <string name="participate_beta_text">Αυτή περιέχει όλες τις επερχόμενες λειτουργίες και δαθέτει ότι τελευταίο έχει ενσωματωθεί. Σφάλματα/λάθη μπορεί να προκύψουν. Σας παρακαλούμε να μας τα αναφέρετε.</string> + <string name="participate_release_candidate_headline">Release candidate</string> + <string name="participate_release_candidate_text">Η υποψήφια κυκλοφορία (RC) είναι ένα στιγμιότυπο της επερχόμενης έκδοσης και αναμένεται να είναι σταθερή. Η δοκιμή της μεμονωμένης εγκατάστασής σας θα βοηθήσει στην εξασφάλιση αυτού. Εγγραφείτε για δοκιμές στο Play store ή χειροκίνητα αναζητείστε στο τμήμα \"εκδόσεις\" στο F-Droid.</string> <string name="participate_contribute_headline">Ενεργή συνεισφορά</string> <string name="participate_contribute_irc_text">Συμμετέχετε στη συνομιλία στο IRC: <a href=\"%1$s\">#nextcloud-mobile</a></string> - <string name="participate_contribute_forum_text">Βοηθήστε τους άλλους στο <a href=\"%1$s\">forum</a></string> - <string name="participate_contribute_translate_text"><a href=\"%1$s\">Μετάφραση</a> της εφαρμογής</string> - <string name="participate_contribute_github_text">Συνεισφέρετε ως προγραμματιστής, για περισσότερες λεπτομέρειες δείτε <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">ΣΥΝΕΙΣΦΕΡΕΤΕ.md</a></string> + <string name="participate_contribute_forum_text">Βοηθήστε χρήστες στο <a href=\"%1$s\">forum</a></string> + <string name="participate_contribute_translate_text"><a href=\"%1$s\">Μεταφράστε</a> την εφαρμογή</string> + <string name="participate_contribute_github_text">Συνεισφέρετε ως προγραμματιστής, για περισσότερες λεπτομέρειες δείτε <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a></string> <string name="move_to">Μετακίνηση σε…</string> <string name="copy_to">Αντιγραφή σε…</string> <string name="choose_remote_folder">Επιλογή φακέλου…</string> <string name="folder_sync_loading_folders">Φόρτωση φακέλων…</string> <string name="folder_sync_no_results">Δεν βρέθηκαν φάκελοι πολυμέσων.</string> - <string name="folder_sync_preferences">Αυτόματη μεταφόρτωση προτιμήσεων</string> + <string name="folder_sync_preferences">Προτιμήσεις αυτόματης μεταφόρτωσης</string> <string name="folder_sync_settings">Ρυθμίσεις</string> - <string name="folder_sync_new_info">Η άμεση μεταφόρτωση έχει ανανεωθεί τελείως. Παρακαλώ δείτε το κυρίως μενού και ρυθμίστε ξανά την αυτόματη μεταφόρτωση. Σας ζητούμε συγγνώμη για την ενόχληση\\n\\nΑπολαύστε τις νέες και εκτεταμένες δυνατότητες της αυτόματης μεταφόρτωσης!</string> + <string name="folder_sync_new_info">Η άμεση μεταφόρτωση έχει ανανεωθεί τελείως. Παρακαλούμε δείτε το κυρίως μενού και ρυθμίστε ξανά την αυτόματη μεταφόρτωση. Σας ζητούμε συγγνώμη για την ενόχληση\n\nΑπολαύστε τις νέες και εκτεταμένες δυνατότητες της αυτόματης μεταφόρτωσης!</string> <string name="folder_sync_preferences_folder_path">Για %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d επιλέχθηκε</item> <item quantity="other">%d επιλέχθηκαν</item> </plurals> + <string name="activity_list_loading_activity">Γίνεται φόρτωση δραστηριοτήτων…</string> + <string name="activity_list_no_results">Δεν βρέθηκαν δραστηριότητες.</string> + <string name="upload_file_dialog_title">Εισαγωγή ονόματος και τύπου αρχείου μεταφόρτωσης</string> <string name="upload_file_dialog_filename">Όνομα αρχείου</string> <string name="upload_file_dialog_filetype">Τύπος αρχείου</string> @@ -597,4 +607,9 @@ <string name="user_information_description">Πληροφορίες χρήστη</string> - </resources> + <!-- Activities --> + <string name="activities_no_results_headline">Καμία δραστηριότητα ακόμα</string> + <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές & κοινόχρηστα</string> + + +</resources> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 3db1c3dc77..197405eef0 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -555,6 +555,7 @@ <item quantity="other">%d valgte</item> </plurals> + <string name="activity_list_loading_activity">Laster inn aktiviteter…</string> <string name="activity_list_no_results">Ingen aktiviteter funnet.</string> <string name="upload_file_dialog_title">Legg inn filnavn og -type for opplasting</string> From 35e683546cf8f904f37af6534f48491c1eeb5912 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 12 Apr 2017 14:34:43 +0200 Subject: [PATCH 665/881] contact backup & import --- build.gradle | 2 + src/main/AndroidManifest.xml | 4 + .../android/services/ContactsBackupJob.java | 210 +++++++ .../android/services/ContactsImportJob.java | 77 +++ .../android/services/NCJobCreator.java | 10 +- .../ui/activity/ContactListFragment.java | 353 +++++++++++ .../activity/ContactsPreferenceActivity.java | 350 +++++++++++ .../android/ui/activity/DrawerActivity.java | 8 + .../android/ui/activity/FileActivity.java | 16 +- .../ui/activity/FileDisplayActivity.java | 27 +- .../ui/fragment/ExtendedListFragment.java | 18 +- .../ui/fragment/OCFileListFragment.java | 3 + .../owncloud/android/utils/MimeTypeUtil.java | 16 + .../android/utils/PermissionUtil.java | 36 +- .../ezvcard_android/AndroidCustomField.java | 114 ++++ .../ezvcard_android/ContactOperations.java | 567 ++++++++++++++++++ .../ezvcard_android/DataMappings.java | 292 +++++++++ src/main/res/layout/contactlist_fragment.xml | 44 ++ src/main/res/layout/contactlist_list_item.xml | 52 ++ src/main/res/layout/contacts_preference.xml | 117 ++++ src/main/res/menu/drawer_menu.xml | 5 + src/main/res/values/setup.xml | 5 + src/main/res/values/strings.xml | 19 + src/modified/res/values/setup.xml | 7 +- 24 files changed, 2337 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/owncloud/android/services/ContactsBackupJob.java create mode 100644 src/main/java/com/owncloud/android/services/ContactsImportJob.java create mode 100644 src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java create mode 100644 src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java create mode 100644 src/main/java/third_parties/ezvcard_android/AndroidCustomField.java create mode 100644 src/main/java/third_parties/ezvcard_android/ContactOperations.java create mode 100644 src/main/java/third_parties/ezvcard_android/DataMappings.java create mode 100644 src/main/res/layout/contactlist_fragment.xml create mode 100644 src/main/res/layout/contactlist_list_item.xml create mode 100644 src/main/res/layout/contacts_preference.xml diff --git a/build.gradle b/build.gradle index 4469ed7ed9..441fb4942a 100644 --- a/build.gradle +++ b/build.gradle @@ -118,6 +118,7 @@ android { packagingOptions { exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/LICENSE' } task checkstyle(type: Checkstyle) { @@ -191,6 +192,7 @@ dependencies { compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' compile 'org.greenrobot:eventbus:3.0.0' + compile 'com.googlecode.ez-vcard:ez-vcard:0.10.2' compile 'org.parceler:parceler-api:1.1.6' annotationProcessor 'org.parceler:parceler:1.1.6' diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 4ee75a4245..40353bfcb3 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -35,6 +35,9 @@ See note in http://developer.android.com/intl/es/reference/android/Manifest.permission.html#GET_ACCOUNTS --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> + <uses-permission android:name="android.permission.READ_CONTACTS" /> + <uses-permission android:name="android.permission.WRITE_CONTACTS" /> + <!-- USE_CREDENTIALS, MANAGE_ACCOUNTS and AUTHENTICATE_ACCOUNTS are needed for API < 23. In API >= 23 the do not exist anymore --> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> @@ -80,6 +83,7 @@ <activity android:name=".ui.activity.ActivitiesListActivity"/> <activity android:name=".ui.activity.FolderSyncActivity" /> <activity android:name=".ui.activity.UploadFilesActivity" /> + <activity android:name=".ui.activity.ContactsPreferenceActivity" /> <activity android:name=".ui.activity.ReceiveExternalFilesActivity" android:taskAffinity="" diff --git a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java new file mode 100644 index 0000000000..a93a7256db --- /dev/null +++ b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java @@ -0,0 +1,210 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + * <p> + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * <p> + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * <p> + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.services; + +import android.accounts.Account; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.provider.ContactsContract; +import android.support.annotation.NonNull; +import android.text.format.DateFormat; + +import com.evernote.android.job.Job; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.operations.UploadFileOperation; +import com.owncloud.android.ui.activity.ContactsPreferenceActivity; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Vector; + +/** + * Job that backup contacts to /Contacts-Backup and deletes files older than x days + */ + +public class ContactsBackupJob extends Job { + public static final String TAG = "ContactsBackupJob"; + public static final String ACCOUNT = "account"; + public static final String FORCE = "force"; + + + @NonNull + @Override + protected Result onRunJob(Params params) { + final Context context = MainApp.getAppContext(); + PersistableBundleCompat bundle = params.getExtras(); + + boolean force = bundle.getBoolean(FORCE, false); + + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + Long lastExecution = sharedPreferences.getLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, -1); + + if (force || (lastExecution + 24 * 60 * 60 * 1000) < Calendar.getInstance().getTimeInMillis()) { + Log_OC.d(TAG, "start contacts backup job"); + + final Account account = AccountUtils.getOwnCloudAccountByName(context, bundle.getString(ACCOUNT, "")); + String backupFolder = getContext().getResources().getString(R.string.contacts_backup_folder) + + OCFile.PATH_SEPARATOR; + Integer daysToExpire = getContext().getResources().getInteger(R.integer.contacts_backup_expire); + + backupContact(account, backupFolder); + + expireFiles(daysToExpire, backupFolder, account); + + // store execution date + sharedPreferences.edit().putLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, + Calendar.getInstance().getTimeInMillis()).apply(); + + } else { + Log_OC.d(TAG, "last execution less than 24h ago"); + } + + return Result.SUCCESS; + } + + private void backupContact(Account account, String backupFolder) { + ArrayList<String> vCard = new ArrayList<>(); + try { + + Cursor cursor = getContext().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, + null, null, null); + + if (cursor != null && cursor.getCount() > 0) { + cursor.moveToFirst(); + for (int i = 0; i < cursor.getCount(); i++) { + + vCard.add(getContactFromCursor(cursor)); + cursor.moveToNext(); + } + } + + String filename = DateFormat.format("yyyy-MM-dd_HH-mm-ss", Calendar.getInstance()).toString() + ".vcf"; + Log_OC.d(TAG, "Storing: " + filename); + File file = new File(getContext().getCacheDir(), filename); + + FileWriter fw = null; + try { + fw = new FileWriter(file); + + for (String card : vCard) { + fw.write(card); + } + + } catch (IOException e) { + Log_OC.d(TAG, "Error ", e); + } finally { + if (fw != null) { + try { + fw.close(); + } catch (IOException e) { + Log_OC.d(TAG, "Error closing file writer ", e); + } + } + } + + FileUploader.UploadRequester requester = new FileUploader.UploadRequester(); + requester.uploadNewFile( + getContext(), + account, + file.getAbsolutePath(), + backupFolder + filename, + FileUploader.LOCAL_BEHAVIOUR_MOVE, + null, + true, + UploadFileOperation.CREATED_BY_USER + ); + + } catch (Exception e) { + Log_OC.d(TAG, e.getMessage()); + } + } + + private void expireFiles(Integer daysToExpire, String backupFolderString, Account account) { + // -1 disables expiration + if (daysToExpire > -1) { + FileDataStorageManager storageManager = new FileDataStorageManager(account, getContext().getContentResolver()); + OCFile backupFolder = storageManager.getFileByPath(backupFolderString); + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_YEAR, -daysToExpire); + Long timestampToExpire = cal.getTimeInMillis(); + + Log_OC.d(TAG, "expire: " + daysToExpire + " " + backupFolder.getFileName()); + + Vector<OCFile> backups = storageManager.getFolderContent(backupFolder, false); + + for (OCFile backup : backups) { + if (timestampToExpire > backup.getModificationTimestamp()) { + Log_OC.d(TAG, "delete " + backup.getRemotePath()); + + // delete backups + Intent service = new Intent(getContext(), OperationsService.class); + service.setAction(OperationsService.ACTION_REMOVE); + service.putExtra(OperationsService.EXTRA_ACCOUNT, account); + service.putExtra(OperationsService.EXTRA_REMOTE_PATH, backup.getRemotePath()); + service.putExtra(OperationsService.EXTRA_REMOVE_ONLY_LOCAL, false); + + getContext().startService(service); + } + } + } + } + + private String getContactFromCursor(Cursor cursor) { + String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); + Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey); + ParcelFileDescriptor fd; + + String vCard = ""; + try { + fd = getContext().getContentResolver().openFileDescriptor(uri, "r"); + FileInputStream fis; + if (fd != null) { + fis = new FileInputStream(fd.getFileDescriptor()); + byte[] buf = new byte[fis.available()]; + fis.read(buf); + vCard = new String(buf); + } + + return vCard; + + } catch (IOException e) { + Log_OC.d(TAG, e.getMessage()); + } + return vCard; + } +} diff --git a/src/main/java/com/owncloud/android/services/ContactsImportJob.java b/src/main/java/com/owncloud/android/services/ContactsImportJob.java new file mode 100644 index 0000000000..a02b8281fe --- /dev/null +++ b/src/main/java/com/owncloud/android/services/ContactsImportJob.java @@ -0,0 +1,77 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + * <p> + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * <p> + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * <p> + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.services; + +import android.support.annotation.NonNull; + +import com.evernote.android.job.Job; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.io.File; +import java.util.ArrayList; + +import ezvcard.Ezvcard; +import ezvcard.VCard; +import third_parties.ezvcard_android.ContactOperations; + +/** + * Job to import contacts + */ + +public class ContactsImportJob extends Job { + public static final String TAG = "ContactsImportJob"; + + public static final String ACCOUNT_TYPE = "account_type"; + public static final String ACCOUNT_NAME = "account_name"; + public static final String VCARD_FILE_PATH = "vcard_file_path"; + public static final String CHECKED_ITEMS_ARRAY = "checked_items_array"; + + @NonNull + @Override + protected Result onRunJob(Params params) { + PersistableBundleCompat bundle = params.getExtras(); + + String vCardFilePath = bundle.getString(VCARD_FILE_PATH, ""); + String accountName = bundle.getString(ACCOUNT_NAME, ""); + String accountType = bundle.getString(ACCOUNT_TYPE, ""); + int[] intArray = bundle.getIntArray(CHECKED_ITEMS_ARRAY); + + File file = new File(vCardFilePath); + ArrayList<VCard> vCards = new ArrayList<>(); + + try { + ContactOperations operations = new ContactOperations(getContext(), accountName, accountType); + vCards.addAll(Ezvcard.parse(file).all()); + + for (int i = 0; i < intArray.length; i++ ){ + if (intArray[i] == 1){ + operations.insertContact(vCards.get(i)); + } + } + } catch (Exception e) { + Log_OC.e(TAG, e.getMessage()); + } + + return Result.SUCCESS; + } +} diff --git a/src/main/java/com/owncloud/android/services/NCJobCreator.java b/src/main/java/com/owncloud/android/services/NCJobCreator.java index 688adc5bef..db9ef4dbb1 100644 --- a/src/main/java/com/owncloud/android/services/NCJobCreator.java +++ b/src/main/java/com/owncloud/android/services/NCJobCreator.java @@ -4,17 +4,17 @@ * @author Mario Danic * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Nextcloud GmbH - * + * <p> * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. - * + * <p> * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. - * + * <p> * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -33,6 +33,10 @@ public class NCJobCreator implements JobCreator { switch (tag) { case AutoUploadJob.TAG: return new AutoUploadJob(); + case ContactsBackupJob.TAG: + return new ContactsBackupJob(); + case ContactsImportJob.TAG: + return new ContactsImportJob(); default: return null; } diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java new file mode 100644 index 0000000000..21eb330598 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -0,0 +1,353 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + * <p> + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * <p> + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * <p> + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.activity; + +import android.Manifest; +import android.accounts.Account; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AlertDialog; +import android.util.SparseBooleanArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckedTextView; +import android.widget.ListView; +import android.widget.QuickContactBadge; +import android.widget.TextView; + +import com.evernote.android.job.JobRequest; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.files.services.FileDownloader; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.services.ContactsImportJob; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.PermissionUtil; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import ezvcard.Ezvcard; +import ezvcard.VCard; +import ezvcard.property.StructuredName; + +/** + * This fragment shows all contacts from a file and allows to import them. + */ + +public class ContactListFragment extends FileFragment { + public static final String TAG = ContactListFragment.class.getSimpleName(); + + public static final String FILE_NAME = "FILE_NAME"; + public static final String ACCOUNT = "ACCOUNT"; + + private ListView listView; + private ArrayList<VCard> vCards; + + public static ContactListFragment newInstance(OCFile file, Account account) { + ContactListFragment frag = new ContactListFragment(); + Bundle arguments = new Bundle(); + arguments.putParcelable(FILE_NAME, file); + arguments.putParcelable(ACCOUNT, account); + frag.setArguments(arguments); + + return frag; + } + + public ContactListFragment() { + super(); + } + + @Override + public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.contactlist_fragment, null); + + vCards = new ArrayList<>(); + + try { + OCFile ocFile = getArguments().getParcelable(FILE_NAME); + setFile(ocFile); + Account account = getArguments().getParcelable(ACCOUNT); + + if (!ocFile.isDown()) { + Intent i = new Intent(getContext(), FileDownloader.class); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); + i.putExtra(FileDownloader.EXTRA_FILE, ocFile); + getContext().startService(i); + } else { + File file = new File(ocFile.getStoragePath()); + vCards.addAll(Ezvcard.parse(file).all()); + } + } catch (IOException e) { + e.printStackTrace(); + } + + final Button restoreContacts = (Button) view.findViewById(R.id.contactlist_restore_selected); + restoreContacts.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (checkAndAskForContactsWritePermission()) { + getAccountForImport(); + } + } + }); + + ContactListAdapter contactListAdapter = new ContactListAdapter(getContext(), vCards); + + listView = (ListView) view.findViewById(R.id.contactlist_listview); + listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + listView.setAdapter(contactListAdapter); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + + CheckedTextView tv = (CheckedTextView) view.findViewById(R.id.contactlist_item_name); + + if (listView.getCheckedItemPositions().get(position)) { + tv.setChecked(true); + } else { + listView.getCheckedItemPositions().delete(position); + tv.setChecked(false); + } + + if (listView.getCheckedItemPositions().size() > 0) { + restoreContacts.setEnabled(true); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); + } else { + restoreContacts.setEnabled(false); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); + } + } + }); + + return view; + } + + static class ContactItemViewHolder { + QuickContactBadge badge; + TextView name; + } + + private void importContacts(ContactAccount account) { + SparseBooleanArray checkedArray = listView.getCheckedItemPositions(); + int[] intArray = new int[vCards.size()]; + + for (int i = 0; i < vCards.size(); i++) { + if (checkedArray.get(i)) { + intArray[i] = 1; + } + } + + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsImportJob.ACCOUNT_NAME, account.name); + bundle.putString(ContactsImportJob.ACCOUNT_TYPE, account.type); + bundle.putString(ContactsImportJob.VCARD_FILE_PATH, getFile().getStoragePath()); + bundle.putIntArray(ContactsImportJob.CHECKED_ITEMS_ARRAY, intArray); + + new JobRequest.Builder(ContactsImportJob.TAG) + .setExtras(bundle) + .setExecutionWindow(3_000L, 10_000L) + .setRequiresCharging(false) + .setPersisted(false) + .setUpdateCurrent(false) + .build() + .schedule(); + + + Snackbar.make(listView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); + } + + private void getAccountForImport() { + final ArrayList<ContactAccount> accounts = new ArrayList<>(); + + // add local one + accounts.add(new ContactAccount("Local contacts", null, null)); + + Cursor cursor = null; + try { + cursor = getContext().getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, + new String[]{ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE}, + null, + null, + null); + + if (cursor != null && cursor.getCount() > 0) { + while (cursor.moveToNext()) { + String name = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)); + String type = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); + + ContactAccount account = new ContactAccount(name, name, type); + + if (!accounts.contains(account)) { + accounts.add(account); + } + } + + cursor.close(); + } + } catch (Exception e) { + Log_OC.d(TAG, e.getMessage()); + } finally { + cursor.close(); + } + + if (accounts.size() == 1) { + importContacts(accounts.get(0)); + } else { + + ArrayAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, accounts); + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(R.string.contactlist_account_chooser_title) + .setAdapter(adapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + importContacts(accounts.get(which)); + } + }).show(); + } + } + + private boolean checkAndAskForContactsWritePermission() { + // check permissions + if (!PermissionUtil.checkSelfPermission(getContext(), Manifest.permission.WRITE_CONTACTS)) { + PermissionUtil.requestWriteContactPermission(this); + return false; + } else { + return true; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == PermissionUtil.PERMISSIONS_WRITE_CONTACTS) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.WRITE_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + getAccountForImport(); + } else { + Snackbar.make(getView(), R.string.contactlist_no_permission, Snackbar.LENGTH_LONG).show(); + } + break; + } + } + } + } + + private class ContactAccount { + String displayName; + String name; + String type; + + ContactAccount(String displayName, String name, String type) { + this.displayName = displayName; + this.name = name; + this.type = type; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ContactAccount) { + ContactAccount other = (ContactAccount) obj; + return this.name.equalsIgnoreCase(other.name) && this.type.equalsIgnoreCase(other.type); + } else { + return false; + } + } + + @Override + public String toString() { + return displayName; + } + } +} + +class ContactListAdapter extends ArrayAdapter<VCard> { + private List<VCard> vCards; + + ContactListAdapter(Context context, List<VCard> vCards) { + super(context, 0, R.id.contactlist_item_name, vCards); + + this.vCards = vCards; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + ContactListFragment.ContactItemViewHolder viewHolder; + + if (convertView == null) { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.contactlist_list_item, parent, false); + viewHolder = new ContactListFragment.ContactItemViewHolder(); + + viewHolder.badge = (QuickContactBadge) convertView.findViewById(R.id.contactlist_item_icon); + viewHolder.name = (TextView) convertView.findViewById(R.id.contactlist_item_name); + + convertView.setTag(viewHolder); + } else { + viewHolder = (ContactListFragment.ContactItemViewHolder) convertView.getTag(); + } + + VCard vcard = vCards.get(position); + + if (vcard != null) { + // photo + if (vcard.getPhotos().size() > 0) { + byte[] data = vcard.getPhotos().get(0).getData(); + + Drawable drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)); + + viewHolder.badge.setImageDrawable(drawable); + } + + // name + StructuredName name = vcard.getStructuredName(); + String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; + String last = (name.getFamily() == null) ? "" : name.getFamily(); + viewHolder.name.setText(first + last); + } + + return convertView; + } +} diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java new file mode 100644 index 0000000000..52f051f4c7 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -0,0 +1,350 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + * <p> + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * <p> + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * <p> + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.activity; + +import android.Manifest; +import android.accounts.Account; +import android.app.DatePickerDialog; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.SwitchCompat; +import android.view.MenuItem; +import android.view.View; +import android.widget.CompoundButton; +import android.widget.DatePicker; +import android.widget.TextView; +import android.widget.Toast; + +import com.evernote.android.job.JobManager; +import com.evernote.android.job.JobRequest; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.services.ContactsBackupJob; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.PermissionUtil; + +import java.util.Calendar; +import java.util.Comparator; +import java.util.Set; +import java.util.Vector; + +/** + * This activity shows all settings for contact backup/restore + */ + +public class ContactsPreferenceActivity extends FileActivity implements FileFragment.ContainerActivity { + public static final String TAG = ContactsPreferenceActivity.class.getSimpleName(); + + public static final String PREFERENCE_CONTACTS_AUTOMATIC_BACKUP = "PREFERENCE_CONTACTS_AUTOMATIC_BACKUP"; + public static final String PREFERENCE_CONTACTS_LAST_BACKUP = "PREFERENCE_CONTACTS_LAST_BACKUP"; + + private SwitchCompat backupSwitch; + private SharedPreferences sharedPreferences; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.contacts_preference); + + // setup toolbar + setupToolbar(); + + // setup drawer + setupDrawer(R.id.nav_contacts); + + getSupportActionBar().setTitle(R.string.actionbar_contacts); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + + backupSwitch = (SwitchCompat) findViewById(R.id.contacts_automatic_backup); + backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); + + backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked && checkAndAskForContactsReadPermission()) { + // store value + setAutomaticBackup(backupSwitch, true); + + // enable daily job + startContactBackupJob(getAccount()); + } else { + setAutomaticBackup(backupSwitch, false); + + // cancel pending jobs + cancelContactBackupJob(getBaseContext()); + } + } + }); + + // display last backup + TextView lastBackup = (TextView) findViewById(R.id.contacts_last_backup_timestamp); + Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); + + if (lastBackupTimestamp == -1) { + lastBackup.setText(R.string.contacts_preference_backup_never); + } else { + lastBackup.setText(DisplayUtils.getRelativeTimestamp(getBaseContext(), lastBackupTimestamp)); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + setAutomaticBackup(backupSwitch, true); + } else { + setAutomaticBackup(backupSwitch, false); + } + + break; + } + } + } + } + + public void backupContacts(View v) { + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsBackupJob.ACCOUNT, getAccount().name); + bundle.putBoolean(ContactsBackupJob.FORCE, true); + + new JobRequest.Builder(ContactsBackupJob.TAG) + .setExtras(bundle) + .setExecutionWindow(3_000L, 10_000L) + .setRequiresCharging(false) + .setPersisted(false) + .setUpdateCurrent(false) + .build() + .schedule(); + + Snackbar.make(findViewById(R.id.contacts_linear_layout), R.string.contacts_preferences_backup_scheduled, + Snackbar.LENGTH_LONG).show(); + } + + private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { + backupSwitch.setChecked(bool); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); + editor.apply(); + } + + private boolean checkAndAskForContactsReadPermission() { + // check permissions + if ((PermissionUtil.checkSelfPermission(this, Manifest.permission.READ_CONTACTS))) { + return true; + } else { + // Check if we should show an explanation + if (PermissionUtil.shouldShowRequestPermissionRationale(ContactsPreferenceActivity.this, + android.Manifest.permission.READ_CONTACTS)) { + // Show explanation to the user and then request permission + Snackbar snackbar = Snackbar.make(findViewById(R.id.contacts_linear_layout), R.string.contacts_read_permission, + Snackbar.LENGTH_INDEFINITE) + .setAction(R.string.common_ok, new View.OnClickListener() { + @Override + public void onClick(View v) { + PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this); + } + }); + + DisplayUtils.colorSnackbar(this, snackbar); + + snackbar.show(); + + return false; + } else { + // No explanation needed, request the permission. + PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this); + + return false; + } + } + } + + public void openDate(View v) { + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); + + Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); + + backupFiles.sort(new Comparator<OCFile>() { + @Override + public int compare(OCFile o1, OCFile o2) { + if (o1.getModificationTimestamp() == o2.getModificationTimestamp()) { + return 0; + } + + if (o1.getModificationTimestamp() > o2.getModificationTimestamp()) { + return 1; + } else { + return -1; + } + } + }); + + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH) + 1; + int day = cal.get(Calendar.DAY_OF_MONTH); + DatePickerDialog datePickerDialog = new DatePickerDialog(this, dateSetListener, year, month, day); + datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); + datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); + + datePickerDialog.show(); + } + + DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); + Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); + + // find file with modification with date and time between 00:00 and 23:59 + // if more than one file exists, take oldest + Calendar date = Calendar.getInstance(); + date.set(year, month, dayOfMonth); + + // start + date.set(Calendar.HOUR, 0); + date.set(Calendar.MINUTE, 0); + date.set(Calendar.SECOND, 1); + date.set(Calendar.MILLISECOND, 0); + date.set(Calendar.AM_PM, Calendar.AM); + Long start = date.getTimeInMillis(); + + // end + date.set(Calendar.HOUR, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + Long end = date.getTimeInMillis(); + + OCFile backupToRestore = null; + + for (OCFile file : backupFiles) { + if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { + if (backupToRestore == null) { + backupToRestore = file; + } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { + backupToRestore = file; + } + } + } + + if (backupToRestore != null) { + Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, getAccount()); + + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.contacts_linear_layout, contactListFragment); + transaction.commit(); + } else { + Toast.makeText(ContactsPreferenceActivity.this, R.string.contacts_preferences_no_file_found, + Toast.LENGTH_SHORT).show(); + } + } + }; + + public static void startContactBackupJob(Account account) { + Log_OC.d(TAG, "start daily contacts backup job"); + + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsBackupJob.ACCOUNT, account.name); + + new JobRequest.Builder(ContactsBackupJob.TAG) + .setExtras(bundle) + .setRequiresCharging(false) + .setPersisted(true) + .setUpdateCurrent(true) + .setPeriodic(24 * 60 * 60 * 1000) + .build() + .schedule(); + } + + public static void cancelContactBackupJob(Context context) { + Log_OC.d(TAG, "disabling contacts backup job"); + + JobManager jobManager = JobManager.create(context); + Set<JobRequest> jobs = jobManager.getAllJobRequestsForTag(ContactsBackupJob.TAG); + + for (JobRequest jobRequest : jobs) { + jobManager.cancel(jobRequest.getJobId()); + } + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval; + switch (item.getItemId()) { + case android.R.id.home: + if (isDrawerOpen()) { + closeDrawer(); + } else { + openDrawer(); + } + retval = true; + break; + + default: + retval = super.onOptionsItemSelected(item); + } + return retval; + } + + @Override + public void showFiles(boolean onDeviceOnly) { + super.showFiles(onDeviceOnly); + Intent fileDisplayActivity = new Intent(getApplicationContext(), FileDisplayActivity.class); + fileDisplayActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(fileDisplayActivity); + } + + @Override + public void showDetails(OCFile file) { + + } + + @Override + public void onBrowsedDownTo(OCFile folder) { + + } + + @Override + public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { + + } +} \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index b698306179..74a2f6d919 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -328,6 +328,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU navigationView.getMenu().removeItem(R.id.nav_shared); } + if (!getResources().getBoolean(R.bool.contacts_backup)) { + navigationView.getMenu().removeItem(R.id.nav_contacts); + } + if (AccountUtils.hasSearchSupport(account)) { if (!getResources().getBoolean(R.bool.recently_added_enabled)) { navigationView.getMenu().removeItem(R.id.nav_recently_added); @@ -409,6 +413,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU Intent folderSyncIntent = new Intent(getApplicationContext(), FolderSyncActivity.class); startActivity(folderSyncIntent); break; + case R.id.nav_contacts: + Intent contactsIntent = new Intent(getApplicationContext(), ContactsPreferenceActivity.class); + startActivity(contactsIntent); + break; case R.id.nav_settings: Intent settingsIntent = new Intent(getApplicationContext(), Preferences.class); startActivity(settingsIntent); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index a6b61ae320..0cf3dd4d6a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -28,6 +28,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -41,7 +42,7 @@ import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.ui.helpers.FileOperationsHelper; +import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader; @@ -68,6 +69,7 @@ import com.owncloud.android.services.OperationsService.OperationsServiceBinder; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.LoadingDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; +import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.utils.ErrorMessageAdapter; @@ -159,6 +161,8 @@ public abstract class FileActivity extends DrawerActivity setAccount(account, savedInstanceState != null); + checkContactsBackupJob(); + mOperationsServiceConnection = new OperationsServiceConnection(); bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection, Context.BIND_AUTO_CREATE); @@ -234,6 +238,16 @@ public abstract class FileActivity extends DrawerActivity } } + private void checkContactsBackupJob() { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + + if (sharedPreferences.getBoolean(ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)) { + ContactsPreferenceActivity.startContactBackupJob(getAccount()); + } else { + ContactsPreferenceActivity.cancelContactBackupJob(getBaseContext()); + } + } + /** * Getter for the main {@link OCFile} handled by the activity. diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 237baec695..6ab27e3f00 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -96,6 +96,7 @@ import com.owncloud.android.ui.preview.PreviewVideoActivity; import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; +import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.PermissionUtil; import java.io.File; @@ -141,7 +142,7 @@ public class FileDisplayActivity extends HookActivity private static final String TAG = FileDisplayActivity.class.getSimpleName(); private static final String TAG_LIST_OF_FILES = "LIST_OF_FILES"; - private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT"; + public static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT"; private OCFile mWaitingToPreview; @@ -170,10 +171,10 @@ public class FileDisplayActivity extends HookActivity /// Load of saved instance state if (savedInstanceState != null) { - mWaitingToPreview = (OCFile) savedInstanceState.getParcelable( + mWaitingToPreview = savedInstanceState.getParcelable( FileDisplayActivity.KEY_WAITING_TO_PREVIEW); mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); - mWaitingToSend = (OCFile) savedInstanceState.getParcelable( + mWaitingToSend = savedInstanceState.getParcelable( FileDisplayActivity.KEY_WAITING_TO_SEND); searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY); } else { @@ -222,7 +223,7 @@ public class FileDisplayActivity extends HookActivity protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - if (PermissionUtil.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + if (!PermissionUtil.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // Check if we should show an explanation if (PermissionUtil.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { @@ -323,6 +324,8 @@ public class FileDisplayActivity extends HookActivity } return; } + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @@ -406,7 +409,9 @@ public class FileDisplayActivity extends HookActivity updateActionBarTitleAndHomeButton(file); } else { cleanSecondFragment(); - if (file.isDown() && PreviewTextFragment.canBePreviewed(file)) { + if (file.isDown() && MimeTypeUtil.isVCard(file.getMimetype())){ + startContactListFragment(file); + } else if (file.isDown() && PreviewTextFragment.canBePreviewed(file)) { startTextPreview(file); } } @@ -563,6 +568,9 @@ public class FileDisplayActivity extends HookActivity if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) { startMediaPreview(mWaitingToPreview, 0, true); detailsFragmentChanged = true; + } else if (MimeTypeUtil.isVCard(mWaitingToPreview.getMimetype())){ + startContactListFragment(mWaitingToPreview); + detailsFragmentChanged = true; } else if (PreviewTextFragment.canBePreviewed(mWaitingToPreview)) { startTextPreview(mWaitingToPreview); detailsFragmentChanged = true; @@ -1901,6 +1909,15 @@ public class FileDisplayActivity extends HookActivity setFile(file); } + public void startContactListFragment(OCFile file) { + Fragment contactListFragment = ContactListFragment.newInstance(file, getAccount()); + + setSecondFragment(contactListFragment); + updateFragmentsVisibility(true); + updateActionBarTitleAndHomeButton(file); + setFile(file); + } + /** * Requests the download of the received {@link OCFile} , updates the UI * to monitor the download progress and prepares the activity to preview diff --git a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 1cab83fbac..6128d96b3f 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -282,14 +282,24 @@ public class ExtendedListFragment extends Fragment } public boolean onQueryTextChange(final String query) { - performSearch(query, false); - return true; + if (getFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT) + instanceof ExtendedListFragment){ + performSearch(query, false); + return true; + } else { + return false; + } } @Override public boolean onQueryTextSubmit(String query) { - performSearch(query, true); - return true; + if (getFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT) + instanceof ExtendedListFragment){ + performSearch(query, true); + return true; + } else { + return false; + } } private void performSearch(final String query, boolean isSubmit) { diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 00738fbca3..563f4d0b45 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -89,6 +89,7 @@ import com.owncloud.android.ui.preview.PreviewMediaFragment; import com.owncloud.android.ui.preview.PreviewTextFragment; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.FileStorageUtils; +import com.owncloud.android.utils.MimeTypeUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -799,6 +800,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi if (PreviewImageFragment.canBePreviewed(file)) { // preview image - it handles the download, if needed ((FileDisplayActivity) mContainerActivity).startImagePreview(file); + } else if (file.isDown() && MimeTypeUtil.isVCard(file)){ + ((FileDisplayActivity) mContainerActivity).startContactListFragment(file); } else if (PreviewTextFragment.canBePreviewed(file)) { ((FileDisplayActivity) mContainerActivity).startTextPreview(file); } else if (file.isDown()) { diff --git a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java index 8b80c7b5e1..6b11b75f94 100644 --- a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java +++ b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java @@ -149,6 +149,13 @@ public class MimeTypeUtil { return (mimeType != null && mimeType.toLowerCase().startsWith("text/")); } + /** + * @return 'True' if mime type defines vcard + */ + public static boolean isVCard(String mimeType) { + return "text/vcard".equalsIgnoreCase(mimeType); + } + /** * Checks if file passed is a video. * @@ -203,6 +210,15 @@ public class MimeTypeUtil { || MimeTypeUtil.isText(getMimeTypeFromPath(file.getRemotePath()))); } + + /** + * @param file the file to be analyzed + * @return 'True' if the file is a vcard + */ + public static boolean isVCard(OCFile file) { + return isVCard(file.getMimetype()) || isVCard(getMimeTypeFromPath(file.getRemotePath())); + } + /** * Extracts the mime type for the given file. * diff --git a/src/main/java/com/owncloud/android/utils/PermissionUtil.java b/src/main/java/com/owncloud/android/utils/PermissionUtil.java index 84effda723..5e8945422b 100644 --- a/src/main/java/com/owncloud/android/utils/PermissionUtil.java +++ b/src/main/java/com/owncloud/android/utils/PermissionUtil.java @@ -11,6 +11,8 @@ import android.support.v4.content.ContextCompat; */ public class PermissionUtil { public static final int PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1; + public static final int PERMISSIONS_READ_CONTACTS = 2; + public static final int PERMISSIONS_WRITE_CONTACTS = 3; /** * Wrapper method for ContextCompat.checkSelfPermission(). @@ -22,7 +24,7 @@ public class PermissionUtil { */ public static boolean checkSelfPermission(Context context, String permission) { return ContextCompat.checkSelfPermission(context, permission) - != android.content.pm.PackageManager.PERMISSION_GRANTED; + == android.content.pm.PackageManager.PERMISSION_GRANTED; } /** @@ -50,4 +52,36 @@ public class PermissionUtil { new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSIONS_WRITE_EXTERNAL_STORAGE); } + + /** + * request the read permission for contacts + * + * @param activity The target activity. + */ + public static void requestReadContactPermission(Activity activity) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.READ_CONTACTS}, + PERMISSIONS_READ_CONTACTS); + } + + /** + * request the write permission for contacts + * + * @param activity The target activity. + */ + public static void requestWriteContactPermission(Activity activity) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.WRITE_CONTACTS}, + PERMISSIONS_WRITE_CONTACTS); + } + + /** + * request the write permission for contacts + * + * @param fragment The target fragment. + */ + public static void requestWriteContactPermission(android.support.v4.app.Fragment fragment) { + fragment.requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS}, + PERMISSIONS_WRITE_CONTACTS); + } } diff --git a/src/main/java/third_parties/ezvcard_android/AndroidCustomField.java b/src/main/java/third_parties/ezvcard_android/AndroidCustomField.java new file mode 100644 index 0000000000..a207850d7f --- /dev/null +++ b/src/main/java/third_parties/ezvcard_android/AndroidCustomField.java @@ -0,0 +1,114 @@ +package third_parties.ezvcard_android; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import ezvcard.property.VCardProperty; + +/* + Copyright (c) 2014-2015, Michael Angstadt + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of the FreeBSD Project. + */ + +/** + * Represents an "X-ANDROID-CUSTOM" property. + * @author Michael Angstadt + */ +public class AndroidCustomField extends VCardProperty { + private String type; + private boolean dir; + private List<String> values = new ArrayList<String>(); + + /** + * Creates an "item" field. + * @param type the type + * @param value the value + * @return the property + */ + public static AndroidCustomField item(String type, String value) { + AndroidCustomField property = new AndroidCustomField(); + property.dir = false; + property.type = type; + property.values.add(value); + return property; + } + + /** + * Creates a "dir" field. + * @param type the type + * @param values the values + * @return the property + */ + public static AndroidCustomField dir(String type, String... values) { + AndroidCustomField property = new AndroidCustomField(); + property.dir = true; + property.type = type; + Collections.addAll(property.values, values); + return property; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List<String> getValues() { + return values; + } + + public boolean isDir() { + return dir; + } + + public void setDir(boolean dir) { + this.dir = dir; + } + + public boolean isItem() { + return !isDir(); + } + + public void setItem(boolean item) { + setDir(!item); + } + + public boolean isNickname() { + return "nickname".equals(type); + } + + public boolean isContactEvent() { + return "contact_event".equals(type); + } + + public boolean isRelation() { + return "relation".equals(type); + } +} diff --git a/src/main/java/third_parties/ezvcard_android/ContactOperations.java b/src/main/java/third_parties/ezvcard_android/ContactOperations.java new file mode 100644 index 0000000000..46d45370b3 --- /dev/null +++ b/src/main/java/third_parties/ezvcard_android/ContactOperations.java @@ -0,0 +1,567 @@ +package third_parties.ezvcard_android; + +import android.content.ContentProviderOperation; +import android.content.ContentValues; +import android.content.Context; +import android.content.OperationApplicationException; +import android.os.RemoteException; +import android.provider.ContactsContract; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import ezvcard.VCard; +import ezvcard.property.Address; +import ezvcard.property.Birthday; +import ezvcard.property.Email; +import ezvcard.property.FormattedName; +import ezvcard.property.Impp; +import ezvcard.property.Nickname; +import ezvcard.property.Note; +import ezvcard.property.Organization; +import ezvcard.property.Photo; +import ezvcard.property.RawProperty; +import ezvcard.property.StructuredName; +import ezvcard.property.Telephone; +import ezvcard.property.Title; +import ezvcard.property.Url; +import ezvcard.property.VCardProperty; +import ezvcard.util.TelUri; + +import static android.text.TextUtils.isEmpty; + +/* + Copyright (c) 2014-2015, Michael Angstadt + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of the FreeBSD Project. + */ + +/** + * Inserts a {@link VCard} into an Android database. + * + * @author Pratyush + * @author Michael Angstadt + */ +public class ContactOperations { + private static final int rawContactID = 0; + + private final Context context; + private final NonEmptyContentValues account; + + public ContactOperations(Context context) { + this(context, null, null); + } + + public ContactOperations(Context context, String accountName, String accountType) { + this.context = context; + + account = new NonEmptyContentValues(); + account.put(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType); + account.put(ContactsContract.RawContacts.ACCOUNT_NAME, accountName); + } + + public void insertContact(VCard vcard) throws RemoteException, OperationApplicationException { + // TODO handle Raw properties - Raw properties include various extension which start with "X-" like X-ASSISTANT, X-AIM, X-SPOUSE + + List<NonEmptyContentValues> contentValues = new ArrayList<NonEmptyContentValues>(); + convertName(contentValues, vcard); + convertNickname(contentValues, vcard); + convertPhones(contentValues, vcard); + convertEmails(contentValues, vcard); + convertAddresses(contentValues, vcard); + convertIms(contentValues, vcard); + + // handle Android Custom fields..This is only valid for Android generated Vcards. As the Android would + // generate NickName, ContactEvents other than Birthday and RelationShip with this "X-ANDROID-CUSTOM" name + convertCustomFields(contentValues, vcard); + + // handle Iphone kinda of group properties. which are grouped together. + convertGroupedProperties(contentValues, vcard); + + convertBirthdays(contentValues, vcard); + + convertWebsites(contentValues, vcard); + convertNotes(contentValues, vcard); + convertPhotos(contentValues, vcard); + convertOrganization(contentValues, vcard); + + ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(contentValues.size()); + ContentValues cv = account.getContentValues(); + //ContactsContract.RawContact.CONTENT_URI needed to add account, backReference is also not needed + ContentProviderOperation operation = + ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValues(cv) + .build(); + operations.add(operation); + for (NonEmptyContentValues values : contentValues) { + cv = values.getContentValues(); + if (cv.size() == 0) { + continue; + } + + //@formatter:off + operation = + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID) + .withValues(cv) + .build(); + //@formatter:on + operations.add(operation); + } + + // Executing all the insert operations as a single database transaction + context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations); + } + + private void convertName(List<NonEmptyContentValues> contentValues, VCard vcard) { + NonEmptyContentValues values = new NonEmptyContentValues(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + + String firstName = null, lastName = null, namePrefix = null, nameSuffix = null; + StructuredName n = vcard.getStructuredName(); + if (n != null) { + firstName = n.getGiven(); + values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstName); + + lastName = n.getFamily(); + values.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastName); + + List<String> prefixes = n.getPrefixes(); + if (!prefixes.isEmpty()) { + namePrefix = prefixes.get(0); + values.put(ContactsContract.CommonDataKinds.StructuredName.PREFIX, namePrefix); + } + + List<String> suffixes = n.getSuffixes(); + if (!suffixes.isEmpty()) { + nameSuffix = suffixes.get(0); + values.put(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, nameSuffix); + } + } + + FormattedName fn = vcard.getFormattedName(); + String formattedName = (fn == null) ? null : fn.getValue(); + + String displayName; + if (isEmpty(formattedName)) { + StringBuilder sb = new StringBuilder(); + if (!isEmpty(namePrefix)){ + sb.append(namePrefix).append(' '); + } + if (!isEmpty(firstName)){ + sb.append(firstName).append(' '); + } + if (!isEmpty(lastName)){ + sb.append(lastName).append(' '); + } + if (!isEmpty(nameSuffix)){ + if (sb.length() > 0){ + sb.deleteCharAt(sb.length()-1); //delete space character + sb.append(", "); + } + sb.append(nameSuffix); + } + + displayName = sb.toString().trim(); + } else { + displayName = formattedName; + } + values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); + + RawProperty xPhoneticFirstName = vcard.getExtendedProperty("X-PHONETIC-FIRST-NAME"); + String firstPhoneticName = (xPhoneticFirstName == null) ? null : xPhoneticFirstName.getValue(); + values.put(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_GIVEN_NAME, firstPhoneticName); + + RawProperty xPhoneticLastName = vcard.getExtendedProperty("X-PHONETIC-LAST-NAME"); + String lastPhoneticName = (xPhoneticLastName == null) ? null : xPhoneticLastName.getValue(); + values.put(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, lastPhoneticName); + + contentValues.add(values); + } + + private void convertNickname(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (Nickname nickname : vcard.getNicknames()) { + List<String> nicknameValues = nickname.getValues(); + if (nicknameValues.isEmpty()) { + continue; + } + + for (String nicknameValue : nicknameValues) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, nicknameValue); + contentValues.add(cv); + } + } + } + + private void convertPhones(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (Telephone telephone : vcard.getTelephoneNumbers()) { + String value = telephone.getText(); + TelUri uri = telephone.getUri(); + if (isEmpty(value)) { + if (uri == null) { + continue; + } + value = uri.toString(); + } + + int phoneKind = DataMappings.getPhoneType(telephone); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Phone.NUMBER, value); + cv.put(ContactsContract.CommonDataKinds.Phone.TYPE, phoneKind); + contentValues.add(cv); + } + } + + private void convertEmails(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (Email email : vcard.getEmails()) { + String value = email.getValue(); + if (isEmpty(value)) { + continue; + } + + int emailKind = DataMappings.getEmailType(email); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Email.ADDRESS, value); + cv.put(ContactsContract.CommonDataKinds.Email.TYPE, emailKind); + contentValues.add(cv); + } + } + + private void convertAddresses(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (Address address : vcard.getAddresses()) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + + String street = address.getStreetAddress(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, street); + + String poBox = address.getPoBox(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.POBOX, poBox); + + String city = address.getLocality(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, city); + + String state = address.getRegion(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, state); + + String zipCode = address.getPostalCode(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, zipCode); + + String country = address.getCountry(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, country); + + String label = address.getLabel(); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.LABEL, label); + + int addressKind = DataMappings.getAddressType(address); + cv.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, addressKind); + + contentValues.add(cv); + } + } + + private void convertIms(List<NonEmptyContentValues> contentValues, VCard vcard) { + //handle extended properties + for (Map.Entry<String, Integer> entry : DataMappings.getImPropertyNameMappings().entrySet()) { + String propertyName = entry.getKey(); + Integer protocolType = entry.getValue(); + List<RawProperty> rawProperties = vcard.getExtendedProperties(propertyName); + for (RawProperty rawProperty : rawProperties) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + + String value = rawProperty.getValue(); + cv.put(ContactsContract.CommonDataKinds.Im.DATA, value); + + cv.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, protocolType); + + contentValues.add(cv); + } + } + + //handle IMPP properties + for (Impp impp : vcard.getImpps()) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + + String immpAddress = impp.getHandle(); + cv.put(ContactsContract.CommonDataKinds.Im.DATA, immpAddress); + + int immpProtocolType = DataMappings.getIMTypeFromProtocol(impp.getProtocol()); + cv.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, immpProtocolType); + + contentValues.add(cv); + } + } + + private void convertCustomFields(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (AndroidCustomField customField : vcard.getProperties(AndroidCustomField.class)) { + List<String> values = customField.getValues(); + if (values.isEmpty()) { + continue; + } + + NonEmptyContentValues cv; + if (customField.isNickname()) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, values.get(0)); + } else if (customField.isContactEvent()) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, values.get(0)); + cv.put(ContactsContract.CommonDataKinds.Event.TYPE, values.get(1)); + } else if (customField.isRelation()) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Relation.NAME, values.get(0)); + cv.put(ContactsContract.CommonDataKinds.Relation.TYPE, values.get(1)); + } else { + continue; + } + + contentValues.add(cv); + } + } + + private void convertGroupedProperties(List<NonEmptyContentValues> contentValues, VCard vcard) { + List<RawProperty> extendedProperties = vcard.getExtendedProperties(); + Map<String, List<RawProperty>> orderedByGroup = orderPropertiesByGroup(extendedProperties); + final int ABDATE = 1, ABRELATEDNAMES = 2; + + for (List<RawProperty> properties : orderedByGroup.values()) { + if (properties.size() == 1) { + continue; + } + + String label = null; + String val = null; + int mime = 0; + for (RawProperty property : properties) { + String name = property.getPropertyName(); + + if (name.equalsIgnoreCase("X-ABDATE")) { + label = property.getValue(); //date + mime = ABDATE; + continue; + } + + if (name.equalsIgnoreCase("X-ABRELATEDNAMES")) { + label = property.getValue(); //name + mime = ABRELATEDNAMES; + continue; + } + + if (name.equalsIgnoreCase("X-ABLABEL")) { + val = property.getValue(); // type of value ..Birthday,anniversary + continue; + } + } + + NonEmptyContentValues cv = null; + switch (mime) { + case ABDATE: + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + + cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, label); + + int type = DataMappings.getDateType(val); + cv.put(ContactsContract.CommonDataKinds.Event.TYPE, type); + + break; + + case ABRELATEDNAMES: + if (val != null) { + cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, label); + + if (!val.equals("Nickname")) { + type = DataMappings.getNameType(val); + cv.put(ContactsContract.CommonDataKinds.Relation.TYPE, type); + } + } + + break; + + default: + continue; + } + + contentValues.add(cv); + } + } + + private void convertBirthdays(List<NonEmptyContentValues> contentValues, VCard vcard) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + for (Birthday birthday : vcard.getBirthdays()) { + Date date = birthday.getDate(); + if (date == null) { + continue; + } + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY); + cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, df.format(date)); + contentValues.add(cv); + } + } + + private void convertWebsites(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (Url url : vcard.getUrls()) { + String urlValue = url.getValue(); + if (isEmpty(urlValue)) { + continue; + } + + int type = DataMappings.getWebSiteType(url.getType()); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Website.URL, urlValue); + cv.put(ContactsContract.CommonDataKinds.Website.TYPE, type); + contentValues.add(cv); + } + } + + private void convertNotes(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (Note note : vcard.getNotes()) { + String noteValue = note.getValue(); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Note.NOTE, noteValue); + contentValues.add(cv); + } + } + + private void convertPhotos(List<NonEmptyContentValues> contentValues, VCard vcard) { + for (Photo photo : vcard.getPhotos()) { + byte[] data = photo.getData(); + + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + cv.put(ContactsContract.CommonDataKinds.Photo.PHOTO, data); + contentValues.add(cv); + } + } + + private void convertOrganization(List<NonEmptyContentValues> contentValues, VCard vcard) { + NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + + Organization organization = vcard.getOrganization(); + if (organization != null) { + List<String> values = organization.getValues(); + String keys[] = { ContactsContract.CommonDataKinds.Organization.COMPANY, ContactsContract.CommonDataKinds.Organization.DEPARTMENT, ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION }; + for (int i = 0; i < values.size(); i++) { + String key = keys[i]; + String value = values.get(i); + cv.put(key, value); + } + } + + List<Title> titleList = vcard.getTitles(); + if (!titleList.isEmpty()) { + cv.put(ContactsContract.CommonDataKinds.Organization.TITLE, titleList.get(0).getValue()); + } + + contentValues.add(cv); + } + + /** + * Groups properties by their group name. + * @param properties the properties to group + * @return a map where the key is the group name (null for no group) and the + * value is the list of properties that belong to that group + */ + private <T extends VCardProperty> Map<String, List<T>> orderPropertiesByGroup(List<T> properties) { + Map<String, List<T>> groupedProperties = new HashMap<String, List<T>>(); + + for (T property : properties) { + String group = property.getGroup(); + if (isEmpty(group)) { + continue; + } + + List<T> groupPropertiesList = groupedProperties.get(group); + if (groupPropertiesList == null) { + groupPropertiesList = new ArrayList<T>(); + groupedProperties.put(group, groupPropertiesList); + } + groupPropertiesList.add(property); + } + + return groupedProperties; + } + + /** + * A wrapper for {@link ContentValues} that only adds values which are + * non-null and non-empty (in the case of Strings). + */ + private static class NonEmptyContentValues { + private final ContentValues contentValues = new ContentValues(); + private final String contentItemType; + + public NonEmptyContentValues() { + this(null); + } + + /** + * @param contentItemType the MIME type (value of + * {@link ContactsContract.Contacts.Data#MIMETYPE}) + */ + public NonEmptyContentValues(String contentItemType) { + this.contentItemType = contentItemType; + } + + public void put(String key, String value) { + if (isEmpty(value)) { + return; + } + contentValues.put(key, value); + } + + public void put(String key, int value) { + contentValues.put(key, value); + } + + public void put(String key, byte[] value) { + if (value == null) { + return; + } + contentValues.put(key, value); + } + + /** + * Gets the wrapped {@link ContentValues} object, adding the MIME type + * entry if the values map is not empty. + * @return the wrapped {@link ContentValues} object + */ + public ContentValues getContentValues() { + if (contentValues.size() > 0 && contentItemType != null) { + put(ContactsContract.Contacts.Data.MIMETYPE, contentItemType); + } + return contentValues; + } + } +} diff --git a/src/main/java/third_parties/ezvcard_android/DataMappings.java b/src/main/java/third_parties/ezvcard_android/DataMappings.java new file mode 100644 index 0000000000..bb0948a548 --- /dev/null +++ b/src/main/java/third_parties/ezvcard_android/DataMappings.java @@ -0,0 +1,292 @@ +package third_parties.ezvcard_android; + +import android.provider.ContactsContract; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import ezvcard.parameter.AddressType; +import ezvcard.parameter.EmailType; +import ezvcard.parameter.TelephoneType; +import ezvcard.property.Address; +import ezvcard.property.Email; +import ezvcard.property.Impp; +import ezvcard.property.Telephone; + +/* + Copyright (c) 2014-2015, Michael Angstadt + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of the FreeBSD Project. + */ + +/** + * Maps between vCard contact data types and Android {@link ContactsContract} + * data types. + * + * @author Pratyush + * @author Julien Garrigou + * @author Michael Angstadt + */ +public class DataMappings { + private static final Map<TelephoneType, Integer> phoneTypeMappings; + static { + Map<TelephoneType, Integer> m = new HashMap<TelephoneType, Integer>(); + m.put(TelephoneType.BBS, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM); + m.put(TelephoneType.CAR, ContactsContract.CommonDataKinds.Phone.TYPE_CAR); + m.put(TelephoneType.CELL, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); + m.put(TelephoneType.FAX, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME); + m.put(TelephoneType.HOME, ContactsContract.CommonDataKinds.Phone.TYPE_HOME); + m.put(TelephoneType.ISDN, ContactsContract.CommonDataKinds.Phone.TYPE_ISDN); + m.put(TelephoneType.MODEM, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + m.put(TelephoneType.PAGER, ContactsContract.CommonDataKinds.Phone.TYPE_PAGER); + m.put(TelephoneType.MSG, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); + m.put(TelephoneType.PCS, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + m.put(TelephoneType.TEXT, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); + m.put(TelephoneType.TEXTPHONE, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); + m.put(TelephoneType.VIDEO, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + m.put(TelephoneType.WORK, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); + m.put(TelephoneType.VOICE, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); + phoneTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> websiteTypeMappings; + static { + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("home", ContactsContract.CommonDataKinds.Website.TYPE_HOME); + m.put("work", ContactsContract.CommonDataKinds.Website.TYPE_WORK); + m.put("homepage", ContactsContract.CommonDataKinds.Website.TYPE_HOMEPAGE); + m.put("profile", ContactsContract.CommonDataKinds.Website.TYPE_PROFILE); + websiteTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<EmailType, Integer> emailTypeMappings; + static { + Map<EmailType, Integer> m = new HashMap<EmailType, Integer>(); + m.put(EmailType.HOME, ContactsContract.CommonDataKinds.Email.TYPE_HOME); + m.put(EmailType.WORK, ContactsContract.CommonDataKinds.Email.TYPE_WORK); + emailTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<AddressType, Integer> addressTypeMappings; + static { + Map<AddressType, Integer> m = new HashMap<AddressType, Integer>(); + m.put(AddressType.HOME, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME); + m.put(AddressType.get("business"), ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK); + m.put(AddressType.WORK, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK); + m.put(AddressType.get("other"), ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER); + addressTypeMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> abRelatedNamesMappings; + static { + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("father", ContactsContract.CommonDataKinds.Relation.TYPE_FATHER); + m.put("spouse", ContactsContract.CommonDataKinds.Relation.TYPE_SPOUSE); + m.put("mother", ContactsContract.CommonDataKinds.Relation.TYPE_MOTHER); + m.put("brother", ContactsContract.CommonDataKinds.Relation.TYPE_BROTHER); + m.put("parent", ContactsContract.CommonDataKinds.Relation.TYPE_PARENT); + m.put("sister", ContactsContract.CommonDataKinds.Relation.TYPE_SISTER); + m.put("child", ContactsContract.CommonDataKinds.Relation.TYPE_CHILD); + m.put("assistant", ContactsContract.CommonDataKinds.Relation.TYPE_ASSISTANT); + m.put("partner", ContactsContract.CommonDataKinds.Relation.TYPE_PARTNER); + m.put("manager", ContactsContract.CommonDataKinds.Relation.TYPE_MANAGER); + abRelatedNamesMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> abDateMappings; + static { + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("anniversary", ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY); + m.put("other", ContactsContract.CommonDataKinds.Event.TYPE_OTHER); + abDateMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> imPropertyNameMappings; + static{ + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("X-AIM", ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM); + m.put("X-ICQ", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); + m.put("X-QQ", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); + m.put("X-GOOGLE-TALK", ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM); + m.put("X-JABBER", ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER); + m.put("X-MSN", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); + m.put("X-MS-IMADDRESS", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); + m.put("X-YAHOO", ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO); + m.put("X-SKYPE", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); + m.put("X-SKYPE-USERNAME", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); + m.put("X-TWITTER", ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM); + imPropertyNameMappings = Collections.unmodifiableMap(m); + } + + private static final Map<String, Integer> imProtocolMappings; + static{ + Map<String, Integer> m = new HashMap<String, Integer>(); + m.put("aim", ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM); + m.put("icq", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); + m.put("msn", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); + m.put("ymsgr", ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO); + m.put("skype", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); + imProtocolMappings = Collections.unmodifiableMap(m); + } + + /** + * Maps the value of a URL property's TYPE parameter to the appropriate + * Android {@link ContactsContract.CommonDataKinds.Website} value. + * @param type the TYPE parameter value (can be null) + * @return the Android type + */ + public static int getWebSiteType(String type) { + if (type == null){ + return ContactsContract.CommonDataKinds.Website.TYPE_CUSTOM; + } + + type = type.toLowerCase(); + Integer value = websiteTypeMappings.get(type); + return (value == null) ? ContactsContract.CommonDataKinds.Website.TYPE_CUSTOM : value; + } + + /** + * Maps the value of a X-ABLABEL property to the appropriate + * Android {@link ContactsContract.CommonDataKinds.Event} value. + * @param type the property value + * @return the Android type + */ + public static int getDateType(String type) { + if (type == null) { + return ContactsContract.CommonDataKinds.Event.TYPE_OTHER; + } + + type = type.toLowerCase(); + for (Map.Entry<String, Integer> entry : abDateMappings.entrySet()){ + if (type.contains(entry.getKey())){ + return entry.getValue(); + } + } + return ContactsContract.CommonDataKinds.Event.TYPE_OTHER; + } + + /** + * Maps the value of a X-ABLABEL property to the appropriate + * Android {@link ContactsContract.CommonDataKinds.Relation} value. + * @param type the property value + * @return the Android type + */ + public static int getNameType(String type) { + if (type == null) { + return ContactsContract.CommonDataKinds.Relation.TYPE_CUSTOM; + } + + type = type.toLowerCase(); + for (Map.Entry<String, Integer> entry : abRelatedNamesMappings.entrySet()){ + if (type.contains(entry.getKey())){ + return entry.getValue(); + } + } + return ContactsContract.CommonDataKinds.Relation.TYPE_CUSTOM; + } + + /** + * Gets the mappings that associate an extended property name (e.g. "X-AIM") + * with its appropriate Android {@link ContactsContract.CommonDataKinds.Im} + * value. + * @return the mappings (the key is the property name, the value is the Android value) + */ + public static Map<String, Integer> getImPropertyNameMappings(){ + return imPropertyNameMappings; + } + + /** + * Converts an IM protocol from a {@link Impp} property (e.g. "aim") to the + * appropriate Android {@link ContactsContract.CommonDataKinds.Im} value. + * @param protocol the IM protocol (e.g. "aim", can be null) + * @return the Android value + */ + public static int getIMTypeFromProtocol(String protocol) { + if (protocol == null){ + return ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM; + } + + protocol = protocol.toLowerCase(); + Integer value = imProtocolMappings.get(protocol); + return (value == null) ? ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM : value; + } + + /** + * Determines the appropriate Android + * {@link ContactsContract.CommonDataKinds.Phone} value for a + * {@link Telephone} property. + * @param property the property + * @return the Android type value + */ + public static int getPhoneType(Telephone property) { + for (TelephoneType type : property.getTypes()){ + Integer androidType = phoneTypeMappings.get(type); + if (androidType != null){ + return androidType; + } + } + return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; + } + + /** + * Determines the appropriate Android + * {@link ContactsContract.CommonDataKinds.Email} value for an {@link Email} + * property. + * @param property the property + * @return the Android type value + */ + public static int getEmailType(Email property) { + for (EmailType type : property.getTypes()){ + Integer androidType = emailTypeMappings.get(type); + if (androidType != null){ + return androidType; + } + } + return ContactsContract.CommonDataKinds.Email.TYPE_OTHER; + } + + /** + * Determines the appropriate Android + * {@link ContactsContract.CommonDataKinds.StructuredPostal} value for an + * {@link Address} property. + * @param property the property + * @return the Android type value + */ + public static int getAddressType(Address property) { + for (AddressType type : property.getTypes()){ + Integer androidType = addressTypeMappings.get(type); + if (androidType != null){ + return androidType; + } + } + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_CUSTOM; + } + + private DataMappings(){ + //hide constructor + } +} diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml new file mode 100644 index 0000000000..61b0d42b6f --- /dev/null +++ b/src/main/res/layout/contactlist_fragment.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <ListView + android:id="@+id/contactlist_listview" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_margin="10dp" + android:choiceMode="multipleChoice" + android:layout_weight="1" /> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contactlist_restore_selected" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:enabled="false" + android:text="@string/contaclist_restore_selected" + android:background="@color/standard_grey" + android:theme="@style/Button.Primary"/> + +</LinearLayout> \ No newline at end of file diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml new file mode 100644 index 0000000000..5a90135ae0 --- /dev/null +++ b/src/main/res/layout/contactlist_list_item.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <QuickContactBadge + android:id="@+id/contactlist_item_icon" + android:layout_width="?android:attr/listPreferredItemHeight" + android:layout_height="?android:attr/listPreferredItemHeight" + android:layout_margin="5dp" + android:scaleType="centerCrop" + android:src="@drawable/ic_user"/> + + <CheckedTextView + android:id="@+id/contactlist_item_name" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:checkMark="?android:attr/listChoiceIndicatorMultiple" + android:ellipsize="marquee" + android:gravity="center_vertical" + android:maxLines="1" + android:textAppearance="?android:attr/textAppearanceLarge"/> + + <!--<CheckBox--> + <!--android:id="@+id/checkBox"--> + <!--android:layout_width="wrap_content"--> + <!--android:layout_height="match_parent"--> + <!--android:padding="10dp"--> + <!--/>--> + +</LinearLayout> \ No newline at end of file diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml new file mode 100644 index 0000000000..d223b425b2 --- /dev/null +++ b/src/main/res/layout/contacts_preference.xml @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/drawer_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clickable="true" + android:fitsSystemWindows="true"> + + <!-- The main content view --> + <LinearLayout + android:id="@+id/contacts_linear_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <include + layout="@layout/toolbar_standard"/> + + <TextView + android:id="@+id/contacts_header_backup" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:text="@string/contacts_header_backup" + android:textColor="@color/primary"/> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/contacts_automatic_backup" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:text="@string/contacts_automatic_backup" + android:textAppearance="?android:attr/textAppearanceMedium"/> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <TextView + android:id="@+id/contacts_last_backup" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:layout_weight="1" + android:text="@string/contacts_last_backup" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="@color/black"/> + + <TextView + android:id="@+id/contacts_last_backup_timestamp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:layout_weight="1" + android:text="2017 / 03 / 10 - 11:33am" + android:textAppearance="?android:attr/textAppearanceMedium"/> + </LinearLayout> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contacts_backup_now" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:onClick="backupContacts" + android:text="@string/contacts_backup_button" + android:theme="@style/Button.Primary"/> + + <TextView + android:id="@+id/contacts_header_restore" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:text="@string/contacts_header_restore" + android:textColor="@color/primary"/> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contacts_datepacker" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:onClick="openDate" + android:text="@string/contacts_preference_choose_date" + android:theme="@style/Button.Primary"/> + + </LinearLayout> + + <include + layout="@layout/drawer" + android:layout_width="@dimen/drawer_width" + android:layout_height="match_parent" + android:layout_gravity="start"/> + +</android.support.v4.widget.DrawerLayout> \ No newline at end of file diff --git a/src/main/res/menu/drawer_menu.xml b/src/main/res/menu/drawer_menu.xml index 20e9df53ee..ccbca84053 100644 --- a/src/main/res/menu/drawer_menu.xml +++ b/src/main/res/menu/drawer_menu.xml @@ -109,6 +109,11 @@ <group android:id="@+id/drawer_menu_bottom" android:checkableBehavior="single"> + <item + android:id="@+id/nav_contacts" + android:icon="@drawable/ic_user" + android:orderInCategory="3" + android:title="@string/actionbar_contacts"/> <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings" diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 8198e0851a..993127d04b 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -37,6 +37,11 @@ <bool name = "share_via_link_feature">true</bool> <bool name = "share_with_users_feature">true</bool> <bool name="show_whats_new">true</bool> + + // Contacts backup + <bool name="contacts_backup">true</bool> + <string name="contacts_backup_folder">/Contacts-Backup</string> + <integer name="contacts_backup_expire">-1</integer> <!-- Colors --> <color name="login_text_color">@color/white</color> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 2c2d649c10..1892f6431b 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -620,5 +620,24 @@ <string name="activities_no_results_headline">No activity yet</string> <string name="activities_no_results_message">This stream will show events like\nadditions, changes & shares</string> + <string name="actionbar_contacts">Contacts backup</string> + <string name="contacts_backup_button">Backup now</string> + <string name="contacts_restore_button">Restore last backup</string> + <string name="contacts_header_restore">Restore</string> + <string name="contacts_header_backup">Backup</string> + <string name="contacts_automatic_backup">Contacts backup</string> + <string name="contacts_last_backup">Last backup</string> + <string name="contacts_read_permission">Read permission of contacts is needed</string> + <string name="contacts_write_permission">Write permission for contacts is needed</string> + <string name="contactlist_title">Restore contacts</string> + <string name="contaclist_restore_selected">Restore selected contacts</string> + <string name="contactlist_account_chooser_title">Choose account for import</string> + <string name="contactlist_no_permission">No permission, nothing imported!</string> + <string name="contacts_preference_choose_date">Choose date</string> + <string name="contacts_preference_backup_never">never</string> + <string name="contacts_preferences_no_file_found">No file found</string> + <string name="contacts_preferences_backup_scheduled">Backup scheduled and will start shortly</string> + <string name="contacts_preferences_import_scheduled">Import scheduled and will start shortly</string> + </resources> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 6860913222..950aeb2de7 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -24,7 +24,7 @@ <bool name="show_welcome_link">false</bool> <string name="welcome_link_url">"https://nextcloud.com/providers"</string> <string name="share_api_link"></string> - + <!-- Flags to setup the authentication methods available in the app --> <string name="auth_method_oauth2">off</string> <string name="auth_method_saml_web_sso">off</string> @@ -34,6 +34,11 @@ <bool name = "share_via_link_feature">true</bool> <bool name = "share_with_users_feature">true</bool> + // Contacts backup + <bool name="contacts_backup">true</bool> + <string name="contacts_backup_folder">/Contacts-Backup</string> + <integer name="contacts_backup_expire">30</integer> + <!-- Colors --> <color name="login_text_color">@color/white</color> <color name="login_text_hint_color">#7fC0E3</color> From bdc549eee737e04aded513ae7300584998ea1a41 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 12 Apr 2017 14:59:20 +0200 Subject: [PATCH 666/881] fix showing wrong badges --- .../com/owncloud/android/ui/activity/ContactListFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index 21eb330598..5290a67e3a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -339,6 +339,8 @@ class ContactListAdapter extends ArrayAdapter<VCard> { Drawable drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)); viewHolder.badge.setImageDrawable(drawable); + } else { + viewHolder.badge.setImageToDefault(); } // name From b23b46dfe80e1fd61843e18585ef62354a88c3aa Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 12 Apr 2017 14:59:54 +0200 Subject: [PATCH 667/881] fix showing wrong jobs, only autoUploadJobs should be shown in UploadActivity --- .../com/owncloud/android/datamodel/UploadsStorageManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java b/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java index cdcc4c339d..86c7680c69 100644 --- a/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -38,6 +38,7 @@ import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.UploadFileOperation; +import com.owncloud.android.services.AutoUploadJob; import java.util.ArrayList; import java.util.Calendar; @@ -396,7 +397,7 @@ public class UploadsStorageManager extends Observable { @RequiresApi(Build.VERSION_CODES.LOLLIPOP) private List<OCUpload> getPendingJobs() { - Set<JobRequest> jobRequests = JobManager.create(mContext).getAllJobRequests(); + Set<JobRequest> jobRequests = JobManager.create(mContext).getAllJobRequestsForTag(AutoUploadJob.TAG); ArrayList<OCUpload> list = new ArrayList<>(); From 72ee7361846b8521426b21531451ecb62585965d Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 12 Apr 2017 15:46:14 +0200 Subject: [PATCH 668/881] expire files on daily backup is now working --- .../android/services/ContactsBackupJob.java | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java index a93a7256db..8f53cf140f 100644 --- a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java +++ b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java @@ -22,11 +22,14 @@ package com.owncloud.android.services; import android.accounts.Account; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.ServiceConnection; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; +import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.provider.ContactsContract; import android.support.annotation.NonNull; @@ -61,6 +64,8 @@ public class ContactsBackupJob extends Job { public static final String TAG = "ContactsBackupJob"; public static final String ACCOUNT = "account"; public static final String FORCE = "force"; + private OperationsServiceConnection operationsServiceConnection; + private OperationsService.OperationsServiceBinder operationsServiceBinder; @NonNull @@ -84,7 +89,12 @@ public class ContactsBackupJob extends Job { backupContact(account, backupFolder); - expireFiles(daysToExpire, backupFolder, account); + // bind to Operations Service + operationsServiceConnection = new OperationsServiceConnection(daysToExpire, backupFolder, account); + + getContext().startService(new Intent(getContext(), OperationsService.class)); + getContext().bindService(new Intent(getContext(), OperationsService.class), operationsServiceConnection, + OperationsService.BIND_AUTO_CREATE); // store execution date sharedPreferences.edit().putLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, @@ -177,10 +187,11 @@ public class ContactsBackupJob extends Job { service.putExtra(OperationsService.EXTRA_ACCOUNT, account); service.putExtra(OperationsService.EXTRA_REMOTE_PATH, backup.getRemotePath()); service.putExtra(OperationsService.EXTRA_REMOVE_ONLY_LOCAL, false); - - getContext().startService(service); + operationsServiceBinder.queueNewOperation(service); } } + + getContext().unbindService(operationsServiceConnection); } } @@ -207,4 +218,39 @@ public class ContactsBackupJob extends Job { } return vCard; } + + /** + * Implements callback methods for service binding. + */ + private class OperationsServiceConnection implements ServiceConnection { + private Integer daysToExpire; + private String backupFolder; + private Account account; + + OperationsServiceConnection(Integer daysToExpire, String backupFolder, Account account) { + this.daysToExpire = daysToExpire; + this.backupFolder = backupFolder; + this.account = account; + } + + @Override + public void onServiceConnected(ComponentName component, IBinder service) { + Log_OC.d(TAG, "service connected"); + + operationsServiceBinder = (OperationsService.OperationsServiceBinder) service; + + if (component.equals(new ComponentName(getContext(), OperationsService.class))) { + expireFiles(daysToExpire, backupFolder, account); + } + } + + @Override + public void onServiceDisconnected(ComponentName component) { + Log_OC.d(TAG, "service disconnected"); + + if (component.equals(new ComponentName(getContext(), OperationsService.class))) { + operationsServiceBinder = null; + } + } + } } From 9aff159c168c605f597acb027b379a699c2abe57 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 10:49:13 +0200 Subject: [PATCH 669/881] make headlines bold set initial state of last backup to "never" --- src/main/res/layout/contacts_preference.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml index d223b425b2..d29de1b32a 100644 --- a/src/main/res/layout/contacts_preference.xml +++ b/src/main/res/layout/contacts_preference.xml @@ -43,7 +43,8 @@ android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="@string/contacts_header_backup" - android:textColor="@color/primary"/> + android:textColor="@color/primary" + android:textStyle="bold"/> <android.support.v7.widget.SwitchCompat android:id="@+id/contacts_automatic_backup" @@ -74,7 +75,7 @@ android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_weight="1" - android:text="2017 / 03 / 10 - 11:33am" + android:text="@string/contacts_preference_backup_never" android:textAppearance="?android:attr/textAppearanceMedium"/> </LinearLayout> @@ -95,7 +96,8 @@ android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="@string/contacts_header_restore" - android:textColor="@color/primary"/> + android:textColor="@color/primary" + android:textStyle="bold"/> <android.support.v7.widget.AppCompatButton android:id="@+id/contacts_datepacker" From d058efc2de4fadb211174e82607cf58adfb8d7b6 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 11:14:36 +0200 Subject: [PATCH 670/881] contact list: text is now in line with header round images --- .../ui/activity/ContactListFragment.java | 17 ++++++++++------- src/main/res/layout/contactlist_fragment.xml | 9 ++++++--- src/main/res/layout/contactlist_list_item.xml | 9 +++++---- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index 5290a67e3a..cf09890612 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -27,14 +27,14 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; +import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.provider.ContactsContract; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v7.app.AlertDialog; import android.util.SparseBooleanArray; import android.view.LayoutInflater; @@ -45,8 +45,8 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; +import android.widget.ImageView; import android.widget.ListView; -import android.widget.QuickContactBadge; import android.widget.TextView; import com.evernote.android.job.JobRequest; @@ -57,6 +57,7 @@ import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsImportJob; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.PermissionUtil; import java.io.File; @@ -164,7 +165,7 @@ public class ContactListFragment extends FileFragment { } static class ContactItemViewHolder { - QuickContactBadge badge; + ImageView badge; TextView name; } @@ -321,7 +322,7 @@ class ContactListAdapter extends ArrayAdapter<VCard> { convertView = LayoutInflater.from(getContext()).inflate(R.layout.contactlist_list_item, parent, false); viewHolder = new ContactListFragment.ContactItemViewHolder(); - viewHolder.badge = (QuickContactBadge) convertView.findViewById(R.id.contactlist_item_icon); + viewHolder.badge = (ImageView) convertView.findViewById(R.id.contactlist_item_icon); viewHolder.name = (TextView) convertView.findViewById(R.id.contactlist_item_name); convertView.setTag(viewHolder); @@ -336,11 +337,13 @@ class ContactListAdapter extends ArrayAdapter<VCard> { if (vcard.getPhotos().size() > 0) { byte[] data = vcard.getPhotos().get(0).getData(); - Drawable drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)); + Bitmap thumbnail = BitmapFactory.decodeByteArray(data, 0, data.length); + RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(getContext().getResources(), + thumbnail); viewHolder.badge.setImageDrawable(drawable); } else { - viewHolder.badge.setImageToDefault(); + viewHolder.badge.setImageResource(R.drawable.ic_user); } // name diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml index 61b0d42b6f..f0441c17e3 100644 --- a/src/main/res/layout/contactlist_fragment.xml +++ b/src/main/res/layout/contactlist_fragment.xml @@ -27,9 +27,12 @@ android:id="@+id/contactlist_listview" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_margin="10dp" - android:choiceMode="multipleChoice" - android:layout_weight="1" /> + android:layout_marginBottom="10dp" + android:layout_marginEnd="10dp" + android:layout_marginRight="10dp" + android:layout_marginTop="10dp" + android:layout_weight="1" + android:choiceMode="multipleChoice"/> <android.support.v7.widget.AppCompatButton android:id="@+id/contactlist_restore_selected" diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml index 5a90135ae0..bdeec1b661 100644 --- a/src/main/res/layout/contactlist_list_item.xml +++ b/src/main/res/layout/contactlist_list_item.xml @@ -23,11 +23,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <QuickContactBadge + <ImageView android:id="@+id/contactlist_item_icon" - android:layout_width="?android:attr/listPreferredItemHeight" - android:layout_height="?android:attr/listPreferredItemHeight" - android:layout_margin="5dp" + android:layout_width="72dp" + android:layout_height="72dp" + android:layout_margin="0dp" + android:padding="7dp" android:scaleType="centerCrop" android:src="@drawable/ic_user"/> From 0ab392a00df998fe135d510e9a74758e8bca50d8 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 12:38:09 +0200 Subject: [PATCH 671/881] use recyclerview --- .../ui/activity/ContactListFragment.java | 157 +++++++++++------- src/main/res/layout/contactlist_fragment.xml | 4 +- src/main/res/layout/contactlist_list_item.xml | 11 +- 3 files changed, 100 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index cf09890612..e37092cd5b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -32,22 +32,18 @@ import android.graphics.BitmapFactory; import android.os.Bundle; import android.provider.ContactsContract; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v7.app.AlertDialog; -import android.util.SparseBooleanArray; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; @@ -63,7 +59,9 @@ import com.owncloud.android.utils.PermissionUtil; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import ezvcard.Ezvcard; import ezvcard.VCard; @@ -79,8 +77,8 @@ public class ContactListFragment extends FileFragment { public static final String FILE_NAME = "FILE_NAME"; public static final String ACCOUNT = "ACCOUNT"; - private ListView listView; - private ArrayList<VCard> vCards; + private RecyclerView recyclerView; + private Set<Integer> checkedVCards; public static ContactListFragment newInstance(OCFile file, Account account) { ContactListFragment frag = new ContactListFragment(); @@ -101,7 +99,8 @@ public class ContactListFragment extends FileFragment { View view = inflater.inflate(R.layout.contactlist_fragment, null); - vCards = new ArrayList<>(); + ArrayList<VCard> vCards = new ArrayList<>(); + checkedVCards = new HashSet<>(); try { OCFile ocFile = getArguments().getParcelable(FILE_NAME); @@ -132,26 +131,12 @@ public class ContactListFragment extends FileFragment { } }); - ContactListAdapter contactListAdapter = new ContactListAdapter(getContext(), vCards); + recyclerView = (RecyclerView) view.findViewById(R.id.contactlist_recyclerview); - listView = (ListView) view.findViewById(R.id.contactlist_listview); - listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); - listView.setAdapter(contactListAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - - CheckedTextView tv = (CheckedTextView) view.findViewById(R.id.contactlist_item_name); - - if (listView.getCheckedItemPositions().get(position)) { - tv.setChecked(true); - } else { - listView.getCheckedItemPositions().delete(position); - tv.setChecked(false); - } - - if (listView.getCheckedItemPositions().size() > 0) { + ContactListAdapter.OnVCardClickListener vCardClickListener = new ContactListAdapter.OnVCardClickListener() { + private void setRestoreButton() { + if (checkedVCards.size() > 0) { restoreContacts.setEnabled(true); restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); } else { @@ -159,24 +144,56 @@ public class ContactListFragment extends FileFragment { restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); } } - }); + + @Override + public void onVCardCheck(int position) { + checkedVCards.add(position); + Log_OC.d(TAG, position + " checked"); + + setRestoreButton(); + } + + @Override + public void onVCardUncheck(int position) { + checkedVCards.remove(position); + Log_OC.d(TAG, position + " unchecked"); + + setRestoreButton(); + } + }; + + ContactListAdapter contactListAdapter = new ContactListAdapter(getContext(), vCards, vCardClickListener); + recyclerView.setAdapter(contactListAdapter); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); return view; } - static class ContactItemViewHolder { + static class ContactItemViewHolder extends RecyclerView.ViewHolder { ImageView badge; - TextView name; + CheckedTextView name; + + ContactItemViewHolder(View itemView) { + super(itemView); + + badge = (ImageView) itemView.findViewById(R.id.contactlist_item_icon); + name = (CheckedTextView) itemView.findViewById(R.id.contactlist_item_name); + + itemView.setTag(this); + } + + void setVCardListener(View.OnClickListener onClickListener) { + itemView.setOnClickListener(onClickListener); + } } private void importContacts(ContactAccount account) { - SparseBooleanArray checkedArray = listView.getCheckedItemPositions(); - int[] intArray = new int[vCards.size()]; + int[] intArray = new int[checkedVCards.size()]; - for (int i = 0; i < vCards.size(); i++) { - if (checkedArray.get(i)) { - intArray[i] = 1; - } + int i = 0; + for (Integer checkedVCard : checkedVCards) { + intArray[i] = checkedVCard; + i++; } PersistableBundleCompat bundle = new PersistableBundleCompat(); @@ -195,7 +212,7 @@ public class ContactListFragment extends FileFragment { .schedule(); - Snackbar.make(listView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); + Snackbar.make(recyclerView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); } private void getAccountForImport() { @@ -304,33 +321,28 @@ public class ContactListFragment extends FileFragment { } } -class ContactListAdapter extends ArrayAdapter<VCard> { +class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.ContactItemViewHolder> { private List<VCard> vCards; + private Context context; + private OnVCardClickListener vCardClickListener; - ContactListAdapter(Context context, List<VCard> vCards) { - super(context, 0, R.id.contactlist_item_name, vCards); - + ContactListAdapter(Context context, List<VCard> vCards, OnVCardClickListener vCardClickListener) { this.vCards = vCards; + this.context = context; + this.vCardClickListener = vCardClickListener; } - @NonNull + @Override - public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { - ContactListFragment.ContactItemViewHolder viewHolder; + public ContactListFragment.ContactItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.contactlist_list_item, parent, false); - if (convertView == null) { - convertView = LayoutInflater.from(getContext()).inflate(R.layout.contactlist_list_item, parent, false); - viewHolder = new ContactListFragment.ContactItemViewHolder(); + return new ContactListFragment.ContactItemViewHolder(view); + } - viewHolder.badge = (ImageView) convertView.findViewById(R.id.contactlist_item_icon); - viewHolder.name = (TextView) convertView.findViewById(R.id.contactlist_item_name); - - convertView.setTag(viewHolder); - } else { - viewHolder = (ContactListFragment.ContactItemViewHolder) convertView.getTag(); - } - - VCard vcard = vCards.get(position); + @Override + public void onBindViewHolder(final ContactListFragment.ContactItemViewHolder holder, final int position) { + final VCard vcard = vCards.get(holder.getAdapterPosition()); if (vcard != null) { // photo @@ -338,21 +350,44 @@ class ContactListAdapter extends ArrayAdapter<VCard> { byte[] data = vcard.getPhotos().get(0).getData(); Bitmap thumbnail = BitmapFactory.decodeByteArray(data, 0, data.length); - RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(getContext().getResources(), + RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(context.getResources(), thumbnail); - viewHolder.badge.setImageDrawable(drawable); + holder.badge.setImageDrawable(drawable); } else { - viewHolder.badge.setImageResource(R.drawable.ic_user); + holder.badge.setImageResource(R.drawable.ic_user); } + // Checkbox + holder.setVCardListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + holder.name.setChecked(!holder.name.isChecked()); + + if (holder.name.isChecked()) { + vCardClickListener.onVCardCheck(holder.getAdapterPosition()); + } else { + vCardClickListener.onVCardUncheck(holder.getAdapterPosition()); + } + } + }); + // name StructuredName name = vcard.getStructuredName(); String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; String last = (name.getFamily() == null) ? "" : name.getFamily(); - viewHolder.name.setText(first + last); + holder.name.setText(first + last); } + } - return convertView; + @Override + public int getItemCount() { + return vCards.size(); + } + + interface OnVCardClickListener { + void onVCardCheck(int position); + + void onVCardUncheck(int position); } } diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml index f0441c17e3..f375b8d836 100644 --- a/src/main/res/layout/contactlist_fragment.xml +++ b/src/main/res/layout/contactlist_fragment.xml @@ -23,8 +23,8 @@ android:layout_height="match_parent" android:orientation="vertical"> - <ListView - android:id="@+id/contactlist_listview" + <android.support.v7.widget.RecyclerView + android:id="@+id/contactlist_recyclerview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginBottom="10dp" diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml index bdeec1b661..7408118d0b 100644 --- a/src/main/res/layout/contactlist_list_item.xml +++ b/src/main/res/layout/contactlist_list_item.xml @@ -21,7 +21,7 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="72dp"> <ImageView android:id="@+id/contactlist_item_icon" @@ -35,7 +35,7 @@ <CheckedTextView android:id="@+id/contactlist_item_name" android:layout_width="0dp" - android:layout_height="match_parent" + android:layout_height="72dp" android:layout_weight="1" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:ellipsize="marquee" @@ -43,11 +43,4 @@ android:maxLines="1" android:textAppearance="?android:attr/textAppearanceLarge"/> - <!--<CheckBox--> - <!--android:id="@+id/checkBox"--> - <!--android:layout_width="wrap_content"--> - <!--android:layout_height="match_parent"--> - <!--android:padding="10dp"--> - <!--/>--> - </LinearLayout> \ No newline at end of file From 84ff5832ba6e36efd761b74a085acde8a21b5406 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 13 Apr 2017 13:41:19 +0200 Subject: [PATCH 672/881] satisfy codacy ;-) --- .../ui/activity/ContactListFragment.java | 42 ++++--- .../activity/ContactsPreferenceActivity.java | 110 +++++++++--------- 2 files changed, 83 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index e37092cd5b..a66db9880c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -90,10 +90,6 @@ public class ContactListFragment extends FileFragment { return frag; } - public ContactListFragment() { - super(); - } - @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -170,8 +166,8 @@ public class ContactListFragment extends FileFragment { } static class ContactItemViewHolder extends RecyclerView.ViewHolder { - ImageView badge; - CheckedTextView name; + private ImageView badge; + private CheckedTextView name; ContactItemViewHolder(View itemView) { super(itemView); @@ -182,9 +178,25 @@ public class ContactListFragment extends FileFragment { itemView.setTag(this); } - void setVCardListener(View.OnClickListener onClickListener) { + public void setVCardListener(View.OnClickListener onClickListener) { itemView.setOnClickListener(onClickListener); } + + public ImageView getBadge() { + return badge; + } + + public void setBadge(ImageView badge) { + this.badge = badge; + } + + public CheckedTextView getName() { + return name; + } + + public void setName(CheckedTextView name) { + this.name = name; + } } private void importContacts(ContactAccount account) { @@ -294,9 +306,9 @@ public class ContactListFragment extends FileFragment { } private class ContactAccount { - String displayName; - String name; - String type; + private String displayName; + private String name; + private String type; ContactAccount(String displayName, String name, String type) { this.displayName = displayName; @@ -353,18 +365,18 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(context.getResources(), thumbnail); - holder.badge.setImageDrawable(drawable); + holder.getBadge().setImageDrawable(drawable); } else { - holder.badge.setImageResource(R.drawable.ic_user); + holder.getBadge().setImageResource(R.drawable.ic_user); } // Checkbox holder.setVCardListener(new View.OnClickListener() { @Override public void onClick(View v) { - holder.name.setChecked(!holder.name.isChecked()); + holder.getName().setChecked(!holder.getName().isChecked()); - if (holder.name.isChecked()) { + if (holder.getName().isChecked()) { vCardClickListener.onVCardCheck(holder.getAdapterPosition()); } else { vCardClickListener.onVCardUncheck(holder.getAdapterPosition()); @@ -376,7 +388,7 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac StructuredName name = vcard.getStructuredName(); String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; String last = (name.getFamily() == null) ? "" : name.getFamily(); - holder.name.setText(first + last); + holder.getName().setText(first + last); } } diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 52f051f4c7..59b1e32a87 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -220,6 +220,58 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); + Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); + + // find file with modification with date and time between 00:00 and 23:59 + // if more than one file exists, take oldest + Calendar date = Calendar.getInstance(); + date.set(year, month, dayOfMonth); + + // start + date.set(Calendar.HOUR, 0); + date.set(Calendar.MINUTE, 0); + date.set(Calendar.SECOND, 1); + date.set(Calendar.MILLISECOND, 0); + date.set(Calendar.AM_PM, Calendar.AM); + Long start = date.getTimeInMillis(); + + // end + date.set(Calendar.HOUR, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + Long end = date.getTimeInMillis(); + + OCFile backupToRestore = null; + + for (OCFile file : backupFiles) { + if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { + if (backupToRestore == null) { + backupToRestore = file; + } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { + backupToRestore = file; + } + } + } + + if (backupToRestore != null) { + Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, getAccount()); + + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.contacts_linear_layout, contactListFragment); + transaction.commit(); + } else { + Toast.makeText(ContactsPreferenceActivity.this, R.string.contacts_preferences_no_file_found, + Toast.LENGTH_SHORT).show(); + } + } + }; + DatePickerDialog datePickerDialog = new DatePickerDialog(this, dateSetListener, year, month, day); datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); @@ -227,57 +279,6 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag datePickerDialog.show(); } - DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); - Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); - - // find file with modification with date and time between 00:00 and 23:59 - // if more than one file exists, take oldest - Calendar date = Calendar.getInstance(); - date.set(year, month, dayOfMonth); - - // start - date.set(Calendar.HOUR, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 1); - date.set(Calendar.MILLISECOND, 0); - date.set(Calendar.AM_PM, Calendar.AM); - Long start = date.getTimeInMillis(); - - // end - date.set(Calendar.HOUR, 23); - date.set(Calendar.MINUTE, 59); - date.set(Calendar.SECOND, 59); - Long end = date.getTimeInMillis(); - - OCFile backupToRestore = null; - - for (OCFile file : backupFiles) { - if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { - if (backupToRestore == null) { - backupToRestore = file; - } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { - backupToRestore = file; - } - } - } - - if (backupToRestore != null) { - Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, getAccount()); - - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.replace(R.id.contacts_linear_layout, contactListFragment); - transaction.commit(); - } else { - Toast.makeText(ContactsPreferenceActivity.this, R.string.contacts_preferences_no_file_found, - Toast.LENGTH_SHORT).show(); - } - } - }; - public static void startContactBackupJob(Account account) { Log_OC.d(TAG, "start daily contacts backup job"); @@ -321,6 +322,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag default: retval = super.onOptionsItemSelected(item); + break; } return retval; } @@ -335,16 +337,16 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag @Override public void showDetails(OCFile file) { - + // not needed } @Override public void onBrowsedDownTo(OCFile folder) { - + // not needed } @Override public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { - + // not needed } } \ No newline at end of file From 3186c2161930d0dba6d5873d415afc6d1e4dbcea Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 18 Apr 2017 08:50:19 +0200 Subject: [PATCH 673/881] do not explicity start the service always unbind --- .../com/owncloud/android/services/ContactsBackupJob.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java index 8f53cf140f..88ab68b312 100644 --- a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java +++ b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java @@ -92,7 +92,6 @@ public class ContactsBackupJob extends Job { // bind to Operations Service operationsServiceConnection = new OperationsServiceConnection(daysToExpire, backupFolder, account); - getContext().startService(new Intent(getContext(), OperationsService.class)); getContext().bindService(new Intent(getContext(), OperationsService.class), operationsServiceConnection, OperationsService.BIND_AUTO_CREATE); @@ -190,9 +189,9 @@ public class ContactsBackupJob extends Job { operationsServiceBinder.queueNewOperation(service); } } - - getContext().unbindService(operationsServiceConnection); } + + getContext().unbindService(operationsServiceConnection); } private String getContactFromCursor(Cursor cursor) { @@ -237,9 +236,9 @@ public class ContactsBackupJob extends Job { public void onServiceConnected(ComponentName component, IBinder service) { Log_OC.d(TAG, "service connected"); - operationsServiceBinder = (OperationsService.OperationsServiceBinder) service; if (component.equals(new ComponentName(getContext(), OperationsService.class))) { + operationsServiceBinder = (OperationsService.OperationsServiceBinder) service; expireFiles(daysToExpire, backupFolder, account); } } From fa414c2a1b388b81dd00d0665527d7d3be62eb77 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 18 Apr 2017 09:01:44 +0200 Subject: [PATCH 674/881] "backup now" asks for permission --- .../activity/ContactsPreferenceActivity.java | 29 +++++++++++++++---- .../android/utils/PermissionUtil.java | 9 +++--- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 59b1e32a87..6db4423286 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -93,7 +93,8 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked && checkAndAskForContactsReadPermission()) { + if (isChecked && + checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { // store value setAutomaticBackup(backupSwitch, true); @@ -123,7 +124,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS) { + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC) { for (int index = 0; index < permissions.length; index++) { if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { if (grantResults[index] >= 0) { @@ -136,9 +137,27 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag } } } + + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + startContactsBackupJob(); + } + + break; + } + } + } } public void backupContacts(View v) { + if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY)) { + startContactsBackupJob(); + } + } + + private void startContactsBackupJob() { PersistableBundleCompat bundle = new PersistableBundleCompat(); bundle.putString(ContactsBackupJob.ACCOUNT, getAccount().name); bundle.putBoolean(ContactsBackupJob.FORCE, true); @@ -163,7 +182,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag editor.apply(); } - private boolean checkAndAskForContactsReadPermission() { + private boolean checkAndAskForContactsReadPermission(final int permission) { // check permissions if ((PermissionUtil.checkSelfPermission(this, Manifest.permission.READ_CONTACTS))) { return true; @@ -177,7 +196,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag .setAction(R.string.common_ok, new View.OnClickListener() { @Override public void onClick(View v) { - PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this); + PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this, permission); } }); @@ -188,7 +207,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag return false; } else { // No explanation needed, request the permission. - PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this); + PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this, permission); return false; } diff --git a/src/main/java/com/owncloud/android/utils/PermissionUtil.java b/src/main/java/com/owncloud/android/utils/PermissionUtil.java index 5e8945422b..c09d27c4d9 100644 --- a/src/main/java/com/owncloud/android/utils/PermissionUtil.java +++ b/src/main/java/com/owncloud/android/utils/PermissionUtil.java @@ -11,8 +11,9 @@ import android.support.v4.content.ContextCompat; */ public class PermissionUtil { public static final int PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1; - public static final int PERMISSIONS_READ_CONTACTS = 2; - public static final int PERMISSIONS_WRITE_CONTACTS = 3; + public static final int PERMISSIONS_READ_CONTACTS_AUTOMATIC = 2; + public static final int PERMISSIONS_READ_CONTACTS_MANUALLY = 3; + public static final int PERMISSIONS_WRITE_CONTACTS = 4; /** * Wrapper method for ContextCompat.checkSelfPermission(). @@ -58,10 +59,10 @@ public class PermissionUtil { * * @param activity The target activity. */ - public static void requestReadContactPermission(Activity activity) { + public static void requestReadContactPermission(Activity activity, int permission) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, - PERMISSIONS_READ_CONTACTS); + permission); } /** From c4e2e6a07fda0e9b652d382df54f794ed574a3fe Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 18 Apr 2017 09:33:24 +0200 Subject: [PATCH 675/881] prevent NPE if name is null --- .../android/ui/activity/ContactListFragment.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index a66db9880c..b38dca5fc5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -386,9 +386,13 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac // name StructuredName name = vcard.getStructuredName(); - String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; - String last = (name.getFamily() == null) ? "" : name.getFamily(); - holder.getName().setText(first + last); + if (name != null) { + String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; + String last = (name.getFamily() == null) ? "" : name.getFamily(); + holder.getName().setText(first + last); + } else { + holder.getName().setText(""); + } } } From 57d210c49fda122b9979cf78ce852b3e25f0404e Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 18 Apr 2017 10:34:08 +0200 Subject: [PATCH 676/881] use collections sort to support older apis --- .../android/ui/activity/ContactsPreferenceActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 6db4423286..f82ba510dd 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -53,6 +53,7 @@ import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.PermissionUtil; import java.util.Calendar; +import java.util.Collections; import java.util.Comparator; import java.util.Set; import java.util.Vector; @@ -220,7 +221,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); - backupFiles.sort(new Comparator<OCFile>() { + Collections.sort(backupFiles, new Comparator<OCFile>() { @Override public int compare(OCFile o1, OCFile o2) { if (o1.getModificationTimestamp() == o2.getModificationTimestamp()) { From 54f8d3091c9a30353c7c7f240f8ed2cb321fb9a0 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 18 Apr 2017 10:41:09 +0200 Subject: [PATCH 677/881] use input stream reader for backward compatibility --- .../android/services/ContactsBackupJob.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java index 88ab68b312..86e4de1377 100644 --- a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java +++ b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java @@ -30,7 +30,6 @@ import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.IBinder; -import android.os.ParcelFileDescriptor; import android.provider.ContactsContract; import android.support.annotation.NonNull; import android.text.format.DateFormat; @@ -49,9 +48,10 @@ import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.ui.activity.ContactsPreferenceActivity; import java.io.File; -import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Calendar; import java.util.Vector; @@ -197,19 +197,30 @@ public class ContactsBackupJob extends Job { private String getContactFromCursor(Cursor cursor) { String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey); - ParcelFileDescriptor fd; String vCard = ""; try { - fd = getContext().getContentResolver().openFileDescriptor(uri, "r"); - FileInputStream fis; - if (fd != null) { - fis = new FileInputStream(fd.getFileDescriptor()); - byte[] buf = new byte[fis.available()]; - fis.read(buf); - vCard = new String(buf); + InputStream inputStream = getContext().getContentResolver().openInputStream(uri); + InputStreamReader inputStreamReader; + char[] buffer = new char[1024]; + StringBuilder stringBuilder = new StringBuilder(); + + if (inputStream != null) { + inputStreamReader = new InputStreamReader(inputStream); + + while (true) { + int byteCount = inputStreamReader.read(buffer, 0, buffer.length); + + if (byteCount > 0) { + stringBuilder.append(buffer, 0, byteCount); + } else { + break; + } + } } + vCard = stringBuilder.toString(); + return vCard; } catch (IOException e) { From 33544f65e7ad41cfa813957076c90eed61b710fc Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 18 Apr 2017 10:55:46 +0200 Subject: [PATCH 678/881] hide search and option menu when showing contact list --- .../android/ui/activity/ContactListFragment.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index b38dca5fc5..2386ddf6f1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -38,6 +38,7 @@ import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; +import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -94,6 +95,7 @@ public class ContactListFragment extends FileFragment { public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.contactlist_fragment, null); + setHasOptionsMenu(true); ArrayList<VCard> vCards = new ArrayList<>(); checkedVCards = new HashSet<>(); @@ -165,6 +167,14 @@ public class ContactListFragment extends FileFragment { return view; } + @Override + public void onPrepareOptionsMenu(Menu menu) { + menu.findItem(R.id.action_search).setVisible(false); + menu.findItem(R.id.action_sync_account).setVisible(false); + menu.findItem(R.id.action_sort).setVisible(false); + menu.findItem(R.id.action_switch_view).setVisible(false); + } + static class ContactItemViewHolder extends RecyclerView.ViewHolder { private ImageView badge; private CheckedTextView name; From 7701b697a17e82814411e21494ca05e54dc420fe Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Tue, 18 Apr 2017 10:13:48 -0500 Subject: [PATCH 679/881] Revert "Bug #810 was Fixed" This reverts commit 845762f8d0a5f40f2ca44d8bb8a4318b0f2101da. --- .../com/owncloud/android/ui/preview/PreviewMediaFragment.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 838d64ef58..23f3fd1e86 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -681,8 +681,6 @@ public class PreviewMediaFragment extends FileFragment implements } private void prepareMediaController() { - mMultiView.setVisibility(View.GONE); - mPreviewContainer.setVisibility(View.VISIBLE); mMediaServiceBinder.registerMediaController(mMediaController); if (mMediaController != null) { mMediaController.setMediaPlayer(mMediaServiceBinder); From 6ac91242ef928abc58562819f0fd47c92199806d Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 18 Apr 2017 23:10:29 +0200 Subject: [PATCH 680/881] Fix initial subscription --- .../java/com/owncloud/android/utils/PushUtils.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index 43d363e58d..3f9cb76581 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -26,7 +26,6 @@ import android.accounts.OperationCanceledException; import android.content.Context; import android.text.TextUtils; import android.util.Base64; -import android.util.Log; import com.owncloud.android.MainApp; import com.owncloud.android.R; @@ -131,11 +130,14 @@ public class PushUtils { if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && !TextUtils.isEmpty(token)) { PushUtils.generateRsa2048KeyPair(); - String pushTokenHash = PushUtils.generateSHA512Hash(token).toUpperCase(); + String pushTokenHash = PushUtils.generateSHA512Hash(token).toLowerCase(); PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); if (devicePublicKey != null) { - byte[] publicKeyBytes = Base64.encode(devicePublicKey.getEncoded(), 0); + byte[] publicKeyBytes = Base64.encode(devicePublicKey.getEncoded(), Base64.NO_WRAP); String publicKey = new String(publicKeyBytes); + publicKey = publicKey.replaceAll("(.{64})", "$1\n"); + + publicKey = "-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-----END PUBLIC KEY-----\n"; Context context = MainApp.getAppContext(); for (Account account : AccountUtils.getAccounts(context)) { @@ -146,7 +148,8 @@ public class PushUtils { RemoteOperation registerAccountDeviceForNotificationsOperation = new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, - publicKey, context.getResources().getString(R.string.push_server_url)); + publicKey, + context.getResources().getString(R.string.push_server_url)); RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. execute(mClient); @@ -161,7 +164,6 @@ public class PushUtils { pushResponse.getPublicKey()); remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); - Log.d("THIS IS MARIO", "MARIO"); PreferenceManager.setPushTokenLastSentTime(MainApp.getAppContext(), System.currentTimeMillis()); From 9da87449d7063b5ee95c9cd2da6107eb306c6c90 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Wed, 19 Apr 2017 00:21:05 +0000 Subject: [PATCH 681/881] [tx-robot] updated from transifex --- src/main/res/values-es-rMX/strings.xml | 6 ++--- src/main/res/values-ru/strings.xml | 32 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 64c7a7537c..6542dbd3dc 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -60,7 +60,7 @@ <string name="prefs_help">Ayuda</string> <string name="prefs_recommend">Recomendar a un amigo</string> <string name="prefs_feedback">Retroalimentación</string> - <string name="prefs_imprint">Imprint</string> + <string name="prefs_imprint">Exención de responsabilidad </string> <string name="prefs_remember_last_share_location">Recordar la ubicación del elemento compartido</string> <string name="prefs_remember_last_upload_location_summary">Recordar la última ubicación del elemento compartido cargado.</string> @@ -232,7 +232,7 @@ en los últimos 7 días!</string> <string name="media_err_malformed">El archivo no ha sido codificado correctamente</string> <string name="media_err_timeout">Tiempo de espera expirado al intentar reproducir</string> <string name="media_err_invalid_progressive_playback">Archivo de medio no puede ser transmitido como flujo</string> - <string name="media_err_unknown">El archivo de medios no se puede reproducir con el reproductor de medios por defecto </string> + <string name="media_err_unknown">El archivo de medios no se puede reproducir con el reproductor predeterminado</string> <string name="media_err_security_ex">Se presentó un error de seguridad al intentar reproducir %1$s</string> <string name="media_err_io_ex">Se presentó un error en la entrada de datos al intentar reproducir %1$s</string> <string name="media_err_unexpected">Se presentó un error inesperado al intentar reproducir %1$s</string> @@ -521,7 +521,7 @@ en los últimos 7 días!</string> <string name="action_retry_uploads">Falla en el reintento</string> <string name="action_clear_failed_uploads">Borrar fallidos</string> <string name="action_clear_successful_uploads">Borrar exitosos</string> - <string name="action_clear_finished_uploads">Borrar todos los completados</string> + <string name="action_clear_finished_uploads">Borrar todos</string> <string name="action_switch_grid_view">Vista de cuadrícula</string> <string name="action_switch_list_view">Vista de lista</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index d52336ea8e..6461c95a7b 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -43,10 +43,10 @@ <string name="prefs_manage_accounts">Управление аккаунтами</string> <string name="prefs_passcode">Блокировка кодом</string> <string name="prefs_show_hidden_files">Показать скрытые файлы</string> - <string name="prefs_instant_upload">Автозагрузка изображений</string> - <string name="prefs_instant_upload_summary">Автоматически загружать изображения, сделанные камерой</string> - <string name="prefs_instant_video_upload">Автозагрузка видео</string> - <string name="prefs_instant_video_upload_summary">Автоматически загружать видео, сделанные камерой</string> + <string name="prefs_instant_upload">Моментальная загрузка изображений</string> + <string name="prefs_instant_upload_summary">Немедленно загружать изображения, сделанные камерой</string> + <string name="prefs_instant_video_upload">Моментальная загрузка видео</string> + <string name="prefs_instant_video_upload_summary">Немедленно загружать видео, сделанные камерой</string> <string name="prefs_log_title">Включить журналирование</string> <string name="prefs_log_summary">Используется для регистрации ошибок</string> <string name="prefs_log_title_history">История журналирования</string> @@ -72,8 +72,8 @@ <string name="auth_host_url">Адрес сервера https://...</string> <string name="auth_username">Имя пользователя</string> <string name="auth_password">Пароль</string> - <string name="auth_register">Ещё нет сервера? -Щёлкните здесь чтобы получить от провайдера</string> + <string name="auth_register">Нет сервера? +Нажмите здесь чтобы получить от провайдера</string> <string name="sync_string_files">Файлы</string> <string name="setup_btn_connect">Подключиться</string> <string name="uploader_btn_upload_text">Загрузить</string> @@ -90,9 +90,9 @@ <string name="uploader_error_message_source_file_not_found">Файл для загрузки не был найден в положенном месте. Пожалуйста проверьте, существует ли файл.</string> <string name="uploader_error_message_source_file_not_copied">Произошла ошибка во время копирования этого файла во временный каталог. Пожалуйста попробуйте отправить его заново.</string> <string name="uploader_upload_files_behaviour">Настройка загрузки:</string> - <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Переместить файл в папку Nextcloud</string> - <string name="uploader_upload_files_behaviour_only_upload">Хранить файл в исходном каталоге</string> - <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Удалить файл из исходного каталога</string> + <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Перемещать файл в папку Nextcloud</string> + <string name="uploader_upload_files_behaviour_only_upload">Сохранять файл в исходном каталоге</string> + <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Удалять файл из исходного каталога</string> <string name="file_list_seconds_ago">несколько секунд назад</string> <string name="file_list_empty_headline">Здесь нет файлов</string> <string name="file_list_empty">Загрузите что-нибудь или синхронизируйте со своими устройствами!</string> @@ -105,7 +105,7 @@ <string name="file_list_empty_headline_search">В этой папке результатов не найдено</string> <string name="file_list_empty_headline_server_search">Результаты отсутствуют</string> <string name="file_list_empty_favorite_headline">Избранное отсутствует</string> - <string name="file_list_empty_shared_headline">Вы еще ничем не поделились</string> + <string name="file_list_empty_shared_headline">Вы ещё ничем не поделились</string> <string name="file_list_empty_shared">Здесь появятся файлы и каталоги, которыми вы поделитесь</string> <string name="file_list_empty_headline_server_search_videos">Видео отсуствуют</string> <string name="file_list_empty_headline_server_search_photos">Фотографии отсутствуют</string> @@ -120,7 +120,7 @@ <string name="file_list_empty_text_videos">Загрузите видео или включите автоматическую загрузку!</string> <string name="file_list_empty_text_videos_filter">По запросу видео–файлов не найдено!</string> <string name="upload_list_empty_headline">Нет доступных загрузок</string> - <string name="upload_list_empty_text">Загрузите что-нибудь или включите автоматическую загрузку!</string> + <string name="upload_list_empty_text">Загрузите что-нибудь или включите моментальную загрузку!</string> <string name="upload_list_empty_text_auto_upload">Загрузите что-нибудь или включите автоматическую загрузку!</string> <string name="file_list_folder">каталог</string> <string name="file_list_folders">каталоги</string> @@ -357,7 +357,7 @@ <string name="preview_image_error_unknown_format">Это изображение не может быть отображено</string> <string name="error__upload__local_file_not_copied">%1$s невозможно скопировать в локальный каталог %2$s </string> - <string name="prefs_instant_upload_path_title">Каталог для автоматической загрузки</string> + <string name="prefs_instant_upload_path_title">Каталог для немедленной загрузки</string> <string name="prefs_folder_sync_local_path_title">Локальный каталог</string> <string name="prefs_folder_sync_remote_path_title">Удалённый каталог</string> <string name="prefs_instant_upload_path_use_subfolders_title">Использовать подкаталоги</string> @@ -450,10 +450,10 @@ <string name="copy_file_error">Произошла ошибка при попытке копирования этого файла или каталога</string> <string name="forbidden_permissions_copy">для копирования этого файла</string> - <string name="prefs_category_instant_uploading">Автоматическая загрузка</string> + <string name="prefs_category_instant_uploading">Немедленная загрузка</string> <string name="prefs_category_details">Подробно</string> - <string name="prefs_instant_video_upload_path_title">Каталог для автоматической загрузки видео</string> + <string name="prefs_instant_video_upload_path_title">Каталог для немедленной загрузки видео</string> <string name="sync_folder_failed_content">Синхронизация каталога %1$s не может быть завершена</string> <string name="shared_subject_header">поделился</string> @@ -563,7 +563,7 @@ <string name="folder_sync_no_results">Не найдены каталоги с медиа(файлами).</string> <string name="folder_sync_preferences">Настройки автозагрузки</string> <string name="folder_sync_settings">Настройки</string> - <string name="folder_sync_new_info">Автоматическая загрузка была полностью переделана. Используйте главное меню для перенастройки автоматической загрузки. Извините за неудобства.\n\nВам понравятся новые расширенные возможности автоматической загрузки!</string> + <string name="folder_sync_new_info">Моментальная загрузка была полностью переделана. Используйте главное меню для перенастройки автоматической загрузки. Извините за неудобства.\n\nВам понравятся новые расширенные возможности автоматической загрузки!</string> <string name="folder_sync_preferences_folder_path">Для %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d выбран</item> @@ -596,7 +596,7 @@ <string name="welcome_feature_2_title">Работа с несколькими аккаунтами</string> <string name="welcome_feature_2_text">Доступ ко всем вашим облакам</string> - <string name="welcome_feature_3_title">Автозагрузка</string> + <string name="welcome_feature_3_title">Немедленная загрузка</string> <string name="welcome_feature_3_text">Держите ваши фотографии в безопасности</string> <string name="whats_new_skip">Пропустить</string> From ae75177f75df0f0650a815eb234e1963d2fd97a4 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 19 Apr 2017 08:45:46 +0200 Subject: [PATCH 682/881] smaller borders, vertical centered text --- src/main/res/layout/whats_new_activity.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/res/layout/whats_new_activity.xml b/src/main/res/layout/whats_new_activity.xml index 09a90238d3..72f4904530 100644 --- a/src/main/res/layout/whats_new_activity.xml +++ b/src/main/res/layout/whats_new_activity.xml @@ -30,7 +30,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="5dp" - android:layout_weight="10" + android:layout_weight="6" android:gravity="center" android:text="@string/placeholder_sentence" android:textAppearance="?android:attr/textAppearanceLarge" @@ -40,16 +40,15 @@ android:id="@+id/contentPanel" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="80"> + android:layout_weight="86"> </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginBottom="@dimen/standard_margin" android:layout_marginLeft="@dimen/standard_margin" android:layout_marginRight="@dimen/standard_margin" - android:layout_weight="10" + android:layout_weight="8" android:orientation="horizontal" android:weightSum="3"> @@ -57,11 +56,12 @@ android:id="@+id/skip" style="@style/Button.Borderless.Login" android:layout_width="0dp" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:layout_gravity="center_vertical|center_horizontal" android:layout_weight="1" - android:paddingRight="0dp" + android:gravity="center" android:paddingLeft="0dp" + android:paddingRight="0dp" android:text="@string/whats_new_skip"/> <com.owncloud.android.ui.whatsnew.ProgressIndicator @@ -74,9 +74,10 @@ <LinearLayout android:layout_width="0dp" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:layout_gravity="center" android:layout_weight="1" + android:gravity="center" android:orientation="vertical"> <ImageButton @@ -84,7 +85,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:padding="@dimen/standard_padding" android:src="@drawable/arrow_right"/> </LinearLayout> </LinearLayout> From 28cd6926036ddca4448196d53a3301c13fd24949 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 12:35:38 +0200 Subject: [PATCH 683/881] Update things --- build.gradle.modified | 236 ++++++++++++++++++ .../ui/activity/FileDisplayActivity.java | 13 +- .../ui/activity/NotificationsActivity.java | 1 + src/modified/AndroidManifest.xml | 19 +- .../firebase/NCFirebaseInstanceIDService.java | 3 - .../activity/ModifiedFileDisplayActivity.java | 36 +++ .../com/owncloud/android/utils/PushUtils.java | 1 - 7 files changed, 293 insertions(+), 16 deletions(-) create mode 100644 build.gradle.modified create mode 100644 src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java diff --git a/build.gradle.modified b/build.gradle.modified new file mode 100644 index 0000000000..07e9827606 --- /dev/null +++ b/build.gradle.modified @@ -0,0 +1,236 @@ +// Gradle build file +// +// This project was started in Eclipse and later moved to Android Studio. In the transition, both IDEs were supported. +// Due to this, the files layout is not the usual in new projects created with Android Studio / gradle. This file +// merges declarations usually split in two separates build.gradle file, one for global settings of the project in +// its root folder, another one for the app module in subfolder of root. + +buildscript { + repositories { + jcenter() + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.google.gms:google-services:3.0.0' + } +} + +apply plugin: 'com.android.application' +apply plugin: 'checkstyle' +apply plugin: 'pmd' +apply plugin: 'findbugs' + +configurations.all { + // check for updates every build + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + +ext { + supportLibraryVersion = '25.0.0' + + travisBuild = System.getenv("TRAVIS") == "true" + + // allows for -Dpre-dex=false to be set + preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) +} + +repositories { + jcenter() + maven { url "https://jitpack.io" } + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + + flatDir { + dirs 'libs' + } +} + +android { + lintOptions { + abortOnError true + lintConfig file("${project.rootDir}/lint.xml") + htmlReport true + htmlOutput file("$project.buildDir/reports/lint/lint.html") + } + + dexOptions { + javaMaxHeapSize "4g" + } + + compileSdkVersion 25 + buildToolsVersion '25.0.0' + + defaultConfig { + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + // arguments to be passed to functional tests + testInstrumentationRunnerArgument "TEST_USER", "\"$System.env.OCTEST_APP_USERNAME\"" + testInstrumentationRunnerArgument "TEST_PASSWORD", "\"$System.env.OCTEST_APP_PASSWORD\"" + testInstrumentationRunnerArgument "TEST_SERVER_URL", "\"$System.env.OCTEST_SERVER_BASE_URL\"" + + multiDexEnabled true + + // adapt structure from Eclipse to Gradle/Android Studio expectations; + // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure + + productFlavors { + generic { + applicationId 'com.nextcloud.client' + } + + modified { + // structure is: + // domain tld + // domain name + // .client + applicationId 'com.custom.client' + } + } + + configurations { + modifiedCompile + } + } + + + // adapt structure from Eclipse to Gradle/Android Studio expectations; + // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure + + dexOptions { + // Skip pre-dexing whe`n running on Travis CI or when disabled via -Dpre-dex=false. + preDexLibraries = preDexEnabled && !travisBuild + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + lintOptions { + abortOnError false + } + + packagingOptions { + exclude 'META-INF/LICENSE.txt' + } + + task checkstyle(type: Checkstyle) { + configFile = file("${rootProject.projectDir}/checkstyle.xml") + configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath + source 'src' + include '**/*.java' + exclude '**/gen/**' + classpath = files() + } + + task pmd(type: Pmd) { + ruleSetFiles = files("${project.rootDir}/pmd-ruleset.xml") + ignoreFailures = false + ruleSets = [] + + source 'src' + include '**/*.java' + exclude '**/gen/**' + + reports { + xml.enabled = false + html.enabled = true + xml { + destination "$project.buildDir/reports/pmd/pmd.xml" + } + html { + destination "$project.buildDir/reports/pmd/pmd.html" + } + } + } + + task findbugs(type: FindBugs) { + ignoreFailures = false + effort = "max" + reportLevel = "high" + classes = files("$project.buildDir/intermediates/classes") + excludeFilter = new File("${project.rootDir}/findbugs-filter.xml") + source 'src' + include '**/*.java' + exclude '**/gen/**' + + reports { + xml.enabled = false + html.enabled = true + html { + destination "$project.buildDir/reports/findbugs/findbugs.html" + } + } + classpath = files() + } + check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint' + +} + +dependencies { + /// dependencies for app building + compile name: 'touch-image-view' + compile 'com.android.support:multidex:1.0.1' + + + compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' + compile "com.android.support:support-v4:${supportLibraryVersion}" + compile "com.android.support:design:${supportLibraryVersion}" + compile 'com.jakewharton:disklrucache:2.0.2' + compile "com.android.support:appcompat-v7:${supportLibraryVersion}" + compile "com.android.support:cardview-v7:${supportLibraryVersion}" + compile 'com.getbase:floatingactionbutton:1.10.1' + compile 'com.google.code.findbugs:annotations:2.0.1' + compile group: 'commons-io', name: 'commons-io', version: '2.4' + compile 'com.github.evernote:android-job:v1.1.9' + compile 'com.jakewharton:butterknife:8.4.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' + compile 'org.greenrobot:eventbus:3.0.0' + + compile 'com.google.android.gms:play-services:10.2.1' + + compile 'org.parceler:parceler-api:1.1.6' + annotationProcessor 'org.parceler:parceler:1.1.6' + + compile 'com.github.bumptech.glide:glide:3.7.0' + compile 'com.caverock:androidsvg:1.2.1' + /// dependencies for local unit tests + testCompile 'junit:junit:4.12' + testCompile 'org.mockito:mockito-core:1.10.19' + + /// dependencies for instrumented tests + // JUnit4 Rules + androidTestCompile 'com.android.support.test:rules:0.5' + + // Android JUnit Runner + androidTestCompile 'com.android.support.test:runner:0.5' + + // Android Annotation Support + androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" + + // Espresso core + androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' + + // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests + //androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' + // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details + //androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" + +} + +configurations.all { + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + +tasks.withType(Test) { + /// increased logging for tests + testLogging { + events "passed", "skipped", "failed" + } +} + +apply plugin: 'com.google.gms.google-services' diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 79fc7c6dbd..ec3e604147 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -82,7 +82,6 @@ import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; -import com.owncloud.android.ui.events.SearchEvent; import com.owncloud.android.ui.events.TokenPushEvent; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; @@ -99,11 +98,8 @@ import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.PermissionUtil; -import com.owncloud.android.utils.PushUtils; import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.util.ArrayList; @@ -313,11 +309,6 @@ public class FileDisplayActivity extends HookActivity } } - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onMessageEvent(TokenPushEvent event) { - PushUtils.pushRegistrationToServer(); - } - @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { @@ -905,7 +896,7 @@ public class FileDisplayActivity extends HookActivity /** * Request the operation for moving the file/folder from one path to another * - * @param data Intent received + * @param data Intent received */ private void requestMoveOperation(Intent data) { OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); @@ -916,7 +907,7 @@ public class FileDisplayActivity extends HookActivity /** * Request the operation for copying the file/folder from one path to another * - * @param data Intent received + * @param data Intent received */ private void requestCopyOperation(Intent data) { OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 94671ce9ac..40ad687e98 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -261,6 +261,7 @@ public class NotificationsActivity extends FileActivity { default: retval = super.onOptionsItemSelected(item); + break; } return retval; diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml index 15c87dde3d..3d828306e4 100644 --- a/src/modified/AndroidManifest.xml +++ b/src/modified/AndroidManifest.xml @@ -29,6 +29,16 @@ android:fullBackupContent="@xml/backup_config" android:theme="@style/Theme.ownCloud.Toolbar" android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity"> + <activity + android:name=".ui.activity.ModifiedFileDisplayActivity" + android:label="@string/app_name" + android:theme="@style/Theme.ownCloud.Toolbar.Drawer"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> <activity android:name=".authentication.ModifiedAuthenticatorActivity" @@ -55,15 +65,22 @@ <data android:scheme="@string/login_data_own_scheme" android:host="login"/> </intent-filter> </activity> + <activity - android:name=".authentication.AuthenticatorActivity" + android:name=".ui.activity.FileDisplayActivity" tools:node="remove"/> + <activity-alias + android:name=".ui.activity.FileDisplayActivity" + android:targetActivity=".ui.activity.ModifiedFileDisplayActivity" + tools:replace="android:targetActivity"/> + <activity-alias android:name=".authentication.AuthenticatorActivity" android:targetActivity=".authentication.ModifiedAuthenticatorActivity" tools:replace="android:targetActivity"/> + <service android:name=".services.firebase.NCFirebaseMessagingService"> <intent-filter> diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index b21ddfb661..a5ab4d409a 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -20,7 +20,6 @@ package com.owncloud.android.services.firebase; import android.text.TextUtils; -import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; @@ -38,9 +37,7 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { PreferenceManager.setPushToken(MainApp.getAppContext(), FirebaseInstanceId.getInstance().getToken()); PreferenceManager.setPushTokenUpdateTime(MainApp.getAppContext(), System.currentTimeMillis()); - } - if (PreferenceManager.getPushTokenLastSentTime(MainApp.getAppContext()) != -1) { PushUtils.pushRegistrationToServer(); } } diff --git a/src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java b/src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java new file mode 100644 index 0000000000..a2d17ca8ab --- /dev/null +++ b/src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java @@ -0,0 +1,36 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.activity; + +import com.owncloud.android.ui.events.TokenPushEvent; +import com.owncloud.android.utils.PushUtils; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +public class ModifiedFileDisplayActivity extends FileDisplayActivity { + + @Subscribe(threadMode = ThreadMode.BACKGROUND) + public void onMessageEvent(TokenPushEvent event) { + PushUtils.pushRegistrationToServer(); + } + +} diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index 3f9cb76581..efa8305161 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -89,7 +89,6 @@ public class PushUtils { public static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER; - ; String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; From 1a6b14c0ffb9c1d781ff492317a561b89bad3af1 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 19 Apr 2017 12:03:26 +0200 Subject: [PATCH 684/881] bugfix for #798 checking cast if remote request is long running preventing MissingActivityException if fragment is detached from Activity --- .../android/ui/activity/DrawerActivity.java | 22 +- .../ui/activity/FileDisplayActivity.java | 33 ++- .../ui/adapter/FileListListAdapter.java | 34 ++- .../android/ui/events/SearchEvent.java | 15 +- .../ui/fragment/OCFileListFragment.java | 200 ++++++++++-------- 5 files changed, 186 insertions(+), 118 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index b698306179..21bab74df9 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -60,11 +60,13 @@ import com.owncloud.android.ui.events.ChangeMenuEvent; import com.owncloud.android.ui.events.DummyDrawerEvent; import com.owncloud.android.ui.events.MenuItemClickEvent; import com.owncloud.android.ui.events.SearchEvent; +import com.owncloud.android.ui.fragment.OCFileListFragment; import com.owncloud.android.utils.DisplayUtils; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.parceler.Parcels; /** * Base class to handle setup of the drawer implementation including user switching and avatar fetching and fallback @@ -382,12 +384,24 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU case R.id.nav_favorites: menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - EventBus.getDefault().post(new SearchEvent("", SearchOperation.SearchType.FAVORITE_SEARCH, - SearchEvent.UnsetType.NO_UNSET)); + + Intent favoriteIntent = new Intent(getBaseContext(), FileDisplayActivity.class); + favoriteIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(new SearchEvent("", + SearchOperation.SearchType.FAVORITE_SEARCH, SearchEvent.UnsetType.NO_UNSET))); + favoriteIntent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId()); + favoriteIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(favoriteIntent); break; case R.id.nav_photos: - EventBus.getDefault().post(new SearchEvent("image/%", - SearchOperation.SearchType.CONTENT_TYPE_SEARCH, SearchEvent.UnsetType.NO_UNSET)); + menuItem.setChecked(true); + mCheckedMenuItem = menuItem.getItemId(); + + Intent photoIntent = new Intent(getBaseContext(), FileDisplayActivity.class); + photoIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(new SearchEvent("image/%", + SearchOperation.SearchType.CONTENT_TYPE_SEARCH, SearchEvent.UnsetType.NO_UNSET))); + photoIntent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId()); + photoIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(photoIntent); break; case R.id.nav_on_device: menuItem.setChecked(true); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 237baec695..0603e800c1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -131,6 +131,8 @@ public class FileDisplayActivity extends HookActivity public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS"; + public static final String DRAWER_MENU_ID = "DRAWER_MENU_ID"; + public static final int REQUEST_CODE__SELECT_CONTENT_FROM_APPS = REQUEST_CODE__LAST_SHARED + 1; public static final int REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM = REQUEST_CODE__LAST_SHARED + 2; public static final int REQUEST_CODE__MOVE_FILES = REQUEST_CODE__LAST_SHARED + 3; @@ -170,10 +172,10 @@ public class FileDisplayActivity extends HookActivity /// Load of saved instance state if (savedInstanceState != null) { - mWaitingToPreview = (OCFile) savedInstanceState.getParcelable( + mWaitingToPreview = savedInstanceState.getParcelable( FileDisplayActivity.KEY_WAITING_TO_PREVIEW); mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); - mWaitingToSend = (OCFile) savedInstanceState.getParcelable( + mWaitingToSend = savedInstanceState.getParcelable( FileDisplayActivity.KEY_WAITING_TO_SEND); searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY); } else { @@ -245,11 +247,17 @@ public class FileDisplayActivity extends HookActivity } } - if (savedInstanceState == null) { - createMinFragments(); - } + if (getIntent().getParcelableExtra(OCFileListFragment.SEARCH_EVENT) != null){ + switchToSearchFragment(); - refreshList(true); + int menuId = getIntent().getIntExtra(DRAWER_MENU_ID, -1); + if (menuId != -1){ + setupDrawer(menuId); + } + } else if (savedInstanceState == null) { + createMinFragments(); + refreshList(true); + } setIndeterminate(mSyncInProgress); // always AFTER setContentView(...) in onCreate(); to work around bug in its implementation @@ -377,6 +385,19 @@ public class FileDisplayActivity extends HookActivity } } + private void switchToSearchFragment() { + OCFileListFragment listOfFiles = new OCFileListFragment(); + Bundle args = new Bundle(); + + args.putParcelable(OCFileListFragment.SEARCH_EVENT, + getIntent().getParcelableExtra(OCFileListFragment.SEARCH_EVENT)); + + listOfFiles.setArguments(args); + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.add(R.id.left_fragment_container, listOfFiles, TAG_LIST_OF_FILES); + transaction.commit(); + } + private void createMinFragments() { OCFileListFragment listOfFiles = new OCFileListFragment(); Bundle args = new Bundle(); diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java index 4321a016c6..3b76c7a42a 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -109,6 +109,17 @@ public class FileListListAdapter extends BaseAdapter { new ThumbnailsCacheManager.InitDiskCacheTask().execute(); } + public FileListListAdapter( + boolean justFolders, + Context context, + ComponentsGetter transferServiceGetter, + OCFileListFragmentInterface OCFileListFragmentInterface, + FileDataStorageManager fileDataStorageManager + ) { + this(justFolders, context, transferServiceGetter, OCFileListFragmentInterface); + mStorageManager = fileDataStorageManager; + } + @Override public boolean areAllItemsEnabled() { return true; @@ -467,21 +478,24 @@ public class FileListListAdapter extends BaseAdapter { if (searchType.equals(ExtendedListFragment.SearchType.SHARED_FILTER)) { ArrayList<OCShare> shares = new ArrayList<>(); for (int i = 0; i < objects.size(); i++) { - shares.add((OCShare) objects.get(i)); + // check type before cast as of long running data fetch it is possible that old result is filled + if (objects.get(i) instanceof OCShare) { + OCShare ocShare = (OCShare) objects.get(i); + + shares.add(ocShare); + + OCFile ocFile = mStorageManager.getFileByPath(ocShare.getPath()); + if (!mFiles.contains(ocFile)) { + mFiles.add(ocFile); + } + } } mStorageManager.saveShares(shares); - } - for (int i = 0; i < objects.size(); i++) { - if (!searchType.equals(ExtendedListFragment.SearchType.SHARED_FILTER)) { + } else { + for (int i = 0; i < objects.size(); i++) { OCFile ocFile = FileStorageUtils.fillOCFile((RemoteFile) objects.get(i)); searchForLocalFileInDefaultPath(ocFile); mFiles.add(ocFile); - } else { - OCShare ocShare = (OCShare) objects.get(i); - OCFile ocFile = mStorageManager.getFileByPath(ocShare.getPath()); - if (!mFiles.contains(ocFile)) { - mFiles.add(ocFile); - } } } diff --git a/src/main/java/com/owncloud/android/ui/events/SearchEvent.java b/src/main/java/com/owncloud/android/ui/events/SearchEvent.java index da31b6c265..55c9a92306 100644 --- a/src/main/java/com/owncloud/android/ui/events/SearchEvent.java +++ b/src/main/java/com/owncloud/android/ui/events/SearchEvent.java @@ -21,20 +21,27 @@ package com.owncloud.android.ui.events; import com.owncloud.android.lib.resources.files.SearchOperation; +import org.parceler.Parcel; + /** * Search event */ +@Parcel public class SearchEvent { - public final String searchQuery; + public String searchQuery; - public final SearchOperation.SearchType searchType; + public SearchOperation.SearchType searchType; - public final UnsetType unsetType; + public UnsetType unsetType; public enum UnsetType { NO_UNSET, UNSET_DRAWER, - UNSET_BOTTOM_NAV_BAR; + UNSET_BOTTOM_NAV_BAR + } + + public SearchEvent() { + } public SearchEvent(String searchQuery, SearchOperation.SearchType searchType, UnsetType unsetType) { diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 00738fbca3..d553ee3795 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -28,6 +28,7 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -61,6 +62,7 @@ import com.owncloud.android.files.FileMenuFilter; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.SearchOperation; @@ -116,6 +118,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi public final static String ARG_ALLOW_CONTEXTUAL_ACTIONS = MY_PACKAGE + ".ALLOW_CONTEXTUAL"; public final static String ARG_HIDE_FAB = MY_PACKAGE + ".HIDE_FAB"; + public static final String SEARCH_EVENT = "SEARCH_EVENT"; + private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE"; private static final String KEY_FAB_EVER_CLICKED = "FAB_EVER_CLICKED"; @@ -146,6 +150,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi private BottomNavigationView bottomNavigationView; private SearchType currentSearchType; + private boolean searchFragment = false; private enum MenuItemAddRemove { DO_NOTHING, REMOVE_SORT, REMOVE_GRID_AND_SORT, ADD_SORT, ADD_GRID_AND_SORT, ADD_GRID_AND_SORT_WITH_SEARCH, @@ -310,7 +315,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi mJustFolders, getActivity(), mContainerActivity, - this + this, + mContainerActivity.getStorageManager() ); setListAdapter(mAdapter); @@ -334,6 +340,11 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi removeFabLabels(); } } + + SearchEvent searchEvent = Parcels.unwrap(getArguments().getParcelable(OCFileListFragment.SEARCH_EVENT)); + if (searchEvent != null){ + onMessageEvent(searchEvent); + } } /** @@ -940,6 +951,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } public void refreshDirectory() { + searchFragment = false; listDirectory(getCurrentFile(), MainApp.isOnlyOnDevice(), false); } @@ -951,56 +963,58 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi * @param directory File to be listed */ public void listDirectory(OCFile directory, boolean onlyOnDevice, boolean fromSearch) { - FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); - if (storageManager != null) { + if (!searchFragment) { + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); + if (storageManager != null) { - // Check input parameters for null - if (directory == null) { - if (mFile != null) { - directory = mFile; - } else { - directory = storageManager.getFileByPath("/"); - if (directory == null) { - return; // no files, wait for sync + // Check input parameters for null + if (directory == null) { + if (mFile != null) { + directory = mFile; + } else { + directory = storageManager.getFileByPath("/"); + if (directory == null) { + return; // no files, wait for sync + } } } - } - // If that's not a directory -> List its parent - if (!directory.isFolder()) { - Log_OC.w(TAG, "You see, that is not a directory -> " + directory.toString()); - directory = storageManager.getFileById(directory.getParentId()); - } + // If that's not a directory -> List its parent + if (!directory.isFolder()) { + Log_OC.w(TAG, "You see, that is not a directory -> " + directory.toString()); + directory = storageManager.getFileById(directory.getParentId()); + } - if (searchView != null && !searchView.isIconified() && !fromSearch) { + if (searchView != null && !searchView.isIconified() && !fromSearch) { - searchView.post(new Runnable() { - @Override - public void run() { - searchView.setQuery("", false); - searchView.onActionViewCollapsed(); - Activity activity; - if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) { - FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity; - if (getCurrentFile() != null) { - fileDisplayActivity.setDrawerIndicatorEnabled(fileDisplayActivity.isRoot(getCurrentFile())); + searchView.post(new Runnable() { + @Override + public void run() { + searchView.setQuery("", false); + searchView.onActionViewCollapsed(); + Activity activity; + if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) { + FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity; + if (getCurrentFile() != null) { + fileDisplayActivity.setDrawerIndicatorEnabled(fileDisplayActivity.isRoot(getCurrentFile())); + } } + } + }); + } + + mAdapter.swapDirectory(directory, storageManager, onlyOnDevice); + if (mFile == null || !mFile.equals(directory)) { + mCurrentListView.setSelection(0); + } + mFile = directory; + + updateLayout(); - } - }); } - - mAdapter.swapDirectory(directory, storageManager, onlyOnDevice); - if (mFile == null || !mFile.equals(directory)) { - mCurrentListView.setSelection(0); - } - mFile = directory; - - updateLayout(); - } } @@ -1047,42 +1061,46 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } private String generateFooterText(int filesCount, int foldersCount) { - String output; - if (filesCount <= 0) { - if (foldersCount <= 0) { - output = ""; + String output = ""; - } else if (foldersCount == 1) { - output = getResources().getString(R.string.file_list__footer__folder); + if (getActivity() != null) { + if (filesCount <= 0) { + if (foldersCount <= 0) { + output = ""; - } else { // foldersCount > 1 - output = getResources().getString(R.string.file_list__footer__folders, foldersCount); - } + } else if (foldersCount == 1) { + output = getResources().getString(R.string.file_list__footer__folder); - } else if (filesCount == 1) { - if (foldersCount <= 0) { - output = getResources().getString(R.string.file_list__footer__file); + } else { // foldersCount > 1 + output = getResources().getString(R.string.file_list__footer__folders, foldersCount); + } - } else if (foldersCount == 1) { - output = getResources().getString(R.string.file_list__footer__file_and_folder); + } else if (filesCount == 1) { + if (foldersCount <= 0) { + output = getResources().getString(R.string.file_list__footer__file); - } else { // foldersCount > 1 - output = getResources().getString(R.string.file_list__footer__file_and_folders, foldersCount); - } - } else { // filesCount > 1 - if (foldersCount <= 0) { - output = getResources().getString(R.string.file_list__footer__files, filesCount); + } else if (foldersCount == 1) { + output = getResources().getString(R.string.file_list__footer__file_and_folder); - } else if (foldersCount == 1) { - output = getResources().getString(R.string.file_list__footer__files_and_folder, filesCount); + } else { // foldersCount > 1 + output = getResources().getString(R.string.file_list__footer__file_and_folders, foldersCount); + } + } else { // filesCount > 1 + if (foldersCount <= 0) { + output = getResources().getString(R.string.file_list__footer__files, filesCount); - } else { // foldersCount > 1 - output = getResources().getString( - R.string.file_list__footer__files_and_folders, filesCount, foldersCount - ); + } else if (foldersCount == 1) { + output = getResources().getString(R.string.file_list__footer__files_and_folder, filesCount); + } else { // foldersCount > 1 + output = getResources().getString( + R.string.file_list__footer__files_and_folders, filesCount, foldersCount + ); + + } } } + return output; } @@ -1245,6 +1263,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessageEvent(SearchEvent event) { + searchFragment = true; setEmptyListLoadingMessage(); mAdapter.setData(new ArrayList<>(), SearchType.NO_SEARCH); @@ -1284,30 +1303,35 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } }; - Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()); + final RemoteOperation remoteOperation; + if (!currentSearchType.equals(SearchType.SHARED_FILTER)) { + remoteOperation = new SearchOperation(event.getSearchQuery(), event.getSearchType()); + } else { + remoteOperation = new GetRemoteSharesOperation(); + } - try { - OwnCloudAccount ocAccount = new OwnCloudAccount( - currentAccount, - MainApp.getAppContext() - ); + final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()); + + AsyncTask task = new AsyncTask() { + @Override + protected Object doInBackground(Object[] params) { + RemoteOperationResult remoteOperationResult = remoteOperation.execute(currentAccount, getContext()); - OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). - getClientFor(ocAccount, MainApp.getAppContext()); - if (!currentSearchType.equals(SearchType.SHARED_FILTER)) { - SearchOperation operation = new SearchOperation(event.getSearchQuery(), event.getSearchType()); - RemoteOperationResult remoteOperationResult = operation.execute(mClient); - if (remoteOperationResult.isSuccess() && remoteOperationResult.getData() != null) { - mAdapter.setData(remoteOperationResult.getData(), currentSearchType); - } - } else { - GetRemoteSharesOperation operation = new GetRemoteSharesOperation(); - RemoteOperationResult remoteOperationResult = operation.execute(mClient); if (remoteOperationResult.isSuccess() && remoteOperationResult.getData() != null) { mAdapter.setData(remoteOperationResult.getData(), currentSearchType); } + + return remoteOperationResult.isSuccess(); } + @Override + protected void onPostExecute(Object o) { + mAdapter.notifyDataSetChanged(); + } + }; + + task.execute(true); + if (event.getSearchType().equals(SearchOperation.SearchType.FILE_SEARCH)) { setEmptyListMessage(SearchType.FILE_SEARCH); @@ -1350,18 +1374,6 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } else { new Handler(Looper.getMainLooper()).post(switchViewsRunnable); } - - } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { - Log_OC.e(TAG, "Account not found", e); - } catch (AuthenticatorException e) { - Log_OC.e(TAG, "Authentication failed", e); - } catch (IOException e) { - Log_OC.e(TAG, "IO error", e); - } catch (OperationCanceledException e) { - Log_OC.e(TAG, "Operation has been canceled", e); - } - - } @Override From e6310cc906d1ce98c917898446c841dfbc0dcf55 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 13:51:13 +0200 Subject: [PATCH 685/881] dont build modified --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 710be1bac1..e9995cfe36 100644 --- a/.drone.yml +++ b/.drone.yml @@ -11,9 +11,9 @@ pipeline: # - ./gradlew connectedDebugAndroidTest --info # install app, then assemble and install instrumented tests of app module - ./gradlew :installGenericDebug - - ./gradlew :installModifiedDebug + #- ./gradlew :installModifiedDebug - ./gradlew :installGenericDebugAndroidTest - - ./gradlew :installModifiedDebugAndroidTest + #- ./gradlew :installModifiedDebugAndroidTest # run sample instrumented unit test # TODO fails because test runner is not available #- adb shell am instrument -w -e debug false -e class com.owncloud.android.datamodel.OCFileUnitTest com.owncloud.android.test/android.support.test.runner.AndroidJUnitRunner From 0d29d949c5411930d3eaebd16b1fc5bc483d2406 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 19 Apr 2017 14:52:26 +0200 Subject: [PATCH 686/881] fixed missing drawer events --- .../android/ui/activity/DrawerActivity.java | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 21bab74df9..7c245e5b9c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -385,23 +385,15 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - Intent favoriteIntent = new Intent(getBaseContext(), FileDisplayActivity.class); - favoriteIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(new SearchEvent("", - SearchOperation.SearchType.FAVORITE_SEARCH, SearchEvent.UnsetType.NO_UNSET))); - favoriteIntent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId()); - favoriteIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(favoriteIntent); + switchToSearchFragment(new SearchEvent("", SearchOperation.SearchType.FAVORITE_SEARCH, + SearchEvent.UnsetType.NO_UNSET), menuItem); break; case R.id.nav_photos: menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - Intent photoIntent = new Intent(getBaseContext(), FileDisplayActivity.class); - photoIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(new SearchEvent("image/%", - SearchOperation.SearchType.CONTENT_TYPE_SEARCH, SearchEvent.UnsetType.NO_UNSET))); - photoIntent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId()); - photoIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(photoIntent); + switchToSearchFragment(new SearchEvent("image/%", SearchOperation.SearchType.CONTENT_TYPE_SEARCH, + SearchEvent.UnsetType.NO_UNSET), menuItem); break; case R.id.nav_on_device: menuItem.setChecked(true); @@ -443,26 +435,34 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU case R.id.nav_recently_added: menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - EventBus.getDefault().post(new SearchEvent("%", SearchOperation.SearchType.CONTENT_TYPE_SEARCH, - SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR)); + + Intent recentlyAddedIntent = new Intent(getBaseContext(), FileDisplayActivity.class); + recentlyAddedIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(new SearchEvent("%", + SearchOperation.SearchType.CONTENT_TYPE_SEARCH, SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR))); + recentlyAddedIntent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId()); + recentlyAddedIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(recentlyAddedIntent); break; case R.id.nav_recently_modified: menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - EventBus.getDefault().post(new SearchEvent("", SearchOperation.SearchType.RECENTLY_MODIFIED_SEARCH, - SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR)); + + switchToSearchFragment(new SearchEvent("", SearchOperation.SearchType.RECENTLY_MODIFIED_SEARCH, + SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR), menuItem); break; case R.id.nav_shared: menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - EventBus.getDefault().post(new SearchEvent("", SearchOperation.SearchType.SHARED_SEARCH, - SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR)); + + switchToSearchFragment(new SearchEvent("", SearchOperation.SearchType.SHARED_SEARCH, + SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR), menuItem); break; case R.id.nav_videos: menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - EventBus.getDefault().post(new SearchEvent("video/%", SearchOperation.SearchType.CONTENT_TYPE_SEARCH, - SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR)); + + switchToSearchFragment(new SearchEvent("video/%", SearchOperation.SearchType.CONTENT_TYPE_SEARCH, + SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR), menuItem); break; case Menu.NONE: // account clicked @@ -472,6 +472,14 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU } } + private void switchToSearchFragment(SearchEvent event, MenuItem menuItem) { + Intent recentlyAddedIntent = new Intent(getBaseContext(), FileDisplayActivity.class); + recentlyAddedIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(event)); + recentlyAddedIntent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId()); + recentlyAddedIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(recentlyAddedIntent); + } + /** * show the file list to the user. * From 06275e0f791234c87d121ec0475d77fb948ba88d Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 19 Apr 2017 14:54:36 +0200 Subject: [PATCH 687/881] and the last one... --- .../com/owncloud/android/ui/activity/DrawerActivity.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 7c245e5b9c..2db1f849f9 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -436,12 +436,8 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); - Intent recentlyAddedIntent = new Intent(getBaseContext(), FileDisplayActivity.class); - recentlyAddedIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(new SearchEvent("%", - SearchOperation.SearchType.CONTENT_TYPE_SEARCH, SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR))); - recentlyAddedIntent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId()); - recentlyAddedIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(recentlyAddedIntent); + switchToSearchFragment(new SearchEvent("%",SearchOperation.SearchType.CONTENT_TYPE_SEARCH, + SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR), menuItem); break; case R.id.nav_recently_modified: menuItem.setChecked(true); From 0325dd37e5dd1db6c7ce8fb1f0393884377177f7 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 27 Mar 2017 00:55:03 +0200 Subject: [PATCH 688/881] notifications icon work --- drawable_resources/ic_notification.svg | 58 ++++++++++++++++++ .../res/drawable-hdpi/ic_notification.png | Bin 0 -> 623 bytes .../res/drawable-mdpi/ic_notification.png | Bin 0 -> 450 bytes .../res/drawable-xhdpi/ic_notification.png | Bin 0 -> 719 bytes .../res/drawable-xxhdpi/ic_notification.png | Bin 0 -> 1033 bytes .../res/drawable-xxxhdpi/ic_notification.png | Bin 0 -> 1317 bytes 6 files changed, 58 insertions(+) create mode 100644 drawable_resources/ic_notification.svg create mode 100644 src/main/res/drawable-hdpi/ic_notification.png create mode 100644 src/main/res/drawable-mdpi/ic_notification.png create mode 100644 src/main/res/drawable-xhdpi/ic_notification.png create mode 100644 src/main/res/drawable-xxhdpi/ic_notification.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_notification.png diff --git a/drawable_resources/ic_notification.svg b/drawable_resources/ic_notification.svg new file mode 100644 index 0000000000..bfcd35b2d4 --- /dev/null +++ b/drawable_resources/ic_notification.svg @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="16" + width="16" + version="1.1" + viewBox="0 0 16 16" + id="svg4" + sodipodi:docname="ic_notification.svg" + inkscape:version="0.92.1 r15371" + inkscape:export-filename="C:\DEV\src\Android\Nextcloud\notifications\src\main\res\drawable-mdpi\ic_notification.png" + inkscape:export-xdpi="144" + inkscape:export-ydpi="144"> + <metadata + id="metadata10"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs8" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1005" + id="namedview6" + showgrid="false" + inkscape:zoom="14.75" + inkscape:cx="8" + inkscape:cy="8" + inkscape:window-x="-9" + inkscape:window-y="-9" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="m8 2c-0.5523 0-1 0.4477-1 1 0 0.0472 0.021 0.0873 0.0273 0.1328-1.7366 0.4362-3.0273 1.9953-3.0273 3.8672v2l-1 1v1h10v-1l-1-1v-2c0-1.8719-1.291-3.431-3.0273-3.8672 0.0063-0.0455 0.0273-0.0856 0.0273-0.1328 0-0.5523-0.4477-1-1-1zm-2 10c0 1.1046 0.8954 2 2 2s2-0.8954 2-2z" + fill="#fff" + id="path2" + style="fill:#757575;fill-opacity:1" /> +</svg> diff --git a/src/main/res/drawable-hdpi/ic_notification.png b/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..deac351b3fe7a831ce4d23bd27b31b3f0e620f61 GIT binary patch literal 623 zcmV-#0+9WQP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004b3#c}2nYxW zd<bNS00009a7bBm001F4001F40Y#QEU;qFB8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10qjXcK~z|U?UylV)KD15|KCf`hGr2#bkeO9>LS<<db4&Bv_lKE zqhn7FFL}4V`P~H%935N)M_XvS*fq4+!Bx6Bi`3!5i5%~9um=ivmzTVY4(2!J{rSIN zK0=ZQR8+V@t_5Kj1^~8*h?)6qx7$tsnUGRyE=|*80Cz4fod!X0S1C0t+9_Ow(lovG zn+yP~3<iT`m(D^HYBrmfYqi=lB6`Bii+>anof%`^42Q#)y<YEI=|WP<b!L7A;7UgH zD-k`_TJPrR_j1bYF!O5w3l{MO0GsuC{Y#Q0r?z`oPpI8)KQP7|BL8z|h-gh~{eEUb zjYebM_x&>fH*(61_#6bmqEhNdR?zBhec#`7kO6?3{eFMLCTKhU#||<803v#1ld~0C zac~*2Y7?>*y6PY@;+jp!R_Kz0NUjd2Pe&P4LRn-AMNzaitIce>rV2$-bRWRGSqTBy z3&Zf?w7|qqN2}FZ5<+|g;LlJ90KOYzZpU%_Y24z(2@%ot5@Z0tzvv#z+@uB1^UjSi zM<ocs^StvidjAg!{ZmURTg=?eh&}IgIxq5e7kx1%Spg!-%#5Rukk<MHz~Pk0zSjD~ zUlRfVA;cCD9gLF^LTnf9bv{Z<DOZ{K9{(bV<JkIyQBhF_KLILFh(SN1lB)m!002ov JPDHLkV1hkw2m$~A literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_notification.png b/src/main/res/drawable-mdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..2e35a0cf8991ef91d90dfda9b18de9891f89fd9f GIT binary patch literal 450 zcmV;z0X_bSP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW zd<bNS00009a7bBm000&x000&x0ZCFM@Bjb+8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10Y6DZK~zYI?UbQT13?r;&#<Iw!9oaW2;~Dvkn2$V05}kQKnY<d z9R({(b`!n;h2#e?2$H4(92#4Ts^slpz;t(KUt8NN-@W(UnarC9E4099h0eJH5qSZK zqUdBe9DZqhYZ_6OWgQXe13jQ8BK<7OIvQ{54bn6{GsZjsJ2TV-xX$zZIpmK*q_y_S z81o2h)X<y2X_6%0<MH^tsYl}tthI;02e2MG1n}d%KPrmivyKeC!HuFhf10$33<Vr3 zngd{rY1D=SwzL7j_96kn0nlny|6m!^1~}*T=55sEsRRrLgRY3Y&Kn>iZ_c^>)&TGQ zB~TG6&@IdIVzyYB^Rg^Q!2JRNc<)Dx_?CidU0Z7>)GWI^&v)CrsxkH6Kh>1$Y87a9 s4RIXbPN!3hG3Wn*aU9=iyeqWg7osRwaER7p!~g&Q07*qoM6N<$g4gS~UH||9 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_notification.png b/src/main/res/drawable-xhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..d035a62131673da1ae41971fd6d688ab5c3d5c8e GIT binary patch literal 719 zcmV;=0x<oFP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm001mY001mY0i`{bsQ>@~8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10!&FnK~!jg?U}KQ6G0Tlzb`SONx<XaP{hto@E=&L6w-Lzso1E9 z)q&;ioN2t}6cV!`O}gVi(6h17f53W4qXYy?8%0E$)7wD2+s(6(vpDf?XLmLMonIN= z_ul*RW+vHLz+$mjW(kW(>ihoD(P;F5<PG`7(|Wyr-}n6;)3uJ6P6z-|6s?g|A_4#) zxe`SY0NgWOt7JMM0F+9loBKZ_d8>$8Mwd{t*<47HWJyH&_;b3kh}^AIDlb~C)>l(C zjTrDe?-YPl0CxaX4hi1{umNB#2!hXfYv(rLy6$C?PXNqoO23K7?QXaGGEe<-9<k?n z%Op1eR5Qqrk-X+O&ZjU8-(>9}^8`H4TLSPL`456bM6PC?L?#1Dsna6z7W&KPZ)}k~ z-|2Kd>IyS`dm{1(=9&k9xyfYmFpE%o0!pbfBJv)GpEkPeCP{L(*Xw=I5ou3AM6Sbp z^8ipOm&;dlMcM{PUewiS<i4b<$ufa+x|$+$XW7IH88m4*sVm50Aj^+dVYv(WH#$wM zfmve>%o;5NN-4jfK7Ql6Zd)fl_49yI$`_GU{g(6~dBJg<<6#)SN)w;Tz_gm*L&rp_ zB{a?E_aM2FChq^*#1_jxh_S0h*LAl^)>DRm4}#!?iMqx%G0Art;X1JgV)7K)OdCk@ znW>`242;L)bpXQ@p~Gsmx^AkjF$4X6|3@6hi#XWCFplFzlW%HrUGDB@Fc@q%8jZ(s z9De~YFCudQc1XS^*{RiP%k6f1%VbT9#bTK)KLPK5x%EC71(pB+002ovPDHLkV1i1w BL&N|8 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/ic_notification.png b/src/main/res/drawable-xxhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f289646c3cfc3c95a36a90e1bd768c3eaf6787 GIT binary patch literal 1033 zcmV+k1or!hP)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004b3#c}2nYxW zd<bNS00009a7bBm002U8002U80dDeNZ2$lO8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11BOXNK~#90?VC@C4sjUAzt21NT_P+|$cBq@aMQ|!<VZ*%lq5MQ zhpm};=b~Ooy*ux0z2`kRNJQM+{9U`f%8dgTS&<yDS$enhnt2@T%AbAB`_4QwW9#`` z-{0^1e)}}@n?L;qP!vT`6h%>#8KAri0Dx`VCNrM}U;+RUjTQ=p^8*6|^_;8aFUYp- z0|2f7nDfU^--zh2=Xp1BsP&Uv1-Y)<69mB+fJH5ad}=nEYiqUIr!0H@N+GX527oXO zccZl&09afs7I$UUXC`tL#LO$&7_%yiF0IJr6tgUABM}_}a0I}bh~cjQTw&&GzVAOx zyW5{+D#*6&?EoqOHph&36o#QYI5_xFu+~4xM3Cb+D*+5Kv($QWtJ!Rxs?}=mgz{RF zx**%Ow-eFTcGjB?c~3+~J<q!>ockL_n&Gx>9|v#~z`_*b=L0xmn&zu|z5XPHd;lp5 zvMg&a5naaLH-M590PHbM^Lf2qf0o7{q;iT`meof@!vMO|$e)3)M6}KGyvNeP;`c%2 za(ONhT|{<r0HB+hFZK8L&yx-o7c@CJc>%x%>D)G0Zy3fo=}^&A%yFER%sd95D4E*< zU#Fhk#4i7$M-VfgL4I-opu4N9>$GH`*b!7Nmy3-?;~jt{QkgONI59D?VrXcnDG?@i z1T`9sKIAV40G9Uj^lXv}6B9&4JEgLc5(I%*7coK1yhSQY08=VRa*@vUz0I!>kysZ= zLCXZQlCoSXNK(-Mus~0<R4PbPP^xbRIz+5XuJ5F011cy26%>IAia-TLpn@V$K@o@u za$R?gM2;j<oe~Qwl}f!q5Zsk0BS{bh!>;SDOPZ7Dg;}Xo>J7v2K7hnUQsT8?7&|JJ z%FDO`u?5WnInyMP6id)7k~2+gNwL--W<G)0BL@I_!!SG+XQE!_BTzvRsGta9?Ys!X za1_9RaF<kJ=Fz-6D2k$VN~YU@Ez9~sL<<tee6Cij|Jt1|N~V{2B6=$jBazWIS>FeZ z2xMfoi5$pS5HnvB$ha=irCl-=<oo^|0QV9^4Ew&HWPZnF{;0vsCjoqjF?HN9jFZxR zqR3p3@B3o__5&F2VA?o<eU(b(MLMlolgq<uwOSp)k1u{6v@!g?VHkZ=b22CQZ&n@0 z*~!cY0c>UF)c`<5Zvc!;eIu6XnxiO+q9}@@C~ff__=g4#FJf4N00000NkvXXu0mjf D^d`aH literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_notification.png b/src/main/res/drawable-xxxhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e93fbd217701804de0b13f8d6fa47b1756d6cb GIT binary patch literal 1317 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf<Z~8yL>4nJ zL`(%?#+$k3mw|$kC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6F6<muuV zQZeW49p8-PP!aYI|0^@!q&#x}%e1iBqKP}z!F7sIOP^ke;UebE0&gwyw&*Q!X4YR{ zXnMVOOQqt<5_K)*Fp-!JdDg(d7?Y!C4LYO)y9|OwB@^FV5b(Tbt#`{q_lnuuzZLq$ zb*Dd7oqPN9`@JWonGA|80!|!YqHwFib?z5ej~qGj00_KYzUVY4OUM6XJW#zh>~-(X zojdo->a9;-$+aLthcDe|Cacn}^4Z?!%B|+Azxw*C>uT#;=PafhKhFMtSKoHObl=si z-X*E(73;(|L`xq(=XaRB;djx_JKe{`mw09|DJ<G}H}3SA-TSU>y~1+f%=a$^Zzs-O z@6{H<vS5mphs)c$asDp3ORqRi&c39&k^hj_O6Id^pII6V)9P3bG|G8zVW{Cvu$zCr ze#w-q%=jg2o!kjUMMWC3&(32jkUDU7)~PtA54)aM78@HI*JrL;>6*k8;8h7Ufi<m; z_ZQp#tEvp^pM3tgeQMCgg>tr@E)2oJ!P}1){^4s_JT0ou*=4!b)KjkBf44ogVYvTY zUUd;a<DHb9U*|LUwIu#n`*h#`hhHKmy#KA<`J(uSyxoSnGqr(QQ|A?4_#H19-rKBD zA$K5>fqC7vhOhJgS1b&O$TN|;zdNE~vhs=$EnBt(#=Q3Zk+VDcLbayq=bCSmbJ!WP z&$w$*F+<*lyVdN|jc1<ud-?L^{Wo&5z8WUf)YwS7US#*U_kl4%qifOksX<}oORqAt zwY8}++GK1_?{~X)?ONQnn-^{ghG<RAOMW)L<3&`o?e~nSGvBWYTU~!6BQ2L*;9>|@ z8$ZK!<`221n>R6^ditq1P-HE`iJLE$ADs2P^03*zyp&XSm%tLPmy&i2PiFqKl<v)u zbzE85y6W_`)mg{-7bI=8urV+wIOwK-Hi_YIqQt+vO`RWQC!9^|SE@bCel6WNYjI~L zf8>iq7Qx;b?-Feq;^KV#XIb>UH@kb-jiDSU)b+fwz4yDp-G+`l)4PX7()JxK;g{}b zTv<_l!mQ{1&f6Rc*$dk>ug}Pv&}E+X)tK{uAs)1tk;QR=&$aCbzyHmg{Iz$lwG{`` z(KG2jSGTuz$mxl2?Q~oGacbu;H>MZUAC}MLaja(eYxYMkSTTclL45oDR3(;N#xK7= z>@I0v@HX<oRf9izO0zD7dcR|qnalu3kX*ss`TM@^{qO4~{<OclYQQ7>)l#%`H~$Bl z_u<V?eXre{e1!GDnbT~iXRq0--pSq2A;vT9|Cxlhww^HzbN!wtGfeEf<nm=@<F4P6 zb}(dZy~V0zmA&9gwC9f*r`8IIGcatq{nnUaU53uiTY1~#uSWRKc3}%xe?9z>MV(Yt z-=Y~a{m-2{_ix$4X=Uf^wiT&+dwbi9bG4p!`C{>{Zod%oj5T4a-)F_l3hUf0cw393 zNquIe+<{Wty4P9_8-Y&!ekOhMk#`O2jvhTK@9yq?KjoPt1AoHvWaG4FKmC>$?+IHy zck_lLwVr?YZs>3{IiL9>A}E{u?C_Zy4u*~wN)1nYt2_KB{m5~LlntN)qNAR{H7NYc U3V-L1z#@&o)78&qol`;+01s(f)Bpeg literal 0 HcmV?d00001 From cb8c8caf7deed26a0b9019ff8a58e0764eddf762 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 27 Mar 2017 00:55:20 +0200 Subject: [PATCH 689/881] WiP activity for notifications --- src/main/AndroidManifest.xml | 1 + .../android/ui/activity/DrawerActivity.java | 5 +- .../ui/activity/NotificationsActivity.java | 78 +++++++++++++++ src/main/res/layout/notifications_layout.xml | 95 +++++++++++++++++++ src/main/res/menu/drawer_menu.xml | 5 + src/main/res/values/strings.xml | 4 + 6 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java create mode 100644 src/main/res/layout/notifications_layout.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 7edaab5356..5811a0ffe8 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -77,6 +77,7 @@ </activity> <activity android:name=".ui.activity.ManageAccountsActivity" /> <activity android:name=".ui.activity.UserInfoActivity" /> + <activity android:name=".ui.activity.NotificationsActivity" /> <activity android:name=".ui.activity.ParticipateActivity" /> <activity android:name=".ui.activity.ActivitiesListActivity"/> <activity android:name=".ui.activity.FolderSyncActivity" /> diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 2db1f849f9..8941747507 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -411,7 +411,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU activityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(activityIntent); break; - case R.id.nav_folder_sync: + case R.id.nav_notifications: + Intent notificationsIntent = new Intent(getApplicationContext(), NotificationsActivity.class); + startActivity(notificationsIntent); + break; case R.id.nav_folder_sync: Intent folderSyncIntent = new Intent(getApplicationContext(), FolderSyncActivity.class); startActivity(folderSyncIntent); break; diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java new file mode 100644 index 0000000000..61466c1140 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -0,0 +1,78 @@ +/** + * Nextcloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2017 Andy Scherzinger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.activity; + +import android.os.Bundle; +import android.view.MenuItem; + +import com.owncloud.android.R; +import com.owncloud.android.lib.common.utils.Log_OC; + +/** + * Activity displaying all server side stored activity items. + */ +public class NotificationsActivity extends FileActivity { + + private static final String TAG = NotificationsActivity.class.getSimpleName(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + Log_OC.v(TAG, "onCreate() start"); + super.onCreate(savedInstanceState); + + setContentView(R.layout.notifications_layout); + + // setup toolbar + setupToolbar(); + + // setup drawer + setupDrawer(R.id.nav_notifications); + getSupportActionBar().setTitle(getString(R.string.drawer_item_notifications)); + + setupContent(); + } + + /** + * sets up the UI elements and loads all activity items. + */ + private void setupContent() { + // TODO add all (recycler) view relevant code + data loading + adapter etc. + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval; + + switch (item.getItemId()) { + case android.R.id.home: + if (isDrawerOpen()) { + closeDrawer(); + } else { + openDrawer(); + } + + default: + retval = super.onOptionsItemSelected(item); + } + + return retval; + } +} diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml new file mode 100644 index 0000000000..adc1717207 --- /dev/null +++ b/src/main/res/layout/notifications_layout.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Andy Scherzinger + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clickable="true" + android:fitsSystemWindows="true"> + + <!-- The main content view --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <include + layout="@layout/toolbar_standard"/> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v7.widget.RecyclerView + android:id="@android:id/list" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipToPadding="false" + android:scrollbarStyle="outsideOverlay" + android:scrollbars="vertical" + android:visibility="visible" + android:layout_marginRight="-3dp" + android:layout_marginLeft="-3dp" + android:layout_marginBottom="-3dp"/> + + <LinearLayout + android:id="@android:id/progress" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:orientation="vertical" + android:visibility="gone"> + + <ProgressBar + android:id="@+id/notificationsSyncProgressBar" + android:layout_width="72dp" + android:layout_height="72dp" + android:layout_gravity="center_horizontal"/> + + <TextView + android:id="@+id/progressText" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_margin="@dimen/standard_half_margin" + android:text="@string/notifications_loading_activity" + android:textSize="26sp"/> + </LinearLayout> + + <TextView + android:id="@android:id/empty" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_margin="@dimen/standard_margin" + android:gravity="center" + android:text="@string/notifications_no_results" + android:visibility="gone" /> + </FrameLayout> + + </LinearLayout> + + <include + layout="@layout/drawer" + android:layout_width="240dp" + android:layout_height="match_parent" + android:layout_gravity="start"/> + +</android.support.v4.widget.DrawerLayout> \ No newline at end of file diff --git a/src/main/res/menu/drawer_menu.xml b/src/main/res/menu/drawer_menu.xml index 20e9df53ee..065c24d15e 100644 --- a/src/main/res/menu/drawer_menu.xml +++ b/src/main/res/menu/drawer_menu.xml @@ -73,6 +73,11 @@ android:orderInCategory="0" android:title="@string/drawer_item_recently_modified" android:visible="false"/> + <item + android:orderInCategory="0" + android:id="@+id/nav_notifications" + android:icon="@drawable/ic_notification" + android:title="@string/drawer_item_notifications"/> <item android:orderInCategory="0" android:id="@+id/nav_folder_sync" diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index ede1df8973..e9f57eb494 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Settings</string> <string name="drawer_item_uploads_list">Uploads</string> <string name="drawer_item_activities">Activities</string> + <string name="drawer_item_notifications">Notifications</string> <string name="drawer_quota">%1$s of %2$s used</string> <string name="drawer_close">Close</string> <string name="drawer_open">Open</string> @@ -581,6 +582,9 @@ <string name="activity_list_loading_activity">Loading activities…</string> <string name="activity_list_no_results">No activities found.</string> + <string name="notifications_loading_activity">Loading notifications…</string> + <string name="notifications_no_results">No notifications.</string> + <string name="upload_file_dialog_title">Input upload filename and filetype</string> <string name="upload_file_dialog_filename">Filename</string> <string name="upload_file_dialog_filetype">Filetype</string> From 20ac3b4e69583b8f3ef42d812c20d2f81eca7990 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 27 Mar 2017 19:10:47 +0200 Subject: [PATCH 690/881] empty list icon, use latest empty list layout and butterknife --- .../ic_list_empty_upload_backup.svg | 57 +++++++++++++++++ .../ic_notification_light_grey.svg | 58 +++++++++++++++++ .../notification-icon_backup.svg | 50 +++++++++++++++ .../ui/activity/NotificationsActivity.java | 59 ++++++++++++++++++ .../ic_notification_light_grey.png | Bin 0 -> 1158 bytes .../ic_notification_light_grey.png | Bin 0 -> 805 bytes .../ic_notification_light_grey.png | Bin 0 -> 1490 bytes .../ic_notification_light_grey.png | Bin 0 -> 2186 bytes .../ic_notification_light_grey.png | Bin 0 -> 2959 bytes src/main/res/layout/notifications_layout.xml | 33 +--------- src/main/res/values/strings.xml | 3 +- 11 files changed, 227 insertions(+), 33 deletions(-) create mode 100644 drawable_resources/ic_list_empty_upload_backup.svg create mode 100644 drawable_resources/ic_notification_light_grey.svg create mode 100644 drawable_resources/notification-icon_backup.svg create mode 100644 src/main/res/drawable-hdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-mdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-xhdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-xxhdpi/ic_notification_light_grey.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_notification_light_grey.png diff --git a/drawable_resources/ic_list_empty_upload_backup.svg b/drawable_resources/ic_list_empty_upload_backup.svg new file mode 100644 index 0000000000..02ecad0b38 --- /dev/null +++ b/drawable_resources/ic_list_empty_upload_backup.svg @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + width="24" + height="24" + viewBox="0 0 24 24" + id="svg2" + inkscape:version="0.91 r13725" + sodipodi:docname="ic_list_empty_upload.svg" + inkscape:export-filename="C:\DEV\src\Android\Nextcloud\designTweaks\res\drawable-xxxhdpi\ic_list_empty_upload.png" + inkscape:export-xdpi="1080" + inkscape:export-ydpi="1080"> + <metadata + id="metadata10"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs8" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1005" + id="namedview6" + showgrid="false" + inkscape:zoom="9.8333333" + inkscape:cx="-15.305085" + inkscape:cy="12" + inkscape:window-x="-9" + inkscape:window-y="-9" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" /> + <path + d="M9,16V10H5L12,3L19,10H15V16H9M5,20V18H19V20H5Z" + id="path4" + style="fill:#99cde9;fill-opacity:1" /> +</svg> diff --git a/drawable_resources/ic_notification_light_grey.svg b/drawable_resources/ic_notification_light_grey.svg new file mode 100644 index 0000000000..762dbee58a --- /dev/null +++ b/drawable_resources/ic_notification_light_grey.svg @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="16" + width="16" + version="1.1" + viewBox="0 0 16 16" + id="svg4" + sodipodi:docname="ic_notification_light_grey.svg" + inkscape:version="0.92.1 r15371" + inkscape:export-filename="C:\DEV\src\Android\Nextcloud\notifications\src\main\res\drawable-mdpi\ic_notification_light_grey.png" + inkscape:export-xdpi="432" + inkscape:export-ydpi="432"> + <metadata + id="metadata10"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs8" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1005" + id="namedview6" + showgrid="false" + inkscape:zoom="14.75" + inkscape:cx="-10.20339" + inkscape:cy="8" + inkscape:window-x="-9" + inkscape:window-y="-9" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="m8 2c-0.5523 0-1 0.4477-1 1 0 0.0472 0.021 0.0873 0.0273 0.1328-1.7366 0.4362-3.0273 1.9953-3.0273 3.8672v2l-1 1v1h10v-1l-1-1v-2c0-1.8719-1.291-3.431-3.0273-3.8672 0.0063-0.0455 0.0273-0.0856 0.0273-0.1328 0-0.5523-0.4477-1-1-1zm-2 10c0 1.1046 0.8954 2 2 2s2-0.8954 2-2z" + fill="#fff" + id="path2" + style="fill:#000000;fill-opacity:1;opacity:0.5" /> +</svg> diff --git a/drawable_resources/notification-icon_backup.svg b/drawable_resources/notification-icon_backup.svg new file mode 100644 index 0000000000..abe3ee0fed --- /dev/null +++ b/drawable_resources/notification-icon_backup.svg @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + xml:space="preserve" + height="62" + width="62" + enable-background="new 0 0 196.6 72" + y="0px" + x="0px" + viewBox="0 0 62.000002 62" + id="svg2" + inkscape:version="0.91 r13725" + sodipodi:docname="notification-icon.svg" + inkscape:export-filename="C:\DEV\src\Android\nextcloud_android\res\drawable-xxxhdpi\notification_icon.png" + inkscape:export-xdpi="139.35001" + inkscape:export-ydpi="139.35001"><metadata + id="metadata10"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs8" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1005" + id="namedview6" + showgrid="false" + inkscape:zoom="6.9411765" + inkscape:cx="31" + inkscape:cy="17" + inkscape:window-x="-9" + inkscape:window-y="-9" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" /><path + style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;block-progression:tb;white-space:normal;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#ffffff;color-rendering:auto;image-rendering:auto;shape-rendering:auto;enable-background:accumulate" + d="m 31.023729,17.856035 c -5.95,6e-4 -10.947,4.0745 -12.473,9.5549 -1.333,-2.931 -4.266,-5.0088 -7.674,-5.0092 -4.6384002,5e-4 -8.4524002,3.8142 -8.4530002,8.4532 -8.321e-4,4.6397 3.8137,8.4544 8.4534002,8.455 3.4081,-4.09e-4 6.3392,-2.0792 7.6716,-5.011 1.5261,5.4817 6.5242,9.5569 12.475,9.5569 5.918,4.57e-4 10.89,-4.0302 12.448,-9.4649 1.3541,2.8776 4.242,4.9184 7.6106,4.9188 4.6406,8.28e-4 8.4558,-3.8144 8.4551,-8.455 -4.57e-4,-4.6397 -3.8154,-8.454 -8.4551,-8.4533 -3.3687,8.57e-4 -6.2587,2.0412 -7.6123,4.9188 -1.559,-5.4338 -6.528,-9.4644 -12.446,-9.464 z m 0,4.9623 c 4.4687,-2.97e-4 8.0384,3.5683 8.0389,8.0371 2.28e-4,4.4693 -3.5696,8.0391 -8.0389,8.0388 -4.4687,-4.38e-4 -8.0375,-3.5701 -8.0372,-8.0388 4.57e-4,-4.4682 3.5689,-8.0366 8.0372,-8.0371 z m -20.147,4.5456 c 1.9576,2.26e-4 3.4908,1.5334 3.4911,3.491 3.43e-4,1.958 -1.533,3.4925 -3.4911,3.4927 -1.9580002,-2.28e-4 -3.4913002,-1.5347 -3.4911002,-3.4927 2.284e-4,-1.9575 1.5334,-3.4907 3.4911002,-3.491 z m 40.205,0 c 1.9579,-3.43e-4 3.4925,1.533 3.4927,3.491 4.57e-4,1.9584 -1.5343,3.493 -3.4927,3.4927 -1.958,-2.28e-4 -3.4914,-1.5347 -3.4911,-3.4927 2.21e-4,-1.9575 1.5335,-3.4907 3.4911,-3.491 z" + id="path4" + inkscape:connector-curvature="0" /></svg> \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 61466c1140..b59603479a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -21,11 +21,22 @@ package com.owncloud.android.ui.activity; import android.os.Bundle; +import android.support.v7.widget.RecyclerView; import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +import butterknife.BindString; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Unbinder; + /** * Activity displaying all server side stored activity items. */ @@ -33,12 +44,39 @@ public class NotificationsActivity extends FileActivity { private static final String TAG = NotificationsActivity.class.getSimpleName(); + @BindView(R.id.empty_list_view) + public LinearLayout emptyContentContainer; + + @BindView(R.id.empty_list_view_text) + public TextView emptyContentMessage; + + @BindView(R.id.empty_list_view_headline) + public TextView emptyContentHeadline; + + @BindView(R.id.empty_list_icon) + public ImageView emptyContentIcon; + + @BindView(R.id.empty_list_progress) + public ProgressBar emptyContentProgressBar; + + @BindView(android.R.id.list) + public RecyclerView recyclerView; + + @BindString(R.string.notifications_no_results_headline) + public String noResultsHeadline; + + @BindString(R.string.notifications_no_results_message) + public String noResultsMessage; + + private Unbinder unbinder; + @Override protected void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); super.onCreate(savedInstanceState); setContentView(R.layout.notifications_layout); + unbinder = ButterKnife.bind(this); // setup toolbar setupToolbar(); @@ -54,6 +92,9 @@ public class NotificationsActivity extends FileActivity { * sets up the UI elements and loads all activity items. */ private void setupContent() { + emptyContentIcon.setImageResource(R.drawable.ic_notification_light_grey); + setEmptyContent(noResultsHeadline,noResultsMessage); + // TODO add all (recycler) view relevant code + data loading + adapter etc. } @@ -75,4 +116,22 @@ public class NotificationsActivity extends FileActivity { return retval; } + + private void setLoadingMessage() { + emptyContentHeadline.setText(R.string.file_list_loading); + emptyContentMessage.setText(""); + + emptyContentIcon.setVisibility(View.GONE); + emptyContentProgressBar.setVisibility(View.VISIBLE); + } + + private void setEmptyContent(String headline, String message) { + if (emptyContentContainer != null && emptyContentMessage != null) { + emptyContentHeadline.setText(headline); + emptyContentMessage.setText(message); + + emptyContentProgressBar.setVisibility(View.GONE); + emptyContentIcon.setVisibility(View.VISIBLE); + } + } } diff --git a/src/main/res/drawable-hdpi/ic_notification_light_grey.png b/src/main/res/drawable-hdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..174aef918c57fc72deac98b9f212de8d495266fc GIT binary patch literal 1158 zcmV;11bO?3P)<h;3K|Lk000e1NJLTq003+N003+V1^@s6k7ifR00004b3#c}2nYxW zd<bNS00009a7bBm003jC003jC0f{@1#{d8T8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11OrJ#K~#90?cK|3RaX?p@o#R@DpsmZqG&>k+O$y=HT8v|tsNB| zNhw7tf`6csjzpa(J`kL!1F=5Af(kycwN`A<=wRPlOK3>%&E9M6b?)yoNdh-#t&?BQ z$=>IloDCu(A|fIpA|fIp(l`U&4P^Eq@Hw!u{q-~8E->TPQD#jEtOa}vOp`+Uw;A99 za1NL??kl@N?*=j$0uBRT@!$J12&@Ojfos59yVmk+LSP4gE&t<n!@yGDcG-5yYI!%X zNTa}xE?&P27%9|?iRgiCrn`M;wZA8<=z*;<`krb;53H9_Zs>iEIOu4R=30B(ALkC^ z7qXNzPkRgePOwp9q<PrKz;0kWusqW?{{*f8m)f6KFG66;fqlRfY0g!`Yv3|)2KcK` zjVx*oYyj8;d`CKsS$GAUCLM8Ao+@h%Yz6QGu+FLeUEmksxl{dl)i~(*6gUd3cI@F3 zU>k6sG%%?~ZGmk8eg>9!Hv)V>>gNgY*twT~)D+lO(rK`!o?5^r;3@FPxfh_GAI=2u z6Ln5%2Y^Y^>G7F!FI5D#8aP5a1=XqrYy@rqFTES_Gz9!e9e=YHvV?RNaQ(&dKEn2s zPB&3}M7k8__MV#O5jF<wbgbX2-N0I};+}yWaIW907O8i);vT*rO^~Dd4A|gN*ekHF zo$BWFjYm<Bz(z^Gq0y}eR#_MI2yBXaFFJQ?t93z-z&1M6EX90ZtOFY%_-$r$tRh|6 zH)9=G<dNZgO!vt;urcF$7RD`$d7KiPX4tZrbzmzOen~iu{u{Q;xSj>meX<U$=J&jM zWx7w+ft9+i&{LxWlSNWs!6>j`6j(3{EEokAi~<Wrfd!+$f>B_>D6n7@STL4>HSxl4 zhuOYa{WHWMaENBU;|%FGf$JDN-p?YiPFP<W)bcWnQD~(D>xZy9OhPLeSU-i;Q9QI# zf%Rip9YsSc5m-Nm)ln?85`i5g_(LQ!874i@?AM$dEin&k;=PBx%Ko#^m5yK(STG7K z7zGxL0t=?Z{~C{B_XN?}y#gM1Hz6V-A|g!};Soa9!1qSAP68K=YV{<-#MyF9l<L=C zi4d6O>I~Jb1Tj~H!0rQo8`PO0z*UI|fxRZJg;LtBcCD&K2n^C1U!`3&sIh2K0=ohH zR&e|GfSU!kpG}m&08RmK3T*ccX*eH(_d)~Rcn-WE|H1^vNk?!9kpcsFNLra8*Fz;Q z0OvDp%S5!m0Pc_`xD)h#N}mNz0B3VGWhG)@kdCxFq(`cEd+*;p;24>2@U#-)TH-<` zNy{HjF#np)Go%G>t`KB2IG-j2)-go7pJWB^*Li*c{6V^cQT?P?L_|bHL_|bHL`3@3 YJAFrSvrSwSa{vGU07*qoM6N<$f_`@XMF0Q* literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_notification_light_grey.png b/src/main/res/drawable-mdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..5da4e5e8f9193685a504ce7c84c3f4cb9d25d8a4 GIT binary patch literal 805 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!EX7WqAsj$Z!;#Vf<Z~8yL>4nJ zI2C{}W8SCuT%e$2iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}Ci#%N% zLn`LHoxL|J#8IMc{vVCk$4tGr9Ipuk|7h-DTfA}8r65;UZteAlr9T915#Y|vZHZ~> z;_@s>UYPNa-*6+R<};ayWV7OLXRM9YKiHmix>5Q4?(>v%v&ohT5^aefWNk2Mx5Gh` zf~^%SFBsQ1T+Qj_nx*hUr$Aid?zhjr4>UiRRW7#MHr?wi<AY-ja*Gf6E||LIBA;qe z(WJYqTe_a7C~sfTEIRLU=e;EHV@7-51wP<1X#cNl!s^3N->~(>-hawpRcx7Kn0J{T zU(cl9=)cOzE{OBh1GVI<HJ=zO82^Yp<yC22AbH1V-8}DW4e19aS$vmII`1gnP<<qF z)pzFS4e|%BbNqCOaa`VLeI!=Xy&?EO`Ge>l@eb7$+;{qC-1pba?Bpm8>RD~gcSlPu z*pTlI+qad?$uSRK@6et#%k14>9c|~U`yFK;Y_cep5EEEGEz6Pn$?r10cZ<tBC0B@; zu*HZxyP7KZ&^3tb)uV0tMVHz7Rvwzt<j1kuX=W&^CabJ?TC39QMIt30Geo=AbO!}Q z&k#M;qUE8vf>XGp6D08N?d`gh*jZneNp*65N@%i~p}?<pq8ZFw!6Ga6RAXXE(3{yl zO#B(w%rhH|4^$^8tEhwoXg>Ey@Z*W%P-*4J+B9cUf@dk~TUJX|$4RgJE)~DwwN#ya z;HMRH?#%BHBTN6+-(wb=>MC^MbnF2Gp5%xidFHwf>u8BX@ed|0@Kz1d|GZynQsB%h zO(Nd8o1C9ah`W&Ocud;SEj5TciY<)kSUr!7y@}<&D;0ga4O1hob#L@MSvaqN`A3g+ zM%>pM@2ozs{194wMWIM`#~;o;hwq9#y&V(JC^y-W&*bsEtC4qVS6|-It6RWSy~ES? h<(y<_;+cAbNk75ek1u`68(@-V@O1TaS?83{1OW1EPX+)0 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_notification_light_grey.png b/src/main/res/drawable-xhdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b930f0aff2a56e6f478a69c842061bb5f0a958b0 GIT binary patch literal 1490 zcma)+Yc!Mz7{}jtUSq~}P#Cu%xo;E^GBz|#Lm~HZS&{p7rlDrck{MLQpb{masl=iN z6^TsR+`0^B?WEk^uo>B0mSOj(>~!{={jz=7|2hBXf1cm-<@xZOC+~>IK?PY&SpWbO zTuB6PNfv)KT3S+PiBoNokV<iJ^+ijRj*iTg^fFXZU<v@_z+Vm8?aii3phoHea;gs{ zI+Y$yivs9$x<y=aLP|t9HOhiQi@Cah*8~8hrz^qPmr?O?{3S)z58Jy;p|GXznfvj{ zN%@UIy!a_CV$!M+Pnlzse0W%CQ<?t7uwBT>`~7f1a?WW>>EmqkW7ENMvYPiF-?Q+b zbnF@EY>jz^7uc_CB$BGHrCEKpqAy&Dlhgl(n$9$!sIiJ<poZPl*!4&{U8VvmEqG6J z1wT(m!}eh{y}dt3O@J1+aVDszLdeb%sz4~NE;ntkH`uCh{J?cuHLLr|>{cF~C3vHt z4Zec9YOrSN=JTL7qx8wt+=v|h=<<#?aZINazK(L$KInzN^`X*o++fzlq{#X?&^>_1 z30-`9PPoeIVP=xdNBjJLfr9RaX?6MWIEgmPNuQFtpRGjj4S4lgNrjZpe{JD;Jy~lW zx_L<y2Rp;KFi&pACy%!AWlO5*(Dxyxj@4?^ojkPmPid2rpsq@m*;<1y%}I`b95$M^ zw}2LvUCcc4KpjM-Q8IhiX+zkW7w<^A<R%-7W^A={wo&gf{e(;hIxvZv0`EL;geEeS zKN&c?xdWs?`+_kl^*OD}tx5|ulktvyfDu}KUA-UA9fR8C7|6CK%wioZxBxvy-oXl* zBkWPBwoCfq;kyDJp%>M<P{M+kH|Im3a^s(;#mCZ=%wdxy1&zu)ntZGZBd<e%A3dQT zq(7$EPfP|m(B0-1V|1sMQOAx<qK$1@!g(Jjb2tjF7VF7y03W__WV1(!k5jMAVvw6H zkz5u00C!XOAs%Cm#D_Z)IBM+ChO?rBir{_L#gdlzi6XTnd5!c88biiG8XxAE!}jVn z6TcQ_hZL=MuLGVzm~fG4#m)c*Mubh9sHq*`@Sh6zhZN1S&d3PNZO5nW9uF^R4|<hn ztj%E!$J&qgr#N8(F>vl^#5<d6OPD8CDts}us)g;8w)SihW-vAM@f$ORv#goPLNaFQ zC|-J)TdvDIQXZ#$s&h<%!0566m0tKhQR=LxK11Fl|7tEVxfK`YPy~usvMsI-j5jS~ z2Xn+g;m3dILkCh}+lJsb%jyit1-@SxVaWH1r{#LabhMBq>h$MYIEc0(%7PXOIlU}{ z?Xo1UiC!L;WpEC0!Q_876Nva=Ofh?l5K3KH&5hJT4j09BFQNmRaZ;b8hKbAa-R=Y& zBK`*BWcLAr5WMe&w|ud^S-zGtRhJb<@c#<@tn&NxtM{BUMqbSQpeUKR)~)4!2qh)H z?&vZKYDkHh@aG!t{^mY}e`U~kA=7pvVI*_ZySIuzFWi6g$RCXbC+5L+M)@soLsaTZ zCd(qA5k<N+!}4!LiJGGwoy;V-UxF*6>wNpc3@|YW<9zvDmRPB-M0-#*>=_dce+M6& z-{x&<ugBUggaF+@OtJSIc<t#L;-sn_rEPP@4HFC5CADqRTcb@%%PzewIRy~e{pIUF zs_E{$?rO75j}--bxR6ee!3pkC3&z^GS^-W8!;O?NjwbN6wx(}zgMAQ)KeMS`8CdM0 zdqt|SJ6uK>rQdc1opVJ#-GQ|q61XinWsSs&w7qVpDsGeo!Uj}5nnQgKJ^1<1mZ;i( z(3#vr25?}FXp@ns;(uA76sqPpW@S0F%4&B9QgW(xGnB9>;)5?q*QgH1IMj$$1ah)c eN%_C3dp)Vf%=fWCkozV77jQk`LAc`*mi0GkgMD`Z literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/ic_notification_light_grey.png b/src/main/res/drawable-xxhdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..026fb801206a9fe319063c5f5c942dc02480cb12 GIT binary patch literal 2186 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 Mj_$-Vd-}yc0qn~B*#H0l literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_notification_light_grey.png b/src/main/res/drawable-xxxhdpi/ic_notification_light_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..653be22635bcfc065e9b3ab5904697a2e90dd283 GIT binary patch literal 2959 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 literal 0 HcmV?d00001 diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml index adc1717207..73cccf8b52 100644 --- a/src/main/res/layout/notifications_layout.xml +++ b/src/main/res/layout/notifications_layout.xml @@ -49,39 +49,8 @@ android:layout_marginLeft="-3dp" android:layout_marginBottom="-3dp"/> - <LinearLayout - android:id="@android:id/progress" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:orientation="vertical" - android:visibility="gone"> + <include layout="@layout/empty_list"/> - <ProgressBar - android:id="@+id/notificationsSyncProgressBar" - android:layout_width="72dp" - android:layout_height="72dp" - android:layout_gravity="center_horizontal"/> - - <TextView - android:id="@+id/progressText" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:layout_margin="@dimen/standard_half_margin" - android:text="@string/notifications_loading_activity" - android:textSize="26sp"/> - </LinearLayout> - - <TextView - android:id="@android:id/empty" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:layout_margin="@dimen/standard_margin" - android:gravity="center" - android:text="@string/notifications_no_results" - android:visibility="gone" /> </FrameLayout> </LinearLayout> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index e9f57eb494..2e1680853d 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -583,7 +583,8 @@ <string name="activity_list_no_results">No activities found.</string> <string name="notifications_loading_activity">Loading notifications…</string> - <string name="notifications_no_results">No notifications.</string> + <string name="notifications_no_results_headline">No notifications</string> + <string name="notifications_no_results_message">Please check back later.</string> <string name="upload_file_dialog_title">Input upload filename and filetype</string> <string name="upload_file_dialog_filename">Filename</string> From 669f68444d10bdbf672ca2f0a0b6b5174056d0d3 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 27 Mar 2017 22:01:56 +0200 Subject: [PATCH 691/881] WiP data fetching --- .../ui/activity/NotificationsActivity.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index b59603479a..6b41f159a8 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -20,6 +20,7 @@ package com.owncloud.android.ui.activity; +import android.accounts.Account; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.view.MenuItem; @@ -30,7 +31,12 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.Notification; import butterknife.BindString; import butterknife.BindView; @@ -96,6 +102,42 @@ public class NotificationsActivity extends FileActivity { setEmptyContent(noResultsHeadline,noResultsMessage); // TODO add all (recycler) view relevant code + data loading + adapter etc. + fetchAndSetData(); + } + + private void populateList(Notification notifications) { + + } + + private void fetchAndSetData() { + Thread t = new Thread(new Runnable() { + public void run() { + Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); + RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); + RemoteOperationResult result = + getRemoteNotificationOperation.execute(account, NotificationsActivity.this); + + if (result.isSuccess() && result.getData() != null) { + final Notification notifications = (Notification) result.getData().get(0); + + runOnUiThread(new Runnable() { + @Override + public void run() { + populateList(notifications); + + emptyContentContainer.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } + }); + } else { + // show error + setEmptyContent(noResultsHeadline, result.getLogMessage()); + Log_OC.d(TAG, result.getLogMessage()); + } + } + }); + + t.start(); } @Override From d66499e1255a53ff2ae414570e067627f22f122b Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Mon, 27 Mar 2017 22:56:39 +0200 Subject: [PATCH 692/881] Try to fix --- .../android/ui/activity/NotificationsActivity.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 6b41f159a8..3f9d8898d1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -2,7 +2,9 @@ * Nextcloud Android client application * * @author Andy Scherzinger + * @author Mario Danic * Copyright (C) 2017 Andy Scherzinger + * Copyright (C) 2017 Mario Danic * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -36,7 +38,9 @@ import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; -import com.owncloud.android.lib.resources.notifications.Notification; +import com.owncloud.android.lib.resources.notifications.models.Notification; + +import java.util.List; import butterknife.BindString; import butterknife.BindView; @@ -105,7 +109,7 @@ public class NotificationsActivity extends FileActivity { fetchAndSetData(); } - private void populateList(Notification notifications) { + private void populateList(List<Notification> notifications) { } @@ -118,7 +122,7 @@ public class NotificationsActivity extends FileActivity { getRemoteNotificationOperation.execute(account, NotificationsActivity.this); if (result.isSuccess() && result.getData() != null) { - final Notification notifications = (Notification) result.getData().get(0); + final List<Notification> notifications = result.getNotificationData(); runOnUiThread(new Runnable() { @Override From febf4765344c3d59b1ca5e36162bcbb04b200576 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Tue, 28 Mar 2017 00:11:56 +0200 Subject: [PATCH 693/881] enforce refresh of SNAPSHOT lib dependencies --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 4469ed7ed9..68bd544bf2 100644 --- a/build.gradle +++ b/build.gradle @@ -221,6 +221,10 @@ dependencies { } +configurations.all { + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + tasks.withType(Test) { /// increased logging for tests testLogging { From 6e934c5e6d7ae0195617b6c04f9f5a029974861b Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 10:32:37 +0200 Subject: [PATCH 694/881] Fix notifications --- .../android/operations/GetServerInfoOperation.java | 5 +++-- .../android/ui/activity/NotificationsActivity.java | 13 +++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java b/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java index 1b4b7a9bb4..d12e5459a0 100644 --- a/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java +++ b/src/main/java/com/owncloud/android/operations/GetServerInfoOperation.java @@ -21,7 +21,7 @@ package com.owncloud.android.operations; -import java.util.ArrayList; +import android.content.Context; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.lib.common.OwnCloudClient; @@ -33,7 +33,7 @@ import com.owncloud.android.lib.resources.status.GetRemoteStatusOperation; import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.operations.DetectAuthenticationMethodOperation.AuthenticationMethod; -import android.content.Context; +import java.util.ArrayList; /** * Get basic information from an ownCloud server given its URL. @@ -78,6 +78,7 @@ public class GetServerInfoOperation extends RemoteOperation { // first: check the status of the server (including its version) GetRemoteStatusOperation getStatus = new GetRemoteStatusOperation(mContext); + RemoteOperationResult result = getStatus.execute(client); if (result.isSuccess()) { diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 3f9d8898d1..47717f0074 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -118,10 +118,10 @@ public class NotificationsActivity extends FileActivity { public void run() { Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); - RemoteOperationResult result = + final RemoteOperationResult result = getRemoteNotificationOperation.execute(account, NotificationsActivity.this); - if (result.isSuccess() && result.getData() != null) { + if (result.isSuccess() && result.getNotificationData() != null) { final List<Notification> notifications = result.getNotificationData(); runOnUiThread(new Runnable() { @@ -134,9 +134,14 @@ public class NotificationsActivity extends FileActivity { } }); } else { - // show error - setEmptyContent(noResultsHeadline, result.getLogMessage()); Log_OC.d(TAG, result.getLogMessage()); + // show error + runOnUiThread(new Runnable() { + @Override + public void run() { + setEmptyContent(noResultsHeadline, result.getLogMessage()); + } + }); } } }); From dfc95e6edd91345cac4ef904b5a3bb343ce7cbdb Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 12:29:59 +0200 Subject: [PATCH 695/881] Basics of push --- .../authentication/AccountAuthenticator.java | 49 +++++++++--- .../files/services/FileDownloader.java | 12 ++- .../android/files/services/FileUploader.java | 10 ++- .../android/syncadapter/FileSyncAdapter.java | 11 ++- .../android/ui/activity/FileActivity.java | 9 ++- .../android/ui/activity/UserInfoActivity.java | 11 ++- src/main/res/values/setup.xml | 2 +- src/modified/AndroidManifest.xml | 74 +++++++++++++++++++ .../ModifiedAuthenticatorActivity.java | 41 ++++++++++ .../firebase/NCFirebaseInstanceIDService.java | 47 ++++++++++++ .../firebase/NCFirebaseMessagingService.java | 71 ++++++++++++++++++ .../android/utils/GooglePlayUtils.java | 49 ++++++++++++ src/modified/res/values/setup.xml | 1 + 13 files changed, 371 insertions(+), 16 deletions(-) create mode 100644 src/modified/AndroidManifest.xml create mode 100644 src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java create mode 100644 src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java create mode 100644 src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java create mode 100644 src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index 2c8c68903f..d6f0d1b084 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -21,16 +21,19 @@ package com.owncloud.android.authentication; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; - -import android.accounts.*; +import android.accounts.AbstractAccountAuthenticator; +import android.accounts.Account; +import android.accounts.AccountAuthenticatorResponse; +import android.accounts.AccountManager; +import android.accounts.NetworkErrorException; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.widget.Toast; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; import com.owncloud.android.lib.common.accounts.AccountTypeUtils; import com.owncloud.android.lib.common.utils.Log_OC; @@ -90,8 +93,15 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { + e.getMessage(), e); return e.getFailureBundle(); } - - final Intent intent = new Intent(mContext, AuthenticatorActivity.class); + + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -134,7 +144,15 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Log_OC.e(TAG, "Failed to validate account type " + account.type + ": " + e.getMessage(), e); return e.getFailureBundle(); } - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -185,7 +203,13 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - final Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -215,7 +239,14 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { - final Intent intent = new Intent(mContext, AuthenticatorActivity.class); + + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index ff0a660103..8ee6c468ec 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,6 +41,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -51,10 +52,10 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.FileUtils; -import com.owncloud.android.ui.notifications.NotificationUtils; import com.owncloud.android.operations.DownloadFileOperation; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.ui.notifications.NotificationUtils; import com.owncloud.android.ui.preview.PreviewImageActivity; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.utils.ErrorMessageAdapter; @@ -579,7 +580,14 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index 3d23bdff57..8b2b647c61 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,6 +48,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1080,7 +1081,14 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + // let the user update credentials with one click + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 1213e19175..36160edafa 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,6 +37,7 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -399,7 +400,15 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { ); if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + // let the user update credentials with one click + Intent updateAccountCredentials; + if (!getContext().getResources().getBoolean(R.bool.push_enabled) + && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index a6b61ae320..1a7e9b0c02 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,6 +40,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -396,7 +397,13 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 513770bd4c..0317d3aaf2 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,6 +48,7 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -284,7 +285,15 @@ public class UserInfoActivity extends FileActivity { } private void changeAccountPassword(Account account) { - Intent updateAccountCredentials = new Intent(UserInfoActivity.this, AuthenticatorActivity.class); + // let the user update credentials with one click + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index d562aad889..fcfd1e0d92 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -118,7 +118,7 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> - + <bool name="push_enabled">false</bool> <!-- Files becomes Home --> <bool name="use_home">false</bool> diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml new file mode 100644 index 0000000000..10d6d06550 --- /dev/null +++ b/src/modified/AndroidManifest.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Mario Danic + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2, + as published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.owncloud.android" + android:versionCode="10040299" + android:versionName="1.4.2"> + + <application + android:name=".MainApp" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:fullBackupContent="@xml/backup_config" + android:theme="@style/Theme.ownCloud.Toolbar" + android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity"> + + <activity + android:name=".authentication.ModifiedAuthenticatorActivity" + android:exported="true" + android:launchMode="singleTask" + android:theme="@style/Theme.ownCloud.noActionBar.Login"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + + <data android:scheme="@string/oauth2_redirect_scheme" /> + </intent-filter> + <intent-filter> + <action android:name="com.owncloud.android.workaround.accounts.CREATE" /> + + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="@string/login_data_own_scheme" android:host="login"/> + </intent-filter> + </activity> + + <service + android:name=".services.firebase.NCFirebaseMessagingService"> + <intent-filter> + <action android:name="com.google.firebase.MESSAGING_EVENT"/> + </intent-filter> + </service> + + <service + android:name=".services.firebase.NCFirebaseInstanceIDService"> + <intent-filter> + <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> + </intent-filter> + </service> + + </application> + +</manifest> diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java new file mode 100644 index 0000000000..618578891a --- /dev/null +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -0,0 +1,41 @@ +package com.owncloud.android.authentication; + +import android.os.Bundle; + +import com.owncloud.android.utils.GooglePlayUtils; + +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GooglePlayUtils.checkPlayServices(this); + } + + @Override + protected void onResume() { + super.onResume(); + GooglePlayUtils.checkPlayServices(this); + } + +} \ No newline at end of file diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java new file mode 100644 index 0000000000..5d98057250 --- /dev/null +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -0,0 +1,47 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.services.firebase; + +import android.util.Log; + +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.iid.FirebaseInstanceIdService; + +public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { + private static final String TAG = "NCFirebaseInstanceID"; + + @Override + public void onTokenRefresh() { + + //Getting registration token + String refreshedToken = FirebaseInstanceId.getInstance().getToken(); + + //Displaying token on logcat + Log.d(TAG, "Refreshed token: " + refreshedToken); + + } + + private void sendRegistrationToServer(String token) { + //You can implement this method to store the token on your server + //Not required for current project + } + +} + diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java new file mode 100644 index 0000000000..c5de8530d5 --- /dev/null +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -0,0 +1,71 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.services.firebase; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; +import android.util.Log; + +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; +import com.owncloud.android.R; +import com.owncloud.android.ui.activity.FileDisplayActivity; + +public class NCFirebaseMessagingService extends FirebaseMessagingService { + private static final String TAG = "NCFirebaseMessaging"; + + @Override + public void onMessageReceived(RemoteMessage remoteMessage) { + Log.d(TAG, "From: " + remoteMessage.getFrom()); + Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); + + //Calling method to generate notification + sendNotification(remoteMessage.getNotification().getBody()); + } + + //This method is only generating push notification + //It is same as we did in earlier posts + private void sendNotification(String messageBody) { + Intent intent = new Intent(this, FileDisplayActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, + PendingIntent.FLAG_ONE_SHOT); + + Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("Firebase Push Notification") + .setContentText(messageBody) + .setAutoCancel(true) + .setSound(defaultSoundUri) + .setContentIntent(pendingIntent); + + NotificationManager notificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + + notificationManager.notify(0, notificationBuilder.build()); + } + +} \ No newline at end of file diff --git a/src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java b/src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java new file mode 100644 index 0000000000..9dd560a126 --- /dev/null +++ b/src/modified/java/com/owncloud/android/utils/GooglePlayUtils.java @@ -0,0 +1,49 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.utils; + +import android.app.Activity; +import android.util.Log; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; + +public class GooglePlayUtils { + private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; + private static final String TAG = "GooglePlayUtils"; + + public static boolean checkPlayServices(Activity activity) { + GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); + int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity); + if (resultCode != ConnectionResult.SUCCESS) { + if (apiAvailability.isUserResolvableError(resultCode)) { + apiAvailability.getErrorDialog(activity, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) + .show(); + } else { + Log.i(TAG, "This device is not supported."); + activity.finish(); + } + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index cabd9cbdb0..015e777ed2 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -112,6 +112,7 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> + <bool name="push_enabled">true</bool> <!-- Files becomes Home --> <bool name="use_home">true</bool> From c14d26f6354954e6c91ada7086311dd30ed13472 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 13:02:02 +0200 Subject: [PATCH 696/881] Improve custom handling --- .../authentication/AccountAuthenticator.java | 34 +++---------------- .../files/services/FileDownloader.java | 10 +----- .../android/files/services/FileUploader.java | 9 +---- .../android/syncadapter/FileSyncAdapter.java | 10 +----- .../android/ui/activity/FileActivity.java | 9 +---- .../android/ui/activity/UserInfoActivity.java | 10 +----- src/modified/AndroidManifest.xml | 15 ++++++-- .../ModifiedAuthenticatorActivity.java | 2 ++ src/modified/res/values/setup.xml | 2 +- 9 files changed, 24 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index d6f0d1b084..8bcee0be43 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -94,14 +94,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -145,14 +138,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -203,13 +189,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -240,13 +220,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Account account, String authTokenType, Bundle options) throws NetworkErrorException { - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index 8ee6c468ec..eb1065a677 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,7 +41,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -580,14 +579,7 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index 8b2b647c61..f4a98663c5 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,7 +48,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1082,13 +1081,7 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 36160edafa..d34c979e09 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,7 +37,6 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -401,14 +400,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getContext().getResources().getBoolean(R.bool.push_enabled) - && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 1a7e9b0c02..a6b61ae320 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,7 +40,6 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -397,13 +396,7 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 0317d3aaf2..d6fe3dc334 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,7 +48,6 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -286,14 +285,7 @@ public class UserInfoActivity extends FileActivity { private void changeAccountPassword(Account account) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml index 10d6d06550..15c87dde3d 100644 --- a/src/modified/AndroidManifest.xml +++ b/src/modified/AndroidManifest.xml @@ -17,9 +17,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.owncloud.android" - android:versionCode="10040299" - android:versionName="1.4.2"> + xmlns:tools="http://schemas.android.com/tools" + package="com.owncloud.android" + android:versionCode="10040299" + android:versionName="1.4.2"> <application android:name=".MainApp" @@ -54,6 +55,14 @@ <data android:scheme="@string/login_data_own_scheme" android:host="login"/> </intent-filter> </activity> + <activity + android:name=".authentication.AuthenticatorActivity" + tools:node="remove"/> + + <activity-alias + android:name=".authentication.AuthenticatorActivity" + android:targetActivity=".authentication.ModifiedAuthenticatorActivity" + tools:replace="android:targetActivity"/> <service android:name=".services.firebase.NCFirebaseMessagingService"> diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 618578891a..02b0f8116b 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,6 +1,7 @@ package com.owncloud.android.authentication; import android.os.Bundle; +import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -29,6 +30,7 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 015e777ed2..941bb0a132 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -112,7 +112,7 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> - <bool name="push_enabled">true</bool> + <bool name="push_enabled">false</bool> <!-- Files becomes Home --> <bool name="use_home">true</bool> From 9e1ceebf9c20d82659e82685b767162d160426c6 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 14:51:46 +0200 Subject: [PATCH 697/881] Remove push enabled --- src/main/res/values/setup.xml | 1 - src/modified/res/values/setup.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index fcfd1e0d92..d1da3caa49 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -118,7 +118,6 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> - <bool name="push_enabled">false</bool> <!-- Files becomes Home --> <bool name="use_home">false</bool> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 941bb0a132..cabd9cbdb0 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -112,7 +112,6 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> - <bool name="push_enabled">false</bool> <!-- Files becomes Home --> <bool name="use_home">true</bool> From d5170673fff12d9ac76c4572cd1ddfd72bb21735 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 14:55:21 +0200 Subject: [PATCH 698/881] Remove Mario --- .../android/authentication/ModifiedAuthenticatorActivity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 02b0f8116b..618578891a 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,7 +1,6 @@ package com.owncloud.android.authentication; import android.os.Bundle; -import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -30,7 +29,6 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } From ac088c14a078402cbd873ea98a8211ddba60c342 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Tue, 28 Mar 2017 17:50:28 +0200 Subject: [PATCH 699/881] initial UI implementation displaying notifications --- .../ui/activity/NotificationsActivity.java | 30 ++++-- .../ui/adapter/NotificationListAdapter.java | 91 +++++++++++++++++++ src/main/res/layout/notifications_layout.xml | 5 +- 3 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 47717f0074..987efcec59 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -24,6 +24,7 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.MenuItem; import android.view.View; @@ -39,6 +40,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; import com.owncloud.android.lib.resources.notifications.models.Notification; +import com.owncloud.android.ui.adapter.NotificationListAdapter; import java.util.List; @@ -80,6 +82,8 @@ public class NotificationsActivity extends FileActivity { private Unbinder unbinder; + private NotificationListAdapter adapter; + @Override protected void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); @@ -98,19 +102,27 @@ public class NotificationsActivity extends FileActivity { setupContent(); } + public void onDestroy() { + super.onDestroy(); + unbinder.unbind(); + } + /** * sets up the UI elements and loads all activity items. */ private void setupContent() { emptyContentIcon.setImageResource(R.drawable.ic_notification_light_grey); - setEmptyContent(noResultsHeadline,noResultsMessage); + setLoadingMessage(); + + adapter = new NotificationListAdapter(this); + recyclerView.setAdapter(adapter); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); - // TODO add all (recycler) view relevant code + data loading + adapter etc. fetchAndSetData(); } private void populateList(List<Notification> notifications) { - + adapter.setNotificationItems(notifications); } private void fetchAndSetData() { @@ -118,6 +130,7 @@ public class NotificationsActivity extends FileActivity { public void run() { Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); + Log_OC.d(TAG, "BEFORE getRemoteNotificationOperation.execute"); final RemoteOperationResult result = getRemoteNotificationOperation.execute(account, NotificationsActivity.this); @@ -127,10 +140,13 @@ public class NotificationsActivity extends FileActivity { runOnUiThread(new Runnable() { @Override public void run() { - populateList(notifications); - - emptyContentContainer.setVisibility(View.GONE); - recyclerView.setVisibility(View.VISIBLE); + if (notifications.size() > 0) { + populateList(notifications); + emptyContentContainer.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } else { + setEmptyContent(noResultsHeadline, noResultsMessage); + } } }); } else { diff --git a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java new file mode 100644 index 0000000000..728c242d13 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java @@ -0,0 +1,91 @@ +/** + * ownCloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2016 ownCloud Inc. + * <p/> + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * <p/> + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * <p/> + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.owncloud.android.R; +import com.owncloud.android.lib.resources.notifications.models.Notification; +import com.owncloud.android.utils.DisplayUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * This Adapter populates a ListView with all notifications for an account within the app. + */ +public class NotificationListAdapter extends RecyclerView.Adapter<NotificationListAdapter.NotificationViewHolder> { + private List<Notification> mValues; + private Context context; + + public NotificationListAdapter(Context context) { + this.mValues = new ArrayList<>(); + this.context = context; + } + + public void setNotificationItems(List<Notification> notificationItems) { + mValues.clear(); + mValues.addAll(notificationItems); + notifyDataSetChanged(); + } + + @Override + public NotificationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list_item, parent, false); + return new NotificationViewHolder(v); + } + + @Override + public void onBindViewHolder(NotificationViewHolder holder, int position) { + Notification notification = mValues.get(position); + holder.dateTime.setText(DisplayUtils.getRelativeTimestamp(context, notification.getDatetime().getTime())); + holder.subject.setText(notification.getSubject()); + holder.message.setText(notification.getMessage()); + + // Todo set proper action icon (to be clarified how to pick) + holder.activityIcon.setImageResource(R.drawable.ic_notification); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + static class NotificationViewHolder extends RecyclerView.ViewHolder { + private final ImageView activityIcon; + private final TextView subject; + private final TextView message; + private final TextView dateTime; + + private NotificationViewHolder(View itemView) { + super(itemView); + activityIcon = (ImageView) itemView.findViewById(R.id.activity_icon); + subject = (TextView) itemView.findViewById(R.id.activity_subject); + message = (TextView) itemView.findViewById(R.id.activity_message); + dateTime = (TextView) itemView.findViewById(R.id.activity_datetime); + } + } +} \ No newline at end of file diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml index 73cccf8b52..adb428ac2a 100644 --- a/src/main/res/layout/notifications_layout.xml +++ b/src/main/res/layout/notifications_layout.xml @@ -44,10 +44,7 @@ android:clipToPadding="false" android:scrollbarStyle="outsideOverlay" android:scrollbars="vertical" - android:visibility="visible" - android:layout_marginRight="-3dp" - android:layout_marginLeft="-3dp" - android:layout_marginBottom="-3dp"/> + android:visibility="visible"/> <include layout="@layout/empty_list"/> From 8eeec5f8918a29b1c868e841bc7081130e71384e Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Tue, 28 Mar 2017 17:55:15 +0200 Subject: [PATCH 700/881] add item divider via decorator --- .../android/ui/activity/NotificationsActivity.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 987efcec59..55a3252eb8 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -24,6 +24,7 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.os.Bundle; +import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.MenuItem; @@ -116,7 +117,13 @@ public class NotificationsActivity extends FileActivity { adapter = new NotificationListAdapter(this); recyclerView.setAdapter(adapter); - recyclerView.setLayoutManager(new LinearLayoutManager(this)); + + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), + layoutManager.getOrientation()); + + recyclerView.setLayoutManager(layoutManager); + recyclerView.addItemDecoration(dividerItemDecoration); fetchAndSetData(); } From 537c6a12f435ca42f08eb8a832b9d73261c11e7a Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 29 Mar 2017 18:57:18 +0200 Subject: [PATCH 701/881] Make notifications single instance --- src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 5811a0ffe8..b931bcc52d 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -77,7 +77,7 @@ </activity> <activity android:name=".ui.activity.ManageAccountsActivity" /> <activity android:name=".ui.activity.UserInfoActivity" /> - <activity android:name=".ui.activity.NotificationsActivity" /> + <activity android:name=".ui.activity.NotificationsActivity" android:launchMode="singleInstance"/> <activity android:name=".ui.activity.ParticipateActivity" /> <activity android:name=".ui.activity.ActivitiesListActivity"/> <activity android:name=".ui.activity.FolderSyncActivity" /> From 9684e89dafbf4d9dfed4c730f3422694059f9ab9 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 30 Mar 2017 16:07:26 +0200 Subject: [PATCH 702/881] Fix drawer menu item --- src/main/AndroidManifest.xml | 2 +- .../android/ui/activity/NotificationsActivity.java | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index b931bcc52d..dec71b5fea 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -77,7 +77,7 @@ </activity> <activity android:name=".ui.activity.ManageAccountsActivity" /> <activity android:name=".ui.activity.UserInfoActivity" /> - <activity android:name=".ui.activity.NotificationsActivity" android:launchMode="singleInstance"/> + <activity android:name=".ui.activity.NotificationsActivity"/> <activity android:name=".ui.activity.ParticipateActivity" /> <activity android:name=".ui.activity.ActivitiesListActivity"/> <activity android:name=".ui.activity.FolderSyncActivity" /> diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 55a3252eb8..56971b8555 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -23,6 +23,7 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; +import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; @@ -108,6 +109,14 @@ public class NotificationsActivity extends FileActivity { unbinder.unbind(); } + @Override + public void showFiles(boolean onDeviceOnly) { + super.showFiles(onDeviceOnly); + Intent i = new Intent(getApplicationContext(), FileDisplayActivity.class); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(i); + } + /** * sets up the UI elements and loads all activity items. */ From 1ab159163c43a9b808294798b939d39fa7b5004f Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 30 Mar 2017 17:38:24 +0200 Subject: [PATCH 703/881] Fix bunch of stuff --- .../ui/activity/NotificationsActivity.java | 120 ++++++++++++++---- src/main/res/layout/notifications_layout.xml | 39 ++++-- 2 files changed, 123 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 56971b8555..94671ce9ac 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -23,8 +23,12 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -35,8 +39,12 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; @@ -44,6 +52,7 @@ import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOp import com.owncloud.android.lib.resources.notifications.models.Notification; import com.owncloud.android.ui.adapter.NotificationListAdapter; +import java.io.IOException; import java.util.List; import butterknife.BindString; @@ -61,6 +70,12 @@ public class NotificationsActivity extends FileActivity { @BindView(R.id.empty_list_view) public LinearLayout emptyContentContainer; + @BindView(R.id.swipe_containing_list) + public SwipeRefreshLayout swipeListRefreshLayout; + + @BindView(R.id.swipe_containing_empty) + public SwipeRefreshLayout swipeEmptyListRefreshLayout; + @BindView(R.id.empty_list_view_text) public TextView emptyContentMessage; @@ -101,6 +116,23 @@ public class NotificationsActivity extends FileActivity { setupDrawer(R.id.nav_notifications); getSupportActionBar().setTitle(getString(R.string.drawer_item_notifications)); + swipeListRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + setLoadingMessage(); + fetchAndSetData(); + } + }); + + swipeEmptyListRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + setLoadingMessage(); + fetchAndSetData(); + + } + }); + setupContent(); } @@ -142,45 +174,79 @@ public class NotificationsActivity extends FileActivity { } private void fetchAndSetData() { + final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()); + final Context context = MainApp.getAppContext(); + Thread t = new Thread(new Runnable() { public void run() { - Account account = AccountUtils.getCurrentOwnCloudAccount(NotificationsActivity.this); - RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); - Log_OC.d(TAG, "BEFORE getRemoteNotificationOperation.execute"); - final RemoteOperationResult result = - getRemoteNotificationOperation.execute(account, NotificationsActivity.this); + OwnCloudAccount ocAccount = null; + try { + ocAccount = new OwnCloudAccount( + currentAccount, + context + ); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, MainApp.getAppContext()); + mClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount)); - if (result.isSuccess() && result.getNotificationData() != null) { - final List<Notification> notifications = result.getNotificationData(); + RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); + final RemoteOperationResult result = + getRemoteNotificationOperation.execute(mClient); - runOnUiThread(new Runnable() { - @Override - public void run() { - if (notifications.size() > 0) { - populateList(notifications); - emptyContentContainer.setVisibility(View.GONE); - recyclerView.setVisibility(View.VISIBLE); - } else { - setEmptyContent(noResultsHeadline, noResultsMessage); + if (result.isSuccess() && result.getNotificationData() != null) { + final List<Notification> notifications = result.getNotificationData(); + + runOnUiThread(new Runnable() { + @Override + public void run() { + if (notifications.size() > 0) { + populateList(notifications); + swipeEmptyListRefreshLayout.setVisibility(View.GONE); + swipeListRefreshLayout.setVisibility(View.VISIBLE); + } else { + setEmptyContent(noResultsHeadline, noResultsMessage); + } } - } - }); - } else { - Log_OC.d(TAG, result.getLogMessage()); - // show error - runOnUiThread(new Runnable() { - @Override - public void run() { - setEmptyContent(noResultsHeadline, result.getLogMessage()); - } - }); + }); + } else { + Log_OC.d(TAG, result.getLogMessage()); + // show error + runOnUiThread(new Runnable() { + @Override + public void run() { + setEmptyContent(noResultsHeadline, result.getLogMessage()); + } + }); + } + + hideRefreshLayoutLoader(); + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.e(TAG, "Account not found", e); + } catch (IOException e) { + Log_OC.e(TAG, "IO error", e); + } catch (OperationCanceledException e) { + Log_OC.e(TAG, "Operation has been canceled", e); + } catch (AuthenticatorException e) { + Log_OC.e(TAG, "Authentication Exception", e); } } }); t.start(); + } + private void hideRefreshLayoutLoader() { + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeListRefreshLayout.setRefreshing(false); + swipeEmptyListRefreshLayout.setRefreshing(false); + } + }); + } + + @Override public boolean onOptionsItemSelected(MenuItem item) { boolean retval; diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml index adb428ac2a..5916db6ae2 100644 --- a/src/main/res/layout/notifications_layout.xml +++ b/src/main/res/layout/notifications_layout.xml @@ -3,6 +3,7 @@ Nextcloud Android client application Copyright (C) 2017 Andy Scherzinger + Copyright (C) 2017 Mario Danic This program is free software; you can redistribute it and/or modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -17,8 +18,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. --> -<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" - xmlns:android="http://schemas.android.com/apk/res/android" +<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" @@ -37,16 +38,36 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <android.support.v7.widget.RecyclerView - android:id="@android:id/list" + <android.support.v4.widget.SwipeRefreshLayout + android:id="@+id/swipe_containing_list" android:layout_width="match_parent" android:layout_height="match_parent" - android:clipToPadding="false" - android:scrollbarStyle="outsideOverlay" - android:scrollbars="vertical" - android:visibility="visible"/> + android:footerDividersEnabled="false" + android:visibility="visible"> - <include layout="@layout/empty_list"/> + <android.support.v7.widget.RecyclerView + android:id="@android:id/list" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="-3dp" + android:layout_marginLeft="-3dp" + android:layout_marginRight="-3dp" + android:clipToPadding="false" + android:scrollbarStyle="outsideOverlay" + android:scrollbars="vertical" + android:visibility="visible"/> + + </android.support.v4.widget.SwipeRefreshLayout> + + <android.support.v4.widget.SwipeRefreshLayout + android:id="@+id/swipe_containing_empty" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:footerDividersEnabled="false" + android:visibility="visible"> + + <include layout="@layout/empty_list"/> + </android.support.v4.widget.SwipeRefreshLayout> </FrameLayout> From 53678207f023ca139c74a3ffe32228ff1f44fbb5 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger <info@andy-scherzinger.de> Date: Sun, 26 Mar 2017 00:53:28 +0100 Subject: [PATCH 704/881] WiP use notifications library branch --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 68bd544bf2..e87996e5c3 100644 --- a/build.gradle +++ b/build.gradle @@ -178,6 +178,7 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' + compile 'com.github.nextcloud:android-library:notifications-SNAPSHOT' compile 'com.github.nextcloud:android-library:1.0.14' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" From a382872313a9b48025276a4f9453f34787ecf2f1 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 27 Mar 2017 00:55:20 +0200 Subject: [PATCH 705/881] WiP activity for notifications --- src/main/AndroidManifest.xml | 2 +- .../java/com/owncloud/android/ui/activity/DrawerActivity.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index dec71b5fea..5811a0ffe8 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -77,7 +77,7 @@ </activity> <activity android:name=".ui.activity.ManageAccountsActivity" /> <activity android:name=".ui.activity.UserInfoActivity" /> - <activity android:name=".ui.activity.NotificationsActivity"/> + <activity android:name=".ui.activity.NotificationsActivity" /> <activity android:name=".ui.activity.ParticipateActivity" /> <activity android:name=".ui.activity.ActivitiesListActivity"/> <activity android:name=".ui.activity.FolderSyncActivity" /> diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 8941747507..6d431973d4 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -414,7 +414,8 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU case R.id.nav_notifications: Intent notificationsIntent = new Intent(getApplicationContext(), NotificationsActivity.class); startActivity(notificationsIntent); - break; case R.id.nav_folder_sync: + break; + case R.id.nav_folder_sync: Intent folderSyncIntent = new Intent(getApplicationContext(), FolderSyncActivity.class); startActivity(folderSyncIntent); break; From a49f8792ee9d4e5143d46044a6560e7d4dfb9ef8 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 27 Mar 2017 22:01:56 +0200 Subject: [PATCH 706/881] WiP data fetching --- .../com/owncloud/android/ui/activity/NotificationsActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 94671ce9ac..c3149100df 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -167,6 +167,7 @@ public class NotificationsActivity extends FileActivity { recyclerView.addItemDecoration(dividerItemDecoration); fetchAndSetData(); + fetchAndSetData(); } private void populateList(List<Notification> notifications) { From 9ea45c74a70862a98599c05d75d6bbdfa0cbd954 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 12:29:59 +0200 Subject: [PATCH 707/881] Basics of push --- .../authentication/AccountAuthenticator.java | 34 ++++++++++++++++--- .../files/services/FileDownloader.java | 10 +++++- .../android/files/services/FileUploader.java | 9 ++++- .../android/syncadapter/FileSyncAdapter.java | 10 +++++- .../android/ui/activity/FileActivity.java | 9 ++++- .../android/ui/activity/UserInfoActivity.java | 10 +++++- src/main/res/values/setup.xml | 2 ++ src/modified/res/values/setup.xml | 1 + 8 files changed, 76 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index 8bcee0be43..d6f0d1b084 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -94,7 +94,14 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -138,7 +145,14 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } + intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -189,7 +203,13 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) + && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -220,7 +240,13 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Account account, String authTokenType, Bundle options) throws NetworkErrorException { - Intent intent = new Intent(mContext, AuthenticatorActivity.class); + Intent intent; + if (!mContext.getResources().getBoolean(R.bool.push_enabled) && + !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { + intent = new Intent(mContext, AuthenticatorActivity.class); + } else { + intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); + } intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index eb1065a677..8ee6c468ec 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,6 +41,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -579,7 +580,14 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index f4a98663c5..8b2b647c61 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,6 +48,7 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1081,7 +1082,13 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) + && !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index d34c979e09..36160edafa 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,6 +37,7 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -400,7 +401,14 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getContext().getResources().getBoolean(R.bool.push_enabled) + && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index a6b61ae320..1a7e9b0c02 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,6 +40,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -396,7 +397,13 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index d6fe3dc334..0317d3aaf2 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,6 +48,7 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -285,7 +286,14 @@ public class UserInfoActivity extends FileActivity { private void changeAccountPassword(Account account) { // let the user update credentials with one click - Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + Intent updateAccountCredentials; + if (!getResources().getBoolean(R.bool.push_enabled) && + !getResources().getBoolean(R.bool.analytics_enabled)) { + updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + } else { + updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); + } + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index d1da3caa49..92444bdd48 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -118,6 +118,8 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> + <bool name="push_enabled">false</bool> + <!-- Files becomes Home --> <bool name="use_home">false</bool> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index cabd9cbdb0..015e777ed2 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -112,6 +112,7 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> + <bool name="push_enabled">true</bool> <!-- Files becomes Home --> <bool name="use_home">true</bool> From 1ea66071868b6a037ce04cd0790e4331af43f2cf Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 13:02:02 +0200 Subject: [PATCH 708/881] Improve custom handling --- .../authentication/AccountAuthenticator.java | 34 +++---------------- .../files/services/FileDownloader.java | 10 +----- .../android/files/services/FileUploader.java | 9 +---- .../android/syncadapter/FileSyncAdapter.java | 10 +----- .../android/ui/activity/FileActivity.java | 9 +---- .../android/ui/activity/UserInfoActivity.java | 10 +----- .../ModifiedAuthenticatorActivity.java | 2 ++ src/modified/res/values/setup.xml | 2 +- 8 files changed, 12 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java index d6f0d1b084..8bcee0be43 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java +++ b/src/main/java/com/owncloud/android/authentication/AccountAuthenticator.java @@ -94,14 +94,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures); @@ -145,14 +138,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { return e.getFailureBundle(); } - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } - + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); @@ -203,13 +189,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { } /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) - && !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(KEY_LOGIN_OPTIONS, options); @@ -240,13 +220,7 @@ public class AccountAuthenticator extends AbstractAccountAuthenticator { Account account, String authTokenType, Bundle options) throws NetworkErrorException { - Intent intent; - if (!mContext.getResources().getBoolean(R.bool.push_enabled) && - !mContext.getResources().getBoolean(R.bool.analytics_enabled)) { - intent = new Intent(mContext, AuthenticatorActivity.class); - } else { - intent = new Intent(mContext, ModifiedAuthenticatorActivity.class); - } + Intent intent = new Intent(mContext, AuthenticatorActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); intent.putExtra(KEY_ACCOUNT, account); intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType); diff --git a/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/src/main/java/com/owncloud/android/files/services/FileDownloader.java index 8ee6c468ec..eb1065a677 100644 --- a/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -41,7 +41,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -580,14 +579,7 @@ public class FileDownloader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index 8b2b647c61..f4a98663c5 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -48,7 +48,6 @@ import android.util.Pair; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; @@ -1082,13 +1081,7 @@ public class FileUploader extends Service if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) - && !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount() ); diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 36160edafa..d34c979e09 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -37,7 +37,6 @@ import android.support.v4.app.NotificationCompat; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -401,14 +400,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (needsToUpdateCredentials) { // let the user update credentials with one click // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getContext().getResources().getBoolean(R.bool.push_enabled) - && !getContext().getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(getContext(), ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 1a7e9b0c02..a6b61ae320 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -40,7 +40,6 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader; @@ -397,13 +396,7 @@ public abstract class FileActivity extends DrawerActivity } /// step 2 - request credentials to user - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACTION, diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 0317d3aaf2..d6fe3dc334 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -48,7 +48,6 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.authentication.ModifiedAuthenticatorActivity; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -286,14 +285,7 @@ public class UserInfoActivity extends FileActivity { private void changeAccountPassword(Account account) { // let the user update credentials with one click - Intent updateAccountCredentials; - if (!getResources().getBoolean(R.bool.push_enabled) && - !getResources().getBoolean(R.bool.analytics_enabled)) { - updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); - } else { - updateAccountCredentials = new Intent(this, ModifiedAuthenticatorActivity.class); - } - + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN); diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 618578891a..02b0f8116b 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,6 +1,7 @@ package com.owncloud.android.authentication; import android.os.Bundle; +import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -29,6 +30,7 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 015e777ed2..941bb0a132 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -112,7 +112,7 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> - <bool name="push_enabled">true</bool> + <bool name="push_enabled">false</bool> <!-- Files becomes Home --> <bool name="use_home">true</bool> From f21fe2b972a26be49fde61bf94825d1daabe6088 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 14:51:46 +0200 Subject: [PATCH 709/881] Remove push enabled --- src/main/res/values/setup.xml | 1 - src/modified/res/values/setup.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 92444bdd48..d562aad889 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -118,7 +118,6 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> - <bool name="push_enabled">false</bool> <!-- Files becomes Home --> <bool name="use_home">false</bool> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 941bb0a132..cabd9cbdb0 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -112,7 +112,6 @@ <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> - <bool name="push_enabled">false</bool> <!-- Files becomes Home --> <bool name="use_home">true</bool> From 76471322ef0ea05ad6502f99b17a43606389bb8b Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 28 Mar 2017 14:55:21 +0200 Subject: [PATCH 710/881] Remove Mario --- .../android/authentication/ModifiedAuthenticatorActivity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java index 02b0f8116b..618578891a 100644 --- a/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java +++ b/src/modified/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -1,7 +1,6 @@ package com.owncloud.android.authentication; import android.os.Bundle; -import android.util.Log; import com.owncloud.android.utils.GooglePlayUtils; @@ -30,7 +29,6 @@ public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.d("MARIO", "HERE"); GooglePlayUtils.checkPlayServices(this); } From efeeaf83d933f983770cccbad781ef146f1e4eb8 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 29 Mar 2017 18:57:18 +0200 Subject: [PATCH 711/881] Make notifications single instance --- src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 5811a0ffe8..b931bcc52d 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -77,7 +77,7 @@ </activity> <activity android:name=".ui.activity.ManageAccountsActivity" /> <activity android:name=".ui.activity.UserInfoActivity" /> - <activity android:name=".ui.activity.NotificationsActivity" /> + <activity android:name=".ui.activity.NotificationsActivity" android:launchMode="singleInstance"/> <activity android:name=".ui.activity.ParticipateActivity" /> <activity android:name=".ui.activity.ActivitiesListActivity"/> <activity android:name=".ui.activity.FolderSyncActivity" /> From e429f351a3fcd014b4783c7175efd7abc7327d27 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 30 Mar 2017 16:07:26 +0200 Subject: [PATCH 712/881] Fix drawer menu item --- src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index b931bcc52d..dec71b5fea 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -77,7 +77,7 @@ </activity> <activity android:name=".ui.activity.ManageAccountsActivity" /> <activity android:name=".ui.activity.UserInfoActivity" /> - <activity android:name=".ui.activity.NotificationsActivity" android:launchMode="singleInstance"/> + <activity android:name=".ui.activity.NotificationsActivity"/> <activity android:name=".ui.activity.ParticipateActivity" /> <activity android:name=".ui.activity.ActivitiesListActivity"/> <activity android:name=".ui.activity.FolderSyncActivity" /> From 8604a144482ffb28f9bf3f02a9f5b2b7cdbfc309 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Fri, 31 Mar 2017 16:36:23 +0200 Subject: [PATCH 713/881] fix double method call --- .../com/owncloud/android/ui/activity/NotificationsActivity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index c3149100df..94671ce9ac 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -167,7 +167,6 @@ public class NotificationsActivity extends FileActivity { recyclerView.addItemDecoration(dividerItemDecoration); fetchAndSetData(); - fetchAndSetData(); } private void populateList(List<Notification> notifications) { From 50bed99eec47a58aa4acd675c40058f01ee88f07 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 7 Apr 2017 08:44:16 +0200 Subject: [PATCH 714/881] clear up notifications --- .../firebase/NCFirebaseMessagingService.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java index c5de8530d5..09f9f2193d 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -31,7 +31,7 @@ import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import com.owncloud.android.R; -import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.lib.resources.notifications.models.Notification; public class NCFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "NCFirebaseMessaging"; @@ -41,14 +41,11 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); - //Calling method to generate notification - sendNotification(remoteMessage.getNotification().getBody()); + sendNotification(remoteMessage.getNotification().ge); } - //This method is only generating push notification - //It is same as we did in earlier posts - private void sendNotification(String messageBody) { - Intent intent = new Intent(this, FileDisplayActivity.class); + private void sendNotification(String contentTitle) { + Intent intent = new Intent(this, NotificationsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); @@ -56,9 +53,7 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) - .setContentTitle("Firebase Push Notification") - .setContentText(messageBody) - .setAutoCancel(true) + .setContentTitle(contentTitle) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); From 047bd3cc8ef05ac3ed05a68ea77ca969d25bd8aa Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 7 Apr 2017 14:20:34 +0200 Subject: [PATCH 715/881] Work a bit more on notifications --- build.gradle | 4 +- src/main/res/values/setup.xml | 2 + .../firebase/NCFirebaseInstanceIDService.java | 79 +++++++- .../firebase/NCFirebaseMessagingService.java | 6 +- .../com/owncloud/android/utils/PushUtils.java | 170 ++++++++++++++++++ src/modified/res/values/setup.xml | 5 + 6 files changed, 253 insertions(+), 13 deletions(-) create mode 100644 src/modified/java/com/owncloud/android/utils/PushUtils.java diff --git a/build.gradle b/build.gradle index e87996e5c3..3dad14a9a0 100644 --- a/build.gradle +++ b/build.gradle @@ -178,8 +178,8 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' - compile 'com.github.nextcloud:android-library:notifications-SNAPSHOT' - compile 'com.github.nextcloud:android-library:1.0.14' + + compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index d562aad889..684d4cd561 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -122,6 +122,8 @@ <!-- Files becomes Home --> <bool name="use_home">false</bool> + <!-- Push server url --> + <string name="push_server_url" translatable="true"></string> </resources> diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index 5d98057250..4b6c5e6638 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -19,28 +19,89 @@ */ package com.owncloud.android.services.firebase; -import android.util.Log; +import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; +import android.text.TextUtils; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; +import com.owncloud.android.lib.resources.notifications.models.PushResponse; +import com.owncloud.android.utils.PushUtils; + +import java.io.IOException; +import java.security.PublicKey; public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "NCFirebaseInstanceID"; @Override public void onTokenRefresh() { + //You can implement this method to store the token on your server + if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { + PushUtils.generateRsa2048KeyPair(); + } - //Getting registration token - String refreshedToken = FirebaseInstanceId.getInstance().getToken(); - - //Displaying token on logcat - Log.d(TAG, "Refreshed token: " + refreshedToken); - + sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); } private void sendRegistrationToServer(String token) { - //You can implement this method to store the token on your server - //Not required for current project + String pushTokenHash = PushUtils.generateSHA512Hash(token); + PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); + if (devicePublicKey != null) { + String publicKey = devicePublicKey.toString(); + + Context context = MainApp.getAppContext(); + for (Account account : AccountUtils.getAccounts(context)) { + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); + + RemoteOperation registerAccountDeviceForNotificationsOperation = + new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, + publicKey, context.getResources().getString(R.string.push_server_url)); + + RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. + execute(mClient); + + if (remoteOperationResult.isSuccess()) { + PushResponse pushResponse = remoteOperationResult.getPushResponseData(); + + RemoteOperation registerAccountDeviceForProxyOperation = new + RegisterAccountDeviceForProxyOperation( + context.getResources().getString(R.string.push_server_url), + token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey()); + + remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); + } + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + + } + + } + } } diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java index 09f9f2193d..a3eff0d268 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -31,17 +31,18 @@ import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import com.owncloud.android.R; -import com.owncloud.android.lib.resources.notifications.models.Notification; +import com.owncloud.android.ui.activity.NotificationsActivity; public class NCFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "NCFirebaseMessaging"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { + super.onMessageReceived(remoteMessage); Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); - sendNotification(remoteMessage.getNotification().ge); + sendNotification(remoteMessage.getNotification().getTitle()); } private void sendNotification(String contentTitle) { @@ -55,6 +56,7 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(contentTitle) .setSound(defaultSoundUri) + .setAutoCancel(true) .setContentIntent(pendingIntent); NotificationManager notificationManager = diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java new file mode 100644 index 0000000000..a0dcbc5a3b --- /dev/null +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -0,0 +1,170 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.utils; + +import android.util.Base64; +import android.util.Log; + +import com.owncloud.android.MainApp; +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Key; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +public class PushUtils { + + private static final String TAG = "PushUtils"; + private static final String KEYPAIR_FOLDER = "nc-keypair"; + private static final String KEYPAIR_FILE_NAME = "push_key"; + private static final String KEYPAIR_PUB_EXTENSION = ".pub"; + + public static String generateSHA512Hash(String pushToken) { + MessageDigest messageDigest = null; + try { + messageDigest = MessageDigest.getInstance("SHA-512"); + byte[] byteData = messageDigest.digest(pushToken.getBytes("UTF-8")); + String base64 = Base64.encodeToString(byteData, Base64.NO_WRAP); + return base64; + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "SHA-512 algorithm not supported"); + } catch (UnsupportedEncodingException e) { + Log_OC.d(TAG, "Unsupported encoding"); + } + + return ""; + } + + public static int generateRsa2048KeyPair() { + String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + + KEYPAIR_FOLDER;; + + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; + File keyPathFile = new File(keyPath); + if (!new File(privateKeyPath).exists() && !new File(publicKeyPath).exists()) { + try { + Log.d("MARIO", keyPathFile.getAbsolutePath()); + keyPathFile.createNewFile(); + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + + KeyPair pair = keyGen.generateKeyPair(); + int statusPrivate = saveKeyToFile(pair.getPrivate(), privateKeyPath); + int statusPublic = saveKeyToFile(pair.getPublic(), publicKeyPath); + + if (statusPrivate == 0 && statusPublic == 0) { + // all went well + return 0; + } else { + return -2; + } + } catch (IOException e) { + Log_OC.d(TAG, "Failed to generate a keypair folder path" + e.getLocalizedMessage()); + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "RSA algorithm not supported"); + } + } else { + // we already have the key + return -1; + } + + // we failed to generate the key + return -2; + } + + public static Key readKeyFromFile(boolean readPublicKey) { + String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + + KEYPAIR_FOLDER;; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; + + String path; + + if (readPublicKey) { + path = publicKeyPath; + } else { + path = privateKeyPath; + } + + FileInputStream fileInputStream = null; + try { + fileInputStream = new FileInputStream(path); + byte[] bytes = new byte[fileInputStream.available()]; + fileInputStream.read(bytes); + fileInputStream.close(); + + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + + if (readPublicKey) { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); + PublicKey key = keyFactory.generatePublic(keySpec); + return key; + } else { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); + PrivateKey key = keyFactory.generatePrivate(keySpec); + return key; + } + + } catch (FileNotFoundException e) { + Log_OC.d(TAG, "Failed to find path while reading the Key"); + } catch (IOException e) { + Log_OC.d(TAG, "IOException while reading the key"); + } catch (InvalidKeySpecException e) { + Log_OC.d(TAG, "InvalidKeySpecException while reading the key"); + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "RSA algorithm not supported"); + } + + return null; + } + + private static int saveKeyToFile(Key key, String path) { + byte[] encoded = key.getEncoded(); + FileOutputStream keyFileOutputStream = null; + try { + keyFileOutputStream = new FileOutputStream(path); + keyFileOutputStream.write(encoded); + keyFileOutputStream.close(); + return 0; + } catch (FileNotFoundException e) { + Log_OC.d(TAG, "Failed to save key to file"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed to save key to file via IOException"); + } + + return -1; + } +} diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index cabd9cbdb0..4d93e4d335 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -109,6 +109,9 @@ <!-- login data links --> <string name="login_data_own_scheme" translatable="false">cloud</string> + <!-- url for webview login, with the protocol prefix + If set, will replace all other login methods available --> + <string name="webview_login_url" translatable="false"></string> <!-- analytics enabled --> <bool name="analytics_enabled">false</bool> @@ -116,6 +119,8 @@ <!-- Files becomes Home --> <bool name="use_home">true</bool> + <!-- Push server url --> + <string name="push_server_url" translatable="false"></string> </resources> From 8ef8a68a86ff5ce2a1ed27f8f1587e5b9dafc036 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Sun, 9 Apr 2017 10:38:37 +0200 Subject: [PATCH 716/881] Fix a few things --- build.gradle | 12 +++++------- src/main/res/values/setup.xml | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 3dad14a9a0..af4097f0f7 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:2.3.0' + classpath 'com.android.tools.build:gradle:2.3.1' classpath 'com.google.gms:google-services:3.0.0' } } @@ -37,14 +37,12 @@ ext { preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) } -configurations.all { - // Check for updates every build - resolutionStrategy.cacheChangingModulesFor 0, 'seconds' -} - repositories { jcenter() maven { url "https://jitpack.io" } + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } flatDir { dirs 'libs' @@ -103,7 +101,7 @@ android { // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure dexOptions { - // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. + // Skip pre-dexing whe`n running on Travis CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !travisBuild } diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 684d4cd561..f50d817c74 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -123,7 +123,7 @@ <bool name="use_home">false</bool> <!-- Push server url --> - <string name="push_server_url" translatable="true"></string> + <string name="push_server_url" translatable="false"></string> </resources> From 0cabc398b1c5ddcb9f2a705006bd626a20fcfaab Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Sun, 9 Apr 2017 11:03:15 +0200 Subject: [PATCH 717/881] Fix sha512 magic --- .../com/owncloud/android/utils/PushUtils.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index a0dcbc5a3b..ad52adff4a 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -20,9 +20,6 @@ package com.owncloud.android.utils; -import android.util.Base64; -import android.util.Log; - import com.owncloud.android.MainApp; import com.owncloud.android.lib.common.utils.Log_OC; @@ -31,15 +28,12 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; @@ -55,18 +49,23 @@ public class PushUtils { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("SHA-512"); - byte[] byteData = messageDigest.digest(pushToken.getBytes("UTF-8")); - String base64 = Base64.encodeToString(byteData, Base64.NO_WRAP); - return base64; + messageDigest.update(pushToken.getBytes()); + return bytesToHex(messageDigest.digest()); } catch (NoSuchAlgorithmException e) { Log_OC.d(TAG, "SHA-512 algorithm not supported"); - } catch (UnsupportedEncodingException e) { - Log_OC.d(TAG, "Unsupported encoding"); } - return ""; } + private static String bytesToHex(byte[] bytes) { + StringBuilder result = new StringBuilder(); + for (byte individualByte : bytes) { + result.append(Integer.toString((individualByte & 0xff) + 0x100, 16) + .substring(1)); + } + return result.toString(); + } + public static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER;; @@ -76,8 +75,9 @@ public class PushUtils { File keyPathFile = new File(keyPath); if (!new File(privateKeyPath).exists() && !new File(publicKeyPath).exists()) { try { - Log.d("MARIO", keyPathFile.getAbsolutePath()); - keyPathFile.createNewFile(); + if (!keyPathFile.exists()) { + keyPathFile.createNewFile(); + } KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); @@ -130,12 +130,10 @@ public class PushUtils { if (readPublicKey) { X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); - PublicKey key = keyFactory.generatePublic(keySpec); - return key; + return keyFactory.generatePublic(keySpec); } else { PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); - PrivateKey key = keyFactory.generatePrivate(keySpec); - return key; + return keyFactory.generatePrivate(keySpec); } } catch (FileNotFoundException e) { From 89ef51b7037af5bc17c91de4f25f7d1e7274b3a9 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Sun, 9 Apr 2017 11:20:15 +0200 Subject: [PATCH 718/881] Only send registration if all is well --- .../android/services/firebase/NCFirebaseInstanceIDService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index 4b6c5e6638..d772cd3a9f 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -52,9 +52,8 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { //You can implement this method to store the token on your server if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { PushUtils.generateRsa2048KeyPair(); + sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); } - - sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); } private void sendRegistrationToServer(String token) { From b787ee6caa2c6561a39b61a382ed845d7a81f138 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 12 Apr 2017 23:59:30 +0200 Subject: [PATCH 719/881] Work --- .../android/db/PreferenceManager.java | 32 +++++++ .../ui/activity/FileDisplayActivity.java | 12 +++ .../android/ui/events/TokenPushEvent.java | 27 ++++++ src/main/res/values/strings.xml | 2 + .../firebase/NCFirebaseInstanceIDService.java | 73 ++------------- .../firebase/NCFirebaseMessagingService.java | 6 +- .../com/owncloud/android/utils/PushUtils.java | 93 +++++++++++++++++-- 7 files changed, 168 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java diff --git a/src/main/java/com/owncloud/android/db/PreferenceManager.java b/src/main/java/com/owncloud/android/db/PreferenceManager.java index d680082f2b..32313dbddc 100644 --- a/src/main/java/com/owncloud/android/db/PreferenceManager.java +++ b/src/main/java/com/owncloud/android/db/PreferenceManager.java @@ -46,7 +46,33 @@ public abstract class PreferenceManager { private static final String PREF__INSTANT_VIDEO_UPLOAD_PATH_USE_SUBFOLDERS = "instant_video_upload_path_use_subfolders"; private static final String PREF__LEGACY_CLEAN = "legacyClean"; private static final String PREF__AUTO_UPLOAD_UPDATE_PATH = "autoUploadPathUpdate"; + private static final String PREF__PUSH_TOKEN = "pushToken"; + private static final String PREF__PUSH_TOKEN_UPDATE_TIME = "pushTokenLastUpdated"; + private static final String PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME = "pushTokenLastSent"; + public static void setPushTokenLastSentTime(Context context, long time) { + saveLongPreference(context, PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME, time); + } + + public static long getPushTokenLastSentTime(Context context) { + return getDefaultSharedPreferences(context).getLong(PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME, -1); + } + + public static void setPushToken(Context context, String pushToken) { + saveStringPreference(context, PREF__PUSH_TOKEN, pushToken); + } + + public static String getPushToken(Context context) { + return getDefaultSharedPreferences(context).getString(PREF__PUSH_TOKEN, ""); + } + + public static void setPushTokenUpdateTime(Context context, long time) { + saveLongPreference(context, PREF__PUSH_TOKEN_UPDATE_TIME, time); + } + + public static long getPushTokenUpdateTime(Context context) { + return getDefaultSharedPreferences(context).getLong(PREF__PUSH_TOKEN_UPDATE_TIME, -1); + } public static boolean instantPictureUploadEnabled(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_UPLOADING, false); @@ -267,6 +293,12 @@ public abstract class PreferenceManager { appPreferences.apply(); } + private static void saveLongPreference(Context context, String key, long value) { + SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit(); + appPreferences.putLong(key, value); + appPreferences.apply(); + } + public static SharedPreferences getDefaultSharedPreferences(Context context) { return android.preference.PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); } diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 04bf2b9375..f9e4d2a721 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -82,6 +82,8 @@ import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; +import com.owncloud.android.ui.events.SearchEvent; +import com.owncloud.android.ui.events.TokenPushEvent; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; @@ -97,6 +99,11 @@ import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.PermissionUtil; +import com.owncloud.android.utils.PushUtils; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.util.ArrayList; @@ -314,6 +321,11 @@ public class FileDisplayActivity extends HookActivity } } + @Subscribe(threadMode = ThreadMode.BACKGROUND) + public void onMessageEvent(TokenPushEvent event) { + PushUtils.pushRegistrationToServer(); + } + @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { diff --git a/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java b/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java new file mode 100644 index 0000000000..9794c09d29 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java @@ -0,0 +1,27 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.ui.events; + +/** + * Event to send push token where it belongs + */ + +public class TokenPushEvent { +} diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 2e1680853d..b22b8ef25a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -626,5 +626,7 @@ <string name="activities_no_results_headline">No activity yet</string> <string name="activities_no_results_message">This stream will show events like\nadditions, changes & shares</string> + <!-- Notifications --> + <string name="new_notification_received">New notification received</string> </resources> diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index d772cd3a9f..b21ddfb661 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -19,31 +19,16 @@ */ package com.owncloud.android.services.firebase; -import android.accounts.Account; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.content.Context; import android.text.TextUtils; +import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; import com.owncloud.android.MainApp; import com.owncloud.android.R; -import com.owncloud.android.authentication.AccountUtils; -import com.owncloud.android.lib.common.OwnCloudAccount; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; -import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; -import com.owncloud.android.lib.resources.notifications.models.PushResponse; +import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.utils.PushUtils; -import java.io.IOException; -import java.security.PublicKey; - public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "NCFirebaseInstanceID"; @@ -51,57 +36,13 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { public void onTokenRefresh() { //You can implement this method to store the token on your server if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { - PushUtils.generateRsa2048KeyPair(); - sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken()); - } - } - - private void sendRegistrationToServer(String token) { - String pushTokenHash = PushUtils.generateSHA512Hash(token); - PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); - if (devicePublicKey != null) { - String publicKey = devicePublicKey.toString(); - - Context context = MainApp.getAppContext(); - for (Account account : AccountUtils.getAccounts(context)) { - try { - OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); - OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). - getClientFor(ocAccount, context); - - RemoteOperation registerAccountDeviceForNotificationsOperation = - new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, - publicKey, context.getResources().getString(R.string.push_server_url)); - - RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. - execute(mClient); - - if (remoteOperationResult.isSuccess()) { - PushResponse pushResponse = remoteOperationResult.getPushResponseData(); - - RemoteOperation registerAccountDeviceForProxyOperation = new - RegisterAccountDeviceForProxyOperation( - context.getResources().getString(R.string.push_server_url), - token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), - pushResponse.getPublicKey()); - - remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); - } - } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { - Log_OC.d(TAG, "Failed to find an account"); - } catch (AuthenticatorException e) { - Log_OC.d(TAG, "Failed via AuthenticatorException"); - } catch (IOException e) { - Log_OC.d(TAG, "Failed via IOException"); - } catch (OperationCanceledException e) { - Log_OC.d(TAG, "Failed via OperationCanceledException"); - } - - } - + PreferenceManager.setPushToken(MainApp.getAppContext(), FirebaseInstanceId.getInstance().getToken()); + PreferenceManager.setPushTokenUpdateTime(MainApp.getAppContext(), System.currentTimeMillis()); } + if (PreferenceManager.getPushTokenLastSentTime(MainApp.getAppContext()) != -1) { + PushUtils.pushRegistrationToServer(); + } } - } diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java index a3eff0d268..0a641cd45c 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -26,10 +26,10 @@ import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; -import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.ui.activity.NotificationsActivity; @@ -39,10 +39,8 @@ public class NCFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); - Log.d(TAG, "From: " + remoteMessage.getFrom()); - Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); - sendNotification(remoteMessage.getNotification().getTitle()); + sendNotification(MainApp.getAppContext().getString(R.string.new_notification_received)); } private void sendNotification(String contentTitle) { diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index ad52adff4a..43d363e58d 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -20,8 +20,27 @@ package com.owncloud.android.utils; +import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; + import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; +import com.owncloud.android.lib.resources.notifications.models.PushResponse; import java.io.File; import java.io.FileInputStream; @@ -34,6 +53,7 @@ import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; @@ -43,6 +63,7 @@ public class PushUtils { private static final String TAG = "PushUtils"; private static final String KEYPAIR_FOLDER = "nc-keypair"; private static final String KEYPAIR_FILE_NAME = "push_key"; + private static final String KEYPAIR_PRIV_EXTENSION = ".priv"; private static final String KEYPAIR_PUB_EXTENSION = ".pub"; public static String generateSHA512Hash(String pushToken) { @@ -68,15 +89,17 @@ public class PushUtils { public static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator - + KEYPAIR_FOLDER;; + + KEYPAIR_FOLDER; + ; - String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; File keyPathFile = new File(keyPath); + if (!new File(privateKeyPath).exists() && !new File(publicKeyPath).exists()) { try { if (!keyPathFile.exists()) { - keyPathFile.createNewFile(); + keyPathFile.mkdir(); } KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); @@ -91,8 +114,6 @@ public class PushUtils { } else { return -2; } - } catch (IOException e) { - Log_OC.d(TAG, "Failed to generate a keypair folder path" + e.getLocalizedMessage()); } catch (NoSuchAlgorithmException e) { Log_OC.d(TAG, "RSA algorithm not supported"); } @@ -105,10 +126,65 @@ public class PushUtils { return -2; } + public static void pushRegistrationToServer() { + String token = PreferenceManager.getPushToken(MainApp.getAppContext()); + if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && + !TextUtils.isEmpty(token)) { + PushUtils.generateRsa2048KeyPair(); + String pushTokenHash = PushUtils.generateSHA512Hash(token).toUpperCase(); + PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); + if (devicePublicKey != null) { + byte[] publicKeyBytes = Base64.encode(devicePublicKey.getEncoded(), 0); + String publicKey = new String(publicKeyBytes); + + Context context = MainApp.getAppContext(); + for (Account account : AccountUtils.getAccounts(context)) { + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); + + RemoteOperation registerAccountDeviceForNotificationsOperation = + new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, + publicKey, context.getResources().getString(R.string.push_server_url)); + + RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. + execute(mClient); + + if (remoteOperationResult.isSuccess()) { + PushResponse pushResponse = remoteOperationResult.getPushResponseData(); + + RemoteOperation registerAccountDeviceForProxyOperation = new + RegisterAccountDeviceForProxyOperation( + context.getResources().getString(R.string.push_server_url), + token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey()); + + remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); + Log.d("THIS IS MARIO", "MARIO"); + PreferenceManager.setPushTokenLastSentTime(MainApp.getAppContext(), + System.currentTimeMillis()); + + } + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + } + } + } + } + public static Key readKeyFromFile(boolean readPublicKey) { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator - + KEYPAIR_FOLDER;; - String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME; + + KEYPAIR_FOLDER; + ; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; String path; @@ -153,6 +229,9 @@ public class PushUtils { byte[] encoded = key.getEncoded(); FileOutputStream keyFileOutputStream = null; try { + if (!new File(path).exists()) { + new File(path).createNewFile(); + } keyFileOutputStream = new FileOutputStream(path); keyFileOutputStream.write(encoded); keyFileOutputStream.close(); From 0eab8f9a2eea5e569d49234598f94f88eb35f4eb Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 18 Apr 2017 23:10:29 +0200 Subject: [PATCH 720/881] Fix initial subscription --- .../java/com/owncloud/android/utils/PushUtils.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index 43d363e58d..3f9cb76581 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -26,7 +26,6 @@ import android.accounts.OperationCanceledException; import android.content.Context; import android.text.TextUtils; import android.util.Base64; -import android.util.Log; import com.owncloud.android.MainApp; import com.owncloud.android.R; @@ -131,11 +130,14 @@ public class PushUtils { if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && !TextUtils.isEmpty(token)) { PushUtils.generateRsa2048KeyPair(); - String pushTokenHash = PushUtils.generateSHA512Hash(token).toUpperCase(); + String pushTokenHash = PushUtils.generateSHA512Hash(token).toLowerCase(); PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); if (devicePublicKey != null) { - byte[] publicKeyBytes = Base64.encode(devicePublicKey.getEncoded(), 0); + byte[] publicKeyBytes = Base64.encode(devicePublicKey.getEncoded(), Base64.NO_WRAP); String publicKey = new String(publicKeyBytes); + publicKey = publicKey.replaceAll("(.{64})", "$1\n"); + + publicKey = "-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-----END PUBLIC KEY-----\n"; Context context = MainApp.getAppContext(); for (Account account : AccountUtils.getAccounts(context)) { @@ -146,7 +148,8 @@ public class PushUtils { RemoteOperation registerAccountDeviceForNotificationsOperation = new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, - publicKey, context.getResources().getString(R.string.push_server_url)); + publicKey, + context.getResources().getString(R.string.push_server_url)); RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. execute(mClient); @@ -161,7 +164,6 @@ public class PushUtils { pushResponse.getPublicKey()); remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); - Log.d("THIS IS MARIO", "MARIO"); PreferenceManager.setPushTokenLastSentTime(MainApp.getAppContext(), System.currentTimeMillis()); From b3a9c56511ef22893642e00b519e682335ddceb6 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 12:35:38 +0200 Subject: [PATCH 721/881] Update things --- build.gradle.modified | 236 ++++++++++++++++++ .../ui/activity/FileDisplayActivity.java | 13 +- .../ui/activity/NotificationsActivity.java | 1 + src/modified/AndroidManifest.xml | 19 +- .../firebase/NCFirebaseInstanceIDService.java | 3 - .../activity/ModifiedFileDisplayActivity.java | 36 +++ .../com/owncloud/android/utils/PushUtils.java | 1 - 7 files changed, 293 insertions(+), 16 deletions(-) create mode 100644 build.gradle.modified create mode 100644 src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java diff --git a/build.gradle.modified b/build.gradle.modified new file mode 100644 index 0000000000..07e9827606 --- /dev/null +++ b/build.gradle.modified @@ -0,0 +1,236 @@ +// Gradle build file +// +// This project was started in Eclipse and later moved to Android Studio. In the transition, both IDEs were supported. +// Due to this, the files layout is not the usual in new projects created with Android Studio / gradle. This file +// merges declarations usually split in two separates build.gradle file, one for global settings of the project in +// its root folder, another one for the app module in subfolder of root. + +buildscript { + repositories { + jcenter() + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.google.gms:google-services:3.0.0' + } +} + +apply plugin: 'com.android.application' +apply plugin: 'checkstyle' +apply plugin: 'pmd' +apply plugin: 'findbugs' + +configurations.all { + // check for updates every build + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + +ext { + supportLibraryVersion = '25.0.0' + + travisBuild = System.getenv("TRAVIS") == "true" + + // allows for -Dpre-dex=false to be set + preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) +} + +repositories { + jcenter() + maven { url "https://jitpack.io" } + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + + flatDir { + dirs 'libs' + } +} + +android { + lintOptions { + abortOnError true + lintConfig file("${project.rootDir}/lint.xml") + htmlReport true + htmlOutput file("$project.buildDir/reports/lint/lint.html") + } + + dexOptions { + javaMaxHeapSize "4g" + } + + compileSdkVersion 25 + buildToolsVersion '25.0.0' + + defaultConfig { + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + // arguments to be passed to functional tests + testInstrumentationRunnerArgument "TEST_USER", "\"$System.env.OCTEST_APP_USERNAME\"" + testInstrumentationRunnerArgument "TEST_PASSWORD", "\"$System.env.OCTEST_APP_PASSWORD\"" + testInstrumentationRunnerArgument "TEST_SERVER_URL", "\"$System.env.OCTEST_SERVER_BASE_URL\"" + + multiDexEnabled true + + // adapt structure from Eclipse to Gradle/Android Studio expectations; + // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure + + productFlavors { + generic { + applicationId 'com.nextcloud.client' + } + + modified { + // structure is: + // domain tld + // domain name + // .client + applicationId 'com.custom.client' + } + } + + configurations { + modifiedCompile + } + } + + + // adapt structure from Eclipse to Gradle/Android Studio expectations; + // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure + + dexOptions { + // Skip pre-dexing whe`n running on Travis CI or when disabled via -Dpre-dex=false. + preDexLibraries = preDexEnabled && !travisBuild + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + lintOptions { + abortOnError false + } + + packagingOptions { + exclude 'META-INF/LICENSE.txt' + } + + task checkstyle(type: Checkstyle) { + configFile = file("${rootProject.projectDir}/checkstyle.xml") + configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath + source 'src' + include '**/*.java' + exclude '**/gen/**' + classpath = files() + } + + task pmd(type: Pmd) { + ruleSetFiles = files("${project.rootDir}/pmd-ruleset.xml") + ignoreFailures = false + ruleSets = [] + + source 'src' + include '**/*.java' + exclude '**/gen/**' + + reports { + xml.enabled = false + html.enabled = true + xml { + destination "$project.buildDir/reports/pmd/pmd.xml" + } + html { + destination "$project.buildDir/reports/pmd/pmd.html" + } + } + } + + task findbugs(type: FindBugs) { + ignoreFailures = false + effort = "max" + reportLevel = "high" + classes = files("$project.buildDir/intermediates/classes") + excludeFilter = new File("${project.rootDir}/findbugs-filter.xml") + source 'src' + include '**/*.java' + exclude '**/gen/**' + + reports { + xml.enabled = false + html.enabled = true + html { + destination "$project.buildDir/reports/findbugs/findbugs.html" + } + } + classpath = files() + } + check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint' + +} + +dependencies { + /// dependencies for app building + compile name: 'touch-image-view' + compile 'com.android.support:multidex:1.0.1' + + + compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' + compile "com.android.support:support-v4:${supportLibraryVersion}" + compile "com.android.support:design:${supportLibraryVersion}" + compile 'com.jakewharton:disklrucache:2.0.2' + compile "com.android.support:appcompat-v7:${supportLibraryVersion}" + compile "com.android.support:cardview-v7:${supportLibraryVersion}" + compile 'com.getbase:floatingactionbutton:1.10.1' + compile 'com.google.code.findbugs:annotations:2.0.1' + compile group: 'commons-io', name: 'commons-io', version: '2.4' + compile 'com.github.evernote:android-job:v1.1.9' + compile 'com.jakewharton:butterknife:8.4.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' + compile 'org.greenrobot:eventbus:3.0.0' + + compile 'com.google.android.gms:play-services:10.2.1' + + compile 'org.parceler:parceler-api:1.1.6' + annotationProcessor 'org.parceler:parceler:1.1.6' + + compile 'com.github.bumptech.glide:glide:3.7.0' + compile 'com.caverock:androidsvg:1.2.1' + /// dependencies for local unit tests + testCompile 'junit:junit:4.12' + testCompile 'org.mockito:mockito-core:1.10.19' + + /// dependencies for instrumented tests + // JUnit4 Rules + androidTestCompile 'com.android.support.test:rules:0.5' + + // Android JUnit Runner + androidTestCompile 'com.android.support.test:runner:0.5' + + // Android Annotation Support + androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" + + // Espresso core + androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' + + // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests + //androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' + // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details + //androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" + +} + +configurations.all { + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + +tasks.withType(Test) { + /// increased logging for tests + testLogging { + events "passed", "skipped", "failed" + } +} + +apply plugin: 'com.google.gms.google-services' diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index f9e4d2a721..0433a4a6bc 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -82,7 +82,6 @@ import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; -import com.owncloud.android.ui.events.SearchEvent; import com.owncloud.android.ui.events.TokenPushEvent; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; @@ -99,11 +98,8 @@ import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.PermissionUtil; -import com.owncloud.android.utils.PushUtils; import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.util.ArrayList; @@ -321,11 +317,6 @@ public class FileDisplayActivity extends HookActivity } } - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onMessageEvent(TokenPushEvent event) { - PushUtils.pushRegistrationToServer(); - } - @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { @@ -925,7 +916,7 @@ public class FileDisplayActivity extends HookActivity /** * Request the operation for moving the file/folder from one path to another * - * @param data Intent received + * @param data Intent received */ private void requestMoveOperation(Intent data) { OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); @@ -936,7 +927,7 @@ public class FileDisplayActivity extends HookActivity /** * Request the operation for copying the file/folder from one path to another * - * @param data Intent received + * @param data Intent received */ private void requestCopyOperation(Intent data) { OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 94671ce9ac..40ad687e98 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -261,6 +261,7 @@ public class NotificationsActivity extends FileActivity { default: retval = super.onOptionsItemSelected(item); + break; } return retval; diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml index 15c87dde3d..3d828306e4 100644 --- a/src/modified/AndroidManifest.xml +++ b/src/modified/AndroidManifest.xml @@ -29,6 +29,16 @@ android:fullBackupContent="@xml/backup_config" android:theme="@style/Theme.ownCloud.Toolbar" android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity"> + <activity + android:name=".ui.activity.ModifiedFileDisplayActivity" + android:label="@string/app_name" + android:theme="@style/Theme.ownCloud.Toolbar.Drawer"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> <activity android:name=".authentication.ModifiedAuthenticatorActivity" @@ -55,15 +65,22 @@ <data android:scheme="@string/login_data_own_scheme" android:host="login"/> </intent-filter> </activity> + <activity - android:name=".authentication.AuthenticatorActivity" + android:name=".ui.activity.FileDisplayActivity" tools:node="remove"/> + <activity-alias + android:name=".ui.activity.FileDisplayActivity" + android:targetActivity=".ui.activity.ModifiedFileDisplayActivity" + tools:replace="android:targetActivity"/> + <activity-alias android:name=".authentication.AuthenticatorActivity" android:targetActivity=".authentication.ModifiedAuthenticatorActivity" tools:replace="android:targetActivity"/> + <service android:name=".services.firebase.NCFirebaseMessagingService"> <intent-filter> diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index b21ddfb661..a5ab4d409a 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -20,7 +20,6 @@ package com.owncloud.android.services.firebase; import android.text.TextUtils; -import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; @@ -38,9 +37,7 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { PreferenceManager.setPushToken(MainApp.getAppContext(), FirebaseInstanceId.getInstance().getToken()); PreferenceManager.setPushTokenUpdateTime(MainApp.getAppContext(), System.currentTimeMillis()); - } - if (PreferenceManager.getPushTokenLastSentTime(MainApp.getAppContext()) != -1) { PushUtils.pushRegistrationToServer(); } } diff --git a/src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java b/src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java new file mode 100644 index 0000000000..a2d17ca8ab --- /dev/null +++ b/src/modified/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java @@ -0,0 +1,36 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.activity; + +import com.owncloud.android.ui.events.TokenPushEvent; +import com.owncloud.android.utils.PushUtils; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +public class ModifiedFileDisplayActivity extends FileDisplayActivity { + + @Subscribe(threadMode = ThreadMode.BACKGROUND) + public void onMessageEvent(TokenPushEvent event) { + PushUtils.pushRegistrationToServer(); + } + +} diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index 3f9cb76581..efa8305161 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -89,7 +89,6 @@ public class PushUtils { public static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER; - ; String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; From ae58e82f0abd5285df142ee55562b14f77539648 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 13:51:13 +0200 Subject: [PATCH 722/881] dont build modified --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 710be1bac1..e9995cfe36 100644 --- a/.drone.yml +++ b/.drone.yml @@ -11,9 +11,9 @@ pipeline: # - ./gradlew connectedDebugAndroidTest --info # install app, then assemble and install instrumented tests of app module - ./gradlew :installGenericDebug - - ./gradlew :installModifiedDebug + #- ./gradlew :installModifiedDebug - ./gradlew :installGenericDebugAndroidTest - - ./gradlew :installModifiedDebugAndroidTest + #- ./gradlew :installModifiedDebugAndroidTest # run sample instrumented unit test # TODO fails because test runner is not available #- adb shell am instrument -w -e debug false -e class com.owncloud.android.datamodel.OCFileUnitTest com.owncloud.android.test/android.support.test.runner.AndroidJUnitRunner From a0fd11b3c490d1548cbe79e77fc931678395a5b8 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Tue, 20 Dec 2016 15:04:19 +0100 Subject: [PATCH 723/881] updated lib references --- THIRD_PARTY.txt | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/THIRD_PARTY.txt b/THIRD_PARTY.txt index 426a4f46bd..12dd17aee9 100644 --- a/THIRD_PARTY.txt +++ b/THIRD_PARTY.txt @@ -2,7 +2,7 @@ Nextcloud Android client Copyright (C) 2016 Nextcloud Project - Copyright (C) 2012-2016 ownCloud Inc. + Copyright (C) 2012-2016 ownCloud GmbH Copyright (C) 2012 Bartek Przybylski ################################################################### @@ -37,24 +37,22 @@ that govern this software, for the purposes they are being used. The third party software included and used by this project is: - * Apache JackRabbit, version 2.2.5. - Copyright (C) 2004-2010 The Apache Software Foundation. + * Apache JackRabbit 2.12.4. + Copyright (C) 2004-2016 The Apache Software Foundation. Licensed under Apache License, Version 2.0. - Placed at libs/jackrabbit-webdav-2.2.5-jar-with-dependencies.jar - The jar file must be included in the ownCloud client APK. - Original license document included at libs/LICENSE.txt + The jar file must be included in the Nextcloud client APK. See http://jackrabbit.apache.org/ * Transifex client. Copyright (C) Transifex. Licensed under GNU General Public License. Placed at third_party/transifex-client. - Used as a helper tool, not included in the ownCloud client APK. + Used as a helper tool, not included in the Nextcloud client APK. Original license document included at third_party/transifex-client/LICENSE. See http://help.transifex.com/features/client/ - * TouchImageView, commit 6dbeac4f11936185ba374c73144ac431c23c9aab - Copyright (c) 2012 Michael Ortiz + * TouchImageView, 1.2.0. commit 6dbeac4f11936185ba374c73144ac431c23c9aab + Copyright (c) 2014 Michael Ortiz Licensed under MIT License JAR file libs/touch-image-view.jar has been generated by ownCloud Inc., including without modifications com.ortiz.touch.ExtendedViewPager and com.ortiz.touch.TouchImageView classes. @@ -63,5 +61,19 @@ The third party software included and used by this project is: * floatingactionbutton 1.10.1. Copyright (c) 2014 Jerzy Chalupski Licensed under Apache License, Version 2.0. - placed at libs/com-getbase-floatingactionbutton-1-10-0-exploded-aar has been exploded by ownCloud Inc. - See https://github.com/futuresimple/android-floating-action-button \ No newline at end of file + The jar file must be included in the Nextcloud client APK. + See https://github.com/futuresimple/android-floating-action-button + + * AndroidSVG 1.2.1. + Copyright (c) 2014 Paul LeBeau + Licensed under Apache License, Version 2.0. + placed at libs/androidsvg-1.2.1.jar + The jar file must be included in the Nextcloud client APK. + See https://github.com/BigBadaboom/androidsvg + + * Disk LRU Cache 2.0.2. + Copyright (c) 2013 Jake Wharton + Licensed under Apache License, Version 2.0. + placed at libs/disklrucache-2.0.2.jar + The jar file must be included in the Nextcloud client APK. + See https://github.com/JakeWharton/DiskLruCache \ No newline at end of file From 320d991c1903aa7370ee9477d36ef41f2569bd5c Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 5 Apr 2017 17:40:53 +0200 Subject: [PATCH 724/881] show SVG images --- .../ui/preview/PreviewImageFragment.java | 113 +++++++++++------- 1 file changed, 73 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index c18b864572..817740af42 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -29,6 +29,7 @@ import android.graphics.Point; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.PictureDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.DrawableRes; @@ -48,6 +49,8 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; +import com.caverock.androidsvg.SVG; +import com.caverock.androidsvg.SVGParseException; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -59,6 +62,8 @@ import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeTypeUtil; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.lang.ref.WeakReference; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -419,12 +424,14 @@ public class PreviewImageFragment extends FileFragment { * @param imageView Target {@link ImageView} where the bitmap will be loaded into. */ public LoadBitmapTask(ImageViewCustom imageView) { - mImageViewRef = new WeakReference<ImageViewCustom>(imageView); + mImageViewRef = new WeakReference<>(imageView); } @Override protected LoadImage doInBackground(OCFile... params) { - Bitmap result = null; + Bitmap bitmapResult = null; + Drawable drawableResult = null; + if (params.length != 1) { return null; } @@ -436,51 +443,72 @@ public class PreviewImageFragment extends FileFragment { Point screenSize = DisplayUtils.getScreenSize(getActivity()); int minWidth = screenSize.x; int minHeight = screenSize.y; - for (int i = 0; i < maxDownScale && result == null; i++) { - if (isCancelled()) { - return null; - } - try { - result = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth, - minHeight); + for (int i = 0; i < maxDownScale && bitmapResult == null && drawableResult == null; i++) { + if (ocFile.getMimetype().equalsIgnoreCase("image/svg+xml")) { if (isCancelled()) { - return new LoadImage(result, ocFile); + return null; } - if (result == null) { - mErrorMessageId = R.string.preview_image_error_unknown_format; - Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); - break; - } else { - if (ocFile.getMimetype().equalsIgnoreCase("image/jpeg")) { - // Rotate image, obeying exif tag. - result = BitmapUtils.rotateImage(result, storagePath); + try { + SVG svg = SVG.getFromInputStream(new FileInputStream(storagePath)); + drawableResult = new PictureDrawable(svg.renderToPicture()); + + if (isCancelled()) { + return new LoadImage(null, drawableResult, ocFile); } + } catch (FileNotFoundException e) { + mErrorMessageId = R.string.common_error_unknown; + Log_OC.e(TAG, "File not found trying to load " + getFile().getStoragePath(), e); + } catch (SVGParseException e) { + mErrorMessageId = R.string.common_error_unknown; + Log_OC.e(TAG, "Couldn't parse SVG " + getFile().getStoragePath(), e); + } + } else { + if (isCancelled()) { + return null; } - } catch (OutOfMemoryError e) { - mErrorMessageId = R.string.common_error_out_memory; - if (i < maxDownScale - 1) { - Log_OC.w(TAG, "Out of memory rendering file " + storagePath + - " ; scaling down"); - minWidth = minWidth / 2; - minHeight = minHeight / 2; + try { + bitmapResult = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth, + minHeight); - } else { - Log_OC.w(TAG, "Out of memory rendering file " + storagePath + - " ; failing"); + if (isCancelled()) { + return new LoadImage(bitmapResult, null, ocFile); + } + + if (bitmapResult == null) { + mErrorMessageId = R.string.preview_image_error_unknown_format; + Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); + break; + } else { + if (ocFile.getMimetype().equalsIgnoreCase("image/jpeg")) { + // Rotate image, obeying exif tag. + bitmapResult = BitmapUtils.rotateImage(bitmapResult, storagePath); + } + } + + } catch (OutOfMemoryError e) { + mErrorMessageId = R.string.common_error_out_memory; + if (i < maxDownScale - 1) { + Log_OC.w(TAG, "Out of memory rendering file " + storagePath + " ; scaling down"); + minWidth = minWidth / 2; + minHeight = minHeight / 2; + + } else { + Log_OC.w(TAG, "Out of memory rendering file " + storagePath + " ; failing"); + } + if (bitmapResult != null) { + bitmapResult.recycle(); + } + bitmapResult = null; } - if (result != null) { - result.recycle(); - } - result = null; } } } catch (NoSuchFieldError e) { mErrorMessageId = R.string.common_error_unknown; - Log_OC.e(TAG, "Error from access to unexisting field despite protection; file " + Log_OC.e(TAG, "Error from access to non-existing field despite protection; file " + storagePath, e); } catch (Throwable t) { @@ -489,7 +517,7 @@ public class PreviewImageFragment extends FileFragment { } - return new LoadImage(result, ocFile); + return new LoadImage(bitmapResult, drawableResult, ocFile); } @Override @@ -501,7 +529,7 @@ public class PreviewImageFragment extends FileFragment { @Override protected void onPostExecute(LoadImage result) { - if (result.bitmap != null) { + if (result.bitmap != null || result.drawable != null) { showLoadedImage(result); } else { showErrorMessage(); @@ -517,9 +545,10 @@ public class PreviewImageFragment extends FileFragment { final ImageViewCustom imageView = mImageViewRef.get(); Bitmap bitmap = result.bitmap; if (imageView != null) { - Log_OC.d(TAG, "Showing image with resolution " + bitmap.getWidth() + "x" + - bitmap.getHeight()); - + if(bitmap != null) { + Log_OC.d(TAG, "Showing image with resolution " + bitmap.getWidth() + "x" + + bitmap.getHeight()); + } if (result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { if (getResources() != null) { @@ -539,7 +568,9 @@ public class PreviewImageFragment extends FileFragment { } } - if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")) { + if (result.ocFile.getMimetype().equalsIgnoreCase("image/svg+xml")) { + imageView.setImageDrawable(result.drawable); + } else if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")) { imageView.setGIFImageFromStoragePath(result.ocFile.getStoragePath()); } else if (!result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { imageView.setImageBitmap(bitmap); @@ -640,10 +671,12 @@ public class PreviewImageFragment extends FileFragment { private class LoadImage { private Bitmap bitmap; + private Drawable drawable; private OCFile ocFile; - public LoadImage(Bitmap bitmap, OCFile ocFile) { + public LoadImage(Bitmap bitmap, Drawable drawable, OCFile ocFile) { this.bitmap = bitmap; + this.drawable = drawable; this.ocFile = ocFile; } From c0f4b80c438f38d5decbfd0eeb1eb6fefb6fa5d8 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 11 Apr 2017 01:18:00 +0200 Subject: [PATCH 725/881] Implement checkboards for svg --- .../ui/preview/PreviewImageFragment.java | 69 ++++++++++++------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index 817740af42..2dac16be5a 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -114,10 +114,10 @@ public class PreviewImageFragment extends FileFragment { * * This method hides to client objects the need of doing the construction in two steps. * - * @param imageFile An {@link OCFile} to preview as an image in the fragment - * @param ignoreFirstSavedState Flag to work around an unexpected behaviour of - * {@link FragmentStatePagerAdapter} - * ; TODO better solution + * @param imageFile An {@link OCFile} to preview as an image in the fragment + * @param ignoreFirstSavedState Flag to work around an unexpected behaviour of + * {@link FragmentStatePagerAdapter} + * ; TODO better solution */ public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState) { PreviewImageFragment frag = new PreviewImageFragment(); @@ -130,13 +130,13 @@ public class PreviewImageFragment extends FileFragment { /** - * Creates an empty fragment for image previews. + * Creates an empty fragment for image previews. * - * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically - * (for instance, when the device is turned a aside). + * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically + * (for instance, when the device is turned a aside). * - * DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful - * construction + * DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful + * construction */ public PreviewImageFragment() { mIgnoreFirstSavedState = false; @@ -185,7 +185,7 @@ public class PreviewImageFragment extends FileFragment { toggleImageBackground(); } }); - + mMultiView = (RelativeLayout) view.findViewById(R.id.multi_view); setupMultiView(view); @@ -342,7 +342,7 @@ public class PreviewImageFragment extends FileFragment { case R.id.action_share_file: mContainerActivity.getFileOperationsHelper().showShareFile(getFile()); return true; - + case R.id.action_open_file_with: openFile(); return true; @@ -544,35 +544,53 @@ public class PreviewImageFragment extends FileFragment { private void showLoadedImage(LoadImage result) { final ImageViewCustom imageView = mImageViewRef.get(); Bitmap bitmap = result.bitmap; + + if (imageView != null) { - if(bitmap != null) { + if (bitmap != null) { Log_OC.d(TAG, "Showing image with resolution " + bitmap.getWidth() + "x" + bitmap.getHeight()); } - if (result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { + if (result.ocFile.getMimetype().equalsIgnoreCase("image/png") || + result.ocFile.getMimetype().equals("image/svg+xml")) { if (getResources() != null) { Resources r = getResources(); Drawable[] layers = new Drawable[2]; layers[0] = r.getDrawable(R.color.white); - Drawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap); + Drawable bitmapDrawable; + if (result.ocFile.getMimetype().equalsIgnoreCase("image/png") ) { + bitmapDrawable = new BitmapDrawable(getResources(), bitmap); + } else { + bitmapDrawable = result.drawable; + } layers[1] = bitmapDrawable; LayerDrawable layerDrawable = new LayerDrawable(layers); - layerDrawable.setLayerHeight(0, convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerHeight(1, convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerWidth(0, convertDpToPixel(bitmap.getWidth(), getActivity())); - layerDrawable.setLayerWidth(1, convertDpToPixel(bitmap.getWidth(), getActivity())); + if (result.ocFile.getMimetype().equalsIgnoreCase("image/png") ) { + layerDrawable.setLayerHeight(0, convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerHeight(1, convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerWidth(0, convertDpToPixel(bitmap.getWidth(), getActivity())); + layerDrawable.setLayerWidth(1, convertDpToPixel(bitmap.getWidth(), getActivity())); + } else { + layerDrawable.setLayerHeight(0, convertDpToPixel(bitmapDrawable.getIntrinsicHeight(), + getActivity())); + layerDrawable.setLayerHeight(1, convertDpToPixel(bitmapDrawable.getIntrinsicHeight(), + getActivity())); + layerDrawable.setLayerWidth(0, convertDpToPixel(bitmapDrawable.getIntrinsicWidth(), + getActivity())); + layerDrawable.setLayerWidth(1, convertDpToPixel(bitmapDrawable.getIntrinsicWidth(), + getActivity())); + } imageView.setImageDrawable(layerDrawable); } else { imageView.setImageBitmap(bitmap); } } - if (result.ocFile.getMimetype().equalsIgnoreCase("image/svg+xml")) { - imageView.setImageDrawable(result.drawable); - } else if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")) { + if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")) { imageView.setGIFImageFromStoragePath(result.ocFile.getStoragePath()); - } else if (!result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { + } else if (!result.ocFile.getMimetype().equalsIgnoreCase("image/png") && + !result.ocFile.getMimetype().equals("image/svg+xml")) { imageView.setImageBitmap(bitmap); } @@ -620,8 +638,8 @@ public class PreviewImageFragment extends FileFragment { * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment} * to be previewed. * - * @param file File to test if can be previewed. - * @return 'True' if the file can be handled by the fragment. + * @param file File to test if can be previewed. + * @return 'True' if the file can be handled by the fragment. */ public static boolean canBePreviewed(OCFile file) { return (file != null && MimeTypeUtil.isImage(file)); @@ -637,7 +655,8 @@ public class PreviewImageFragment extends FileFragment { } private void toggleImageBackground() { - if (getFile() != null && getFile().getMimetype().equalsIgnoreCase("image/png") && getActivity() != null + if (getFile() != null && (getFile().getMimetype().equalsIgnoreCase("image/png") || + getFile().getMimetype().equalsIgnoreCase("image/svg+xml")) && getActivity() != null && getActivity() instanceof PreviewImageActivity && getResources() != null) { PreviewImageActivity previewImageActivity = (PreviewImageActivity) getActivity(); LayerDrawable layerDrawable = (LayerDrawable) mImageView.getDrawable(); From c070e9d1bb16f078e22902b3855cb99360cf8d05 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 19 Apr 2017 16:26:29 +0200 Subject: [PATCH 726/881] missing merge commit --- .../com/owncloud/android/ui/activity/FileDisplayActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 0433a4a6bc..518eab5b8a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -326,6 +326,7 @@ public class FileDisplayActivity extends HookActivity if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted + EventBus.getDefault().post(new TokenPushEvent()); refreshList(true); // toggle on is save since this is the only scenario this code gets accessed } else { From a04b3e63dcb9455da32dba234f76f143bb3990da Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 19 Apr 2017 17:09:45 +0200 Subject: [PATCH 727/881] cleanups --- build.gradle | 3 +- build.gradle.modified | 2 - .../ic_list_empty_upload_backup.svg | 57 ------------------- .../notification-icon_backup.svg | 50 ---------------- .../android/files/services/FileUploader.java | 1 - .../android/syncadapter/FileSyncAdapter.java | 1 - .../ui/activity/FileDisplayActivity.java | 10 ++-- .../ui/activity/NotificationsActivity.java | 19 +++---- 8 files changed, 14 insertions(+), 129 deletions(-) delete mode 100644 drawable_resources/ic_list_empty_upload_backup.svg delete mode 100644 drawable_resources/notification-icon_backup.svg diff --git a/build.gradle b/build.gradle index af4097f0f7..273f28ca2d 100644 --- a/build.gradle +++ b/build.gradle @@ -101,7 +101,7 @@ android { // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure dexOptions { - // Skip pre-dexing whe`n running on Travis CI or when disabled via -Dpre-dex=false. + // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !travisBuild } @@ -176,7 +176,6 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' - compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" diff --git a/build.gradle.modified b/build.gradle.modified index 07e9827606..604c8af8bf 100644 --- a/build.gradle.modified +++ b/build.gradle.modified @@ -176,7 +176,6 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' - compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" @@ -219,7 +218,6 @@ dependencies { //androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details //androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" - } configurations.all { diff --git a/drawable_resources/ic_list_empty_upload_backup.svg b/drawable_resources/ic_list_empty_upload_backup.svg deleted file mode 100644 index 02ecad0b38..0000000000 --- a/drawable_resources/ic_list_empty_upload_backup.svg +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="24" - height="24" - viewBox="0 0 24 24" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="ic_list_empty_upload.svg" - inkscape:export-filename="C:\DEV\src\Android\Nextcloud\designTweaks\res\drawable-xxxhdpi\ic_list_empty_upload.png" - inkscape:export-xdpi="1080" - inkscape:export-ydpi="1080"> - <metadata - id="metadata10"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs8" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1005" - id="namedview6" - showgrid="false" - inkscape:zoom="9.8333333" - inkscape:cx="-15.305085" - inkscape:cy="12" - inkscape:window-x="-9" - inkscape:window-y="-9" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <path - d="M9,16V10H5L12,3L19,10H15V16H9M5,20V18H19V20H5Z" - id="path4" - style="fill:#99cde9;fill-opacity:1" /> -</svg> diff --git a/drawable_resources/notification-icon_backup.svg b/drawable_resources/notification-icon_backup.svg deleted file mode 100644 index abe3ee0fed..0000000000 --- a/drawable_resources/notification-icon_backup.svg +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - xml:space="preserve" - height="62" - width="62" - enable-background="new 0 0 196.6 72" - y="0px" - x="0px" - viewBox="0 0 62.000002 62" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="notification-icon.svg" - inkscape:export-filename="C:\DEV\src\Android\nextcloud_android\res\drawable-xxxhdpi\notification_icon.png" - inkscape:export-xdpi="139.35001" - inkscape:export-ydpi="139.35001"><metadata - id="metadata10"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs8" /><sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1005" - id="namedview6" - showgrid="false" - inkscape:zoom="6.9411765" - inkscape:cx="31" - inkscape:cy="17" - inkscape:window-x="-9" - inkscape:window-y="-9" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /><path - style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;block-progression:tb;white-space:normal;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#ffffff;color-rendering:auto;image-rendering:auto;shape-rendering:auto;enable-background:accumulate" - d="m 31.023729,17.856035 c -5.95,6e-4 -10.947,4.0745 -12.473,9.5549 -1.333,-2.931 -4.266,-5.0088 -7.674,-5.0092 -4.6384002,5e-4 -8.4524002,3.8142 -8.4530002,8.4532 -8.321e-4,4.6397 3.8137,8.4544 8.4534002,8.455 3.4081,-4.09e-4 6.3392,-2.0792 7.6716,-5.011 1.5261,5.4817 6.5242,9.5569 12.475,9.5569 5.918,4.57e-4 10.89,-4.0302 12.448,-9.4649 1.3541,2.8776 4.242,4.9184 7.6106,4.9188 4.6406,8.28e-4 8.4558,-3.8144 8.4551,-8.455 -4.57e-4,-4.6397 -3.8154,-8.454 -8.4551,-8.4533 -3.3687,8.57e-4 -6.2587,2.0412 -7.6123,4.9188 -1.559,-5.4338 -6.528,-9.4644 -12.446,-9.464 z m 0,4.9623 c 4.4687,-2.97e-4 8.0384,3.5683 8.0389,8.0371 2.28e-4,4.4693 -3.5696,8.0391 -8.0389,8.0388 -4.4687,-4.38e-4 -8.0375,-3.5701 -8.0372,-8.0388 4.57e-4,-4.4682 3.5689,-8.0366 8.0372,-8.0371 z m -20.147,4.5456 c 1.9576,2.26e-4 3.4908,1.5334 3.4911,3.491 3.43e-4,1.958 -1.533,3.4925 -3.4911,3.4927 -1.9580002,-2.28e-4 -3.4913002,-1.5347 -3.4911002,-3.4927 2.284e-4,-1.9575 1.5334,-3.4907 3.4911002,-3.491 z m 40.205,0 c 1.9579,-3.43e-4 3.4925,1.533 3.4927,3.491 4.57e-4,1.9584 -1.5343,3.493 -3.4927,3.4927 -1.958,-2.28e-4 -3.4914,-1.5347 -3.4911,-3.4927 2.21e-4,-1.9575 1.5335,-3.4907 3.4911,-3.491 z" - id="path4" - inkscape:connector-curvature="0" /></svg> \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index f4a98663c5..3d23bdff57 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -1079,7 +1079,6 @@ public class FileUploader extends Service ); if (needsToUpdateCredentials) { - // let the user update credentials with one click // let the user update credentials with one click Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra( diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index d34c979e09..1213e19175 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -398,7 +398,6 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { ResultCode.UNAUTHORIZED.equals(mLastFailedResult.getCode()) ); if (needsToUpdateCredentials) { - // let the user update credentials with one click // let the user update credentials with one click Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 518eab5b8a..0b4fea067a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -175,11 +175,9 @@ public class FileDisplayActivity extends HookActivity /// Load of saved instance state if (savedInstanceState != null) { - mWaitingToPreview = savedInstanceState.getParcelable( - FileDisplayActivity.KEY_WAITING_TO_PREVIEW); + mWaitingToPreview = savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW); mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); - mWaitingToSend = savedInstanceState.getParcelable( - FileDisplayActivity.KEY_WAITING_TO_SEND); + mWaitingToSend = savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND); searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY); } else { mWaitingToPreview = null; @@ -250,11 +248,11 @@ public class FileDisplayActivity extends HookActivity } } - if (getIntent().getParcelableExtra(OCFileListFragment.SEARCH_EVENT) != null){ + if (getIntent().getParcelableExtra(OCFileListFragment.SEARCH_EVENT) != null) { switchToSearchFragment(); int menuId = getIntent().getIntExtra(DRAWER_MENU_ID, -1); - if (menuId != -1){ + if (menuId != -1) { setupDrawer(menuId); } } else if (savedInstanceState == null) { diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 40ad687e98..7f5e5b1357 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -160,8 +160,10 @@ public class NotificationsActivity extends FileActivity { recyclerView.setAdapter(adapter); LinearLayoutManager layoutManager = new LinearLayoutManager(this); - DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), - layoutManager.getOrientation()); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration( + recyclerView.getContext(), + layoutManager.getOrientation() + ); recyclerView.setLayoutManager(layoutManager); recyclerView.addItemDecoration(dividerItemDecoration); @@ -179,19 +181,15 @@ public class NotificationsActivity extends FileActivity { Thread t = new Thread(new Runnable() { public void run() { - OwnCloudAccount ocAccount = null; + OwnCloudAccount ocAccount; try { - ocAccount = new OwnCloudAccount( - currentAccount, - context - ); + ocAccount = new OwnCloudAccount(currentAccount, context); OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). getClientFor(ocAccount, MainApp.getAppContext()); mClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount)); RemoteOperation getRemoteNotificationOperation = new GetRemoteNotificationsOperation(); - final RemoteOperationResult result = - getRemoteNotificationOperation.execute(mClient); + final RemoteOperationResult result = getRemoteNotificationOperation.execute(mClient); if (result.isSuccess() && result.getNotificationData() != null) { final List<Notification> notifications = result.getNotificationData(); @@ -249,7 +247,7 @@ public class NotificationsActivity extends FileActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - boolean retval; + boolean retval = true; switch (item.getItemId()) { case android.R.id.home: @@ -258,6 +256,7 @@ public class NotificationsActivity extends FileActivity { } else { openDrawer(); } + break; default: retval = super.onOptionsItemSelected(item); From cb281d3bb15cbbd4eecb7fcf866bced8b588d31c Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 19 Apr 2017 17:41:20 +0200 Subject: [PATCH 728/881] further cleanups --- .../android/ui/activity/WhatsNewActivity.java | 4 +- .../ui/adapter/FileListListAdapter.java | 2 +- .../android/ui/events/TokenPushEvent.java | 1 - .../ui/fragment/OCFileListFragment.java | 74 +++++++++---------- 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java index b7f9b54f48..42fd9399e1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java @@ -253,9 +253,8 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa return v; } - - } + private final class FeaturesViewAdapter extends FragmentPagerAdapter { private FeatureItem[] mFeatures; @@ -318,5 +317,4 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa return v; } } - } diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java index 3b76c7a42a..530f6fac24 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -116,7 +116,7 @@ public class FileListListAdapter extends BaseAdapter { OCFileListFragmentInterface OCFileListFragmentInterface, FileDataStorageManager fileDataStorageManager ) { - this(justFolders, context, transferServiceGetter, OCFileListFragmentInterface); + this(justFolders, context, transferServiceGetter, OCFileListFragmentInterface); mStorageManager = fileDataStorageManager; } diff --git a/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java b/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java index 9794c09d29..4eae0187a2 100644 --- a/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java +++ b/src/main/java/com/owncloud/android/ui/events/TokenPushEvent.java @@ -22,6 +22,5 @@ package com.owncloud.android.ui.events; /** * Event to send push token where it belongs */ - public class TokenPushEvent { } diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index d553ee3795..cdb7406abb 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1332,48 +1332,48 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi task.execute(true); - if (event.getSearchType().equals(SearchOperation.SearchType.FILE_SEARCH)) { - setEmptyListMessage(SearchType.FILE_SEARCH); + if (event.getSearchType().equals(SearchOperation.SearchType.FILE_SEARCH)) { + setEmptyListMessage(SearchType.FILE_SEARCH); - } else if (event.getSearchType().equals(SearchOperation.SearchType.CONTENT_TYPE_SEARCH)) { - if (event.getSearchQuery().equals("image/%")) { - setEmptyListMessage(SearchType.PHOTO_SEARCH); - menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_GRID_AND_SORT; - } else if (event.getSearchQuery().equals("video/%")) { - setEmptyListMessage(SearchType.VIDEO_SEARCH); - menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SEARCH; - } - } else if (event.getSearchType().equals(SearchOperation.SearchType.FAVORITE_SEARCH)) { - setEmptyListMessage(SearchType.FAVORITE_SEARCH); - menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SORT; - } else if (event.getSearchType().equals(SearchOperation.SearchType.RECENTLY_ADDED_SEARCH)) { - setEmptyListMessage(SearchType.RECENTLY_ADDED_SEARCH); - menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SORT; - } else if (event.getSearchType().equals(SearchOperation.SearchType.RECENTLY_MODIFIED_SEARCH)) { - setEmptyListMessage(SearchType.RECENTLY_MODIFIED_SEARCH); - menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SORT; - } else if (event.getSearchType().equals(SearchOperation.SearchType.SHARED_SEARCH)) { - setEmptyListMessage(SearchType.SHARED_FILTER); + } else if (event.getSearchType().equals(SearchOperation.SearchType.CONTENT_TYPE_SEARCH)) { + if (event.getSearchQuery().equals("image/%")) { + setEmptyListMessage(SearchType.PHOTO_SEARCH); + menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_GRID_AND_SORT; + } else if (event.getSearchQuery().equals("video/%")) { + setEmptyListMessage(SearchType.VIDEO_SEARCH); menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SEARCH; } + } else if (event.getSearchType().equals(SearchOperation.SearchType.FAVORITE_SEARCH)) { + setEmptyListMessage(SearchType.FAVORITE_SEARCH); + menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SORT; + } else if (event.getSearchType().equals(SearchOperation.SearchType.RECENTLY_ADDED_SEARCH)) { + setEmptyListMessage(SearchType.RECENTLY_ADDED_SEARCH); + menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SORT; + } else if (event.getSearchType().equals(SearchOperation.SearchType.RECENTLY_MODIFIED_SEARCH)) { + setEmptyListMessage(SearchType.RECENTLY_MODIFIED_SEARCH); + menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SORT; + } else if (event.getSearchType().equals(SearchOperation.SearchType.SHARED_SEARCH)) { + setEmptyListMessage(SearchType.SHARED_FILTER); + menuItemAddRemoveValue = MenuItemAddRemove.REMOVE_SEARCH; + } - if (!currentSearchType.equals(SearchType.FILE_SEARCH) && getActivity() != null) { - getActivity().invalidateOptionsMenu(); - } + if (!currentSearchType.equals(SearchType.FILE_SEARCH) && getActivity() != null) { + getActivity().invalidateOptionsMenu(); + } - if (currentSearchType.equals(SearchType.PHOTO_SEARCH)) { - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - switchToGridView(); - } - }); - } else if (currentSearchType.equals(SearchType.NO_SEARCH) || currentSearchType.equals( - SearchType.REGULAR_FILTER)) { - new Handler(Looper.getMainLooper()).post(switchViewsRunnable); - } else { - new Handler(Looper.getMainLooper()).post(switchViewsRunnable); - } + if (currentSearchType.equals(SearchType.PHOTO_SEARCH)) { + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + switchToGridView(); + } + }); + } else if (currentSearchType.equals(SearchType.NO_SEARCH) || currentSearchType.equals( + SearchType.REGULAR_FILTER)) { + new Handler(Looper.getMainLooper()).post(switchViewsRunnable); + } else { + new Handler(Looper.getMainLooper()).post(switchViewsRunnable); + } } @Override From 79a0a380ebc8f0e26ea998bbc0b61d40029d04ee Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 19 Apr 2017 18:08:54 +0200 Subject: [PATCH 729/881] move to master snapshot of library --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 273f28ca2d..bd641ec81c 100644 --- a/build.gradle +++ b/build.gradle @@ -176,7 +176,7 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' - compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' + compile 'com.github.nextcloud:android-library:-SNAPSHOT' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' From 312c09b9022661e0afb4dd20e030bf4d5b9c48a9 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 18:28:57 +0200 Subject: [PATCH 730/881] Implement icon loading --- .../ui/adapter/NotificationListAdapter.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java index 728c242d13..162cc61808 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java @@ -20,17 +20,30 @@ package com.owncloud.android.ui.adapter; import android.content.Context; +import android.graphics.drawable.PictureDrawable; +import android.net.Uri; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import com.bumptech.glide.GenericRequestBuilder; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.model.StreamEncoder; +import com.bumptech.glide.load.resource.file.FileToStreamDecoder; +import com.caverock.androidsvg.SVG; import com.owncloud.android.R; import com.owncloud.android.lib.resources.notifications.models.Notification; import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.svg.SvgDecoder; +import com.owncloud.android.utils.svg.SvgDrawableTranscoder; +import com.owncloud.android.utils.svg.SvgSoftwareLayerSetter; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; @@ -66,7 +79,32 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi holder.message.setText(notification.getMessage()); // Todo set proper action icon (to be clarified how to pick) - holder.activityIcon.setImageResource(R.drawable.ic_notification); + if (!TextUtils.isEmpty(notification.getIcon())) { + downloadIcon(notification.getIcon(), holder.activityIcon); + } + + } + + private void downloadIcon(String icon, ImageView itemViewType) { + GenericRequestBuilder<Uri, InputStream, SVG, PictureDrawable> requestBuilder = Glide.with(context) + .using(Glide.buildStreamModelLoader(Uri.class, context), InputStream.class) + .from(Uri.class) + .as(SVG.class) + .transcode(new SvgDrawableTranscoder(), PictureDrawable.class) + .sourceEncoder(new StreamEncoder()) + .cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder())) + .decoder(new SvgDecoder()) + .placeholder(R.drawable.ic_notification) + .error(R.drawable.ic_notification) + .animate(android.R.anim.fade_in) + .listener(new SvgSoftwareLayerSetter<Uri>()); + + + Uri uri = Uri.parse(icon); + requestBuilder + .diskCacheStrategy(DiskCacheStrategy.SOURCE) + .load(uri) + .into(itemViewType); } @Override From f9c0e1ca090fa49e2311fd3d15abd54cb43603f3 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 19 Apr 2017 18:31:20 +0200 Subject: [PATCH 731/881] align text to the right --- src/main/res/layout/contacts_preference.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml index 884730fb8e..80dedfd8f1 100644 --- a/src/main/res/layout/contacts_preference.xml +++ b/src/main/res/layout/contacts_preference.xml @@ -75,6 +75,7 @@ android:layout_height="wrap_content" android:layout_margin="@dimen/standard_margin" android:layout_weight="1" + android:gravity="right" android:text="@string/contacts_preference_backup_never" android:textAppearance="?android:attr/textAppearanceMedium"/> </LinearLayout> From 22976389c2b3e95a57b2205d9c3f73db66b4fb42 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 19 Apr 2017 19:08:59 +0200 Subject: [PATCH 732/881] add generic circular avatars for contacts and use slightly smaller, more material like font size --- .../com/owncloud/android/ui/TextDrawable.java | 22 +++++++++++-- .../ui/activity/ContactListFragment.java | 32 ++++++++++++------- .../owncloud/android/utils/BitmapUtils.java | 8 ++--- src/main/res/layout/contactlist_list_item.xml | 9 +++--- 4 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/TextDrawable.java b/src/main/java/com/owncloud/android/ui/TextDrawable.java index 224e9d6248..12a24c4d12 100644 --- a/src/main/java/com/owncloud/android/ui/TextDrawable.java +++ b/src/main/java/com/owncloud/android/ui/TextDrawable.java @@ -28,6 +28,7 @@ import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; +import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.utils.BitmapUtils; import java.io.UnsupportedEncodingException; @@ -95,9 +96,26 @@ public class TextDrawable extends Drawable { @NonNull public static TextDrawable createAvatar(String accountName, float radiusInDp) throws UnsupportedEncodingException, NoSuchAlgorithmException { - int[] rgb = BitmapUtils.calculateRGB(accountName); + String username = AccountUtils.getAccountUsername(accountName); + return createNamedAvatar(username, radiusInDp); + } + + /** + * creates an avatar in form of a TextDrawable with the first letter of a name in a circle with the + * given radius. + * + * @param name the name + * @param radiusInDp the circle's radius + * @return the avatar as a TextDrawable + * @throws UnsupportedEncodingException if the charset is not supported when calculating the color values + * @throws NoSuchAlgorithmException if the specified algorithm is not available when calculating the color values + */ + @NonNull + public static TextDrawable createNamedAvatar(String name, float radiusInDp) throws + UnsupportedEncodingException, NoSuchAlgorithmException { + int[] rgb = BitmapUtils.calculateRGB(name); TextDrawable avatar = new TextDrawable( - accountName.substring(0, 1).toUpperCase(), rgb[0], rgb[1], rgb[2], radiusInDp); + name.substring(0, 1).toUpperCase(), rgb[0], rgb[1], rgb[2], radiusInDp); return avatar; } diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java index 2386ddf6f1..074f2574eb 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java @@ -53,6 +53,7 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsImportJob; +import com.owncloud.android.ui.TextDrawable; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.PermissionUtil; @@ -367,6 +368,16 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac final VCard vcard = vCards.get(holder.getAdapterPosition()); if (vcard != null) { + // name + StructuredName name = vcard.getStructuredName(); + if (name != null) { + String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; + String last = (name.getFamily() == null) ? "" : name.getFamily(); + holder.getName().setText(first + last); + } else { + holder.getName().setText(""); + } + // photo if (vcard.getPhotos().size() > 0) { byte[] data = vcard.getPhotos().get(0).getData(); @@ -377,7 +388,16 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac holder.getBadge().setImageDrawable(drawable); } else { - holder.getBadge().setImageResource(R.drawable.ic_user); + try { + holder.getBadge().setImageDrawable( + TextDrawable.createNamedAvatar( + holder.getName().getText().toString(), + context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius) + ) + ); + } catch (Exception e) { + holder.getBadge().setImageResource(R.drawable.ic_user); + } } // Checkbox @@ -393,16 +413,6 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac } } }); - - // name - StructuredName name = vcard.getStructuredName(); - if (name != null) { - String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; - String last = (name.getFamily() == null) ? "" : name.getFamily(); - holder.getName().setText(first + last); - } else { - holder.getName().setText(""); - } } } diff --git a/src/main/java/com/owncloud/android/utils/BitmapUtils.java b/src/main/java/com/owncloud/android/utils/BitmapUtils.java index 7c7194f37b..891ecdb98a 100644 --- a/src/main/java/com/owncloud/android/utils/BitmapUtils.java +++ b/src/main/java/com/owncloud/android/utils/BitmapUtils.java @@ -28,7 +28,6 @@ import android.media.ExifInterface; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; -import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.lib.common.utils.Log_OC; import java.io.UnsupportedEncodingException; @@ -265,15 +264,14 @@ public class BitmapUtils { /** * calculates the RGB value based on a given account name. * - * @param accountName The account name + * @param name The name * @return corresponding RGB color * @throws UnsupportedEncodingException if the charset is not supported * @throws NoSuchAlgorithmException if the specified algorithm is not available */ - public static int[] calculateRGB(String accountName) throws UnsupportedEncodingException, NoSuchAlgorithmException { + public static int[] calculateRGB(String name) throws UnsupportedEncodingException, NoSuchAlgorithmException { // using adapted algorithm from /core/js/placeholder.js:50 - String username = AccountUtils.getAccountUsername(accountName); - byte[] seed = username.getBytes("UTF-8"); + byte[] seed = name.getBytes("UTF-8"); MessageDigest md = MessageDigest.getInstance("MD5"); Integer seedMd5Int = String.format(Locale.ROOT, "%032x", new BigInteger(1, md.digest(seed))).hashCode(); diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml index 9b1bb08196..96f5c620fa 100644 --- a/src/main/res/layout/contactlist_list_item.xml +++ b/src/main/res/layout/contactlist_list_item.xml @@ -25,10 +25,9 @@ <ImageView android:id="@+id/contactlist_item_icon" - android:layout_width="@dimen/standard_list_item_size" - android:layout_height="@dimen/standard_list_item_size" - android:layout_margin="0dp" - android:padding="7dp" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_margin="16dp" android:scaleType="centerCrop" android:src="@drawable/ic_user"/> @@ -42,6 +41,6 @@ android:ellipsize="marquee" android:gravity="center_vertical" android:maxLines="1" - android:textAppearance="?android:attr/textAppearanceLarge"/> + android:textAppearance="?android:attr/textAppearanceListItem"/> </LinearLayout> \ No newline at end of file From 4cd4af9824388138d9a85737b138af32ff5f0660 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 19:46:58 +0200 Subject: [PATCH 733/881] Fix drone --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 710be1bac1..e9995cfe36 100644 --- a/.drone.yml +++ b/.drone.yml @@ -11,9 +11,9 @@ pipeline: # - ./gradlew connectedDebugAndroidTest --info # install app, then assemble and install instrumented tests of app module - ./gradlew :installGenericDebug - - ./gradlew :installModifiedDebug + #- ./gradlew :installModifiedDebug - ./gradlew :installGenericDebugAndroidTest - - ./gradlew :installModifiedDebugAndroidTest + #- ./gradlew :installModifiedDebugAndroidTest # run sample instrumented unit test # TODO fails because test runner is not available #- adb shell am instrument -w -e debug false -e class com.owncloud.android.datamodel.OCFileUnitTest com.owncloud.android.test/android.support.test.runner.AndroidJUnitRunner From ba9a3a28864adf7f74582f85364b74c736ef3d17 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 19:48:50 +0200 Subject: [PATCH 734/881] Push --- build.gradle.modified | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.modified b/build.gradle.modified index 604c8af8bf..d99ebed620 100644 --- a/build.gradle.modified +++ b/build.gradle.modified @@ -33,7 +33,7 @@ ext { travisBuild = System.getenv("TRAVIS") == "true" - // allows for -Dpre-dex=false to be set + // allows for -Dpre-dex=false to be set :) preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) } From b4a218e9d64319c74fed8af63fafb0b82cb1ba83 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 19:57:14 +0200 Subject: [PATCH 735/881] Update drone --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index e9995cfe36..acc92f50e3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,7 +6,7 @@ pipeline: - emulator -avd test -no-window & - ./wait_for_emulator.sh # build app and assemble APK, in debug mode - - ./gradlew assembleDebug + - ./gradlew assembleGeneric # run all the instrumented tests of app module - DISABLED until we get an stable setup for Espresso in Travis # - ./gradlew connectedDebugAndroidTest --info # install app, then assemble and install instrumented tests of app module From 54f920a4d724bead1c12e5e87e019c6150adbf63 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 19 Apr 2017 19:57:38 +0200 Subject: [PATCH 736/881] Fix drone --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index e9995cfe36..acc92f50e3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,7 +6,7 @@ pipeline: - emulator -avd test -no-window & - ./wait_for_emulator.sh # build app and assemble APK, in debug mode - - ./gradlew assembleDebug + - ./gradlew assembleGeneric # run all the instrumented tests of app module - DISABLED until we get an stable setup for Espresso in Travis # - ./gradlew connectedDebugAndroidTest --info # install app, then assemble and install instrumented tests of app module From fb4374d9fc10a12fc63f7275a7aaf60416b95e14 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Thu, 20 Apr 2017 00:21:12 +0000 Subject: [PATCH 737/881] [tx-robot] updated from transifex --- src/main/res/values-de-rDE/strings.xml | 3 +-- src/main/res/values-de/strings.xml | 3 +-- src/main/res/values-el/strings.xml | 3 +-- src/main/res/values-es-rMX/strings.xml | 3 +-- src/main/res/values-es/strings.xml | 5 ++--- src/main/res/values-fi-rFI/strings.xml | 3 +-- src/main/res/values-fr/strings.xml | 5 ++--- src/main/res/values-hu-rHU/strings.xml | 3 +-- src/main/res/values-is/strings.xml | 3 +-- src/main/res/values-it/strings.xml | 3 +-- src/main/res/values-ja-rJP/strings.xml | 3 +-- src/main/res/values-nb-rNO/strings.xml | 3 +-- src/main/res/values-nl/strings.xml | 3 +-- src/main/res/values-pl/strings.xml | 3 +-- src/main/res/values-pt-rBR/strings.xml | 13 ++++++------- src/main/res/values-ro/strings.xml | 21 +++++++++++++++++++-- src/main/res/values-ru/strings.xml | 3 +-- src/main/res/values-tr/strings.xml | 3 +-- src/main/res/values-zh-rCN/strings.xml | 3 +-- 19 files changed, 44 insertions(+), 45 deletions(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index 4fb3ddd145..ac5b777205 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -611,5 +611,4 @@ <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> - -</resources> + </resources> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index c4250c6159..aa3cc98834 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -611,5 +611,4 @@ <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> - -</resources> + </resources> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 68593e7691..b381456a94 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -611,5 +611,4 @@ <string name="activities_no_results_headline">Καμία δραστηριότητα ακόμα</string> <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές & κοινόχρηστα</string> - -</resources> + </resources> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 6542dbd3dc..414def54b5 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -611,5 +611,4 @@ en los últimos 7 días!</string> <string name="activities_no_results_headline">Aún no hay actividades</string> <string name="activities_no_results_message">Este flujo le mostrará eventos tales como \nagregados, cambios & compartidos</string> - -</resources> + </resources> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 1356bca3e6..c8f5dd3585 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -107,7 +107,7 @@ <string name="file_list_empty_shared">Aquí aparecerán los archivos y carpetas que usted comparta</string> <string name="file_list_empty_headline_server_search_videos">No hay videos</string> <string name="file_list_empty_headline_server_search_photos">No hay fotos</string> - <string name="file_list_empty_search">¿A intentado buscar en otra carpeta?</string> + <string name="file_list_empty_search">¿Ha intentado buscar en otra carpeta?</string> <string name="file_list_empty_recently_modified">No se modificaron archivos en los últimos 7 días</string> <string name="file_list_empty_recently_modified_filter">¡No se encontraron para su consulta, archivos que fueran modificados en los últimos 7 días!</string> @@ -611,5 +611,4 @@ <string name="activities_no_results_headline">Aun no hay actividad</string> <string name="activities_no_results_message">Esta secuencia le mostrará eventos como\nagregados, cambios& recursos compartidos</string> - -</resources> + </resources> diff --git a/src/main/res/values-fi-rFI/strings.xml b/src/main/res/values-fi-rFI/strings.xml index 057aef76d6..0245688830 100644 --- a/src/main/res/values-fi-rFI/strings.xml +++ b/src/main/res/values-fi-rFI/strings.xml @@ -562,5 +562,4 @@ <string name="activities_no_results_headline">Ei vielä toimia</string> <string name="activities_no_results_message">Tähän luetteloon ilmestyy tapahtumakuvauksia, kuten\nlisäyksiä, muutoksia& jakamisia</string> - -</resources> + </resources> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index ef280af47d..9e91e633ae 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -52,7 +52,7 @@ <string name="prefs_log_title_history">Historique de la journalisation</string> <string name="prefs_log_summary_history">Cela affiche les logs enregistrés</string> <string name="prefs_log_delete_history_button">Effacer le journal</string> - <string name="prefs_calendar_contacts">Configurer la synchronisation de l\'agenda & des contacts</string> + <string name="prefs_calendar_contacts">Configurer la synchronisation de l\'agenda et des contacts</string> <string name="prefs_calendar_contacts_summary">Configurer DAVdroid (v1.3.0+) pour le compte actuel</string> <string name="prefs_calendar_contacts_address_resolve_error">Une adresse de serveur pour le compte pourrait ne pas être résolue par DAVdroid</string> <string name="prefs_calendar_contacts_no_store_error">Aucune application Google Play store ou F-Droid installée</string> @@ -611,5 +611,4 @@ <string name="activities_no_results_headline">Aucune activité pour le moment</string> <string name="activities_no_results_message">Ce flux affichera des événements comme\n des ajouts, des changements & des partages</string> - -</resources> + </resources> diff --git a/src/main/res/values-hu-rHU/strings.xml b/src/main/res/values-hu-rHU/strings.xml index ea5ff6232b..2a98f83ad1 100644 --- a/src/main/res/values-hu-rHU/strings.xml +++ b/src/main/res/values-hu-rHU/strings.xml @@ -607,5 +607,4 @@ <string name="activities_no_results_headline">Nincs még tevékenység</string> <string name="activities_no_results_message">Ez a folyam olyan eseményeket mutat mint\nbővítmények, változások és megosztások</string> - -</resources> + </resources> diff --git a/src/main/res/values-is/strings.xml b/src/main/res/values-is/strings.xml index 764637526b..e4b4bc9a9f 100644 --- a/src/main/res/values-is/strings.xml +++ b/src/main/res/values-is/strings.xml @@ -611,5 +611,4 @@ <string name="activities_no_results_headline">Engin virkni ennþá</string> <string name="activities_no_results_message">Streymið mun birta atburði á borð við\nviðbætingar, breytingar og deilingar</string> - -</resources> + </resources> diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index 1121b920df..5ce39aa40f 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -586,5 +586,4 @@ <string name="activities_no_results_headline">Ancora nessuna attività</string> <string name="activities_no_results_message">Questo flusso mostrerà gli eventi come aggiunte, cambiamenti e condivisioni</string> - -</resources> + </resources> diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index 9f68fec0fa..c57813df57 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -612,5 +612,4 @@ <string name="activities_no_results_message">このタイムラインには、いいね\n 追加、変更、共有が表示されます</string> - -</resources> + </resources> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 197405eef0..210bfdb8e6 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -598,5 +598,4 @@ <string name="activities_no_results_headline">Ingen aktivitet enda</string> <string name="activities_no_results_message">Denne strømmen vil vise hendelser som\nf.eks. innlegging, endring og deling</string> - -</resources> + </resources> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 2322086ce0..08a2a41fbe 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -610,5 +610,4 @@ <string name="activities_no_results_headline">Nog geen activiteit</string> <string name="activities_no_results_message">Deze stream laat gebeurtenissen zoals\ntoevoegingen, veranderingen & gedeelde bestanden zien</string> - -</resources> + </resources> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 0edac89176..5359b9fdd2 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -613,5 +613,4 @@ <string name="activities_no_results_headline">Brak aktywności</string> <string name="activities_no_results_message">Ten strumień pokaże zdarzenia jak\ndodatki, zmiany & udziały</string> - -</resources> + </resources> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index c433744542..4cfeae5fd8 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -162,7 +162,7 @@ foram encontrados para sua pesquisa! </string> <string name="uploader_upload_succeeded_content_single">%1$s enviado</string> <string name="uploader_upload_failed_ticker">Falha no envio</string> <string name="uploader_upload_failed_content_single">O envio de %1$s não pôde ser finalizado</string> - <string name="uploader_upload_failed_credentials_error">Falha no envio, você precisa se logar novamente</string> + <string name="uploader_upload_failed_credentials_error">Falha no envio, você precisa reautenticar-se</string> <string name="uploads_view_title">Envios</string> <string name="uploads_view_group_current_uploads">Atual</string> <string name="uploads_view_group_failed_uploads">Falha (toque para tentar novamente)</string> @@ -189,7 +189,7 @@ foram encontrados para sua pesquisa! </string> <string name="downloader_download_failed_ticker">Download falhou</string> <string name="downloader_download_failed_content">Download de %1$s não pôde ser concluído</string> <string name="downloader_not_downloaded_yet">Ainda não baixado</string> - <string name="downloader_download_failed_credentials_error">Falha em baixar o arquivo, você precisa se logar novamente</string> + <string name="downloader_download_failed_credentials_error">Falha em baixar o arquivo, você precisa reautenticar-se</string> <string name="common_choose_account">Escolha a conta</string> <string name="sync_fail_ticker">Falha na sincronização</string> <string name="sync_fail_ticker_unauthorized">Falha na sincronização, você precisa se logar novamente</string> @@ -266,7 +266,7 @@ foram encontrados para sua pesquisa! </string> <string name="auth_expired_oauth_token_toast">Sua autorização expirou. Por favor, autorize novamente</string> <string name="auth_expired_basic_auth_toast">Por favor, digite a senha atual</string> <string name="auth_expired_saml_sso_token_toast">Sua sessão expirou. Por favor, conecte-se novamente</string> - <string name="auth_connecting_auth_server">Conectando ao servidor de autenticação ...</string> + <string name="auth_connecting_auth_server">Conectando ao servidor de autenticação...</string> <string name="auth_unsupported_auth_method">O servidor não suporta este método de autenticação</string> <string name="auth_unsupported_multiaccount">%1$s não suporta múltiplas contas</string> <string name="auth_fail_get_user_name">Seu servidor não está retornando um id de usuário correto. Por favor, entre em contato com um administrador</string> @@ -301,7 +301,7 @@ foram encontrados para sua pesquisa! </string> <string name="wait_for_tmp_copy_from_private_storage">Copiando o arquivo da armazenagem privada</string> <string name="oauth_check_onoff">Login com oAuth2</string> - <string name="oauth_login_connection">Conectando-se a oAuth2 servidor ...</string> + <string name="oauth_login_connection">Conectando-se a oAuth2 servidor...</string> <string name="ssl_validator_header">A identidade do site não pode ser verificada</string> <string name="ssl_validator_reason_cert_not_trusted">- O certificado do servidor não é confiável</string> @@ -452,7 +452,7 @@ foram encontrados para sua pesquisa! </string> <string name="prefs_category_details">Detalhes</string> <string name="prefs_instant_video_upload_path_title">Pasta de envio automático de vídeos</string> - <string name="sync_folder_failed_content">A sincronização da pasta %1$s não pode ser finalizada</string> + <string name="sync_folder_failed_content">A sincronização da pasta %1$s não pôde ser finalizada</string> <string name="shared_subject_header">compartilhado</string> <string name="with_you_subject_header">com você</string> @@ -611,5 +611,4 @@ foram encontrados para sua pesquisa! </string> <string name="activities_no_results_headline">Nenhuma atividade ainda</string> <string name="activities_no_results_message">O stream irá mostrar eventos como\nadições, mudanças & compartilhamentos</string> - -</resources> + </resources> diff --git a/src/main/res/values-ro/strings.xml b/src/main/res/values-ro/strings.xml index 570f147706..94de94a3bc 100644 --- a/src/main/res/values-ro/strings.xml +++ b/src/main/res/values-ro/strings.xml @@ -2,7 +2,7 @@ <resources> <string name="about_android">%1$s aplicație Android</string> <string name="about_version">versiunea %1$s</string> - <string name="actionbar_sync">Reîmprospătare cont</string> + <string name="actionbar_sync">Reîmprospătează contul</string> <string name="actionbar_upload">Încarcă</string> <string name="actionbar_upload_from_apps">Conținut de la alte aplicații</string> <string name="actionbar_upload_files">Fișiere</string> @@ -11,12 +11,29 @@ <string name="actionbar_settings">Setări</string> <string name="actionbar_see_details">Detalii</string> <string name="actionbar_send_file">Expediază</string> - <string name="actionbar_sort">Sortare</string> + <string name="actionbar_sort">Sortează</string> <string name="actionbar_sort_title">Sortare după</string> + <string name="sort_by">Sortare după</string> + <string name="menu_item_sort_by_name_a_z">A - Z</string> + <string name="menu_item_sort_by_name_z_a">Z - A</string> + <string name="menu_item_sort_by_date_newest_first">Cel mai nou mai întâi</string> + <string name="menu_item_sort_by_date_oldest_first">Cel mai vechi mai întâi</string> + <string name="menu_item_sort_by_size_biggest_first">Cel mai mare mai întâi</string> + <string name="menu_item_sort_by_size_smallest_first">Cel mai mic mai întâi</string> + <string name="drawer_item_all_files">Toate fișierele</string> + <string name="drawer_item_files">Fișiere</string> + <string name="drawer_item_home">Acasă</string> + <string name="drawer_item_favorites">Favorite</string> + <string name="drawer_item_photos">Poze</string> <string name="drawer_item_on_device">Pe dispozitiv</string> + <string name="drawer_item_recently_added">Adăugate recent</string> + <string name="drawer_item_recently_modified">Modificate recent</string> + <string name="drawer_item_shared">Partajate</string> + <string name="drawer_item_videos">Fișiere video</string> <string name="drawer_item_settings">Setări</string> <string name="drawer_item_uploads_list">Încărcări</string> + <string name="drawer_item_activities">Activități</string> <string name="drawer_quota">%1$s din %2$s folosiți</string> <string name="drawer_close">Închide</string> <string name="drawer_open">Deschide</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 6461c95a7b..7adb832146 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -615,5 +615,4 @@ <string name="activities_no_results_headline">Событий ещё нет</string> <string name="activities_no_results_message">Этот поток будет отображать события вроде\nдобавления, изменения файлов или открытия доступа к ним</string> - -</resources> + </resources> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index 53da8b6934..4419bb4fc9 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -610,5 +610,4 @@ <string name="activities_no_results_headline">Henüz bir işlem yapılmamış</string> <string name="activities_no_results_message">Bu akışta ekleme, değiştirme\nve paylaşım gibi işlemler görüntülenir</string> - -</resources> + </resources> diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 624a72166d..ff6c2a3b3d 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -610,5 +610,4 @@ <string name="activities_no_results_headline">暂无动态</string> <string name="activities_no_results_message">瀑布流中会显示诸如添加\n更改&分享之类的事件</string> - -</resources> + </resources> From 8da1057f3b031d5d93f7e006ef025bbf78c92c17 Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Sat, 4 Feb 2017 23:03:44 +0100 Subject: [PATCH 738/881] Added Fingerprint Support --- .../authentication/PassCodeManager.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/PassCodeManager.java b/src/main/java/com/owncloud/android/authentication/PassCodeManager.java index cc4dd383d8..0317c9f982 100644 --- a/src/main/java/com/owncloud/android/authentication/PassCodeManager.java +++ b/src/main/java/com/owncloud/android/authentication/PassCodeManager.java @@ -28,6 +28,7 @@ import android.preference.PreferenceManager; import android.view.WindowManager; import com.owncloud.android.MainApp; +import com.owncloud.android.ui.activity.FingerprintActivity; import com.owncloud.android.ui.activity.PassCodeActivity; import java.util.HashSet; @@ -40,6 +41,7 @@ public class PassCodeManager { static { sExemptOfPasscodeActivites = new HashSet<Class>(); sExemptOfPasscodeActivites.add(PassCodeActivity.class); + sExemptOfPasscodeActivites.add(FingerprintActivity.class); // other activities may be exempted, if needed } @@ -61,7 +63,7 @@ public class PassCodeManager { protected PassCodeManager() {}; public void onActivityCreated(Activity activity) { - if (passCodeIsEnabled()) { + if (passCodeIsEnabled() || fingerprintIsEnabled()) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } else { activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); @@ -80,6 +82,17 @@ public class PassCodeManager { } + if (!sExemptOfPasscodeActivites.contains(activity.getClass()) && + fingerprintShouldBeRequested() && FingerprintActivity.isFingerprintReady(MainApp.getAppContext()) + ){ + + Intent i = new Intent(MainApp.getAppContext(), FingerprintActivity.class); + i.setAction(PassCodeActivity.ACTION_CHECK); + i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + activity.startActivity(i); + + } + mVisibleActivitiesCounter++; // keep it AFTER passCodeShouldBeRequested was checked } @@ -89,7 +102,7 @@ public class PassCodeManager { } setUnlockTimestamp(); PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE); - if (passCodeIsEnabled() && powerMgr != null && !powerMgr.isScreenOn()) { + if ((passCodeIsEnabled() || fingerprintIsEnabled())&& powerMgr != null && !powerMgr.isScreenOn()) { activity.moveTaskToBack(true); } } @@ -112,4 +125,18 @@ public class PassCodeManager { return (appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false)); } + private boolean fingerprintShouldBeRequested(){ + if ((System.currentTimeMillis() - mTimestamp) > PASS_CODE_TIMEOUT && + mVisibleActivitiesCounter <= 0 + ){ + return fingerprintIsEnabled(); + } + return false; + } + + private boolean fingerprintIsEnabled() { + SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext()); + return (appPrefs.getBoolean(FingerprintActivity.PREFERENCE_USE_FINGERPRINT, false)); + } + } From 99bf76657abb32f0ccff1e038a372a2a7557d9e0 Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Sat, 4 Feb 2017 23:03:56 +0100 Subject: [PATCH 739/881] Added Fingerprint Support --- fingerprint_icon-web.png | Bin 0 -> 58648 bytes res/drawable/ic_fingerprint.xml | 9 + res/layout/fingerprintlock.xml | 67 +++ .../ui/activity/FingerprintActivity.java | 383 ++++++++++++++++++ src/main/AndroidManifest.xml | 2 + .../android/ui/activity/Preferences.java | 49 ++- src/main/res/values-de-rDE/strings.xml | 2 + src/main/res/values/strings.xml | 4 + src/main/res/xml/preferences.xml | 3 +- src/modified/res/values/setup.xml | 1 + 10 files changed, 518 insertions(+), 2 deletions(-) create mode 100644 fingerprint_icon-web.png create mode 100644 res/drawable/ic_fingerprint.xml create mode 100644 res/layout/fingerprintlock.xml create mode 100644 src/com/owncloud/android/ui/activity/FingerprintActivity.java diff --git a/fingerprint_icon-web.png b/fingerprint_icon-web.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6fffde304996f969863e66a18120be138ae828 GIT binary patch literal 58648 zcmd3N^;=Zk_x3Oh-Q6&BhlJ7$-6cv&C@_GCbPGd=AYDTZ9ZE^5G!`K+bPGdBcjwHP z=kxv(@A~DO>pIstd&Rxh-uqtr#2XoCk`OWy0ssIKZ7sE@008je76`z{eYl(jOx^$h zVE}D4<!1r&dj$kJv{RXA(GR#r6m*Zd!C($!Wl*NNCk}<W5ru;-jYFpOg^fpF+%2pB z3y)=WYU-^DcC>`V02c%A+7K6fh`!H3a*Up)26I1k{r+w4LB)36&5mivraUr4QmyOo z(?_ez{L{kAjy`&+|L-N+ZGZj-I;F(oe3Fotm$@(xk06tSyM8HnQzxwOm-?;J40=um z4kML}E?4!lLL)M7-LK^CtQ8}Xs}k35x>WW5C&DW2b<NTIv-88UTcH&m3;4Tnn>i(J zGw_oA%Z2j}egSKD%%xwuV&iVI-~Ciwz4)#>{M?s&_waemAbJ7i9f7=e-Dp=#JKT73 zWOb!~@#UE5y7mqlDmPP9@juD>9P!~6p2^1QW{PgEAO2e3oa9q(@$LTQuG-ApInpoW z^$cSFX0fh2!}~z`pZng;bRCP|e)Dc{dxuc{p~P}0=c!fKz+Ed?>q>Xy3r5CU7_(=a z2m5eg`3+iE5Zu#gWb&Wrn$cobD5j6kk6CP1TJ!e1yPap0=FjEY6+iDbC6?Zar$@u+ zA|;U1HzM92Y@v16O+yM-)*FQ#Tg#jWQ!NX~qr-yS|H*`(t2Sph)TY_3#`?+Jc`pAv z+WQunynj=l*mUd4V|C&4ysc|^u@otOxwkf?@NT%fGJ4_n^<_?Q?f)~_H<H-wY+_<) z(9NXAzHOpDvVQTx@M0NeKLcAhSI1>Et7ILSPyJSj*<ZHD*xcUX9o##ZG`Ga!;=KM( zR+xkWUjCsYSaGwew(cI3E~|g#pAuaTZ;^`0ygmr1`@3|z4{N~OmGdvQPAOKlpd~CV zg5a2;$^Xg4!24D<_kuyK-DhuyCd<D-8*h<KhqGTQoE^E1t`=dYCqp(v@;_4163_qV zw}s&oU0HKY&v;+TXg>uvOh}V2BPQ!*%cpchKaZmpjL^N)YlJW|;NOMry;I$P24>lt z8hPbdd^;D~C5BpTdemFH!%N0(o#=OVwkBBU?-WjJmeZWvF9E^f3dR3>LB+}<DAD5E z{;ON$uM0%7)6Ny*Qxo#K2;~hEZQylqf3bH+^Iy8PltHhVE+uf36xdbq|9r7nCb}rX znE75XQtvt5f9f`ymDppsNFk)Deh`_%Gp5{<w2{ycU#fi6D`0n2zE_OolU^Yl!Tkr^ zFvGddU#$N#(7Wg0N*_DDyS7xJ2zklASTg=ZLcDqB$TymS{O;E#$(19peP-5sPvL(W z2r*J^6Dq#3fAI1`&En$;)*(?R>h;O(-9ZhpBQqHC^W|*ho_axA)q`QQ#We3`C#f@7 zoto}e{1j4+V@+b~1xLbAL~{v#hK*0=O8*y6_MH09-JLDOlgF{!?`jNevrBt>`rr!l zealS(hBXi0X-(b;Jb&}pw}Jo4B{<JQzZq`_*Y~E4l9ssR@X-1~EEulvKV+Fk|HZ7J zH)4ikb4&IsbH49?nNvN3O>OV$1c)7VH)ih_LfxDCrv8IL#2eUJ=*A5~N+Nn8MrWhU zz}8G4GW_yhVZ_D>DJbxenpsUrZ1%4g2HkXbUo4na)(gt?hW*`L$llL2uL=*#&9yXO zNU72~nbuD-D@YMBGj(%_yZ7(uBKpsy>M!5j?)Q7Y7(l<d-`X^VSj!|4zC#4kO<x05 z|M$ERD2jy2luBR+kQ>ic&vl8Y<M>&1P}$C-Uglxyjz+2;0?0jWq$wy+@P@1v;iwku z_qw%S*EqZr7igQ4xq$Ai<Nql3;Nz@@L`=3)L+p}Xlh-Y#DRvG)voTZt$@E{i(rvHA zA?0Dle<?eW)LrEe!@qbjVR?D<DSfoO7s71`yeJrlK=k#8wX3@Ac4^?OXhX?`nR3B2 z2#Sgc{~fB^)spd{bR_&e-po#H#+%snySHKK7O}P<0EHfQdq-Pox`6-lQ;49@HUi#% zdAM`syZxS<{E7_2vTptC0b2=+?^`d#q8Hvu34Xa(`R`p)5D?w|HKYae_Tz(v(QgHH zlRx7PQ3j(j_L{<yWkapoO2|NjU);`@jhCMP2Y6Yl-dO#8EXm(c`ubVb4Oid0HXj)l z{CE4^pE{a4+W&Lr?Hm8Qig5l#uU7uW&}@ZgiqHG%b<IkE;fDAA+5S2H77t~-R-^UJ zZnB>7_PgM?yM&A5-SNyV2+CIP<p9v6VOv^Z_5l(fV{eICNgHE-FZ^eS&QwSEmwW%< z;|gfd=!34AbN6fq?u73R8)ARz!v`D)FCV_4D2Z}M%XM{>HDN|RRagHDn(qEwJ|N2S z_Pq|QHpw=-j+vk6Xyo+Zzh_0t#3dr;&u-$r-?#bvvjaDHEtEp9v(_@Xsw%RqEMO+K z8qLlNY*WX)4#L6961q<Upks1{7FStL8(pjLPl(H*M5n!=piAE=`$G6hl~Y}S2U6-d z6sh-hM#BE^XeehveAf?|*xiSQT|P(qM@ZdQD|9C;_qbae#oX0#9}XN&I%QFZ_ORVI zg-Iyu>kI#Se2u=>SJvibx~_lzRZ00%(NBq)4q*eo4T)8h=PajbAXF>dNyOsi%t@m! zni+Y9_y=#QoAo|t*o9AM1XV1k7s_m_Slk8I|55P1sT#x>G>F)=-d;AuEOT}L8$<*^ zch(Bwr)f?bodVq!2<x;#Ao4m6>=gBoJA-dl1V8A%9KgRVfmK+*vdlt1JDI-8A`V<~ zUFG9dT7{2&c~8~%nbdL}j^(Z3y`+cCmz$DsO8PPql;~ve?WY7U*~L)&W^l!yz(N`H z8|2-V9@0mCSV9xA1NZwYKau78bnbOXgi~lhhf|WYA9Cu19@#8CFQK1&GPF|bczig# zk7(I4x?UzQy*|XJ?G9fa-zL7c<~=*t+YF_AcGMo6oYJ#8L{KQ>)c9gK`cy$8Al@m) zS`-Vk^?f~-J0J(s=9J}@aa$hDyWrg8gl6cqc&OxAlvbASGKO#1#%q-70CovZSuhlQ zPBZ{|!{~YQqwZ91*(J>)J=(uD>2!9YR`pPXl)3U<KSkl(AztCYr^C6*oQ}-wO?V{f zrCvJiMbLcEM!x}N134f0C@8$Q{JM}Ks1~H2K|@=gofdmgkn<JGitPkRY`?R;QeBZX zYY9^><QM81?V9X<7#~>K^(uYX(w5ddbY1vyUgwwu-B7v^-KO6T`9O@^8Fl4>6N=>* z!wqRyxpW^k+4&GwY(RyvJyKG>UxI}6Xb4U6^LnPqpxLI=0T*z0aC1B0>!G0J>`=cC z2`<3<BgM8jRJXyvRq_E$zQ{I81jGTB)X@c0^pPu*-3+Is;q^{5^D0Q}$`DXf3*#%1 z^9fzI@XyMRDycqX8YT4l*RcLdE0aWL_s-Q18)=rtpnN6xE~>onn@9NMjHkJ@DA+4s zfmAe}RDMLg0T2X%K*S(mh)fhX>?wi6?`lK*m6Xk*VDX4X$oBG`L{yX71E48Pk<@P# z{&e*m9!^XuDiB}3nA{ED$8P+~V6QL{k}}zu*V06~)8NGr{G+j^Kz)PA2eD49`1UMJ zogw_z90s#kTsv|8j-?M$mj3vOgc2A3L`4i&2NDZH8eV!?kA@w(kspP_Dx9?;`ok~t znp#ss;B*Vw7nf3g=x;A}W2;#wHwU=rx~-<6Ur_o3d%OxLxN<`D^W~6+$@=gUrYFLY zTT?Il=(xz4jSQTZZ2IGl_-_m{pAKEM@1M5Yw($lO%3BqBhA|%PwOAEHl>ttKPDD<L z59Qn50*0;-x!?|&t`n8ot#@(1*9bq_j;!=e%2gmO43a!*lD+f+5s)wuEk`sGBd;PJ zpyHqHOwTvxVJnN%B^k}_df%im29T1{%!jQ^|Jnaz@oI*2_(t#{4&yO+P5CxAa3tYG z{t)>iX3HbHwKaO#^JBd{s^}bzzc$!mJ|KW10wu=&>Lf9kl%|B|hG6Z0IwRJrx2DA} zxrQnuEF`^Y3)14;Lu%6C`-ub?<4RssL0h?oxQ1ezJZt;jmBHpZZTpK56{2Nd8Y&d4 zB=$(y&*6H9%R6{1-eZ=mykjExD<7xLamrrai$jsB1LgtIYkw2-{6mB?BYsu2<J`6A zg4dghFBorMG+YlcM8eLHal*66$srMXkA7|3Cim~v%Z&-BMhscJUV+_PQLTIr{COV= zk{A<Fnqv+fl@tQaMImR38xjwEK8AH_aU;vWfhXTAy0$5r0_=H7fRmGrriY@6$gVK= z*%p%~v{%UWq))haxPR~qo;UXpJ<XMO)>0x&>jQ-{XIe<+30+wtTpP|Naz0LqHv)_) zGFE#G&F@aFpaU^zMo?9?`u5d*5NsQCyBd-+VWDI}uj(|4h#iXlq2%;F?f|mt`q!e& zt@__YNp@vzK-)!2JJ^t%BPw^410bVP`*{JfjjueCbB`xZ?nAxqqg`}`fzz<*&HEbs zH)C$y)mtq8?24MnDcOhh2bQoIDb-qQ^#iBIu?<`cWks!xb(tpow5n0FiX|kEcBYxB zI6qc!HM~28<vB8C=gx_;lqiSgTAGh^+u2*)M%>TVxqA!jR!-}*8d|gcMyn@8RjFr@ zS+Qj*;J=vkd>Qm9eLR!IlVhHc0{jZ|$UHtQOj*C5hRmA($A>MRe$f#HNxNTJ?r!8B zc@}3u!T-5(hwxfdRA!*dJoz8jx?yeR-urpQIoi@U)w|gHw*tY0ySrXdq7bp3FwQ|^ zpFHyB3LEFD=8s+gMkd2t_1!kthwQ3t9qF!G*Sl5eEHD{iJ6E7y1Rob;l2%!T_U#~~ zl<hiO6aP4z!XV%jK8*l;W&U{shW#N_$+!A-OY(*#AuInRT&#z6!Rp<1t*{X58`HP9 z>K}LS9W>7@u}|^DJ4)SY=rg~aumops?|dp9%Pdpx(fP#x^Vz)Nwn4E1jq*qCaB5G_ zo5-+#hnR7j)AEmWMHQw^K^SG8ZikwXa7A6;X)<}j4#Q4r7t@`ao+{~gzTmc}4Ajhg z+(M(mXE;XXdM5CqkEbrz6-sdRU7p<NddX?<gINNb-Oi`Q7twGR+kE$@+jsXDoqGC+ zzytDIT#+-q`j>?=J8DQt7k;W`uUr?KZeks%vb5`@`7<K^SdZk<$6<H)KbgtLoS%RC zx|Jy1n68DIhO*~O?nqzfzeoHniPTeDzrALOZB1ML<xV{K7>}8wo2`#dPiM&S0GEn0 zkQLP4Tx(;>MVJW!dfOVr-`KhQ+nj79>ypx4E^yuG2+8@+YcvIzG=HmEx^nQ;c_=d` zLsLET@N3gg8Ry^KmEtU1n)!lBv@tRkoF~8fr&OZkUDHyAMP8ubx>>q{^H;%swtVcX zFTx5oJD#=wD&o3X{7<!H2a$5dF1FPC(24!SHkFJsdicA$xz(+C-*mf(Fq}E-!oWJb zKpKP;H*mvPtc||7STYOb#|_x6Z<z^<I(fiUM0Sy#E|ZB-kpE7;Qmqj=f_%4EyC9@o zy5WL1!J9}c#N~jAw}(BFSCGd9`bL;E^|8k98S(rW*+)^DxRmUw!M~-ynQa=-6hvZq ztDo9w6+`+Oh8SK+94n61Y8EFcKW?wx<U(;Yt;<Y8AF0qimP42vpE6XbiN(^7{2a35 zE<AP=EVsudfX+WgBHSV)87Q0cUn1^ZIDf5BjAoEgj(XV{f>BXGw#!e(Yd)W(8!-fN zkZ#~Jz}#yXWbB@jI4q}}A0P1VEA%fm6y4_cUzIquz36>Z;k=vsEbTt*dVpGHkKtFY z>t0AcotX5Te5}0NtI8J~bF6p@Nz8rP6(356X)NX-{qad;5wXe%QFtmI<cSU%fypO8 zwYC@hObxbtR1Jpspi0F9xQu8eF#%sD*lys)X}DuX)`h$%t9=9(sO@yC(ovXOgNS6Q zgk6(N59rg(JriGqx|J*DSE$POFZJ(K$CeUnT3{EKOlay(%Y}uD>vDN-7NYjTk>UUD zf828`Yth!ysW{Yu0D_OlI5yzX?%F8qh(~T896B>ZAe1r7Im(pyq#J=7L-7%;?0tVi zV)6i&;g7n-4kpSZXV3VQRkxzHW%P7}_E?Mx)DF_ebs_-mc(mQ8tt6oK*AIFIk90e` zlHH1TAO!jmKbYfk_oA_h@t?GuFZ_PmU7oM}d*{b_)1RG#=HQieufY5_=C6#z{_)F^ zORf+r8}_FWh$s`_1IOj-=+6?va#5*8{3I+uEXoGwd#J==%Y+oZ(Vya6%yicSk7H=E za<}bX;m;Pq2xqWhz<y@ekUq@y{O^Z1#Oo1|nB5&&h}PT5b@p!K`J4>T3x|40i^FLV zc+$<&^7_|K&yUgfN8H6vbS~r$rM@9O$RT+sFqm2DRi;k{d0c_KIS@pD=|On+(kO61 zgj2bsjOm9c8S&*%RInT5OznGQSS<q=>MsJ$y?gsGTV{oB+M2&BeqaFDo~B=W9|67B z_}Jac3Er2JkVY_C6Q#_C9kVYD2TOec2hY&Kx#Eb*)B<QSY)A6Jf2mT01G578R}c^m zM?=zf8}e|;Bj7vz6o1UXi__nB4<&g#|Jv5l+gC}`*3NEr>{Geo9GW`(+Qms{m0i~l zXCXhxD;xd2gEyx)6(np?MU^&&N3~pKn?6@*xuy`$r~LVB^fWOGT1dA@SjhelI|Vq1 z=Rq*r?l9p@!&S?jdYQPqx2wu5<Vdd7+L7Lor%ejX>Npi_LJj|UaJMev6uB%r^!Ch_ zXXM)Z>xtKmLdPM&BB4wI+6RR$b39MEw6mmYMghX&lDD~Eshv$Fzj&Ut@<6U=dO$2< zC`o>*SPBFaQ}_VTVM<P`kU6To4`n!w%^4i<VL9z~;TfH8QFc{D(t$sF)ORtzhJwAH zeFH<Vv06ZKq083~`_{ZWv-qLAfg*70qtUXd<TTB_PuZS#!pW(o@*1rw)2b-wMZyl) zJEZu#rX0t2og(Z#Pheyjr3wG9vFL~_fGnx@E-Bc<;%r0{x@5H``Cw7_sc4r_>IkBS z%~UCt6aGj=iaD|F%Zru0>kkfo{S#i`*6pV}&5>SzM_qANk>yLl)|sMFX`?S8S^h^) zjUSawkptOpNXRYIIkZ5>7e~`iM@n#LQu*-H4gL^in;H;v;pd$0Xg$O&ZTAkoW!Aip zpyEGL-DmQoB~`PH;}(@U`Pfs^aDhZJM-<V=&zR3-K7Y!-6T3wL;Q_shjW&dXwX5g| z)2oPNmu1b{g24^CkB;_j7XZ+zhx$(7gSNtZSUV^gmYr7G5W2j_2F>PU|5B$w*j>m* ziO}DswBws^!Mg(BJw*;Tlcz1*hGrk4-#<>6DAS9o!|A}%v9lhb8fW=e289n~ilpHO zngu!q^2!#l*S3vhw+n!=aNu)TGadK35BZkx9{`e0MQ7icez3fM;e$@8h)_iare<uU z!9ArXZq%nM8oKJLOvUKq8RbriBV1zZx_R+=$G-2#SGV|FHa)@z(so`G-M+n?0YipE zHoJY+1|BkZ`sdD#w^orE?EAO3%DE0!vCSF9kK&3)^I$9Q2F?aNoc~&N*xa7_s>?0D z2c&}mJ_K)x*Ok>8`kS}Ml#1emu>jp9q<XK~EOq{jXr;(Sghji*bB4+X=RWx7Ko;|l zDd~xN`7V{hWb8D1oVUoMVwXR_1HAD)Pk6Ju@q(FCz2Mstp*zZ-vG|~rz36})OTcJZ zIoJ`0Kp-+xNss{OtXzm0<dF#0H+u-;qBk1-tb3e}a{rFPp!k9yfi;$Cvp5<;7E62j z&jqRCNlw#c=f!$IVmUKI^Td+&2nRI`CejxJ2;jW`orpgO^6b{_%}^#MUdk&g0<@d* z%$}Sx+XVd>3f<6rm`1*>-O+VjtM1;hY2QgdFbLzc|5T<aoe@9QH7_RF>Q1|4S*(+? z36^L@2ra2Hs!`RW@YU~f>ZqYZ-CQ4!9z6070OU~cwTt%@r`toc5|jYuM;f~AGVVIj ztx6?)#PsoN9<ORd&hJAf%GvTDQP@N|Y<;#xC+%&NlAS3bx}!RDgjF;J{FNUvjJu1h zJUi?Yt$C!iUjb0d3t)V6CuD5)ftZ=Xv`!?T<tiVuN=Nnuj(I;xd~u8&*4OlqjNOQy zbmb5PtzcA8nDI8YX`HRuI9+20WF`X#|Ls^67$1=4ba>0iblx~hYi`&^Pe})O76FRW z0B~r|<iW|FOn@Q6w<ECs=mg_|#7Sw)33C|V`KV0X)tzcm3OkQjwM<Tb*5u2r!DyUD zbvmp?+6|*3O9n>(q(M1FUo7HO&kH~f#%hlUqub1b8?x45g;`$YV@4y`W{0JJ%U*U@ z{=RO?a^R^NTVSqOcTWlT7{!8dG|eANj{U1tV#x7{7r*iSXC%i?xe!T9WLR`RAa0&; z$@$)b>D@u^u=s>fdR?3a1wp_r6BFo#3+~XHBIPhkKP?yzH@5!Rg;Lqzb$0#B5;Pu` z=$`hw{?iNAx(J0fpG@1TGvlD$$3}y8FYy2%dLOQ`2vw6ViJrpex=(_jy}O8<PY9C% zyA~m7%)h*m=8=1+Y9F++E0qH`D)9AL3qKC%X&D}i$PewLea`PH4)UsII&k(!`&w;2 z>Ky@W;Lh(<c5!6i6<C7ej%eJXd<i-NW0e`e>=iL;R@%X+#q7|R&>G_wNDE&92CqQh zcw4aA7u^diWcDkVBw-hr@}t*oe@m&Q*Jj%o>iEE>wOj(2CGE~$56m+dzQ{(ymR3Id zk18P=gP(U%H)zjeZ+4xv!doiZA2Mu34pV;E(#UkMGAW0FklD>MG9YwoSrsArK&+br zE1#nwPp80*M9;!+4$;gGr#2>O2oY;35mM<kYRe?*Bqdmy0Jkg0Y>W4*zMA?@kp zHN3!GnIVa$Lft2;8vH$E!09=)wdl&>v)H8Z2YASDDxp(jq;}5zt+$+PX+wtW-<}T5 znGt5#Qb|d~Y4jn48SfqLboM67KOOvhvBV9;8f{ihUJTv^*T8h}HVw{)u7aP6z^#+W z0Q@N^myLP3;ZZB5hgFrS|E9ZM;a`W-nn;Z9h%~0C_4gl1*II|;NuIHlzFz;WZFnm$ zfknfD`pG7<k=RYDsyc0E7N?>r*|BqEGmd+fFvy8K7=BUK(@%9k^AP96Rv;3O^mmF% z^^?;fk>TuL2$Ife2~PLa&Ee&hLzAwRrYk+gyhA=rfv$LIR!axf-{Ags$xE6*+#;Z} z<I$4u!7hBdKw+XHA%v|xu)^M*fbzy59YbnOCQIt2Y*=dNI)^H{u7|lqR?wj5Y9Elu z0tD>deMxF0MX%+Dp+7~<D5k8)Vb>oIZI{YFa3)R$TY|j+Rii8KMrs|rAZI7DFX8iV z8v-=+J`&}JqV_!Ld)M2%D*`rZ1RctR9gq^dT1v7oT;sj}D2Qe)G${;G6kh17n2y|# z8-!IJ+O;|ZQuM!rFAJOonj(37IOy%rfDwd~;ehb5Fsub1_;rK(FbKNz3F87)3@Lwr zON&4H&zG~$@DS}0S<H#Ac0?G2H%t`~8TTtg1f5T3n0foUiuAI};n2ay46T+gsZ9MZ z%jSoJkDxr^>#tbj5fRK%cA$)iUl~uDHzK2d1OG9?Sa|N2g-~|CC&%rV#LV#mD|*9E zkSOF8ruxz8@`-;$H_{0Q@y9;{V-Sk{<{b5;7ppirV>z)|;*Fo>!dITU53a<cB?DxC z6!6yzecdO8z`Ur{POFZtJp~7xAE5ze-p^&_@PQ5<qp{E%lY0Ts!>&ro1FbvLGD7gX zyY9%B`klhnkn-@$=2z*=gF?(KgwUQ%he`XlmqTIS(%>dKSQauj&pfZBpT6#rHou}V z7W^Ik8J`ayoa+z~0o`Ah{htb4x;TztlYgupqF;Fz^H7SO$h#sh-HM+^`8A%cZHr)> zk<icr__3Yb!yI(+`Jnrpbr;obyjlP0cZ(%6UE^<u^PbHV_Lm-<M?k%Vc_sr2%Iw`F z`31q0*bP?C`maulatG{}C-3p169ASe<}y~+b8FadQp3D@nU-@I43$2X16o2n(7#g9 ziqALeUCm4lH3)0)hZqy}NqIVzldwlB6qA}tLP@dPk@W12SmCAdJ#qHnv#JdtE?Gc- zdhid0RU1#_SN}!T1MV_)9qx2-dC<XiqEl3`IIo0EniIApsaKJ6I4)NE6`=kd6k0Rz zumo^B9D%7HM^`kQmFB;?+x=LGflS9|Vd(|YpF(C8Vxi`<ya5&0V~**6C*hjO)E@QU zHuX}X;(`W$sk~D2kC=Y0Lm0~PB0k=dus;qo9C~ao;X7>f;Gd6mx1v@vBeIud%?F6m z1R+G0pt#OFTi>#<)J?B$xxsR9lr)pWhe%lk20;hupJqEQQ1?bDjojdoPIupYr+MG( z#@>O*@}}@cthn&y!GPo<kher_wY>e`U72Tu{XUPbIh2vvxz(4<pOnMq3r8?D5%&+h z2*Zc6VNd`|5;31TwK*SZ*p1Fi<_W$v;aaQd?v`CH6Dp)Z5_b}|@o&k}hnC7)Jue&5 z=jz$S?m!p7KW{K#YRsM%$zuNQqPZt(BQc+3G0ZaL{rJ_(=_@8*G`H}tU#%w(@OZKk zi${c$?bZ0+Ivf)OKz)oP6$T~x&a#{aoBlDJ)&y?I-!d5L+IF@!Y-qSXRQ_(s30B)O zzA#yg_$H#eywdjwQ$3<&R)ii_;VP|2&KdlVc6aP+)3=$(O#CIWVR1SXc)@9^Em)F; z>s3iDc6*HxPiK>}iUjzg1EJ`I;eDP!Gi?~Z+n>@brERS0HH4BT$VK*&DwR>oA@)mZ zkof&B;pwJEV3^ae#O7QR-h4h^a71S>Yq0~w2%z$l^{Mu*PYW(buH@RbFm$y*^EG+O zt}o{MI0yHAx#XYNPD4Y*kKW{0&Vr>=#4U2ZF>QmQ7ogxsh4J73_(jh+$v58Wyp3_h zGUF9%ZTOZ>jj1A}P8Md`yU`_ZkshIrc>)r(Ji8Nug-ssiwPZ3XQnqUS6`wZWy>9!s zM$(`;E4T;e5e9J=twkzKVP1~~*olz^8!UH5WdX$n!keZ;U3rwejzwTa$`DdzjJK`E z&gJIL9o2jul5pM66AigfX&+%egg+1!r<cK}Q**l?RsXOnW2vcJP!C4kI}KzgTr7&f zS1G5MwN@v4qTM-o&QsxE+d8v=UIW*LUET2^FU<tc5TiJ*!6%&KrzCJ!46eZUQo-Pa z9?G&FGXZ8n%3nU2TkY^ffSrFP1gRHz#xBu}5+eb6Vcj6)17WuNh6OOM#*pr4r_TP) zksyQlFDcPDS^ELG(3`eKL$1Z{;(i*5CO{XUM0HR9f^Q$%#r(MhIFc-L*$%X6Q11DW zomZ?1D=H6bcES)X$<I?~qT6LLQPMEBRhWL<JEz3VM@@;9&o#^bl>aJpaDN)X=-C7U z?pc!n)5d7TPPdoy2>c%!9buAkm_S3R7BV!c+qHK`NOIwuotmNdn!O)dYizO;#M#cx z=f6&FZ+W>9iw9HnvdbDc%Q+s3vrvW-23sx=un6Ngv;pga?kFVC8(EfwTAXKO9Zhde zA<<|STiwU_i)4A2p?Gl)Q;AS(Z8gwryOZrUoM_|EL(g|t?f}Y<%KhR9{h3Kd@&p@K z(uf+YKZ0lpu;$JCi?J-|wkN_*$`ZIa*IeQ#wM}*1A65Ms)L#=i%6G|(FSUV-r^CdV z)+!XU+$^t=v6m!m8bi^dpdGW)^HlSs)!u!q+ewFY^>GSUwTVBQ!;BsBjG1SB;3Ofj zCHwxARdv0agm!}Ty2kEU&-|U)!rMZZ3H2zSE8)93TFpQ1>t9aVDHc{_QO@i0r}oH3 z|8ItUXK4z<OVH$|nYq)w5C!bT6at$z<2GPL?e*-7Kz}n~oHBx&?wd^73+3gK(e6ms zv7q=4IBI%L+>`m+){$U(&9Cs1r!#eVLN{ZcTSD|(iCi(!q))#~zqpxHHrRTuNrklp zB6Ye`D1>{|S1k+&XtePS*3XH)-(h*<hhDIIL>-SLq_t1EHOM?Hnbx=1$k1K?;<GJ^ zh25RHtfP>R3fl#z44iKc{I8!rx4U<(E}PR22Ls%~8tcM>pL2^T%)vsMR__yP(wB?p zx;Z)htM`B8DqaeBf*mp)S{#xc5?$Q3i5i2%9UC|74YP-G*`+FzFZ8+@3coq0`bZZU zE8UnfILRF=TBILjUuaHeXx9D+{Vp+qpsXDEUJWXBw@Bfo>tN^N1sgOP*g5}R&9bff zdtILG|L?)qFr}-SZ*YnMA<S)I)~42Ik30OXK`4SaR1gbK8FWfp6-@;xnt&WZP{8j! z=bW>X&9(Bu`3{z2zza#_vZkl(V4>6DDd~}jho~>B^4<7~_~U?BTf!cHXYv%EEzI9F zy_MF>scSjVb#nWJL?mrIHtGnODMY?$s6iY>`pghl-$_-hj<zqU^cQ<&yjYAqCxG1< zHAh7p_6&p%ERW)piwD|@6f5n8EMYC-93*6cR%!4Eb+ACgCNpm&s19~2%EP!+F%k&* zS?Ua-r&~%J>ZV$ci4qV)c=6B6Ol9`c6~kf^Gl%K|g9moPdl>{G?GK;)m2Ic-+TR*n z18mb=Hl3RN5qA@J7xxe+?}l|qTkqS4zvi65TkSaq!o2sHTfJ?vo`No8^yr<mu3w>~ z{%dm<aUL<)&3YpkCWb=lyKPU-K>>KcxtB{MOB6mLv!X$M4&8!1*#x0|2Yqx3690;K zhx?gGpHqY5N0wvJPtLy>pu44Rla1@>oE`_YIEh&Ct37I-q7o*vs$U#T$Ic(>n(|b! zls|vUK859P5{rjhS)NL4&c2k(t_H%+pwaj%u!VopPENhT=z*~E;p3z`xRBrB4t76& zdz94EStOLw3K8Qk4+|rgUV|GBXOa<*J%vyf!$2@Xo$0F6WYv$Cj-KxtMy&3&NOvXA z0@*Sdn1V;BtH&nRI-gm!zmlsW_&Dp7K@C>@-il{x_#>3F!J(VtDy-;Hm=+@Vf*{;X z;o?0Zi2Kp4s8FHhewk7<S~Y9;FINO(&jNXmhz(DzGo)3U-7gcla}Pfr2Ic;$P6^~t zAZ8{pcE9_p@)di0T7ldU^Vks-7YnlAMA9nuehwK-;rV@wTh6ng&PBkDy1d~o4}GdZ z7y(#%v?QgD%TY*A-w#s4)WUE2rQQR%;?KL^sgmuYzBpeX)YIrj$T^sN=b>)tR>(e! z(LoJiHmNT!XS6G{|5_q^#cBT%?P>P=W{?FGf;_Z0NXWIQj5sBRT3lrK^X36;^JN>% z59JqdpKRe<^dZUJXcK``X_)bD%08{&g%}drSGr!r?d_*9(Kp66%4Ooe&le#K5<Qz$ zm5(ep$RcA9bS{|KEF^b}_m6sk4<}~<74mXNP~8k3@io)rvhBlFtq8`cJP2MaHGz%s zmBJy%b)Q9DdVd;M|MXDf>)|1|V+R?8Zm~)@zqA*|kv6;w#!%+nV>GbCgz&FY7*vBe zttyZ*{8ZOh1!wl&MdR;dn))n^x<;`?wuKpbW*|p#LX50<J8>Xj2Eh)u^WjO|n9F$Z zR~=$a1tC5NRz>}FE!+nwt&a5~23=X}=EAm=zH`U<LR#Ch#i&5eHO=9UxrDh$1Zw<& zF`<MtN?^VQ{M^&y`#4*(xh!=G)RBvCtV_J!B&dikdz*qB1U3cv1D<!CLUq6k`y9rP zh^dLKC%Nzg1d2>+<q}fJ;{d`H%~?B5N%%NL68}=OhmTyX%qT%szew+I=P(=F(*v-N zKfB|CZ(^zAa#>=_b{VL|MB$3$Vt5L8+~Z$vgnS?N^8&z6rO&id@Q<k+dd~0lJ#@*F z-U7pG6#sbmV)+#V+>0Zwc_p^P9sdCVB*6S|G+l>JbBM>G^99>U$p~_T%{$M5X>wp7 zC1So>7fu1H$0o}ReFuIT6%bQL9RQnW-0q82udNMk6A&r#DN9Q=jhO+8tML-4zDse9 zNj+TE!*0W2WD$D(J_Q7y35x;Dl&JL{;fJI9QD*x~0X_)~{%gmUgdPMpPoPRn)ijp8 zm}pr{3f&0h6;V#AqN`aG2M_?H#I1v@m#SfDzmGIRl-61LQgsM~i$*4=>~VkfVIV2m zPhFPrD8BQ{q$N#OS~V07VWLLWLs##=+$w77VkJ3XbeFbY6Y9b~j>6)YSo`982-8}7 z?i*67<J%;w@b&`+$%(Uy>ypuckQL_8yU<ahI(0<#!!T`cvH$_Sd5){5oMr@Os4MS9 zCf}j<ITU~(LRlz>GM<t9Fro|3SB?yu+77+TMcXa5b|9~B3~*}1qy^WOV%nh?_K!85 zTgDQap_!^9zX(E_kHfXj7&u3HYi(s;JvVaz&6-6)@Db}734cH_FA5$(vawl2GLD*` zi!rMd#bJlo^C%u=lmJA?F|_W|6VR*f={=<=9GN8JdIz$&>#r60xFDiihT0JNJ0Gr5 zMEy{RwFSc4SSSelNC!VdxtLVuyKo`o2z@frLxH;2;L=9C++P4bXgi<ImiO78<e7?H z{-_d#`O5*5>9NDnz3wF6P)q9^1?0Lc{b<9cHN{?WW-=wn8wbp;a$s*q$e<+Ft*C14 z3Br=bzIv2`vqB)Y0rz51F;8*er}#<^d7_}Rp4#^}lcF`q@EXfE4L=l5>Ng8?{J!2S z9QZJeMeo6s^6m@V-|Jwkn=rB><|lgAKepQ^Z;3kytE>AQPna0!J|T6pKgnV{#QEfb zCDpcx^|7+0fgKC@c4G_@+o2&)Ul$^->m2m@;qcdmSjPx}I@YUxwC$Iq&`Kz#g+hH! z=qFE5Y&8NQ`%?msg?2goxoD|}hOI;__04|4jn*!^htjGl#Qo;Z=i7Vy6n5N0YHNv< zBiW1AaEL!YS<iTKQ_b)8VfUh_-$!Kw$@ulkQ=*q4mPJ~iLrF8mqplKwCpjj|tz#C7 z!IY15XUU?^6!55SUyL4*;U0qp^?sAh5e7U*WY=+tMpb$=lb`U}e&c}aYk%;YV~>6c ze3pjl(ghI_9>p^>1$9sYoAT}t-PwKy4WnJhrqzBX=d%4Q7ug)h_$(c#8(zlGKv1Si z%86U>qV*~6*Pa(PHHo3t1h#wjasEHt(>`~BzTgunH<l-Gx6;l>M$w^Mp+hG_Wq9lU zUK(583&B=)b6-&f(D4wf5JVXtWV#U({`eN7Rsa+350%D*N`TVV$>Y*dnvZ=Pc;RbF zC_;)BR!G};&Bp=0<>DE_6I>ZlKj9CN>q21mudD3O2NunIA+Q%mR0#N^FUiK#U?w-1 z<6O5m=CXW4X{V24Z=$%;VX<f5b4UYkXY)3BpA(K3%f6~Gc_{-Xde)$3_Fh7h=W?t| z2Rw2caFO}lAB&<0rnH-jbvs}I0f*|jE2F@RJHh4;@HDZ|?D=`CBUl7r1gWLpcl#F( zqm@iHyOZ-W@!3uc7p1gFnR4!X?kBIqwayu~2en@oXLIjDDcM=DJ>L`J*vBCAQSk5? zXF!8!8vvX=QFx^!vC*eWgA*rzD{5ipcv0^LYoECtsCs!jUaD8i!d@Uv-w#RbDPR^# zNuuv$dZ6VL2bV(4v*53Pcg7NZUtNx*(fYl!f>00_Ns$|$%D}}HPJ^&S*f2{xk!IQg zl~BbRFJo`)gjP||0jN>mSfJnka=!<v!S6*wHziHJ?qeix>sMC3Z^(yaIJJ>_K;p_u zAqldLk~U6}rIqc#*dGrgMBg<nQ&!-G3MKG|CZ3m*WP!mW{<My&8(|G>K1q<_Nv!&y zJ5lKRFdZKudGuEDBpNZj*Nv;DMCui@#_an_<AabWtFRYoDwg*kPkOb3`!I`Cgm_$w zQMzLh(cDTjk-Yba!?viBTiH-;Whb!;gJUMC!r;z8SMFMBn)ZpjU+w)x<KX=lc~x1p ztNb5Ue^$M%{IfcL`9Gq@qvY+5-^*N<yVF4G+5T9UBv8qmweYSpP>$h+c*J0nTH-a` zlb(ji!wMh$lO3Vv#y3p{4q3MU(EGZ%PfS>}3MqEP{B1vU=d7W6U?31ux66MtxY8q^ z&71=V+M4+H(z9hG`JPC+^5W$veb{pw<`^XU4ca1p#nCK#5b@8J)-6yi8SGXvi)&1| zZO^RK@CNzvsf310owt$;|60o1;56SM-hhqRzCV&*d4zvmOFa540(x{ohKMu;B_P!g z{<DI@C*PwEUpxHqqnPW6>yz8Q#kbhum4lKj5oy>XQLa!As+mJP0@?P^FK@9dPrhb@ z%=mo7&&SyYGqbI~iy(8r=@K}poZLI6;lNq{z{0=FCal-rUxb<%E<3qc*~QJlLXY>S z$6)nX5SoM=;Rwz%25-B*;;p{Rw0Ik7rSx<6$<3#awALDW_zeP|F>?#UnHvg5j`U7T z{}uTMZoG42A@Kc2%fe-@3<LJX0J$f2zS7}uY_ZOHV~J8hisQ7yX0}iPT;BpiJ4KwR z>m1r|-uS`lm8G?Ppo+Jh48gZl?}1V9d!+fo2z3_PxBy18F48D4`?F`idFGKkua$5p z^Fhx~;+>WDfoGb31+cX1NOsuU@p%4?@<iI-Fd9jRGk7RQW@*$=_8mI;)9LaU(y}-l zi0G#iHE~64kvJIrbei`&9eUImm8Wt<RfN097Qo?<mjMAMM9_v&HXyw}zf&XE7gN}i zRW`>j!Y^x_`^_Y;G)N)O8zBF2&NyDAr#)iT`Wl589*tO|#=+;jJ(OxrwditrnK_~~ zgAK5I7N<IScdz;qv*&crymN;ek@BK`<!L*&F0d<BU4I&+XE-dM(}Eh0b9B;}+0gz5 z{K}+>orWU|;SUGA_loyR)Ut?v%Xmfa%YQf-y?~903fKHNX+et9-;d2n49b<-xX9DH zOdvI)E~*>C9Q%K1p2KMF+zEO<o_sGuo^mSx@l!|9+(!x(;>f>-%VJ`W;UZ)12E<S2 zxfm3U6fFcx<2^4XcV(EXCrl7dImUTZIP<)>|Bj+Y%SpRWXeA>!!EdiPhw3ZyK`JU@ z9wQmzX)np&L{O3gHlJ3<$LBbpj+F65!Z!$nntmOxBx3c3+e@O~?(P*D8$beIf?-;t zx_&UlBP;K*DYryY!jJYB-DjP}x%Xxip5ou>E_|6+6?>)|kTPN69p2UJz#-&|b9S7< zZNF4$0ZH1`3{!*K5>l3iae^8Ynb;8FPj0$jWf7EA{gi{bo^iP61p->xl<)jEfnmTD z@((srzkFm4A?jGK^X?75mcse@0w1WFXsKhxa1EEf64sm#6r~+U4$k|ASvAD?9^Vzx zNGe-s=^bvBby-JuEzGp`+tysXuEv}6X@7Uds}4$;nWB8Q#ELapEAez7-->SSQYXvT zKx)KXge8`_GT23|ppqjud^LjK>;ztj5=Ekj(-<enC4m!#Q<@jn;2-Q@=%Tff6!vEG zQ|qvK2TUIu23rEtV)I~qWB<FbziU;Pv4|MXAsiktJ|YT*$oC#18I~Thb8q{`Tl`rG zM?_I1J-uPl*+ip~!PF|O+?0a`p3b-)w4OXJ03#k^HC@#6<T<tNn9~s33cemiD2DT` z%j=Vb!@BwF&7vbRizj%@QjU!yZ#owLJAu05R_2yq`2<7<o{^+%+^PUCY>Jf@B0Vzv z{ziM?Y+~_9DjRjmbDzjeIi@f;t1{sF07$X=>H7h`CxF_BW(`QTtaZE|FF9#!r*0A9 z)3n+-V7_|3HZ~n0N9qI?L?bymtH%O4K6R3@t#ph35QM_}gbmD4OP>WVhIbhKNBA{5 zWvFpZ0C$3Zj1FwNW0~?|JP1}@ts)}l|C*s!AgRmMdPS)J^^rt?J3df4W1<GCxhs5| zEx`dUfO^-6McJi@t78qefE3T7zcp`Bmr4LH*l*c_^r@Jt4TrDy5L<=AQOyEFUOU4M za&!HPp6?v)<8DB36U(x9rxN=?%vn`?>=ub_)}s}D3KzwbLAl$!oh@Q^b+<t@cv=-f zDz?ant(?T#AqAyt?nnYeXI7L*k2Xo|F(vL2)e_UFcv<8M&bmCqk+8C!X1&eZ8$($= z<FJnfu+G1Y7#CN$S*_RJBTkrJ9>(Tb3F{l8n(PmB3{tXoFj->fcAc9^MN*9eM={>; z8?h9zeFq0!=Cm$+B-W1P#3EEntjD_|GP;u_Fv-*a<(<!S%SnPIawzEQ3=Wi*d*R(G zi47UXuM)LjmoI)ng)Jyb46@WId4#TmNk%5fnnAFdxf{m!mUGy0T$gt0*Ol6N6u=hJ zDsmRPr!B^J+<$Py^@-9EsOWjFnJF~2@n4h5ssx;m8u7a&>Lsn&zqkE~Q%i!m^PHzs z3(69+K20bIreSH;F&^ALR>!)?x>s79Uw7|Psw_~N696(v*CchSvk1SYq#@_`>cS^{ zlqI?SF|=7bb^r9_L%S|&bcu7lL9<7z03kwK#dv6jEH0F>&)1@uIEl|mF!U2P2z`R( zahIYJ*q!$U*-W^h&SoB7(@TI7(q+1CtoSkaP8?<VaPHo_mZ1?v|G)8V@4xfQ)ZZc} zg-e{&3>($YN;3uYy}BUoMf74NGKs77No9h8`B?ql%|YXC5<x8)IO8SWz08E8fd25g zAU5eA(tkEO@`D}2{tkq}#IvdMOZgzaSUnaKq~Zz7f2>c~m~aF2OQ7POJ4eP{`OF~c z(BI#l5>>)vtG&7w<zo6$j!j?=L5vaVahW|X{nIFF>wygdF|7n}*mfeZt4e6jI6&oz z2Ts}$RoJ1}!!HE+^5#)B_;;nGp#O%3fWO9mD`7M@QfBao>Ad80w}1vE%9>+`ebhjY zgdS^N{0owDYJ!0|OB~GyE!g)YsmxQ*p>dwtJU5<)VX^~@Vb|Xt`@U}55eSV=FC(6D zdNW7e!6o--iE2KOoi;MD*e&%#aC{KYrC7FBI2MDL5iT?AvcgL^Tt=Aqnao}H*8b_k zmQ94W31+?xnV#GtFNkmZMb?J|DK|1bu0+gH^VUE6UgM({JjxGv8-?mS-(ME<XQAsS zt+fTSO@4J5=Aeqa9o>;;Flt`d;kYDej>7PmH}nydk<YF)nSWs1G}R6R13cNIqH}ie zKmL?c4GjCC;G!(iOH`ZOT*=P(QyO}qImsdhVp{x>`ei-qjRyo5WKnR^Z@`Uhs*Yyz zv?6L+jdb;Xd>b2`nD6wMw3SC#UGA=t!}Csi_%8f*``^K+$p(k>v;dLjhY8$44Vq*) zj&tjmT`1yKX7%TwC{MfZfnb?1I?t|my~3R}jT!N4(9waLUTe}Rv41&jSX_`JRkijp zfij5!;5PC;?L%-sId2r)D~<R{sB!f&7fS+`^XEGx(+T5kBR56;=5MYy767h9)e@I9 zAX#F%yP8tTjSoE#$?{fto$DYX_8P7ZsRmUhM`BkDSL|41B;*RsjMvmU>`FtKB|~<L znDHgXmPw*?tshPySu(@TAPan4BmBvO9FW|bsL9ZQEAzy3oa5@RSKbG1N6Vj6)S>H= zi{y%e=I>&Y&1)&U2uoz|9y4=d;pEa(9fgaK%ZI5rct7)<{I2rCFt8BN!IDzN^*-^@ zbB`0wLK)w<y)RX%5@}@fx%_e)KuV)RV(Crw+oi=@A_)h_<rf-Q7enX|E_PWpZ1D7T zB~p)_={fS9qNUh60EKj(xJ!x>7SRa)z?glIqv0agf(6gaua|n-k>bM)_T}8vKXHFX zMpE%6+E-eCXp>~nc<efnl85?0ZZ|5cDW+oQw{a!z$sGq(jPP)PhCRJM^Cc$V8dXs3 z$$Z8IpcdmRc2p%!xDV-lM*#MYCf;%db}%{vhmJyQNLxXsh4+RXr&>*~PTgcO@6%r@ zTb81C$a1Rb_Ft+;8OHa<3R8_w|2*Up{HN$EW4JS^Ok@I{%4;r`y7SBDU?wgk7)g7> z%B#YIThDG(uKFizlSaO&Xk#dx@~jf?WXQ8f8VA1I>wW@Tu4r8T<4&eA-6#$C_P8z; z5>rIi9M&e=PbWU4tq#JUhsc77R%amwS#Pvx86l892^BA92Tq*=z>?LHJvm3pr?O(+ z76EKAo&f6#VvpOkjS_}^FAAJ0`G=!D8}P?}FtPdgfCz?DGkHEP<{}KA1ZTfp%4*pC zz$j(0lMRP>uEQN<I5JzOK#2gT7``rKBrr!kM=BM_%v>hhZ=^NGx}aG|(1Z^O@81hw zrK>kQRPJx_{LmZVD7i)u0R(agS5KC(Gd8+^i&ft4Ik!t**4N&t(Plo17&2<qAsnaW zgGPWxdFU50{m(Rab@{_WApSU54wijSve~Hg80^OH+2Ah)MMqiyMK+m7Fp+cg+GKx3 ze`s7pX<Y&^+oV*Vl1m#m@P==Udb3DNXJ5MijmMe1ZDX*w%ImWX5!!mgP5OTgv*XhG zwtX+Z@jdY(^ZW?e*QW3~F%G|ZiY{8z==qV+#pU=(KEdXPnwsG2ZO<jTLWx7ov;z}2 zDXhEHHN!Zbo<hg4XLwi-DP|^rr5e1YlybAzUG((@*#SrOOKcVmoR;2c9(!CHgNQn% zOWdj)l=Jsa4uhWxgE4Ph+zKB4yLywkM`n%?$~taJL6N7d$e3(${UERu_EyI)f1HH3 z4LzWGI_W|9H8z~HM6mdr0B#Vq0k8gW+ipb*n6eX1S!u-k`uL`oDjY;jG?tOZ-uvbm z3-Db0AC(So(K`=IX}s|`5IJa10J{bUCwPfCcY;0JC~U9^gX3Ok#(jsV*h37_Hqr{c zEgGqsYdyPs>ZDItMywoz!at!`Q9M6MGe&Cu6B?D@EHd<R&H0lc`>2=Q5j*D+gf;it z`jaa`(lS9`B%E5iZIfJgyLEe#_tmPastlD3lMLs?75bSFwqC~}r?<t}(d+&&nWDSC zU!s4-{>a`IRFeX#+*eR>AH&<LNHjA$d%niN6YBu*=3Q0kcTfyfny^G7jsa*Z+EvOn zU%?<&kF8bGf*;!fzp>xO!vG|vXl&SYH%iBFwrFN<50_;-@3D#dsud$y`8C!}OI# z9@nivSsOnTP@Ab;6&Ptw(ybkIsr;pcQFFwiAKtI9nz&x0_vbG9;~>CH;XR*`@izc? zYA`JG2PS*{iJ`(BS@8$Dcvd&@g{t8Da28LUtyNz2p;%d&L_1PlGYOa^by#sbS=M76 z=C0|pHC~z$H{@y266xN-$s*poho@KE;gxC(W!g67Yy{{iN#i5MsLF`e$RHQ;MOD0H zLmW`SeS~2_VBaz9;{fc`_Ry8>r1hB-2J#(yL+cEQMV@I#(qat7Pq{Yq|4LE~o}kk0 zB=h1B@*t&cd}21c1Zic~5IbMt=$YL7f-7DjfuLEB!0v!F-Ov7cEl&o-dN>DAgQXoI zhtg&G;!8vVN&9xs@5O3F3pT2>9{0r(Y0J7Xpz(S1F-w0$V?^tK#0fgTftw+UeYDuO ze6B0ee00+63Vc?0&onVA^jCV}p^Ga#wXVcr@%rcF`%?KA<VozOyb`{Jd*?CD5#gp^ zeIVI0!n{<)`iFOOK<(9|scoLpOp<Z#+l0%y`+>J3ufcYjC<5h5b%K>`4?|_klESBq zN3XNqYB@33Rg+w8bgshr$uNHt&3$VRiA)lK&sYJ?TV6#LUDxPmKQNO5)h-lMD!A_j ztZ=e$HOPKvwgo9k?~$L+xj7p~UXeNEjP#w+(#VNxHNMlKB0fSD@@UKRS7L`H#(=i6 zm5w$TR<e)ulsyA}dq}Tp<X(l20vtS*`B4&L-{(d7WfJ+WN6#(cJDM^=0#guJ%5$m} zoba@=&rIMP60x9j?~1u&ymBc(6(bsPtzyXZ*<DNO&QK%CBtEE2bYE6GWr{iE6ZuBf zga!@y6f|7LDDNM61)Gc;T(fSM=tz%$`6$tN>Fhbz>Eal1n9-oz9&%%LRq;De9x3*@ zidR(}!=cT{(*h?EJ4hlMM*X5IYauq0y6X<O&%B7aW6zvZ60)VgQoAyqx|5OqKa$Qe zEUNEo!)F3!=%E{i?vMsSh7u5@R3sIYE=duop+UL?qz04@kuIeKDFNw{lul_R=AGaF zy{_|NzO6NTpMBO|dp-Bs=+&XG57G;SZHlkCt8FbjXB&{Cc-24LY%HvvpRnY<E#W0e z;#)bntk7hL`&71W&2z>+obCcPAzbc1Y1FP2n@)2(P)`uWywW2~;OV!jT+o#v!cZUL zc&C^L#R7;4ux!>}?SK7%{DuI_#dGo9<~4gE$YW|iqB>%4uOtNP53e@LQXHWcHKY=O z!SD|m$*ZG}zTss+XstyGW0m@qCq#zIiEL!{?x!%L9`@ol1tPeEE+_QYd)SS*$JTFD z&uEH#-#AJKKkBDU>7f&ZYSJWqjE+S4%q+RkY93OkZQ$AR*s*PraDER?fo|Z@yI*ul zuU*sE{L@_IDHQx~4%&`_;tDMWGI8EmdQ&uYu|!O;q;`cMLsYz)Y#FDiUBD3^h{P(1 z7lV9J(c~i8aw_H^%`~Ui?PhHL&7vj@MX-{zA$&O|v-{x2Ku`R3>&SN^LAUs}EVcr+ zPA0RU4DaBhwZ^;k(>LA*v!8;>!m+filH&`J&kOkhq}ZCZ+Fse7W|Dn4GvF$kSOOHC zXD-_eaLi16(taf+7#JG0lHkO(xg;9#Yj{~zRM}TwRQYLkE^a?^i1*4Rg&s<r4W>q& zgx^rY7~1cWiiG`>o@ZI$qxIpt9as0oz9mky&(`l1_Xt<^4EOAv>8H>1q{8^oqib+6 z18W&hrK4*~kEsSQL1bQnzHPm7|2`W)uxUI$60BFQIfCGGb6s1i_F5j~4A6a;N!a+G z_}y6YBOb@45tMF@rmyPU_MzwAo&xv4r&t7^Gx)L*9s*@)RoPw66R`Gc9EfB!7q6AN zUqIfT(f^<A6oP0;K1d}0(&EqFC+AlE0Ldr<cuaz2^gtVb@o_G#4txeg@~d_xyz892 zEb75ueXp`LUoyJ#XOyV@e&O$Tg7365<+vp~oLI6>#ZHyQ0@gEB4p*v>j_IdaS4q9i z^Qgam6=!KybmX1VR`t8KZ#ZTIt;vBy(hl82F89ymv1GK85WAMpk#GsA1D3YCyGyy^ zsWqwM?`z(ROG|bI>EW4uT{w^B+rs~Eao(y*CqJ*|dID<y6HyS*t3>|fvtk0$iteAf z`408EUj7=nvYr_|Wd!Mp0`GZj%cFm(6D3=vW1?AJoz{7}x!UsE^$puJGa?nimG0nT z`!RE+t#||L#~l>5g0@1oE+4`nu`R0`Htp9QqXziJA8y)Qe{=dmZaJtA6*EL!<uh|) z>7}m2#JR2%_XX_>x=Jor#h6QjV%toi@w^Wu90i6HO})l2{-rxWA{EQq3S!gc3{Gpp zeBp-0S74Vc5{^3keaLeDSK3;>Ij)NK%R4@!l2i$cov&7&ow5jjZ|5BX4;k%4&XHR+ zGK6AGREVOe^V@iOgGLFV-@ubD?11!d`|O*B5;%ZdPhdlyQR1N0JbZSFJqPhzw`4eU zaHxYW?Gyhw>}az0$##{eT8qV6mz!*LvMs4I^>EIsDf0*5$|E#Vke%M|XvuEqJ4!z4 zi1-}YcMR@71`6-pX4BVg&q$<zO2e^Djn_i23h-}pZ}Po{C{<fI1~t-#^TWd(=(R00 zG;8M@p*P9o%Wq2blgO=2o6}U%eIW;ET6m*jc1k5Lt*QYNlcZh0c5PwemQ9@s=1VPI z7c9RljChobhfcfYqZt7Y#<<1qf*g~N(>z6PerkZ=Qw+Q`OtS)`Rnz{nU!>si4##~O zJ4|D()>Kz3bm4&^lxw5+VIjY}9}a0eTI!XV{Ur0aI4XZdod!dB>1o{}0bCRRqSBm~ zNkC6#uQ3DEo^BtI=Agsi{1vr3f1=2{Pkt2@FuM-!v1Z_s2CcXB82*d4#HMxUKY@Xn z9{@ljAyR%fNJ=y==q8BKoKaRwi=tRPMeN5DJk>*DxZDW+62Se|a0Az}B2NXn(Ml=9 z(c5h44eULfNkU;fo-1*iId~PwD_JNb00WBGjuM~jz{uwKBprOgRgm8cVId>KN@iE= zCp=&+JMbBI@Jt}>b=z)83qLb9^YNKtQd>Zq?~UuuZEdx_DXVXU%E$tDpH%O)Zj+2$ zMMx=kky5j=_jTvx)-SxN)N8zGMs`7B|11h6;J~$B&XTud86K3t7uLj`)WvzfpE^aT z(~0Cy^VT3bB$Y-1%@^<g^8W4$NMi6}=qBkCp^^Cw7R5+isr%%L_0Vs+9Q*RErqr@Q zy^4hHL$coFCC<zWe+>ffEfJAshqE2`uP@O+MvOGSQdViRrCrdTf^x8DuvgkXQCpO6 z=M1@_MM@#iz5&`Dg-ows^@kn-xC!K$_s-%Iy!65S)C(ciI$@_f3^|5Ld30Yw>ON-2 z8_IoW?5CWO8Bchz){c6TkjF9pPsYN7`7J5;93DlzJS#i_)ehAtzN4&@eG_~V6Y^f$ zlmo`4VuMUkev$bm7ilDTo2^(B7CkFe#Xp?YHeh?`gG%xHrrYRe`YrhYr>Jn#a!GsX z+Kf63XjzicCzo%1_?qetWIO?tVH?dGFYrjHNo4m)Fs03>(6BhnyMEPSd&eYJ;IO>^ z1i1Z4oIWESWsTmRz^=F58GUvbh>Hyv8WIWS`$Adwo=ZtaY$uWITiqTqA?4IM)+=1@ zY}2tohq?=5xc8qqG6@gmpy3gugp$|XB`VKFp9lZA_cDx)REgS>6Zs;t6vOAKcj4-E z^E;8|j8!L8o1zj=gR0K@-p66OW&guV-qDVSd3#9*+!ja~3~YX?SWhRsZR8`0l{3?f zeuzEicY9d1u9*YnCsidxf9SZVYH<2gJAER4$LAw?^k46rc=}c+9f~<nSp+uC#mpX8 z)Xgg03S<gkDkp9&A?k>YOyA6|r;ikOYdEE{VjulgX1$5%^6c&XIP?OkcRBRq{+SBl z_r8R^^^Jr_1U8f6weYQ{;T=n^ZrnI=Q;6+1P%-=;QDmhn!oarMk~J`nxb|;$fUSMn zC#jz-YxJGJ?Od1kjp^w5`Mt+KhoI0FDFpBQ@N?DcyEiyuwc@2awfv-KgijA{pK6(M zw<R}=DD@Sy4&;%&LzN{*JDnEO%-(RqZ!uZ7$~5@P(I&JZwm*)QsE8s~D6N@MV7LjJ zb})FUb?0pbCs*XhUwA3u01}a!d2~p7<{v1Eo3qk6Y-2jL>9cy$K-*F<AhBK&Jyk#} zBf{ZyXWNi~*Ua(|e07u*_It(XH&jCGQMERcdO(~_QhP&tV*>Nm8{k1tlt-g&wB@t3 zu;i|px-UUy5iB`dcOQbm4+x28`|36b3{*73kTI6BGjH%Qq|niiuTs&YT#wh2s43bf zPZ@Msxehcx^gte&Wd0r3xtd=Xh61rkOhC#6HdD&kN#um}5grz%zgM-x#mHV(`jb~X zQqal}W$gECJ}x&_LkjjsODgD5oXIrwiDb1=wW-*Bv9wR|*X5e#R6p9;Ue7#Wi_hcL zjKHf>xMHVMUKJlWCu*4Ee835dq^$+1ho)28L5)Q_#FTzwx{nqRhxr8^HyYKS93Oti z5zHBU?awxR?lXtFVRgSgZjQPLcp41kNcY08TGS$DqtHPJ91#q%X6O%TSqHZYfL7Dz z0$!5hqB7@SfPWHuK38$8xEHl>ri>Nx0s#>+WW?!A>c*MG6&s=@WzEQA#=&!LU*K%` zeUI#7gvud|*}0DdM+hycTxsEbgW1@US(iOy`T<^JBO)!7>@-D5Ng*i;Gg|u=xTjx! zRv{hixd|TzrG<$17n~F3P+Hl_LEOFQMp*iux`o3I^KE+;ZeboB^Fh>a0G$Si;d5-; zdIjGZyP~E!fO`DUJo&AVq@$E)LdD+0by~Z$4~m?3)8~Xy3o;zR8BXH@Y!Ejx6oW-x zm#}xiGkOzrqkbh(xWcaMec9Z5CR8ka@A}Zlr%7ubioH3<N281Y+5$~_7$;$G`59|R zAknw^#vAD$d@pt=rK{I$jDoJJf#BaX5%gLfTdW0c?b;PcBF-ul$Y!`Eeg5xEiY<eJ ziu}UxwM*xdpoUIf3$S$pm7LiqaPzbWf`Q5`S1M*`rLFNq!SwuZ0%yWaaZt^3gC|&# zHVYKQS?Pl9V@2E=191(yT<z-|SH|<KI~@Ks6YH=a=zmp?F>9h~FM7W%NgS55jkp~q z6WDsxx9&uDvEtuV0>;je6!~>zeEr=ZBd@*kywjvJ!^rnDjcu-X-b|TsjIZ>vB^=Fb z%JB>2xjzezsgu*W;1rJf7{&rP^~1pm*Qrg{|0Fe6K#$F_((B0NwhR#Ju0iU}Q&sSr zFI%zP!CfV%nZjPWObVh*SkA7z$pP-3I~Q@oL9`T9!5<hTvBgm~OlQox$rd5R!#sQi z$Q{_^C+<FvA`&vs5aL{?G-CXscq@rG#Y~Rm<f>pDy1-Ts6*qjV%E&F(!w^K4xN$IV z@ZKkHO1*}4IbP7OO8UA+Ls6-gDN&_7v*52G^^>w9MC|P|n$iS*$mVBAk|XRg-Iy6a zzX)7nHG|n^ywqUPn;ZS#ur8+e6juFtZUDnR#dH3mWO-7P=(CJmLBLV&FJB&yay(lO zE{<hwq|yq1H=;YfZT;=jXNBn&Qbe(I-^!gJ7WoL-;VczGsz}J!Ig~#CKp}&f39YJf zKlEOVf+jp4YVz%#YNytHcvRwqyFc`v{s7E-pXX{!a+J#!F-!>-wdE0t;p9yD2`6+{ zBjQ9rkD}0Jfg4vt{XT%s7U=PFENh_m)MFCh!C0^_>a%QBtzygFmGTq|-eNWGuRqB; zNsSd-2`Z!H?iqiR+q0vMB%~LoXaD{SiO@KD#*RR%s2U4y>yRy-V7}+uVthepMfyXv zH==<OH-$MFP!`nbDfaSnK5$|0u!GeUGIq67u5Ffho?fS)G%QmqJHLtTw)`hn(B0Si zssk#s&m6&9;d{v4*drl+VQvhk>8K%Cax&=$$ATU}{*zB@@xlzG944h6QIya!U()>L z#&}Jw<NvvCGK+)D?8jkif@ZTg4}sFpSP}n*5xFZ73Bc9Kl>o+_1tlG;`a%EHECpqE zrRhHTJRykBevN&#C_cl)i{kC^STiy<@mIbuOc5u3%BVI_9ssxhuDxGfluy_j@@p0o zfC<E)-*PvrLt9rmM1EFvUM00dicPS&3_V9=lSUC(?=UR0yVbaU$rpV}&X1*)&R>Ly zE{*?KEz`PIaS835!w#I1q;#3ETmuE9KaF0@CKb;WHaUwBIEST}o3L;&(~OUiKVkoP zzd+o+1GtKjQZl;I5LH*BS@W>(*uDEiPq5$kQm(6mPp!Q~H{j*{`HR<F@<0(7eKe%_ zS@|ZH)xYYu(Oh{K_8A0-m`y-4_F3ppygNeQ{}m_2TDzD0E=6ynXo1-0ofBoZy4N?C zV@P^3s_OmsGlO8O$j+33d{r>&28Bg|AO;0Fi7tq~U(xAJXTIX@6QBKA`M=f5leN<; zVYUg-5iGOcaS8$*0yJq~QfGMqUVNG&zwQ0k+OI^i5mpkK_H#!WH{D{rVT-XGmJ}=< z2AChu8Jld)XN;AI*p9k*1%fA$PHOgmjhDe0auctjDe_O%c|I<n3QrH$8o9?$AItUq zs?b3vD&CGu*n1QYsJ3sz(Xfm!-dT_NKzb1L8=5*UG2?%SA8A<F9Bl~AC{CH|qC@!} zO3~N3v{Y`=aPj_e?JFi<)cjBhZOe>`4v5fE)c|;rO8CVVNtcxN{E*!w=(C$9S?}4I zwKu>J3}~SQHd@8xy*SXxCg-ey4ej|%@APFQnYgVKFYr#fdDOZ|3>8<jtNQzzi`%3W zO~fAjyr7JMOCV&;f&uQ=Vzor~2sh()togF;w7Fd?P}HhRrY8G_>QSHLFEf81JQ?)- zNNI6x9(adVC}&TMyy`7@DZhc{sW7OVOl}7R`1fo)quvXO#t>v2r>G};1tJdFWaRQ* z-6#1HBsVP4PeKV7btVsmu{%+maldSu$@G*{^$A4b5lEm2P6uP!C;|FifqiU0v2j34 znQHr2N+8X-b=c<Wxg&r$27z1X)ar`wUnMC4PsG+G3BGo>XI<+!bZHlSv{DMJ9p3(& zE1dC6PJZbvrVHh&l5k%tN+qaBNnPc~!jY|v2L3qo1HQe3+n<c!byst<MK@c5A6<2t zKB;V=-6tl{WeE%=g5Ja(Q=A%SR^W$jgsHQ|`%SDarsqw4UE=@mzhV|aOT)m0Ap}iV z;E>4tZAD4;BEQ$kjRH#3zA-MCY_PF`7h>0)K*jW&{p3hoVP3{7i+;3!jdpnIImwz& zjo)&Xjq>34%Z44{@1HAadp#u|un-q64+qolK?!^5REml2MGO<)YrFP7x_iwRPT%v^ zAecwhn{FZOT5v^Ymndy#F-1r?OT@Wu{-AhYT$~m`&@Y0cZL)Bbf;ZA8!1n&U(FXz` zivw(^3rG}3;gW?^3gD&5?cn99`;xk>6Ld2{7N)7Jia_P{kg>9BBBYGvjqmC(-pRkM zv8okhAoBD^@@eToTKD49D?k1b%YdJ1ENR?Jek<X>3VoZBf>;bv8hS;*%`7${qM1zk z3xPb$BUaVh{C6AnT!oe_@(I;>7wdP=$P_T0(I;Db?Q8(Y8cx>a(EA*}@_)XK{BIB~ z$_yjsqA#^^gUHN0Ln78zd#!e7I$~n%3&BfYqR3(_d!V*nsEU{VeE8J^<1oRjJmrUT z4|@6^_l>D*zQ5mOt&wLNzQ_x`Z?q3z()L#-eU)Ww&Xq=h<lQ(l_T$b~ytHIX0c(Ej z9{&2LVJW4zcrKUS`AtLv-%h?=3jOJJz8%Fmt(DcqLyDy;T?@;WavB-ey!km^8(q`~ zPB`F(dV$j{T-bm`g?;`AJx`}mm-bGC8!3QX|NJz^Z7DWpL5MMBjZYqnn<ra+Id0k~ z<=lD0xnl64T=%en4>wk?nf4JB%RDhgT%^)`l)t8lWc0Utt;$m9aR|Rs@jzD+n4FD@ zb$PIHmkB=D_}PwGm2aiH6;DBHbq5M~G2X0-{G6d2@{ENWO~9AJTfpe8VdC;u2nvGk z6*r%acuShPtLP;2UNBCO8iseGTmL8jC84UnT@jlHUI9jpoQFzUb#LnE7#f5j%WM{Q zc4)u)4Vx1TthE(3L(WLH`S*x}fAA<x2-C$A{|gmYBX($KVv90pmO1kru9elVb_oVE zeI{xJ!CjHUysJu~A34#=Imt{kEy5<8z8_)~-l5;ugtW&V#S?uT@c2TB3J3dJ;}2#V z2?KUUmJ+UlO6>~-=;LSEPT4n439+_5<dO!k^@P|J%y%F6rG$)TVsd;dMU45<7PruR z$Yn`J*L_$;UR?ZG&~@@8PGS=lsHBHhmAFp)sN-2C(O#412WksSLYJLW{E7VvcKF4~ zuK5c5SWi4BBd6kTEm)`V+)><4^P3~?V}S=e9L)E^n+4N#G5D8RCFql5k<_mld50Fe z2irgAIwuTf%z7esRSKzig2?RJZu&;OP<LrVjKZG@{88B64m#GY;cki7`O4-SkrboL zEl5SN{9nm4u|3t6n)X4+3QHDVu=oQ}c@EZ~nLmb(X6V|He)ue{=ZnzTcX|#$$MTh@ zh2DEp(BjEpDp}ym@IQ;0Y+yN7AjJz1{C$Wf0lxhLkOM>)6dLsGx>PW$19ErQ<e<iX zD~R-Vg9wQY<#n>M59k=#T{xFgsn)v(FQjO;J$TjGSxHL9S(`o45NL-K1uCwUOWdee z38o>6$Dp1-|F-G#w@qbNvLwtwV!a`1=t~*P)ufr>MYUr#FyRf*c|`se{A?P5&Bh0e z$1jW2qSI34yr($=>@z>^lXbRxHyOsSpSOPqBiDU?rEgyFjVYp(b%yScZ$_{c!fAME zZgts9n%rbBRp%>3lomQf?J0l*NsM{?;EiCbKW>o}%a51&5E|^ML=K>~9xhIR1ahX( z!NrtR)x_Vb$Vru=+8FTr^NflZ{esl$7PHN!SNAtvuVPBfKT_Z&sU#j3t4T!LBOJ9L zMD;U)IM!i=%-L>y)V$&<`BFvx<2UU|Wkz$e42}#sdPP^oVQ5idh@r#KZzL+8ghUl6 zyc>y{2JL+l3{62q2kU}=^wcfUs)HgzEyPRXaxolg=XS4)z(amEMf3ry>i=)IniTyT zg6^zn8zV&vGN;!*BWW2D|2a!A&-B`tYABZ&*qrTVkc3gjVMh#;eAHzXDw?mLA6b=I z+rpe^K3Qqv%RSj>d&SJOE6&6i*;igC_8k@;fP9qY`~q1_8dv4xJM$`;#dU`m$d9;Y z#Bf^<Xu=>NOOu~6inl+|0KS124|5IS0RL<7_<#*U?>8|TBJR}PRbGQF!v|)9-%V;2 zYBD}bkKjNcXULlWj*puUya;*ETgm)`QDe-eF8gzUaRt=|YG+|{BEz>pG?2HKv;zPM zU(*B&;<)X%GILy@en*Y9qZspKGJN}Oal`)Smi31CS6QR8->;JL($m9rfHuLiU=o>E z|7OoiQoX@eU#VRWgwQudUZQFRfnxxYh^X%==2FMMGyb2OLlv6sV<Ycb2#PfHyUg}= zz~aR+xCQ*AD7)i;V*Y1Nkq6p^s<(0`;5NvBgI>BnT9^y6+i`3gt?_hP^#NF<5tX7` z`zcl74o1K1+nwJq@7D#?Rn4S;J&38LIjtVBiIP{_W1S{bIIgN;Hn|;Q5`l+k4aF{k z|7g}TTiqJd_avvWg-cSVryAb*#@c<CDY^Pn&DaAC{C5aaB|r`=!xel7A154s3{T-h zfj5)SpD;+b1Vw&<DSZd;s}?^}WF%?`+c_&JY}gElF(GPy3TZuM^jJ@Y^w)u<+$Dho zns$3#b1UZCMM)sCQKx?$qt+MkO@&)iUst`)dD3Iw{4P!nOvIB_5%9M)=9p)sb4$fw zb?Irk;=&MF@S_BzUX|ew>sMLgi=f3qXPX3sADOLQ$J4dn*1{@OQ#zeW2})Om`(1EK z=I`idN+gG-;udGBPfbAQ3t*Y6u)n3C1iZ$0B~clUtibeBy<QzFEQUz9FK@-wvInfh z9@2jh^MQFti7e&aEJJw!f_!$oQQFF%Fr?>-RPV!wzqQ2N`An2n-%{}MiJ`&%po5U8 znA#<S8ZS11LZ<H9-PegRL8NyzY&=iwIl?d{SBfULL_uqzzTYHi&1-s74coug0W2@p zzux&ll^Re6LVX`fuvBDz8yZ-pbQYxjXI9dqD$zO5E1_ai6f9t&D??L@YEIeODn%1l zP+vaNV>nZnl2d|96gP<Ppe<&&f{Jh`x4+2lua1ORA0E4w2{9DSIKX-_L~QcfgByta z??qz(h!*>&0OX66#X;MGJ(0nTvw)Vd00Yya+9i|14VAB})_Mf4e&d3!DNDTKsH2ZV zp9uq8M8K+4c!_A6NnqyH_=AL2@t{Eutg!)udl*uBP2VTplu79HO7v36kL3XB0j?#c zsbE<8lj~=TFVZwjEri}K0**LnE7~UH{78U&6T2TD1!?hG=-H_yRjG!}*zX>(kKo_0 zPp$Y;jmpNbRSri^)!8CZQbWfaMuR=i*aX58G!AzOr8$uU%7z6Wd3GIb3h~TvG)BIb zA58^E!qw2iMv?glxHtp9J&8n7pMD8Wdn(QJXj(*KRS}o`+HQb%as>%D$WDeNJrWZA zRq<{h^dbCu>g%^)o@6z*_7cxm)y*%b+miQbzv0W#I5(><GQcU?J=O6Q^h3Ord0s|q z=yzohWKt@%haB;4X5|Cqcz{&;*X_T|>!ZO_IMdTD_<*AOWzWVr9C!>twsr^6)X&nE zO^N#InXTop&xiW1RT0$8>steQi{eFQPGo=WT^v|9XU~N}y+H_>njmQHCUP<CMUKFE z(0Rn`?kWh-FW?HgR?@^t`#E6Om9~WnO<lx%7nlzK=9>Tra3+k%T+3Xj)(MQj2iQdZ zs9WA1uY~pOa(U!6WLvTdC(cI($hP*CB2Cp&FOO$xJ(n-G+zNjt988vTUshDht28oV zG~j<wSp|dC6RvCvT6+9v6wGqM+CQPcx-`WF;g!nMS$PA7Z*2yhn-}vxz(iNKvTf{s zy<TkSk*9fsdylSrsWYYR0Ypdse*BQ%^jqw>$kvtZev?43BGddKA|2H$7|c7@1a@QP zF2#uutMC7QwPgYYseC>iEJ-7bfT}ZFXCisqw>}m;T}VY$@8B7%6J43uhp3hspBt-! z+Qsh<j-<Bn(gNQL@$|X?i-DYE09Vhx%KuE;E3~^?a1PJlURSQC5X5hDHBuManEMCS zPYJmwCdSSq;lcQ5K_y;1l1TS>eFMhU@3D>%X`<_Aha0@E+~l9G-bI#%)0Z+JAwlVI znUmQ-FG*n99NL>+$Q?L<OY<X9K#^7;`6mJa05zJjOACXCZUjUA$jN@vZTfD5-MF82 znvCb}>ZS`5rm9tPyluLp1*lKIYPOA2_$>~TPV+|cOJFuchqL?(w8LV21KH-gL|GAS z;cWGI?qpl_7zN`AP!|cnyEypvby3rGGxo%PC+7v~3qEl5lmVck!p`M@(Dz16K5yyz z*nIz)BU}BbF@iFA0y(8b;l5_lq$5_yTl5cv1^*iD`Sj?@UAmZiY448eLQwIUDU$6W zn&d}Mm;rnf)}dSM0VbvSO1$v=_j5KF;OGpv-msR!firJ5fcFvT1cI)>zRbQoX8=NL z?bJi`pjPzjT13~sJ&GAAf6B!4u?%Gh&ICT@6oSW}sCp=t5InNQ1t{q!lW;H{f9N(> ze~_i_Fp-=VT!zoyT;}<iPnJC6g^-!}nq+WtRRUSReKBcp;nppoG|>3(^5AFH&aIg+ z5c!bU?tmZNBT=JxtBbST_{MT8h%EE^2OBzRiXEo$s=b<6)Uw+2@sJ|?ZNllq+k#3A zC%TtP4iwQ4=du_C29m|wqYt8MBq<U(p?+{}WdWXj9)kY95HH;@dcal3{HF7K{fO~) z`)V?M0&t`QQUdZoD2=_lsMp$ZA7S?dJ1N9+HsL32CbPF@7Pn&y8t<Wuii9NI4mnUg zt6NWlPnz=)|J+4+K*5aewe3HNi$QPK7e-6F^K?ahmcjN>tCwWyJO7dQ3QFDkM~w2~ z?y1*b3C=Zk_!Rawzdc&DRxGTbLOJL71`SHYeW)Mdy$|n_RZ4-WiVW>D=)rr@>Rzd0 z7DgJd16p%@ghO32cPn6V77YcSH_-r(g(2l2RAkKBsXIpentNBj&5s-QRbYxx|J`mD zMCKiFOh_ED^%>EM;8?9Ld<CUf+&20%NTrBHYe^#lHq0P|r^i`6@*dauSf6k?2i+`+ z;z_ty2n{)6fBO%r?J5RmNx;}B7XCHQyvc{krGSfV)xW?l%{<|}c;EfMj^$7ZqoxU? z{8%(t#OY6n$=HBtPEdQ*jsOu*ngogC0%T;4S3hLtkG9zXh|U*-d@$LMK3y-`AQQ{* z5vrw;=qm<@jTq@Wh?vs_>v-sHE)YVT<|G?65*Wbk5rUAziE)Yf5OvDqjBFAtV_Kxo zndCQh242dKl~)i;uwURh!yM{0{g@|H9CPONdbQnf9VnyNtPMw8`o=V?&5$11m$61g z5-;L9_dwy}zVtt}Er9afclZJ3GQ6#?WbQBhtqLnbfe?S$k&ue0<U6|b;80j^&JHn= z*ULqOOz^!edKR#9Dgh9_cqqNt@V*4Zq8G*F`so;Okb<FEjg3k@fKDS+6VrXmFIWOV zX4>wvhqWgkDTysU<=xU}flQ1ucTT51$rYm}X)fMq<RPY(#1cBx!#+GNxb3-tsv!|b z`0_$9swy{0yZ8@FS5zKTrvk|%XO9N9M_)N3A^h<*Cmr;tnXV1+pD-S>!Ebt&n8Tbg zrp#iJHcQ(u0J($ngavr)dCLIowuJK0vkH1)W~<)5F1djyk)~4yUNJ8IT(|KQpm&_E z5{P?8Olu=1>H6>5GJuER#xk9xw|nbjzt|NrvuNSL*}lN+nzaakjQq23^mSJ&0Yd5z zCf9?V(FQ+(;uZ6Amkb1-lP-`PN^ZYSQR%emPdmu8jU1}ld3o<;Jv=x>*}}*}YMM4S zlQ0+N5;g>f^8t;&=ClAk#Y_;&p9H8rbO#%Ij6|qC$j6KOx4%^2qH$B*6l5lg=rXi| zOrEI4acdf;Nu(-n|3dtI^9<Kj&z4aw(<J>ovx}7l#>H*JkAQL}IuWRcF5{Y+A$CKV zE&j3?7z90C4sLDy{O--;#%36_qSZr_u-RM)gf@$7)P$ht?H`(mz!0auMafvIB^=^~ ziLWy*%Xtwig899A^nRTRS(yki3Rl6ydkKP}@>!u}Ljli&!3e?LFi@1JW~bI*4?qC- zKo7YbgNG8Yz+~Jy`w(9;mMGTU(9qYS28>6W<#lg!repyPeDDb8$0zg35HtcVmqtyX z#4~u$s+u%1(5>D*$R&Y##1LPeRf;G>kV-X3j+2uot&q`>|8J`j()NNy29o1bw%VEM z5bL<Chol~L>5+eHLQHVY`@{8jB?rVaMlZZeKjeGZLqbl`ZE2N4-5zQx(3r=9-oC|f zST~;C+(S8y(OJo)JqqA}^qXW)6#5DQ*wLc0)!g2&nR=6cR;S(4MLwjBG)&0tq+us8 zta+VO_p5E+Go#2T7-@1xN$KLZruT)UeF!8h|DLvwg}(CJZd~h+PXkrke_G(BuoUvg ztK53|A%H_qOpItH2@9}>+|SP0@*)EKn9)0JuO$JyT6I9L@d*UoT<hBr1AFZ>Db?D{ zl+-3#|B_a^n*PV;gt80AM?!&BWWo|U+)T|pS$pisrSbL^;<`8CUreIm-AGS+G9dWN zKu57zHA4=yq<0#(zM<J8mY<%bp46i+jk1771*_k<uI&erj}nN!=^re+`&*L7*%SQv z#s%7Qy9XT30Rs3ytQi47I_n7NVaRHF$e1<|HjETQiGmzDc-7{0`_g#7F+<Gt9-uRx zWH-Yv2MR%^L6?2?qx*-BqvASu+1ALKS<C{Z2_{jFoi1dbglK;i%HWm4A1n`IK;&mK zR&UfjpKe}0qvczA2WnRmh5@BeBU7XFx5y0gd^XGW)qs{sCHHoNv6$n32}xn_`z>_* zo|cn0K}^dJ8xemVuU{;)>zys3KJ~EDG$;ST`$Z1Vit<ZfEvg{zsVO_)Ip8WLnQ>0f z2DOsy>5_NOC#5$(na-7QkWe2Pg73_3zEH|G_yL^~0_a}<eyT|b-1`M!-k-Wr)uN#) zWi3)P8=J~^X);*84(H)IAad4OS38EcG@hAR`i#AM<HX9wyS`R({5f&~MFSOP32bON z;29?8(WK|l-Y4w1rzF_Rs^o4~pgt5ys$dl#K0z|_rQwigy;Q>WHv+wb6_Ev@l==dV zivBwRFlonHMXLU^WEMufA2+jHtXXNjH_H%&?Rt&$<Nk1d8>$%bFV6n+2iMPb<n0gP zC#0P;?=@8#fOEW2x)|S-3pkBGc^-v#4$n39NS5$Tm-BPHhe+N}-$w!s{eH^|20&iu zSh6t*#l3fdfq4{G&lLcSr<miOPNvMw9h@Jx@8czaVru|>OjdI*W?!axPuPrAoWxFz zcrFN|FqCq4Du-u{35V{8R#!}?jpI?Ee0g14%07U`ce<Q@k<cWcym`LbD)m^oZ(1c8 z--S;;-hP(U=n7bx`ET3GnnVedPhXQU0OJNJA+M`M=VB9Pnf)DGr_{7qN?)T+E#piS zHbrGE>@q#AwS|lY{BI(ey!Lr^0~|^}oKBg^_de~vJ0xxngWriAjnhi1-jz1Gs{I>Q zVnI)A{lb8?<E7b(x|ylb2bdq}f&6b4dG$0zHYXI&k`B(<l~5s6)Oi4mjFwM7cFMjb zB>^1B0e~`M;$2rTTE+R!&`#&&@!ih-%Z+Dw5)tnC0;Iu<pp57^=xon;$<)z|R5D2a z5X@W9_;@yt82w&N^vRuFAkwWF3UW&XvAqZvdaH{3;V}+aEG7|v(e%0p5^3w${_~0` zIPku$O$j%(Hq?3Ks|-Y43~OzT&*dE65myu3B`RDa^X$Ug(7nVj6eqO1ty{OBWDPGD z=QIokL9NX`toLec5z$7j`xj4T@qGNUT>HIbQu8SoQry`r?5UXkqNE0NCIlEA2|K)# z0*wB~_YnZ^UHm4fQgO#C4^D#&8xUBwM`Sx;A(y(Z<u}&eNQ;WdXW`E-bh<~5kM*_U zsOB%F!jUlv<f9Inj8DeuU1asQn=m4vIVKI73x-~LcxHDltfENRjrz?{?_s{c@Kw;N z7aQE-`SW^%3m!{;6ZZo)x=uX)$V6!0T_Rha@(uWB^m*z=(Z<a^d_Z?sBCUM-LkfTi zGrrzW#s$;W7XfGOVas1#YmWhyAI6O8Con6H-JJ7v^#N_KwDj(xXZ#tNj>Zy01Tey< z!R^pO1$J$olhl2JEE1T4s!$H4b*ku9dzVRsRe)m9dx6p*q%M53idBiP)6XWsnvbBT zfK)?3%<4x~Wt1=-JdPh;`wEw){d~kaXOAypnwte!EYF>r{O=&}s><R^^25+V;mM~G zQ>%|@L-f9*SP~+us*P!eST`ra7G5A|!~)ZAEq}Tc$9@vjVWgHGKP}FF^lo!p-2~-! z0u6!hBRd8<;xIoiYpmlB+Y*Dq{1^Aw*+h~+V!uc<9YP(DMHCtr>@ug-&lk|NA<5PO z3NLhpYwO%mUFS;yVFYQ90*m}f*^yqyGL<Alq*ol}jw`=0%n61M6b>A}waK*cD7JR} zi%3fz!xP0$FyfBg8*oF|wE`5j$&}N^g)p!D93}Z{P8lJoM6wn+@~>cLz)JS%AGM&u zAn7jdkUhsTYGdAGmLWO;QZc%(rfEm;PHAnA7T0fsi2z^wufN1A6yofSAbU5Z>33@3 z;csXw>Mc1~5Xe>bLouzFgL}(m_k?FKwm099+MYUQm+ju``C;)qJV5&K5d{fw=9ULr zIQx`P{YO6NaPw<y&3gDM^2%vkM*bOu6yEpz0izqmJ3Xh&f1y9iVOsSMZ{!(I{Q~FR z#J5B(h7;;ISk$mm$#}B0iGKL}pB+i)H}2EJ^jV;>@YjATb9N>AACK_m+K+$soWkM~ z-Mitw6;I_i@h_9bXwUIZxXQokL<{s17j(!}68#8yTd=rIr@SL9PkE2Xpt>JCm1Wy0 zE4}sYV6Yv}n+xag<sk9SVcU!lFrtIrrmZs;YpSZYB8_WQk4cJkH;S0JBI~G}T3bn2 z33yiPu#BiF+0vbS=neD5%LXA>nEa&@5oeTF?}!t3imXsk5nT$7T=C%sy8F^y+2^!W z=xR-)HDO$RyHzH_^p_WiCv;b#-1dj>>dGgbrx4)z!;_p>&gejMcQBfdEWVx;i_6=` zRiB;s2X&LaVkV8z#_z;1zdi8hs-xTfG=3RrM()0RK29x6n!a0034S$J#x!-D&kd{Y zJp3TV^G+qM`P=X};H+nhEm`YKD_4dWdM=l#Cvz3$k4GLqm?r3V5lfMPiTiOcTmZqP zj=P6v{(%gkpSPL9G4<RV94hIxU$qW#ja7(<;)vu(*iZ<0rDE!6G#rOX9L40^NTSlD zX1uSdRa3r6-W2}ykOgF18vu(xLN^aBx2AB8BW&<oh{|+^HWIvaBi;B}I_0g%5=N9A zt;<9tUG|@3d5o1rQ<^1aUkZ7UCodz<6N8p5f-;&Kgvm<?#Z;_#$&tRqGtqzqBc~D* z=ehOC_Qe4tXnFhx*Ct8Lyb3|=4NJr%o|3#0&j-LhZ4b8tT4G}M8jxPE{mUT$1z^n- zfW$lpAoI$>`_bcn4GK8I*}vFVY%Q0jWWH(~o1lmHzTh77lw@LJVhQ+31eb&A9`;)H zZytk;9FxedT>w#NA#XNQL70>|XIFPqQmh;D3gXT*_G80Gj|NjuWS=l8(@eUFifryq zM5pcJTUZBwlp!$1_z(vu-)1b*yypfeDOTx{iThO!?ww1Q+xFxv9iQxep5bhl6?tp( zJ$5lY89!TJ6Brr!2`ojvR)4|(Y=->ya5FMcBo+XG_k}w56nd5!$2Z+3$9GjM5v=Sm z%d8BQfWot%L6OH~k09Upzd;TKKrfOs9wq3=HX^ISWGAYd)fic3q&M~Erxv|S4}s2E zRzwKyu93ZPH;rV<!|;;Vy*Y8dOZrLpAbpeO>wmAbqowxD$pF&&9nqE#a})hGc!A>p zCcMI3w6Uv{3qqeH*<;MphEr|)wZxOGZCt))Lv+s^kj-ni1yW@M>a8P3I(+hpx5^e$ zIUgxz$D|+8SUs+U8JN-;yA?Pm2>toSM$2^W#qp5jQc_S18Pb8%%e2PJ1V7W`S=bn9 zmWe}HX${|g_z6lsEhp)$yqP~Qp#YfP|E-II0hirv^*UHzT=>NR@XQQ|Soz;JCS^BX z03UjX8<B4{xw+)Z#KFmFg6%z8akoJYx+3&`5&gd0AoxYrBWZ$whSq8o1TFPb$&6su z_wXv!|8P5%SR&}#6g&&8D%`dqF)dnp=tA`{+WB_r<*eS<NR1NvU;h<|v^}56FmVlq z%UH)zazL(g9zt_&7l`?;{kZ|V99(3W={bKw+K5l2CYANtD1l93cARJx`Oa-=>^%*) zm4+el9OD~lQhkoV*3VyayDEn_*A8d{99f50J2?w5xVsQu#UIb3#mFg@hos9b8dma& zmX8=$gz(U<<i+epRFk*1ftb^!WY9~v3zAAjkTkkDCJxV6**fT47$P4l3k(GAn*a$7 zX~2?3&6^u>e*DKF-6?`5t=qE#x`tsM%D8O$y-fO%6%p@9*psVnS@y`_C6ZsROjA%| zvVkm=P`O~Sd~=Yvs!Ic|6RJy(Yzy0iFHB4vr&ht{@HprrOAZiJziMzbi$OygP}UxA zcANJSqW!Yi_%wxj6BX5EuWWE1FR3!RN-lNt)$`hC!`N-TA8I@D;%mzXgWXz-$Nmnd zAk?#Q5ULxA@dI4jSwQXAQ%?`_@Gv0Mnu=9q<<1A=m8>Ol%p$X`h=l8_AGqGkttERo zcZ9z=Dt`ps1c{pF_1k(MGN#+n!TJP9Ing1xK%%?)^mdS|PVrZcT&)pup6^U>&M--? zgi(Z5yG)~k=jq{K=Lhe04`pjn+B3iG$AB}tcQ<75Ll9AJ2`3=a9tK!o-9f0AEu?j2 z8Q7P$3OI?-_2(3LW18BcsA_IA3l;Adw<Y3M?r)Buf1DVC9SjDR(|q?4#cHsJ<uZpi zBTY$J>v2*2oMXCGxv=PTO;901Pl^BKf<k|qB?aW>SI5Ip(d~HBIDP(Eo|rR&&$a6G z<%=h8vba5@;hkL!WZF;3k|rLpOdPkFkYk?mwfQ;Y4>k!=0ulok(>-fo^vwVskSK@k ze*^gWgggMFIR>f8;_5){X{C5oX<?K|kIw>34<0}Kod{xgGbg&)z7AJ03CHzLC0`RI zjc%N!Pn?S_jmUm0sj$#gzd=y$%3syNC`H;<wvrMZ_6lJen}Oun41lkGfGckuvUv=h z)#;4_Gan(`F^)k@gR*#*2L32X20-c#o$uAu`n)}ne{QoaFoIkS*=eB#h>d5ao((>y z0u^&J1{bSakx`jUsU(~++y@|(JxWG-XR;?I1UN)Pf*T3uzRwdhs%&;mjEJntR;>9Y zJIHq3JyS_<>kUA8M)<|nsxAQ`x!x*Hz0^iMz{Jppw#y-G&4aFwn6*0%f9Qn|q|d(D zl{YL*asv&-9xMARO@M%)smM&M%@CcJPZAhicpJYrU6#xzc%w)Hl-`9-MZn7LM8(K4 zi`BUy4AEtXK7uC)HyX0v*?^wEG1s%$zGWB?Ll)=J8!bRI%5e?re`-0=A7TLXf;*m= zRsUjINcrCRVknu@)f{twW?dS^k53TNPXECE0Pum~i%fW9<j9fz3SE`h{@R^MF5H~q z4xr)qVCJODM4>$gXTo=ZxN4B3$V3b=F$0aNMi0Y}YgZ|OMXfReqX?O=o!LW?w)=Oj zB!k8A=Oi4MD&d5m6q#798neiPr3ra}PNr;8T+y+*w|(^uYw!@PlI$L_^Q%0#nstxg zqkDbp>92CgZK+#hs|sZ)%yREOSq$2i0G3$I4NpoAw7QF=eqKylAQHwv?PPmedN2N$ zu#}=FdJ%Lv6g^sDMx<3HOb$Lwo+nk1jc~8XkeGJAI1dyhSlrU4@T6UwHE2n9F{rxR zO6~1M*L{=Xt{)1#aJ4~Ef=@UsqABsARmgefTL}gZ%ZH7jSKoc|uG+Sf_!$6P$})Ri z5QjSge}ZFoeE<sJ!UUKlG}=-wWAz!Xy6<do{7Fas6H7#w6&3$StuDDu{K3<~gw8iP zB-T{ibHBn6g(}K_$@NoZis+jgNA6)Jh<`?i{t)2Ei{^cjHHGhitxa4ur_2rGUrG{; zevwy(rop$4Y{u`dmG82(ut>p)p0r9^DU(@md(2urUp4`l72YNM846HopT<(iYex9@ z_?+{8A>UfC1E4o)s--}-c`qf8?f0MKgz{Jp09_I25c#O<x@lRu=h&$+9*P|2?<!v$ z9fFtK$vkwXpc#sJ%X8F(Q0&T*S2uOYn(DcyoF!21nD0zw#X<Uvn1LhZ`*!If3IOrv zs|1z0fI{2E{(k%XvmMV-41|ittzXtg3Sd{39I@3|qB~SeiuG{DD_1rrqLD~+H5zm` z30)}`f}}w<vPYy_L*fkZC97m|NQ`N~s+I&3qWKwJF0%~3&nNy0!~dmQ(ND7E|Bk8F zVv<j?xI+Z0_cfaOez&KECc*_;OgGOo>(Pb0%zwWbe=a<E^W2AMDXkDY$T&a(e&<YK zv9}H~3%Ef&(mUee0vrAkA0DA4EfyukS5<cvb<^lO%GO8?*ZlMD<4t@BT>Y1SRm>_$ z*=@WSJ5)1$x%s?|`=|cr2s(UC!I&i?XoL>M*~Ut`l`Y?;=wES(rd4rHRP3rk5hrX^ zqlB9{pIb>PC>N(I+y$0)8QsR74`!@#H;TeAua5y8nN@Wu;DQymUW>&k`y$j3otLBU z8aTs)WP@4-KHyt2dv4~ag!a`_uAr39rVbvGX=3o<7ube#mZjIJPj0d7bOjkB%4ift z65_#IWhBAY*YgFUPv@bY%1BT!NLgL=JNbW4im;r9TYq5IV(~|rwvvBcZjT?QU{o8i z$1?{rO;`IZ=OqWS2lqD0&wUnt_~195@1Ip3{KGxMIk7CBGmg2@xa*6dE^dZzhZOCh zrN9H)sqY7CADsMYBg6Tek?g|fb)qixSVB{A(1=jt*88iwy3N1{D@6Xd{jR&^!M<h& zBq5sFwFdunJ9~xofuo{6PKS5r4iHY<-Sb1$l*BkL8maR2T}YlY+1)*z^v;Ck6yJO{ zr4KX;CJjzjSgYz<bjQh|6WsORzO9V~?@Rrm>L&~#cytXDR?EVb1kR8ttDk?0zy2+p zzLu0;ixDWCdnrT>s6qgVCz0Qa4z2>95j)#K<^_B3rwM@GU3?Af%Kp=wu@dwhW$}B3 z>+hXBGWeFt3;yo(aHsskq_XU<{*Dp1Nn)cZ5E5i|)hjUK5XaLcYhZ$`KaB|!KB=mB zFFwA`J8eG0;_<K^05<TRQ84BTV(Tnsp^o-ijpYFH1D?v_mld``;MSi3;OxW`4U|R! z?US$Or|h@^05chehT=K=>@LmeOV2Cwjq~;vvf}U?l&Y3`+%uiieCQUD8dTXJIj~gz z`hFb=UU`J+KEAQlPQBTNo$N=KpB}E(ufGSm5CIk+2hNu}S>~hwOcrR>F#7fM7jU}; zti8Tylp7W03KAS7wmYS5C`E|A7^@j(ds_a4*Hc!=22JpE3jB`esv*yIDPSpm0}LeG zBn!<}zv@1TVB@dc9;Tk5xDa~j`LfKL<vv0GESCyCyb2EhB!B?gy>Im(pg^kGUq<od zH<>3OZ_GnPidDMrER)4a+uk{dUT4ZePJO+t2ct&{@esevz6ePc7nF#%^t(=5ap)yW z;pghDa*Dg=Sz~muE1)x|U1N6Qa-*KpRc6PXajLX{Su@rXx$uXz$!tt(Sex;kd6ho8 z;q55Qvy$X5rX+U_cP;n;u|2f>(=-o7AXREX;5moN58b94&Nqrx?DdlSnP*1Ld1fS6 z56XeVD7g%;L+LG2^!Idt`UU>@0~7Q4J6@L9JOEiMyCl46+&U!>pkwHBUD5zx&Wusm zrFPNnxfuZD5Pa=}5({(=lHX_jaz*Vu9DW7Ii{0Ub7|D@Ho_d9=|6Mo?gg`et)P-_W z4nmafh(73UzC$4jBBwp`AOaev>eIQT+N<Xm;e*6cM1$`ud{|R{PytXIpfxK8RE14* ze;uJi&H@Z+qY00}2>axJz-|2<;35YM;P8en64m|wr;NY)Kl~WYhzhHh1-niqy38Mi zSBieLivB5=XGhPeY7<-iH7j{8xJM3pvRtNJL@>h>NJ}Ngu2tQ;IvT8X8|W#B@kb5H zy4ey+v@T74NsuyrU^TDKXe`b^{ZwJ&S|>c<ugeS=h~DQ5<N?aN{wS0<ZrQvF=xd$( zO&`Fe4>YdgL23*4Z%SzIQvLzy!2!_<^jt1BfBx_*2R~Gh96*cNQeeu6DNSFR!We}t z#vRR}tov-r_k%6J>;+ykLBoV2qO=!ZIc$kC6ff7@{7(7!ChhPukAO#?*@*k3Z*}+k z8ka(<6=l;-Y31nhiY8VTpt0q;&ckG^imjdi;8jRO+1)I{fxnNN{>!g=UMuOaMwe zpxOr%Y6>zP==r?+h|MAj0Q`rpnVx=>lns@MabkA5AVAa>o2Olw&@rhLYTq{-7nhxp zr+ivro5I|S;OnCT+t`JCcj}qoH9vbo#$Y&LI1<YBGNv+GGX?<mdGH^l5(9R&R^P>v z<tjY;YNgLQYZv(exCziE@KVa3TZITCPKNGm1!$OalKUS76au)bZ|c*}K0SZ|#fck> zE(aDLvlIVTtw9036TQ<Ln@p*)7Z1_!))cW#fcHx2D7>T$i&y6Z09Ip~s!ETQCpt-$ zu4qRcb$T9{avIkVvHAyt*N8%2)NlV3eIm?sVo^iq9820U>D?*)bYBNB%JXTU=U~SJ z3Mhf0dlv%qwN{TXc%pY$fUsI{jtDK;Zj!RJ;u8Qd-Pon1m7})|peK>?oz8K0xm@3m zNyf*Moj5ykEBr=`e<tV@CZ#Z<dcfEH?8nGj;lqJ2K1xsVPF06<shqwUW)jgAG>#>r za}VVm|Id0u?I1D92gtr<ga8$gG7G9Qj~_^y2B*Iguo&=URGAxRJ1QjvK^WhrtCUP9 z)>MLk7ecBp>q(_%$7L=C2mtu)_@E_gxeSnFX~rV^$()H3KIC-b0O=83bG!5Q{Vq+7 zVCD?>sSPb9y=Bdt&%QcU=h=GEMRhghz>@t~y{+Rq>>p_lSK5^v#U60sN=UVLnMW(W z`U42;w7yX^6|h+S(q2se`Lai)1dYwXc@ivc65>v7%S8`}ZhMa7`@$H(5>812ns+Ie zioYhx&Nbryo02^=zZmvNK;6&^Se@(@SiUri$yxIOg!u}l38kzuMHz&12+)h`#jAY2 z0|%l}_0Y+VN%6d&l-aOh;~nhQ)z#Lyb?2Eagc(@A)2?F*5bZ(jILcUNDw9EF2w*8k z`bEXpkk}aXm;YV}x>F1HV7-C&&+nedo*K}0^t?K)x$~kK>nCkkk;Cwh?d8%-f$5lq zbixnk%|6^IA^0L?P5>I6L?daUMh#5k0pnPD+It6wcloN`*y7?!H3T_lw6s}*9;?hn zPJJttLpwkKCe_F~+$x}pb*)OJ1dzn5-eQiwdn8A675(bS9h%@$^*MMacPD$TxYxds z8o{>n(y3+|X<8A7K7d&>??AglhszT&pq(*ThtPB}3XJZ-N7cCeYdXnokQkss@w`Mw z??CM)^Fwwo&ldRrJs?2__&=7uI<D#O`~S5KMwf(ybW2J~k5)RA?rxBfW&;FNQaY5B z@GT|X3<RVE1f*N(mX2+|eZG(1f7@ewJnp^c-gD3M+!Id#g0NN)3^t-gWNzIQ7uPrd zu>D7%ptR^;^+DuFSsOyful&)Lm!k}f4nZ{x+wysKrW)SD9D*7^lNb=>c+x3!r{#&Y z)@(nB5!IoZ^1)lG&yN5e4<7R3*u!zSIQ6;03q}OC02u^`Fw|+^pL+i9gNid&Q+Ime zjsl)k;(li`0nFQoJ%U1YpKLu7G!u0#Ql_-qpC9e`qLZm$;bb{5n}9)7>Hl27)w9On z9avqg#fiN75oma|6@?^5^aTJ^D+IM@KFQA$CpGD~K~rzP>bV<-FxZF#fC^&NxS86+ z0s=%Re8QI)ptHYK@|;wi;P4wDAs2#p#K*VN5a-*7avk}opY@7>RNmig=}Il9i@IQ| z*UPmg2x=2mxnaW&?##2d3afLy-@7&YW5&5UAuPtMHfL(0pe?3cfl%vkO%O6q?O-6z zzZi^d{A`o=>f6_AK}6|*_)pcsZ{k5vbr^A^1*v;$SnjS14?Q3z8Ktx$WIP+SDR9-0 z?d)g9NBPvUR)m)K$>(={{R4r$YeM`5mI)F%b}0DePlYr^%^Bw%;Mp6X_9O>*NV4;| z-6}-%0WfVwS7=s=@Pr`TTp<3QI1WU>iKt6~Uoec!#HPBOT>bk=U=#z(h8A|DUqqi+ zwT}4DrFj^8Q(A?ci_v8Dj^FL0NKz0leSSHnrXO@GqTs8^rGFf=xPzfEDgb{R=j}tV z!Q$NIlJRfyiuVAJ&Jy>Z003me)?VlUNL!6XI>mN+08nJeor3~49<`bPq5wQ=SZM_H z#&H{KaBgd(d6RfezD9rykI8VE<T#_!M$=(PkEe4y_Z)gjDfun5#4S?6Opu4UcP_Yq zzi273N{bn$T=v4P4GoV-5(Sd{2ms$*9DE{>&@)D^yO(%+ssP|vugwgElu|%5+PikA ze*Ol4Am+i>o)&oXSJH9fW>K88-w~yD)wtd`{s3{9FY1u;e4<S+707n@=do6BdhE~S z^hm@~4}&hV(lxJ0r1<HP&!?oDWyqbjhB=<asC$O-06-KN`M;ATi1QKk#kB5DM&YC` z0vG6q0DC3VlNO2jrDH!Ec>ovMr*!Bj)w+1)7<9PV_4`iJD8bncUn?0iI%$gcD4oG# zg3qI&EPs3zi|`h8il!*Q_GAeYscrITiXHWxWbVZ{EXgi8W~{|stNjrpUp3mRGA9RO zQ_|6QR+xuaJC6GKEER)U__2e*=+e~&S(f4hL=VAD-IacOkf8Z?P-7(oi|&%V-Ri{l z-V0VohhV9HZ~+or=N7^?@{g}7d}{MoTd((7+{-Szw&IVvDC?{m=l}|a@vT%vu4}HM zqmDnEX}`|$iA`LfPfrhm0&8t!QH75Ny6ew4ui(cmRnS5zcTsKA=qo}S<B>i19;OR} zneN17-#Q5q;RC2!I2$e^h6tp(FjQ6(UcD6nG_aq7s6uOBG602Jnp+28z=le>s@0^w zb>tNi0Kjh(tvrt)IrOoj)h-LWlG!~P5_LKfQ@C{fiN(tobg->>fEuAnLi>k@R(y$2 z|HqWXGdw6JX@oz=d3?1e`^bYc-l86!&pk!qP6w<7eB+d}alM~$?wm7W1tXu5r{t0Q z{I<4azq7&wYwrUUWPW;6vtNP22zHTT`8_Zoj7nOwJOJSZkhUvBw|fIfQIP`eMiO}G z@sThOX{EuWyvABT0RfrpBH2x*QuCp_=Q&G43F#iPkS?J&pVB4VI#FbihfB)cnH28F zgKWUP$|MdVMh2`iCnX<n3g0g(G!uXbtKhlS&y7NJX~-2b|87VRk{0oL;^y&{(J8W@ zo3z$AuCXb<qFMA+%Y1`B9<%WXK(<dfwsbo8wh#Lad@Ns@jo$cFnT@d3EKuwWABZ41 zkcy}2PQB$aUZ@Ak-XQ1Wf=m`M*Ig0(;ZA~t(-_J_AbZ?p&5%tU65o)etsBw!1gIzy z0j9Zf%)Vife_~tCZDagCGKtFEz`O_gfu?gn5CAsu805AAM7>OIzUM;#K|GsT4$AYT zrm4mL))RLyWwcK>4o%rERxUA+<Ro1AGP8Uj2Z_knG%Vw2!2AmFSip4s>F;xa6dI<A zfaj`7ZBX`j26)5FZcW4pZT=D?f~OL0jmtmUT1jhSHU&d_pzTHn)>mC-Xm?ioALvZT ze{=NP1m)Au3+TK6fSwSRUgaD`M-~zrUXz6h2_mb=D3(|FX1bMsV}a`;TM$v7)0t2F z%F+(<n}JL37y5_P%Ssz5myrYaM{ZrH<7#X$WnkRc4W-~E<}-zKS#x1Tb|{}YUIn6c z9VB7e0K#0mb1~MIC@&!y(zax}uvL>ox8D>+(&+9Mja{%9x1h5G04P9=%9h68tj0)9 z3CABLIJjrawF1Ds&N<6N5@8S1Z(waWL<F>6-9SPO0<0tf0!C<Qnq4=Mf~l<zZtSy0 zX$azq&JtH?ItLGJ2^Ct*jRxtlsR4^3IBtBFvFE7**6;yk<;Dt#4OGIEUaq@I#Cag# zD5UgWNR(-N#%bb8V&mDv|C~jfBbu>(>WeYiG~dTNAYhuBF4TQL=eo*uw)5yHw1@Qp zCA~_G5me%nr$7B>euc6AM)!*o=C)ohDFX7@y~zb5jCG!dSCgE38H>&es?Go4w?Y}Z zzywlgM;y5q0PHg<EM<c#C>Q}M+PGW+V*zikJHr8!;w66?wI?nVxh8{S3zuU22qFN1 z0pcvbeWF7jiA_(}26nu#0uWP=h^Jm@zb_v}%}9kzTY`bTeqpEnJ<%w`3vwDIZ|k#4 zhS%&v3{bBT(OBN1(%&>dVIQ=x((yv!98<=<?{F#?AoBXmUTPYn@ZrU6_ftmX#+}h{ z{_%aN_8w4(6qZ_#u06F?{J=KzYW=HrN=f(_RQ2swRsnzPKDqgsjSZ4|%2HY^k&o+h z@k;VRh+ws!H9yboBTALtY(D@}zW51wcG&l5?{lxRN<&EQFY?y94<gTHrl(g>M^Y<5 zYc4L}dRtH*a@m9Vz-nx5J#>N5l13yu{{|78i11t#%kA@axmOV*Bh{*AGTU;96ARwe zH7w0WJ;!g5>TNDopRlswQNn6W9dV<dTJ=Klm@_j!=BZ_!>9EK|mBbr!S@Q^*@xB-Z z2*YclvUlD6G(>9<=Q@i9K+vE2`Eo~dO9q%FPwZP@_ijSZjL9xWI;U=1dso^?sdN_O z_Y0(Q2YT!O%<*v?0|Y_O1E~z@d+Y9zIHSUu$gA7>Kf_n}ph;iGdu7t$qo9aL$IKA) z)V5jtkl2v@VYQzurQ1>yl9)j;n~w~&KWPW6j`IS{XZyyL(g#qF18?|;@(gHoN+srL zBzi~8#BHV3Fba-4m?wE%JN?LOH0FH;=HWJ8?N0v7x^3^3>Q)gTz|0@eTWR8Qk6gHE z6|55-ed&S2ph3_;fK`kM-%)pO*LNA~^K8YvDnI%~6*X<`9~X8@weSkGxIK@aU&~$a zuMgC&C7_*3Fi8W$+ovoU#4GVkP^yOcZ{F4aF8X_g7Hy?+BDD3Wn!;eAY9g^^S54|2 z=5Pmyt)gXJ%n$F{8U`Lsgt<tRHQmf}u{HfBg*GFl0hq@QU4^7CPy3*lq`YfBfz81C zLyu5H`vHyS1M#IAhTpPjAWy~(6Zy2B)_bp=)#fi63T3l9?h%4<=K<oxfYYj-Nv+*s zZ3)z&rvb^<`k0+l1J%8M{CT#8?zbLhd<!onSP(H7Q@63c*l}yuLag@_K;*JFlvH`d z7OJA?op~Qdv6fZN1ETr9o$o-;HjjR(Rgq<Xd-6P)gncr&#g=*)r9~b+>8Qk4T&3JG z%MoZ_9z8SVN19WlEz$2<tCN5&b09BmH6zkPSc|E+yvxqADGB9hc_rtVO}^bhq&}n) zgn{!FqF2w~KD_&PhS3!R1_J~U*3gpx;Lx$B$gyr)ru#f9qADE(>veGT44q@}jmi)> za@y>oQTw_f=be_@&+&Qb1uN<nL28~^?oX+w&iVDR3^J_eZOhXj&s?$Ax{sHV0--LC z3)4X$iD;@(N<S(!&kDsoj6QpmTuCG9U^VYw>$GsXAb%I7GNwC40wZ;8PFLsQoQuBN z$H=3sDbSdh9Y9BCRwBv~A;E+z;<8IVf8JO#OGUIM^|8|n>M?h{Mm}bXckp=eb2zCG z*c@-5V=<9uT=i3{y@KeknmPWr3nF_r1Tw=It?SGRagh%bGop$GpeY<ZU-A5z!1C|; zEoVOMito2cY70f3myFo|tGYz?HEZe>--94_X)jMzJ2|+8CDSk5p4?sS!dLI$llils z@3MznZ&zzDcjxdk|H{gWTezS!B5krUaYqC>iRX1fmD>0MYD4L9z4M+#0{?YelD}aI zr#o~#kjd$Ijm7<S05C<rbu%W(D_`>Y^0_c?GpDeCXHa7DyvI2C+kM4HYQPHWeY<z; z>Q4?SsQP?cldzw1JAD_q)xJHo8#w6UkOpsK5w;U1-u<K5zN5~*9bzZ)Q)_`d3=9*x zf(e`%s<^mvF2v-iHeg;713aTN*+y^aB*(NthywL7XoVB`8tbv&`{PDzIXYS5ud2;1 zsFhcQ_iD~1DXEKziZj-&4PUR=_S7$O_`1&&NGWFf#wO0Aag6ovhAFn(#q)$sSTwqq z!C-1s-tnhXG5aWuqj;2~xMNMaLE*hnf!jHmL?<<U#~qRO)nK);o9Ojj3H*7gQE1g_ zcPcu5#@Pik;)F4O1+X-~M)En6rD*HQ+g9`+|JIRViT1AL5RjNlaedHGQJ=vGblANy zL~YN@JSDHyURvME0UT;Mn%0ZA$)+N~0l%DezVdF2Itd(D5Wy&odQ`vg;sZ8McjjQq z_U`#=FD@6t6K=3|1jsO-Y~#n|Cr68ciA}Lr9|)4u4|xvfLS~aQy5()hIAWiz2X723 zuo28FJV^{qs^92iTul{ZA25nWd4D@ZM9>umw9)t$@ymA1^Fa<m>tAa{4wAk~;G>B= z>-q4h$WHJ|e4>8bR(5FvN4n2sq82N^1Lb4hOBE;L$sTf-vnj9JHj227ZSSuIdHY4) z@&u*_38>dGNgrT^jW=o_!|7LijT}IHkDNVzjwebbC~caBxEhyHwJDVJ<VS%cdVQL% z_1~5l>bMzma}Mus!cb3=(po}kJA;coLebV8c}9GWK-43ijyW4h)Q|UB3l+0&h6Bp) zSL3wzv$ZctQ>sg}$U5Vll?HyWx{d@g6>YCMZZ_jwF0^;K-M0M_pEDS?|E;AU&q<PX z*_xg|=m2^uOxe^9j&dYxAZz%>y7M=`t#(OJO|+*|$wcNbWa_8w2%JOX*>kD0C@VEY z+g5xd!+rQ|!3u_&tQ@&Vg5eA=6C8_1*JNLIhb@9iMgT^<i_FI4<^9e|Tbe>M5TKam zF=bS%m|*N>?I*$(!5uj@qu2`q<NKUyRS2Y+P7>IRltg;qKmMOtYz7^L<8M_mp8Q}q zeca&m;K0xMk?;yhQ`u9ee}pctGwB*TK1Yd|cL)FlwY1xTyx2ZhD)`S-%n?YRD?ag$ zsJKe_56^HV!5uka_1kV&PA5!%D_AK}Yq=BlI%1#wc<Z+k9Z<xexM);c6rpWS#`53C zMpdj$NXS<l`Ef8&-7?o2#I@h$vDD^4Jb7wfG?;6dE!HzOvDYu72GsxB>SrClV1fEO zk~|Xh6Sj#3;+8$qxJn7UIu`H4=BS7>Y4v4MP)Z9+t@Q+fq3}h(cP9|R??J+)({S@E z(@X;ZV0IhK(PKbdqpZ!lgMt;f_rFyE=I0pPeP!%sw_~XH33swUV+uyloo=5NkMOPE z19r&Aj-Zoc^#s4DQk!TLpS|J8VeyYL+z<P;MLcC66*0B(&QaEqR6?Ms0Z~>L82fkr zmXPtFALJwRcDdK4Zy7A#gQBS<J#e^Gmz)<n5A+vHT0?UMnZN>;OwXkZgWw>}9kB`Z z6Q-=*CGMm{CGw88*e@9SPE6PJv1ouu@VG+xO2!w^E#@9T!Og^fVfr&bIx^k${2lID z2O+K1Jz)qpN07^hb?oD}`yYskE>e&3p&<ywq$T;6T<{hlw-Us#CNdal<n?##$4KMc zV0H@)jN-zW6z3tE2!g8z!9S5nOP&eMkOa+@cDL6wKy5x`h^9q(EH^2@TBwxnSeL1% zr@r;7O~?c%-^h@Mg_MpyP;eLVX!EhLqggT)vWbzyQUE#pl?YSw4Q3AN4q^tz+pWHM z0u#^fn{QuBHNI>%E5yVLL5NMC7&Xb=#Se@jUh+Wu;CT@i=JQ-L^$wx<8N=ZMwC~qc zZTJR#T2hAqu!U^ijHNbTc9pX4hE5u9TdlHckB)9rmHv;2s%Ff+f2akxVny3pbd_@a zr)Z;8wXA845Y-zB07s9$XPBO*dfFyg^Z|nS8hTCnW~dkRX|p3@*bxUljA(px{XH5^ zj?wO3mz=c!_tC5fLnHv14ur5kEzU~g*v!FSNdP?=4)f-hdCJ5wz>j|7kUH{+W`UR| z!$&!it$EBV&SezG^U@qQ!4-p+_$9QLbvsO<_1yRT*=;hW+Y3L^J_JyZ>$j)9GfaA% z!Nl?(2f$M7zxfW=oc0jU?zxH7f*--ec~s5)*AN@clO*t)u6YW6a3zJMM8krCQ%SY% zO-!4-sk|03_*sMyviuQeicj7?^_12?`yDkd(9@#;)PFPY&Zohse!+ZAMGI9EvrIk- zm~sjM6Q;btLK|%sY%r#?6&nt7g1z;zcw1j_cadlBolS~IZ^s7C;!B1emHu=MX;5n| zRL_}vHu4CxShmbJo+}~ykdZWp3#!!qfJ*Z>eRh4`T8vt-E(4E18-h{;C#+!Ndpe<w z9{CaL=L^Y5Dj(n(V8O}~!>b~euts4+xVTNCD&6z5@stS^Ca8%_A5@XX$hi%-hi_M& z*qM=Fk8L(MXCC;ZeyJJ$sD{z7-ng9xaGQyR#pg1!Ab(?pOli)=?yr`ztL5_-e^3_e z5^9de^(XRMR=~Wn4olR3P1Iu7Qu2E2E{B>a&q>jE5<kCablQ^CO1!3<KC@#mL~iwV z9f`9%A3=kB%nguUyQq$6g_NZ5INT1**U9@IUAz;!&Vi{?%^qU>$ki7L0E;2wUz1{< zy&3r8#nJa{58U?;92*2KWKBh_2(VTq;B5Eqkm+QiapJVPY*%p>GU3tqDWu_w`==;d zNkD+5ex9xT#L@J&rnnGtYiluvfa5xAIB#`E6z?-q35KFP`R|pDL61G$S}UB$x;ibm zd1k1VT5`zMIiL#nj5*H{@tVnT(tZOre|rFzbOQaSNBs8vT<r5W^$|wzzNedGgV*8H z61y@@0TYF;g_Ua>1&W8iFF}O3TDAUc(x{IF3Df1CR+Noi9~pSXIey}jowBEi@Wl{3 zyM^|#U8;^0iem<<;2cU}&QsMG>sJ4rY%$bo^~???Y#8{(9yQ)p_|*cnW;vj@(f(Ti z`War3n=inpv!nas*XHM~pqpQ!HaUBZOw^|C1A6$>@&Q3Fwl>E^Iw<mWa}OvadS^iI z?b!s(1y@Adl%KZns?LqRzX?uA-*ip`aXQ+N9&^|PovVqiy)(!wPw_5}>_~~U54xXn zMZ`#LYo^i`a5!MvC#&E);%eSO{1;sp>7ym^ubJp%K5SJa8*NXY>LeWPGJlz<AZ7#l zPoMayf2;nx#aolODlsVMgdY|Zzwugm^MuIFfz*93AzyE}r|~3|z)OOA>>_8~YvMz< zewm-8#LE*|J`FDXrAy9)2eCgDQ({b0%F{8~(DSgX)`xklmiQ08ddk+JX1duY?MMBE zVslK4($3)$G;4igU^k{e1QYr?QdRYpH@%`(M(d9Ct6z0!5KWvfdYj~p_#=nJEP2N0 z{=~-@kOV4=i0`P~wo}lx(FQDqSAtlZ@=3S^8g!&^Kk{jzW}GzFUb(71RZ^zS<A?-a zT$;$TAM~{&cHcTQ5aNg^7{bEN>J5+g_0Gl$<0Cg#%Ed8*GYYg4N58JCRx{Fc_vs5U z-#alsr@kHcxs9Rycp*4)ATzN#DEgW=Yq;;QelvGlzQT<LamkWC-6U`ICMc}7fiCmT z>_na0X2H$V-&KfkAJOytc<421lESTxW^n$|%HQM6!$hxWM4pN*?K_;6gIdp8>FPxs zN)jNKwh71c!7<?`Bgth>J$$Z)PLe5u&$&jczgoxj)S3!)?2O@_et-qKlxu&OyI)9P zeeya~Ofr2P@Dc~W_i8wrzYY2l$QD-2b*v<p?2{Z)B(QoD8NcU%KJ?lPp{=!f;_g>L zJkJeQ7J~||NcM$j@hS&<jl?c^FZWTC?%NupNm@;|AB<+(PXuSvd3@G_{Yk><TK#68 zNSC#3d{PI!^O(mJhsviC$e=l??`0m&-&wx|3dwa5Ay3wRC`7!|YWFJjK&f5S0gna> z)$^34274{%b~cvq?qGDt88JDPR6!55B57VZBy299|3|p5W8wEA+?Jx_kC!ToAe>)} z2}TCpl6~%0aY!(Gm$vWXr})HAk~s>_seCDB?*<e^z2zTAXB}Lo&d?vCnhyyk<OM#r zh+VLu<2~R<-|hKf;vm4=|8G23XkF3M?d=K7!N#A9E$dZt?!%Bp1~IT>l3H&@TVVfo zV*eA!dk+grI_|?%91Z8VS%v_S>&NY82>UYiZTds#n(G}Afo#jF@LEzgNy_M7*#+F8 zFi-8RO0hO(*6kS7XodaCm3T5;;a|Jgs+^7(lNrA)fliEaPRm($he_#1ca$8cxF5lm zHQ2HEdSu2KeXxAu<^U?>l0tZl7IC}yru@pX_G%Qwd;GeR@pf(`bLg23wFPgo;?>(L z50WVmFtPINDo#^eoav&$GlWe({=5B2pY!8_5nG)b54WXkjvfhHRxRPm7$ZgN4gyGT zpxTN0uI}zcOhko2J=~wuk2HeiyV1&e|9_(!-Txh<nuVY^`k%slv#2I-$>uNb)zxgy zJNJB{Do<lrQ+`GYOdsP9RCkbgkUA7$vRy+2-9F4+ZB*HeY)(i@N4;EgZvU^Q*K49V z%qX<vvWd<@FJ;Q@**>Fx=mRdOlRfTW(3efN`@Y?zt7iHUNWS&pY1xaxz!)B?+OlvI zt`mkVj3e#pUiYzDfTlC1>umLA7pw0Z3hj2Vl;0bnq-CU|R~-z@P*BDgxbP`Aa?V4F zy<RbW+aY&_I8A>(S0}cDLXk;s8GHHY$x8!mAP>iprH7<8bGRx-)uc~`RrI>=1&lz* zAH?>P0qGzw!F+Sp1z?z_VRKS&(8abo(wCmjH;pSp_u~7Qj~qh&o`v>rv@`y3;Uww? zyLH%JX8gE?UcuICl_(3AJLA)WfG356{l0sxat8P)Z1qH6sOi_YxGc)_okPUPZ&Fb- zx%1SW2hRFNT;l=a;_eR*pD``K`zwlv@I7(Cq;~m|RcV5e+(<W*chGGX5u7=@2QOS# z+12#0j}})+!HgXv85Z<~V)!G^=F1IWrm1mg;o<Ok=VuKOtUt$hH~TAGw!3qwG1Tl( zj~p7k23IUP3R|_E|98$TOJieA?Fs_KaKIKD9^ofAHasQ|XQK%p73C$es(ZK%Ph@B+ z9F{R44pLrKHgKk@ntsVB2M?=4v{3Ug%ioxH3gJT`->jPEX?6$<^5_&<j>UWHK2aN( zm&q!bk}5trAgd>BOMb$h;>w6KcjCqUQV3SNy)rcxrvN#l7d~INEGdC{4hUZS6Oz6w z2;F&`U~%U1?0#0QA08tEk%*^&(9^7q&U6~!&2)$ET$rdM^D@YQr}wVy-(2xkNN8q7 zv6HO<apIddI!1B!JhY7d>Z~G#`%uAr2B|&i#0M~dOGfDVM>URlxmq&VSWcPP{(k<e z|8A9=n0(x2;UYjJqTQAGZ?4Uo)E#!D%&?0Of`}Mu#lGKN3|cZeTpd9(Kl}8m9nLDS zXhkuIF6o2+bQ`)E&!nwA&9*7PHF=F$uG`F6We`BRCsLTHvW-Y4+-531z`<qMV5j<d z9+EbcF4JPusZrBjWix~-RJL0(O6zQ?Fn++1Q*UGMYd_&dy^N=(jz3}13D1Vuu0brv zpP8xHNkAUJQgjGSsKENA1Y<TD*LnJ3XH27W-hd!y6Z&j4yyOhmmRm48n=K=kZf*H= z!C^6Xm8diMng$LTewUyOZ2%8E&vp@?VX^AiXU=7*!vx2nc}iyFn6PUYK+kks*U&z( z@z-3FIt(4U<zD$mH7%PG?rnregpBq5Ea4IFw3V_JBOrM(Y#UujxVN%Zq%Hw5+_0nK ztzgEJatY0w#WDOI@Ik+YU-2}Fd_qV1ch~JQ^Gj_t!oe!2vsAYjj?bS?<X12at|DjV zcqt9ZgL^4H{QLCVofoWgq1(leZ#B1Wn|Gg|Rq3pp)%#y!Be>-o3Yr3uiKd8{z-2Cm z{IDMkJto>)Fn4B2F6r!5lcJntNmE$sB4{X^e3+a+ht=!r_#;b5fYw9QrZDfLY8M9V z!&$&ny}-EYQc_)(*H1iRR)>zAUOXYZrt#FA@Qe5uToc^A%`9;o!bz4H*?5Lq-0@JD z0b%HoV(TB2PyB<vaRmXPx^md|AJn_t{TPxZ#AMSZY@;r?<M{e+<flUP%fd69A|5qW zgbFQ>iSRJFu!NttIGav{kbo;9JPH#aU0W`ej~UMqnW>CE9)2rckc^eJ8Ab=olv__L zJe!FOp+O`e8m(`+g~(5OjfsemtV$`-ll8bj*`X*T&ccE$juv9)0Rl+XNmaH!w1=qS zFLc<7aL?JhPCO;&=?I)(U)Qe6zKU@+dS6NH6gisVk?}xZ9PjZM*TO#j*ocC2HW}9g z18F2~Dq?Jjcr;Kr7ED#!`Q^PaodOsvHy&*jj=;Sl{>9ak-=_`<zmdb(nsOc9&o=y1 z$VP2X-5O(?H(+Nu#byTHH$_Ork$z?xtdW&|VnJE`f*i*6#3^kzv{|(?Rh0$l`%2CM zhNFe$DZhAGXSi2eO{!3tL@-ma<tbgqD*Unbdpf<vWv}1Fug9^2i8hvmS5ghUvOiP< z^VUo<6#t0Vx0a*tLAqMkb-W)wRHf+`qd@%Ed7=n-?8_&PboqD~Mq;W;`h(mbRGsTH z&+Cl1(LXzOo4=f$qxCMC#V>TtG4EXnWI31RKSbiX{IWDsxNI|aC#?hS!0nS(5~MhN zG7jMXIZXUo(|)hyD#}1&*l$X(y{|YV#si$`hUE40Gm<b|GHXW>+1X=OY=T#E;yl$W znsEe?h+Tq<Sjw)BND8E3J-79mDK!_Kx#fI0nu;pOO|o6MH3r)klI}LeYdX$o%Q&En z(FJi8(NRbZM*!c=0nmFR(XXV}CKwx<vJ6akG;7#eD8rkG$ZLh<w8=7KwPt8qPG2rJ zMEQ>QG74_yYb(-d48^$fXQU)PpbjC--<-q~o7>T`xx`4u=CJN&f5RAyT<<CG9$+@I z53Cd6*f78T0POS<$*j=&wKC{BkI9qpB~4k()k~IzziX;H_Foy}3!(=T3e3IE$Xv8w zKu&vAt`x%)YX4TE<X|$O!;5Nl+scD%>BO%^-Cm-cG%s%Xacj{>I{fGxk~3Zn$Dr@y zrTYLf{s&~W_VHW*_wf0)>eNg^to@RB&2z)?GljH6?~kX+U<6x2Wbt97q8(*ZO$zo% zOD4--X<}_HPT>)!d-;~9y9%EY+XAtr1zG3O+>M$0r}l}bqld3|oYZDCx*Mx9wc(UL z6j59~|7Aocw{g$9P$E^IfDpV#uBExSyVW`))^jai72;{nwkN&Om$1u%pO=zp{~K1; z6d`JF3Vayz{awzSk*JI6cPBc>5up~uS2-Q2B{f$Pt<?O|A8q$Z3-6<YidPdD${zJi zsvj9!`Kw?2R|Kve<n#PNp86v^6E^ZTC`hk>XUx^G{&&uUA2=UphOcoZ<l{VriQl+E z{AHT&Q4cI%z&|`;D7diG4!dM_y!(0%j~syAd;`84ji&xiMltJtA#fwg1V5$#u%RHH zt07-c)7=M%ArtJn<3f0$V>W||wLZI~cnr4gTZ%p<xP^aM2#(q9#y;#1i<Z%JhcB%0 zMC&~;Brjad*&R1@ohoq0ybRH8l~(@0(FPP~5+m#C0U}c7%tSa!oviT&d(aN?ZM60i zAeR=~dX~)xHXfRm#QC;vG_&79-czh3M$v13_flA3zrID<t-OXENcCj@E0pr_%#Kz7 z1VYofJpvWpnB#mS=_)MWwE#WcxPg69k3<~#5@PO~y65p$vnbrVQk*YqHWcD7k*xtZ z780-C@WXdF=l}UHf0F`b5Q53`PyVs?)&;aE8BRSIv^DcOeFRn!k@gPKFbq{Jxif*d zSzxKrG88p6L?>`xv+~9Y;Y+vblnrOt7m}2cw~=Q9&z(o*#XEmla_x01F0Ni44{=6w zZx`Lq9&{)0!`cC&iRWcj?b<VP=x(dSX(8Mf#VivA>heBCu4#{(1`d9G)gF!1SPf|X zbPk)IaJ`S{IQGPLD1AUX<5Ocn0Op<b(e)&GMVRb=5wc0CN4Q4kTjj7Rt85Pb-SQL0 z2sK*|ARFmD)`?P&I@)`P{@sk~WRK2TIq1*4?t=eBQzF5%fk+9<+u@Bn<_ms?p<+Hu z^0!YCv=>eL98KayevifsQA`a>TiDK;Wy%ML^f4wm{WRqJOhWxB#&cU%gDd+Vxj*H4 zI3{;@w)|@}9oeQ0c*58Q-S-iz^9>W0?Y#<HFB6vkkw_hHD4JSe>6nE?iG0-5XlzDf zW4?H-3)F<On-Es00I<s+C*&`Vji%4Gvqb=bNJr+fGsdZ9WS>-CfW3%n80aJ`P@I}H z&xk+y%i>~n{8TT2pVDP~d6YXjA`2%v3@F#?iZ12h1OS}%4{I4J(v$I@Lf~Yj^Kt@2 zJ54)1ld$XNZH3bDj{&B27*Vmiz*UNgCJ+(A#C`@#G`~#A%yb4l!K!o_E)Zi7xOr0l zn>0utE;_zM5Oa@fDBA4C7aCRcR{u*o|GaPu?k_9efv!n*GIvOYcCX^|R$QcNmIkjh z%LW37HSou`=|2F4;sR{~gczF#a_iVP+EU;M<+^S?-Pf&!l@%&$;vtKh8f;%o<ZKZv z^Zb~%WOFYr|7zk<RFb=Ol@>XyKqlJTqY+XJDP%{`C>z@=7p1f^nbXue3^}~@49(@I z>nY-6aL%WO>YO($UXFRsubdCHlfN2>WSRp8mj20lW+{lsc}F}fi4iJrI)5lQpuAr# zzXwNU{k%RuU9`^9Q7$X3hj$;=SW3@0{QKWo#NmfEJ&)Wj{a|_r<wsusG%l|z3+(t_ zWS|KWrk$u7)hl1IJTS3bsJxbP(9aL3gLDV)wKPaBe3T-qmFkYanXgvEg_Kn=TFFl6 z{cciYxiiDVN!EIe^S5PE<_(Cfl+5f&dxCH=451+f1G@22V(i&GfGB}3KXg6^f_*uI z^PXM4@XzTZOf_5*x1o8!0ki!aO^Ly#h$3)Z^3`l;g+DS3fj=&v`sM^KT3X5Anc8w@ zfwSp!^uGO8!m<Tw%*Vtt;fZHr8!~u6alz!Jh+WB+i;42(50$jT3r%o&#bo!sNMYXN zGKIa&ZX&KiDp5$Crv+hqqJ$ML@Oi&MtWah=AO2DDrdqA?F6!fN^l<h8X32k4ik&gK zm<#QCX{|<sph>7#=7)7k=@rmX8qW7zIZmZzSQ659RO(1uxe9&%2O#aSDJ08uw2)It zAGsMdTuD(af@sIWGD|JOzrw6Q;<B4RgFkeR*uSCQa$<xyp3R>1k2aVR8BlTvOCTV( zN9sy}0Bp}qmN(gNacrY1HvchktTXNET-GvonbvH>x6LO5&OhQ$F)Q3D$T0e0^@*Km zf};=oF&m2wTqyV_Rn@$$J`BHBIKg>=Bik)rn+gEMa(kCeV2#zBfV!j8f4X?YO=(Xq zk}d_!1(Lcl_;Yw>o2FQ`lip{$Mz#oLvaQ+f%Wj%Mz^VU|9=O<od5+g;O}uE3Lb#`- zdZ{pGWN6Cg(9bfh)0lIV`sVP>Y|xXEZ=2p0m+)dIjMpMKnje;~>cj22jMB(~-$C+` zf95I?vyX{zgo9#d<g_B+7n#UWtP#W(mz9q8@4N(nJ<sYm`fBYbELTtl(>nc!R(Q62 z&RQNF-^MasUttj(=`h2mXAgM15#kqtPPEA0!c&)(x(;Bi<$TWWh|Cd$5ImN4WbLyA zz#{U8OcMv)pbL0~j+$qXg;@ao1GhUOGc>dwW3hmy0!*AhNy)Y#9bNW%7eAJrk0V@( z8Jh)n-<-++>JnFeHUN5Zlc4v&pwD}XG{x~rk?oKPLMnkOKP=FLf;#^0<`o3yg>tJe zfLm834wL8aWz$d6!GN?N!lFz<(VwZ7s;a%!7TjCPnh<~cQ(__Q!ul7hvIa`>Gn)JG zHo0N1+YdU$3}4fIaS0D&(Q!Qq^dOx!A-_IN4$Sz)U^KY!V=svgCq@yLYHeoi5_1(E zC*OZFQo>OX*nS5|AxjB98<i<+(&j4=um-Xpl#xwlZuhcf6H}54pK-CTc|<g!v>vj| zeY5^#A>XJYq44PuIWkmL%4R5hpyy-*ROUEN4FLQ_nl@o#Z2e>3wSt|dZ>4iuzIU+u zFI0Tf^EAMSl7?}hwmdS+wA)qjG1KSV>-;c5&qy`$xxJ09y0xUZP9uSef{IAR=kQ<( zDGEJ8Ibw55I~+Hj-=FZ_pNq+bEP}Ws!q4ZIxJ>{=>{oY{gjm}#(?d<lB_D#%GH-w_ zHyS0bPk2gGAfiN{U*eP#HUmhyGTCTx@nd`&PG03K|EwP;&KK<R7noUJogX03`l>4H zx^;DCHz6=Q3U+WO^5Dlm5D5#~(?fqK$2%E-8k@MYI0B?E`Ax<>(tZ>LrrMGM<P9oZ zs&v|gYXH-?0eo=P<L~ASj!%^xEEo@#oXd88ogyDW7g^#CGIic-;xU}EAJ@kp#kDw( ztSU<(Y}Iza<aqxCC0sX1for86N}VrhX}Nhb8r~Hznr{t2QRWTACdP*BWzjrCYsfsC ztJGi7KHaD9U~69!)Wj~18PHlw7stM~-LHZPu>vetS^zT;frBU5XZbTS;1|xx;P;ad zjvG#{5%xkKlTFc=$wwd+d;4aN<6Ix8$}cZXV%kS+ka`%+QSS*)3!Z>PPrn3kB5Blv zU<7-mVu@?YX5Q~mGPtd%W&tcZu;JC10jLw=0Z5uo41(`NKwrID<iV+gkn1Vn0I>ip zdTQ(o`<Vam_8k@in4cBQ?@#q8Xk3?j!l~^@(+gNm{-(8$Ea@&Ezbh|{3X_AC)&dbu z{qeFMrC*Bvoa#DJA0?`h{5)5vJNRty@!oQJ<kbYb&7$wbSsOS>bY614d<6MSZJ=GP zP_UoY622tLQiJLEE9c&Q79EPfCmYx}AX?6bZcaYmaOKaPCSwD)6bTg7M|LwrvJWT& zGO=t$oY}9#KaI+}%#kj@Kyobxb<ZVgFOvLxID-7VuLEz6fhxeh?nMNb2Tm?7)V1iw zW{1j=+JtjFu&C8G`r14iE_6$T)){LvV=C=9{(1YPJAW3wm!D*Em;KS-V4Up@JQv0N z78jooJU+^Uk8^4{5n5<*kpn+baVgx?a3|>y4A0h?vmG_I!NI?re$%-;%(Fh!f{)fz z__UUM7T_lb<QQcwkP$vYKpxU*OuwYT^ZULIw^cCg`sPach}f!@xRWa<+G|^LD0F5C zqSCS>8YHQE?{MRUPbJXiVMhyw{fF^ntvHnYf#XCAITy!q50l|xE)+PC1cmo+YqOAg zgXK+mF-%pT-m1G=s;CgStG`P)?ie4H-j!Vfc+O?R&h)P)Frl_F*D~9y`M2{|<(eur zGd9bZmyo&%xIl+!fS1?ZL)T^dAeOu2vpWS*vh@Nm;tc`#&m%AiK5f|VFjMqNP3H`Z zN8XxDk9QL>_z!uum9lwK({Rfy@i86j(LAcpzKu|kSr2g`j+2dhlH>Tr#ive@$HVx~ z2S3lWzoG4RxwZnSq`>3w(C=vr^yE=C4Vh62h0G*)F!x;)wlRO&NLlsUBJ?7(0#m!% zO^A8?f}GZpkbL*?)D>guOY7@;kKlzJP_I!>#(AAzp}`+8{y{aiCmqCcFxQ1Z<%_2w z4<4uVncCTzr4@SuB_nM^f6sKf%4S5WEf^{&7T5W8_ibx>_(>#f*Fw4)dE>vz)H1S) z*q?XFyp;U7W(j6=r3cOTue$uYMxUNU5}TtDftNoFF^})R`Y75=uucf!HoW7<6_fiC z$KSDUYKq#4BRL1Kxc)!e(9MJg4L^U0CL72T%nMD?7VT*U@1&jnirS_>|2xSGa!j&k zE_<G#_n@Lr+Z0I&Nq#o=Y`3lrwS4&@Vfo%|Z}gZ>8P!ank4-);AjCYdB7FM*M?y1R zvbY1Z7l#{()1J)4H^OxNPEtH&26he*f*(EJ%AzG)yac_aARhC7J3;QyI;ue)ShQMr zR`ep;Zzl>#L#NDP62~aS+3@JZ(hnxoGWB*3Ul0G#=VS`$Y0M6$gvkic*N%7>S_Hty z{7fYMsVM`|aTc;ZZrJ@VMt_(4-@0uSZ9YoE{um(p+?z^Chpa;kA>rg}d|#+>(t}gR zoD=Z>ql#mpBd6kd>^V#IG#97Oq4f2Ta?qg1o6ld7D631UxCBLAdHIKJeyeZwe#Nmo ztGsMexE1WW_%e%9g9=KgMBXOv-59T1;}U{JgCTucV3oF^C3AT`KBkay_Zk@qX%j`* zyrd;vgTNDZMCI~p0V-T^|9b9Q|7mKN`J)I@fHA>YxRf_T9S|t?H=YpDux^j1n7Ena zws%i3c@T@E2807f!#}=AAcxgLm9D_BuV&E-$1T=Z1;K0odoZOwP8iohIse}rV(`I# zIzS>B;K>j~*|OvMdX~d)cKGS^Mu&<#z8;_#L5`6AD8aQT=<}2m46cZ7JBPCTxiFXd zRwfW|xCoKg9PO-n6NoS%`7a<LSh&;RRpF<^L7ERc>7BoMZ=*Y_ns4PE+e>tQkX{UR z&`05Yfgj$~)EOYZNM(UTk_uSjkMFup@q#1(a5^qes5*qygZ6svMXVv-=C*Ar4$+#g z9Sc9ef(T5!{1Fe$?yh=~BZ%6_9$0&a_@c$x0YQjqJUsVKo_DCM{1(*Y$zZ9;;Q6e5 zWY1yp=rJ`)F6-z@-MRkkhwttLU9cWz;mmro6p?AF0kU*l+N$#X9gW##l<m-3pj#_b zOR^;vjMe+op8!i*z)_M03wu8At#B5xOh{>&F)&=d&+n>#eEi8KigTPu0uW^)*}}b5 z`RLYH^cx4DzrI(n)k-cq3O9%Hx5+c!`@Q`CD=jvF30i_KLJ&EU%e*5BcS+oAr?J~E z&WJSPoaEq>I_X^>Rf0;tWXa3#XJiatjb<fU6H5D0Byp1HCW98-5XY21Ke36f({p@| zgew8NyB{2aWrZpOzsbqhqz$==w`^B{TwZc#>58VE{HK2&7vXSw(Vex<hkpFx%J_Hp zYuvvs<bCm?cUwQO?h*Rn9XMGE_dlN6jwv!jJXH42vWP=m)sgupkHg%s{osO6yj#Qx zdO68!m0^4VKl2u(yZ)`5w>%`le-(_n@xV!6;!E%hO9U#%2wcrA#>X*FNiIJe)_Nv9 zr=kiLe}@KQ@^_B6N<`e2B@Jd5EdPn#>+f|BYl8HlitDDJ3zoHeO}xP+bL;ayj)`AA zW7yJ$O~Y77$AGtJLydMEY?Un|<X=lw?C$ek9!pw+NB=Z7$;i7RaBOKQU)D(x!zgMX z{)`RenRQ=_CnXDK8QxraP`^ieRi%B)vraR5NJ4;%(Xztm$0}%`W?{T6PbFF`bD7-c z=;xfrv`qcSSBDlFk~^Fq-b)UH)7!-pF2zOUV!zFK5phgh7I=>;rP^dF!zJbg(pJbj zG8Wh}CEAbd_Z@l|2c&78yEu}&68Gtg+<`>EPH~0$o=ljkmx5wbrm!$G2ULcmged`m zgb%~M{Huqr?k1n*Tm|+fF@Ij!?57Zb>)S_U+}89Mz?SCLg5;2c7yAxF;g~&MO~u>{ zdC|fLlIKjIT#rVMrq+kq1&QpI2Gw*lHaqYC;oxoIt+fJ_h-+$z!qnA=-oi6PYAPDs z1PB1~NLSCS<nYZ?J}aqa=><$LCHg4?*D?Bd`r>fd;3}En?CUg~Itwh)2yGf&pdTa> zf3?_HcRtmfdSOi(0CkZn^ssjrI-zCPEVSz_I9zdYD|wWZ;H0g@i;#G>*Wj=tu#lNg z01KQr)tGYoVPXa|esH8*bVg$%LT)5NnD?!%L0+US>vSSvP*oOR85uCeW}2wTTpRrw zYABE|KqXb0>SlPaJAao%Y<B;}|73jT->iu8NPz)HT#s<@H>WT@xUHP@gZbtjp2A6b z8TOjtD!ey+0#!`t5a^E#p63w#l(hCC{q-}m%eEwbU8GA$6z@9#Jow+^PXzc3La*ci z*;ukCJnwQS1!QQg-@1JQ50))LWOm$KuVkFg?&$JM71nD)W82_d%?hPx_X;ZV?FY2e zkcQ+5h=0bE`NfCbI|X)Q_{_xT3Ee#ky%lY>xGaVLymb#fTk|!`w4I(Y=0ms$=<&fc z^!Vs%gRAZ|f!j8qjN8CaJz0-;8Dx6Fu`0e6{wHmVjuM7VKIYHir51krjz-D^tf90c zY(r3M2&LuxnKZ|IqI?C3E(Ju1JNCr-t}T!uEQOn9MZ;f}PBFf)Q@H&e{j409fZ0{n z01BP6hqnFSd>h4u@#K)4(Q1PS(bgAM@-=cNxVWIrB^J0p?bDoKynnAsi?oU~2s)m( zdVy(1@m_dIeX*azqy6Akz&L(!YNf~vX&SJ!-`k96U8}t0LUL(ib6r6AQ{Z>-Hwyo9 zod=KwKVPz3#{avvKJ|G_(SmFAN6IzurbTuSz3{KRDl*XwQojolbS=c&5qI)^4C^@P zeABZVNeCXEy8Ir_C0dHN^!n>VMAYG|7DXzjZ4jxOa|dCI7c%+K>ut*&%*K|SY=MY4 zXD}aR`}^AK)aq5i7lA1@^^-Td-wQymcn&BR@HN<F@%(Wo_Sk2#FTZz*Y7^OQudDgv z`>ZkAiAH4w64Ky3v75d$$>Q6WG?i5#Qv<UM9MiTfrT5?;&6$*hanr4Pmoz2^zUj_M z;>^z&i8OACR(MA<+qg&c#a$P4{>t1cODEd-p~=;3W;eYP$oChdVXOjgN5)xa@6R3H zvE$!De0p47fCpt2Rx>p15f6%v*nLYfL>S!k+(-5AvRPOG0kLzFfOpw^b@Nc{>34wY z_g-jREC3q})Lr8Q43%s$zgLiy#e-Q8O$e=}RZI1pRIuFj+=<$e6$u7g8<bO^E<rZ2 z7FcKrn|=#R4@?tr5I{t9&oZY(>p~AB<OT#r46eK_RhF$mh&@o<TQHtbs|L;TMP?S` zwVGl_1y<PXN$mFfBE1gArGp5%(W$05skdpV&tLs)H&ApL0I{3A$rRLl&Qe8!2u8~1 zAk~f41QrZKZ4NF%-0d)ypU)6ieXAdFNiLiH<|5&%7^!;;Z+LUQ<GCf@SH-*!nkQGG zsD~@2+*tHuyqC9>61^i-eFRUPK{aAIb@A|TAr83@ZD7cgm;WpAz#Otp*?UC}<D`3D z<=9gF%kR;oyi+98r=Dk+wtrCJT|i*sQ%-jn4@+c1`@Ws3fMXjm^RO|f!U7X+LOO4w zKX^4yp?EsA=Fj5&Yv5NYJ2i7{-3C~%>g^-OkET?E@lQjhNKJi@Yh=mS@CX};1q--k zuNW0sbi7L+<H6vDXW9!FXOgT&e!qSs2`An4rpxclYg`adeDWw^7Nd<n2KjffqaGgW z;$b|ByDKQV&901rlq@EeG@e>keA?ze2>!0Cz(j#)EPnGhOfI!dzU7_w;RQ1a7)>L0 z6V+`pI4B;eDN+W~M$)ONVatQlnOlS!#)^Kd6~^Kka>1Gt*OFW4|A>1x90wc^uQ>+3 ziGpvRn?B;cooef@jyeZk6(flz#mfeCB0I9vsyhucm#);0Svc4yePK6L|E50^sFV^1 z@iZ1KQ`m4GGF`KYJ*;xc#sj75eJRoFJ_-ou4lu_@>rM|%-qGEKsl-->@sQtte~%%8 zV13Q=aumAF7Yx!r1N&0r{<FJ$#`=34`_Gj#7(xWJNr^Lwe#48en7bQMitm4Kp>{FJ z-gO&4<U6GNK_?F3Y&G?BdVj>xEZQX1i?}cQQ>?EILp@iG{aSFiLcl|s`z$#<?kVr5 zY~PLH^D^e~lqlC_Yh$Zoq%i(d?(#9fYI;{P?71Q$`X{Q)y3KQZ5-NM!G34JYn<g70 z{oUJzLHXPGx#YtHp!0}!5}OgIaqG1=#(iz*bjBY+_UMDYd%+m{bpa(Idhe`;&zXjW zpHP-piHdfUD(F?o7ytq1djQ~uM|#jKWR}(ppsm|ZPwHBV?=yD_7AZTHgz`V9=mr5# zWo;oR5y!HXI`XgT!s|a<sHFWgr)U3||A)k0X|{K({HuEt;%E|z`LLf)gp1+HTjlA8 zFQqV-q60Ps2uGVm3z=}V+R^)Uf32|hsMiN}q5+x=*o((^SeCF?1IqUUqS}+;g$0j3 zfpy-Mf7F*|NuNsZ7fs+}f)i~?Jr{mCX$i`~v}M^v!R6n>sZqO+O`VZ9uIta8$c0g{ z&W=Oj>Qp%C6ga{qpypalyu2A$Q~<AsuYOO#?`j>IW&29Iw7>4jrsQ~!MM+LHkW%E` z2ww<r4$|`aYgIJ9BVVS2_0s%kc2?%fqZCQdJ!{>VaJoix2J9r+?aHvfySi=%v>^>K zi<O3KEJA`mI3HlPzWD;ZJdGrR;qELfg|i%g$n^d*Yf%u!qp{hA47HO9gF3v~XXw>9 z2t<#uzywS2de1-wxSV*W+&B}X*I#!VQS>OJZCLN4+bZ9I$H$0p^hiy@j+x~O0A`#D zPalFqGs8&7-|SovulW^uBJ%3s5+cNF>ob#oM-T-5rR&^qh$Vs#K>8u55s8RTk)=IX zOo>1UVL05~@bLKe{cLx(^NBHb>Z$4A+`hNqKQLIWD9aAT1UZh@^4)CR&XEHB;#&E> zBFyJ~Artv!Q-Nv2u2Y@$Vo7v#_z42h8aG-<g9+wx8eaaY7N))p_9MwY!oxq&q!XkA zdBh0O+m!A15C%;_twj!Suk`7n_RcQjP@m<*Xz$glP--eCWLLL$?=cop@Q)kV8@9Sw z22vM{gQa(UJ{vIv0j&T<<s^hFC{J8a>5|^LeRD3%a`?3M?V(F#G(ln4r|G*M7FHwx z_vSr*&I%*sigAt8>MqFx3G40t@d%J4Mk6``T;mjOv4h>2G4&|?H>*&+touJ<z6XD2 zVVPsfj@M5CfzkpajA&L)tIOY)8IjPFMgzFuO9@k{0Ws%~-Y<4b!9ezULkrU6jE(rb zey%Ukpldu`jaD%}Mi^GOR28M4*Ii^9e@l??r#YwF@8<h}E&|zefM)`7gg%b{=PmsE zSo6zTK?q*?A*zJf`les+WW01%0c(ceqy00gL|KN}Spvz0BkmYQFel!fZQEtsB>06! zUzOizG}Glq6Lx<7?<$!t<(FU7D{d{{MFu!C<;>WTN!PdDn-xtM2!^}PqLZ9Xa8J>C zt7H7^1pbrb>0C)k<i@AGu)|}=!GCz~@zD!M<zIUhk=Z1Y!}p63ynIX&=}+j!p3K4= z!5RjH*|pzs+6|t7{Goc*-c!q?Tr5-brv@T92={#P7yR(;&8Y+>Oqw$n9^fN{J*1Ke zjsq_SouL!NNC#vw>wl_$3M*kE(cMBys&{=S{|&Xn1)^z|t9z`C#SsXn2gfwoj5rAv zoyuEGx85}??_5aIJ4TqfD_M}Yqd+#zqrJi|O|x<I8xWlqImeXFfB&zkH;;$9{r<;i zpRr|x?2Ke7JCTZ6+O)`$N{UdHl<Z5k*%0@gqOwhvnHEbar0mO#<+g_?lo*xlTN%bO zX1*`IKflN0H-FFTx~}uQ&Uv15uH{_N9KW1nm^f9p2l&1Wa*2@So9vX!5jKX1qwXo0 z%rwvL;GJ%zR6*y7+2&1nq;WWRIPh2PY>+7bw))p!`rl@Y|0OxA!@)Fj2=xRZAgzH$ zV2$P8avwO0`y(|w8}i8YlvrTF(QfP|O|=186W%``P7f~JEw~>My4W64`eS)oXXU>8 zs0>+Rkv(n^(nq=~j0rLHAs2>2XzzCcWe$8Z49XTRYs!cl%;AA;1|!d)Y^$%%nhq8> zz6w`Ong>M-Iu&?swJ1KwSl0Tz;?Ih$^F<l;Ch=n`UcV!sAV|)7j$|i1en{8g0J_(2 zU?=UZK&)7|B}`1TTxcJvB>neJDKz5R11L(%gY}H9qyduHO)#C_ZxVdSS(GzD|BRLU z!E%DfCdknShCC|4MmG?ZlVtB`F3{`2nqJcepYAH)uw@0G1RPm@WgbH^O=ns)Y@1do zm2Cen0&LOpA<cX9>e5V0j+<@uS=&0uT!os1Y=PyDOE>WNm%Kl9heGYuu!>O^{=`VU zmNXeIOH#lX_}c+1?Vn5JP9dP9QFk?37Qr@%*GX<DS65&&s6#<i{l^p6A<khf=S=$I z0#YPq!IRVCcP8KMo(@c4zkhA^^lp?{gFI@=$o-L3)vA!b*&E`E`m;-y;>k0R*R-E# z6iOI&@7(ZsdChC<>ifXc(y4(N_QWTFZ(hDr^Ras5g~#T~?uX9n7e6Kj&A5-=p2+O; zV;s9p1kU74^lkoLDSm7>o0E2Lqq{_k7ZkAGKUUl+hcbJKNB8#X6gVe+HzE$ll#Z>c zttdfyZf3dytPgf5cpQ0lKkfR<o1-Nl_uho3W_z@MVIO|{?nMre9z|5HmQ}wm#j^su zcOgJATmF;Z5ua@71AYy}O!kk+jJEJ&cZ+${_f^4(&6&I#OM@4rF%0h<48!>%da3>0 zMn}enc=v^T;$9$o8S;$4;QymsJP-lm?An?fY^U9}+Dj(ey>e}qs@3f|KN|f**{vnU zbgZ#nBYCGS*ebWyC3mO<Z0=WW>`Hwf#5nnuU6B|HORik9zVzIs9SCglyGw`%VS><b z1Sw>_KUE9uAN3G}88yB1B0up`^qVg1TABlJnC92rnAr1*H>x!G0g~U)^Qrp^RIRW0 zTY9jyJ7leJ?v-c_i~Ovs;kn?|-d`uOgct*Uj1mg=#$~OStn=M9W!4&VyaRG2OD7iR z`o@aS5b$c~u?o~(FC;7<6?z*4LFhYb8?TajB#}oP3ZqN5#0sc8TW;JHeTe02sDr@o z3qCOG{<P{gAzWMfz4EGDWLIpDP~-}vKrD85BI>l_hS<2nA{V)VS&e!6qAZk`MzX3{ zhsTf{Ueae|e$6jdY<L5}N@6hGh6cu{Df5U|R->Cy`yzS$hMTTE2W>;Z1DdFF`F^9N z`?JBK-&JQ{=S7}q1r<dl%6tB~mYV{TmHfcYbg!A%Gq4%`mR<dR$Zvy!Yo8Khr=3Cc zbf9_q52qTiL^=~N%L_t~#u0Epd4p0ZnXKG5$H5x84X1mIK6N?ZzvFyACNeYT_HuvA zC4?aS<~ObO+i)d~-`@$g7k)kVlfN%~G#Nb@GUrvT{3QE=rlyIF9*8xSFddWf`Mqdz zO_exTL}Mqi#XFMy@Oxp-pKc97*1zI>r9Gpg4l&H4CkU|2F*3R3HWf2xn7NSbh!l(j z`Cc#GMFd~oSyCf0`=Q3d!iX!mO5Fie12f+@)RGg~mV(q0Gq|BOZ3SZ6<^m-@UhtxW zRA#nP-fArH^yS{q8B44XnIH5OdHQXtYxDwujLWFx$}iw3^cyIKaebqyYX2^ns8cP$ zb51}Mjw6lP4YXc{y9_)czj?juE*wfLQadZ+VrT{WGU5FuvA5)F_OvP1yC`T?*ZbD@ z^$F!``iZQ*Sw%BzFh19gUt+#T3Ajg$Z}D4y%Ar;1#*eWL(Yz~XIIeU?6MY+9IOLg6 zOpHD3%8S)6FGu!)AYb!wS!<>QY^{i%g6iW?W^za6=*nqG6a$d?#x9QY^H8r1MJv3a z^_|K-JHNbPM%sd^yfkPZ9#jm!yXLR*_=O};NhkYHK2t^F&--Xnvczn??(OQtb~G<K zm(<E}oInaLPQNRPYqnVtSzW&cDAGp^<J1n!7zc&!HT6QXlxuzwfMRDdrE?VVx+YPR znl#v427ErM9i)A?EBU{O5pe6|f&LtU=aSL$lp>S=st!o#&6klcp^a5Dz!}mYuxVG( zS5)`|S(wDwBeSA|b}54IN$1*I^gV|DWgZG$aQ9tajv);vjFGAV1cV`7$X;^@thowt z;vRJC5sR~hOF14U$PGA!|3ZFdnka0=V#VDRYHQW)RXKMQF(=pa=?()d3bOW&SFEqL zzWn~pWBZ-}C@3nd<??lpz<`yXbF8q~@9xHa{CkPa2~E`wT+s*pjuBwaGrffPGfVk} z8U(y)6T?3qU$Cb)I@W6FcVbu7ujn4L1XCp?E%$gKmf;R0Zb3We&!m&P#@2sunTQ`f zv*$IBI>>&;5t5oNEP6!fELYqYdCm?2Yvb?jS>CCYYOql8sVV+)m~pmpiMc#)_I|XP zvAF}Y1|3wduQq_yzkT@rgQvWoUwOPSmHlfU|I)_gu|GoIQ_`$>2~*LIPa3kiJ2>B< z4kLSvxq`;!@l~X7cn-J&A?4h2*HNy#L+e{+S;6AYrBxwMsOSy-rVIX!JM52OhNdkN z=?7RTSUjHjB_!}SNG-!XA*r}-DK4hGIfj?DBRa7xKsQNbhsYMX{+Z^JNbTF%%oNH! z-}}IDQuqy~%#s?HAn&0G?mrwyz#!78pmrZwsX268k;v4ch;pmZ<-1-z(?YOlh3_(- zPE<}EHMZC*epDmkX{*mGz`e}6_vsmf@9z|Kd^1|u7y>0zrRfLqP9>@>?0;cxz4k&W zNQ0@<^y28oms_c{e`e+_r&<r2d-k)><bM}gF5tG7t^X&t?I?0F_#e*DEz<_4!!Y?- z$mJ{?{>1CLqn?U)DsseZk%YrQeHHs_j(q>@uG+WOKytOU*qa9&S`PVj%~HZXkYG$$ zhXp+)+!LGaE6<-UFneC+y%#2B+u8G9`Ik)LwYP^3&N~@@OrC^4Z(1z;{F>e;#bxzu z0K4)rz;l4bS>dA$(G|YWX@L&{C(jGni%I~4-HORpKUj0s<h-+yr;<*Ic=RohUVA}v z3cR2^YcL#Kt^M>o$UiQGMm(C$$+>nTN)Z|4hS2H($%7;l4&8dVk>s;j!!|qrV1(1t zce|_a6D`0|d4+G5OR8+e%`M~u?DK(2{%J%eR{~-;Q+`*I%PlP1r&hQfuQNxv*gMCt z$_k7LLbY~VI^}h0=#eb>00qUmx7Hgyg^w4m-)D$}Rliusi<0`i{fS=Bbt|t$WOr46 zDcR3^eYt1D!jkE{*qL02(+14{!}C!U&DDFimhXx1TerPOr_cY{Kv6ZhMV->$Gq0I` z_R2oshQZMnrub-Ru*1xWAj&G_qxyVYuw<~DFJDHiVd^ZWRN+68?mAy(c9vxFY=GXe z(RzDbbNZlfRaU64z+6jE5JAG8Ce8oep3l+>p%WpfV_%TSEr?M%Y)EERNndU7+g{^U zLBnBG)NS(O?vrT@AM(QKWf}Z%W5zYyJC8J|;7mI!ld*ojT4ZA7>$A<edOo>PWeFEB zsN&IffqQDRGvB>!BPNA(z7BVKPUiduKw-IscxU|ic)W%)zDOMmh2eSWHZI%jxuAsN zR21H0_>O!|UD=G@a^FHx?ADS-I2O|fz3*p5bh8p(;~W5n7%jerbFMzUXGhly5!43U zeV@>Ncj%#2`fjy>ZyNo@f~tI1P5a&Utm@BRP$|^Zfb&5LTXH?RaP)(?zfEh?i)_D6 zMsC=t_<G~rrF@?hCYw!v^S?HAV#rq2WGi*bHyHJ-O|4Ue&6S)`3G*LcNRJHnqlI2k zl6^;{)&Be(hIi@LJ_chg-9K$izL;z-d+E0&+-@@^b9{aB+~OcW7!F_zCezFy(*^Hz z3iA%%yC@}F{zHRS%H1>)JV+X!=`qz2QC!|(Yl^Q}Xck-iA}6&zVpGv%X~ch`a>ti= z`%sbyoNxBj#T1a2i5raAcJI|Xvyeu0ij^~j2B+?>d(j#TH;QOdGuqmqhs(kGS<kXy z(tx<xplX4K+So4z`1{CUK@q*P<d@5%qUS|_>Zj+9Fs=3pv^rd7fzmDqKf&F#g<>s5 zyskrmg6etc?d0{rw%B?7j=9WH!%=Y3r&*}1^h}tD7P|LM4UeMoRIe+mcmes^W`ui1 zuI#(?^x<f)V`Dw)v*Plbu^0GuDa?V*km<kzk%WChYtE1_FlvAg-U59i<fE-z{hv@; z;5@Fa_UPj0S!m9=XtM7}(G1TZAS#9&_-PAR75cHl5qAo%$Qll~gISt<yb>QrB&3ow zI$UCydd?4m!2#-&k^tK*yuo1wyhcDfx!ovY<hhZ@qKyZCo`lU4H#7CN^%4PQdxIso zRu{K;uDDx3u^Qr&Jcj<X{%R!lUz_6l573Ky^&k8J@YHkmK!B^#U_W5gxOd=stm|Bw zm;2XxdVAwxET_Qo?vLJE-|$)mczlKLECh$I7#!ff6!+*@pm!#G)<2nUcgCo9tIB=r zw))j62d!Vl02k}E0wcs5xR_#2@3}!{N%s%5#olJ8(l!N_yGFO{>fS8%e>G%Wsd&S( z`A6)-hwAq%ztP(&xe$S%qaeiZWbr==M<}=l3rU45mL6LHM{v2kkm=L@r!e2t(Vo!m zu7_f63%jRcK%s)T!|uFQQnK78Nlj#NqoDpeo&unG97(KK@2Tgmo*!ebD#^Y3zS-wB zk#n8xGVvOBlH2-uBgRoclW-(ub-3&WbZO`1oe9^W-3e~cuXl&Yybj15<sP>^Rtfir zc7PA8BuPSH=XDCMg!$aZ?OXcUYWS;~-8u9DmquLPF)q8-6im{HW71dXcJ2fJpX_E7 z*CHRX%dRP{`_8Z+C?qEB+a4fwJhtr>B+#~R0mJ@CApsggj~J;j^6a+(j-$~#)Ry9p z6C1$TIQK2P|H=Hyz;tX}u?!4AyC>t#6^1fO^ipu$c6ea4%u@0An0-QLszx{hj~T(r z?w9IgFly5BIPm|XXL&5raJ*5-V&v7ar0%t*8NR`Yisqlr+=1dF0AIX{6<fRXzz1Jq zKlTk}%2+BTBViMZj{>fc_VjaA9>T-&=HpZfRd90(!Y|)37A_ku{oY&yH${nbV(m49 zB)HCz$4>aIz2#(=RWuwpZ#JURwb7H>B`hd-?Gi_<4!)qJ;9omFxECEN(RF@T<^JMQ zGTX$!cbVPsX?AoOc2-vS4e`CTDY0zS(bf_@TQu>pwmwK@OvYGuW6g{G=b_ctRAJsM z|7yh9tLa{2;)R>h)i|9$odbg^4zmtV>3Ys4Er{{UyV_h-SPMphIR|JyeGBZ!oL`qj zjmvztBxlqaH4$;qCC-;ti#DhM3z^~9v#q}UE*flQhc{Cp5K>k(pj#CWSN<~a5dvOy zd#cRzpXu1jqHlbCU%_Q6>1Ap)UBvE@EZ@Q{8aM@qjTmN={fujkk7zPn@nPy8d7rq^ zZfxpd*$-DVe^&61AY8Ue-p`v<H5_;tIVL`^{_f*eoaff*_1V4)#{ru1!S^0F=(euB z@L+@dO^zaIQ+uR)(fk}jXGr^JIS-%5UV0dI@|@&tgF933qx6l}WGZ;%l*q=_a=|ON zVssVc+SB#DAs_0>tn-{Uw~uf@r*R~D7TY_8yD&-r?Nzw!^=z}rm-u7_=<g?<;SKfx ztDxSO3BzO$eG2LmmMdFOF!CNeY&4m6$T84m#IVqf840?GKOR#pnLf|V@ckLtnDXBB zz4;T;rk}_7j8|@J^M%o5<r)e*fAfkoo?F=Hl3pZ_1P2(ysUBd`C;vMgt|?fIk9L+e zx&R5)9TrbL6W^7p>cG~MoKmi=FUpa=^Qi>V`^xRjwkRGSR{P7MPhUvbh%yn>o-fC( zR3DP7`DJP3->wumJ+|IgI^zG2-(=^mwHOGq;1Ee_gl$e;z^RH?|7ARrZbWl9^4K)= zSuFKGFvTWkbTHF*z;9xgTopePDAb^Dagp3Lb4mNV{mPrz%e#A>_5M{^`p5Ni@w|R* zzx(FnP{FwqMd8+Z^w9gkbH-<|U!IX@P?D1k(-WZn>5hA13HwA+gi*~3!f%H|m2`nk zBA`^H-x-gKejT5pErI*9dH03$8?LKUy^g9w;LvJaSTsxhkdzkDrQL=rOb(tIRRe4| z)5!Is+ceg*>ix92^)u<M00g!iLMjUW>#n3wQr~pZx#Fl{;Z`ukN1oF48gz5|9^yl? zwx@6E_d=Cap<yBh2r#~+pp;KmNFsdV!O+%PxRmIWp25`53xstcme5ibaf|N3Gr^@i z?PO}D+pzVNinF9`|9Ew*2EF`k3FntY`<>5b+J-QJcQmV|P~+cplZ8;Rant~LiWMFc z8BUJ=dJy_zI3w4{|05Alib795i!W||DDAS3tmu9N`Ev%0!>tVQk}OhXcVtD&?Z`8C ziz7}KWd%JBRtiYn4m)(d5R)f*j(?MpSu+;mHHPr5W{6^Z0L6XPI_LqUI|TB*4_|o; z(_x7TyGS1S!K3uuYP=~|Iu{CfN!t0))$253Q)Fv%Oo|XS2nB*ROve%o7-U8@l&Gf4 zu8{BFY^Cxk+}iM6Y6DUB2)$Z0xY=L_ZBnd5bt-;#6Tp;kfrO>t1`qvj@=otZqvVC9 zuPU3hh-MADL|9)2?g)IFFO#w!T0KguUaU|K0p8cT(YdIx1dG*|H3`e|#e)gbaGt}5 zpo#F!BUp|as97CbM`~I;M-aHw4%AUZ7E_h44@UafuUTj(PKY1k9*6Un_b<)%<rd0Q z@F|xJ=5#Vn8D!vOUBgr=oDjNoXHL8!ooMmfvIM;Pu+i+q^Bg7Z5tw@vflk339*Y#a zQN=KdsmBE*k;QwVOY2ykdE}wf6Hzk-z><79V9Yi~*H#XAu&A3aW-~54Ts-GXz-5-` zze>VsE%dXB&!iU}qkyj9G2cwk!MhUsgvOhM-H}kGjkD>*An}ei6H@k}CBa3FxwQi{ zV)Xv)4l#SWU??f6O7YeE5PpSd@^fvN>!jCuPQoIPgnSb`;Lch4twqX}^Y%_3*klAx z9af8HxST9kDOyBkZ#KT-TTz&{9)Hy~*wF*pcm$|)f-i|S@G;Et3&+S@#K?<g4ZTis zG7Wz&dUchN_+?F3jyaDs^5FJ(v`}z&jx-i3?<YX<W8(Y%92P+t*tXl%LxoX_wi^_3 z(g9e6c#hIWQe4>Q_Sc#0)V-0!1=@1rrA;Nd$~Dz#lYn>J9a1u!<=pkAw7Q1S`Y0$< zm=`?Vcfk;k88Sh0Bog|C)_zg^6`n>Lu&~@m5`bq{mJ3};udQGBJv{p8RLyAG^q}DC z1bg*qEBX$3>>-EsOjF?|D$15|h}wsYWZqpYTzSf=1B&wHnXBYM_=~`ir3!nnAm1qP z1G^(R*CkCm&qaIE$=qmleOPFt!L(lM3GNbGeD!zyg)LeEQH%$u`ztdH+E;}m7WX3< zLc2sMxrlKvNUpOQTYNVxehPj++h}~o5-6s4z`e0tpe-3ztNWN+`&ih(@*M4#<y9qG z=+R4%8xz;NWA*oY3QNh3@0zlZ$D!xK?outrL`D!?;_qmc_S!2+Z5)NsheE?7)$6AG zEBnSsHVBuM0!~hK|GU&~PNK2)+D|I6{43FHIH_<kUM%Xz*Y*D?>MJsS$kE_RIObpJ zwinV`Fi}p|PMwHTlMg$`JK$mMOBZ@_OFLECn&<sGUpO;?1!SUr5O4>27kk-F%@*JL zrvuqD@D9$&v;@c8gd@eMQC19YTm*3>r&J`ghgjkgxEODAKzhz=K~NXg17uQhiI)Xx za`itBRt54$`n;PjIMQ9B(&&D@;)APAUx=npaOO{Kpg^EmeRC%&HUvTp$2eTXT=|D# zYmlsj&bo6=W!ls?J6}<yekNS5W}WT<!1nN;!=n%P4)U*hDw;j&uocX~_4mWE2AF%t zZ=7VPy;E;msTQY>jrq-hk7y*9=o5C=y83gW=7S$GZOj|*rJN2V3VEKjU4um&%Q&+r zumv`RG-=UG7PK75MagsAz^(}wAlAgCxM|b53ntvGNIHpCA;F1}A~}_-`1};<=Y8L( z-{#Ta3u34Q2&8oq1^dwfb-TzK6owr}HL6pc8psxS*HvKcMsTptYXB@)%dwNIpOBV& z_gfRlU0ia>4K+pqlPYzNh<ASLk98`S3v}xAS@P!Bs87YwsASk_h$ngv+A5lXhKbw< zHQf@U9KCvYiG2VyHO*K+hVpmNUrjFlT-<Xn|6ZfWl1;`ecx{b9{E}}^;1@kNnjFBj zCn_YhjgOG5!1-YwU1=_zQ!9S$OP|@lZ}711xRKmPkxz!}dNju-6#%)I#pBzvagz_I z^OZ3iHlFo2T6LBdhn1!xOW#5ob`r3zm;$+k>qs9kHNv&Gdif4ukoPz){z-#G)4-A0 zz5YvSi6a|KBj4FbBe%^>Af}+Ze_bIxay&r7Ec@d2omn_I1MezS=Gms<cn@Wc3FRr< z-swt_LzSk;qbgGrKw>u}P|esoOQ2?v>8)$c)&gUFGA@0z=L!9&!Q|wh<#h{QeaLiI zHWNP9$PNve@vEJoh<i-eSz7oTb9?FbV7?8I=g`m5c$+}^%SgcO76W-FJ&(#$FyhSQ zzW@qUyx@-Oj@GqX^iC=)Jul@klJ(h)MSI@&uf+4^^nWG>|5EA`IApyP0z@Zl0$N7` zwgREC@bz<eJu=3{wpUw;)8)(dN&^@!)9K)1iKyf1ak=u1<8p6T&nEGe>-b(T$JR5Y zF5SVwcVUx%4?oCbHQLbvN9<^!O?I^Ke!HGep8R=F{mNzimpYsJrBgY~JL;$m#8e0? z7O8cP@>P6@FGwPFGh0dTrhu?mzp{x}TNVGHV=iWb3v8GdSd9jq*H|#0+0x~m<=y7p z=e<$8$lQB0jk)J&8g{~2Wbo6|o-V}T6G8NhBc9cx-r2K@GmM}TGk%B<tctX+n*8-v z8Vz_2OtQ8%AYe0vVqn~>Y8i@g!MjRI9fQJ1^pBne$X(U<FVQ-3!cNm2E80>;7Sh4@ zu$nRH7J4yh7TFy|K%Wk^yPGaXJKQbaxVrBrv42?Y;+FjkN#J<m^{M%?X@T=r^depC ziuY=7YH_$g7Z*eSuSc<D%55=hsb(#E<ir~eAHh#6V7{%q)vZ1R%!skax{{Imh8+QS z^7rJU`N^GYCR2cGJ<|z2SPH44Qv7KwFXRsv-V~p#uhj+<{TGg02gf&tzU0^Egu^zR zsL|zQ6&cQ!4({L49+N4r&ehb3!Q3<H5b)mD=E)+mW+qTs)J;V9JrHz05C%*41j7Ot z47985O|tDwc4wJ~2*<7gt2gHI<T}ewMuOAxxW#0vfI+(XfZ*c2ZSB+hz_LpeJl1ur z3oVNZmCT|eF_l^f^tiC_GcrNZtPQy*Mc7<wxyIPpo-0bhrn{<0FX?xvjnVb*f8Mk+ z*>a-R53Ghv_vLmPYA4^KjahkryL`tNOvWgjLBrq#*JL3@DG2&BSTRs+JPxr|iD9b; z_Z<3_JOZH8liH#i`JF-kXLQg9$fBLAJ3ug?j{lea(C@y~T@rKnA~HtC77Z5-gd+nm zsynnQhek?aT&I{Qv);*_bIW3Dx@y#V`Y*4->0#7{{Mz4P?9_G@5zV@a!L%WSpLHM! zu4v?rMv$uLP9sX36ZlwO_H57njm$${s3kiBR&gq3Ke61^<s=I?64?8HqfmSYS*KF2 zfhfhQKpUmt7>rpP0{w%0MA232^MlQ;?@VKRvbYx~fP%eJ;wODaIS#=)2ao>iDf?1E z2Ixscv?nqU45Q%*8GG9hqK#u1VN5e6_TF_+le#15SkdABp2Q7>XVgeDR(woUIbNlE z&e((d1wt&3Af6x2K}2uQ%qtKkSzi{QC!i%e9fGV>Y$wu=g%REH40Hs&=NLFn<U0Q7 zr+Tf<?p3zsR=2;apUTE?3>d38{u~mW(ISrAESSUUHHjm5K8{2~g3Dir6s#^KDkY3E zN);`oP%-uZw$E4uDSQG%$gKnom;dSklAwj=(IxoN-<g_<-<rVKeQlQT4J%r-*^t*W z&ONa;dCoS>g$NctB^0v*-TW3tutn>r90SJ~m?c0_gk&^Kn6TZ}<yLZn4<IQDD1)*a z5}8pXj$HFkP7>x2<Z*gKmLA;iWEF?bK?V@>={XCdN+Hy1c!I3#F+&8_ECGVD!>FR9 z8p*1niazs8J>mj>n%w{4W$;`axp9qJhltvSsV`MVwhg(huv8XC!3+h7)k;PqMBG?t zxU%p_0FK+0z)+U?)<lcS!>Hu_4iZ|8gGGsLY=4>Sit)oIi)$r75O!mje-8rRVosuB z;tX69AmVWgmGsD)$85!sT+gSsgpg|m7!~QMWwHO?=VS&3k46dyf)Q^1Xc)>Z8SS|f z81W8ssdqn#{Jn;>NV7`1R6w-mxWv>uc%<0c-%bm4$e0~c?$?D&DKQ3kR7|WE0~oK} z<~Ss*oE~{CjYT}tyb@*JilN(hviG!l<!$3r9qfqQ)+fD0g48xT0eDpff2~lj&FBD< zS3iWx`|Y^kQPgwv?_Z|_At+!_0b>}+lL=6fv&$fK)q)ezGLLE4U*=Jxzdq{q7rETR z-DHB^7)B;JS>IpFeR6X%sIKV90&TlHAO=kZn1t*qd2EQ6{omE?Xl5HSPy?8(wZhH^ d24y)bKyuTI8g>wLDInl?>bUi>q9d-<{|BLqzZ3uf literal 0 HcmV?d00001 diff --git a/res/drawable/ic_fingerprint.xml b/res/drawable/ic_fingerprint.xml new file mode 100644 index 0000000000..f650f74452 --- /dev/null +++ b/res/drawable/ic_fingerprint.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M17.81,4.47c-0.08,0 -0.16,-0.02 -0.23,-0.06C15.66,3.42 14,3 12.01,3c-1.98,0 -3.86,0.47 -5.57,1.41 -0.24,0.13 -0.54,0.04 -0.68,-0.2 -0.13,-0.24 -0.04,-0.55 0.2,-0.68C7.82,2.52 9.86,2 12.01,2c2.13,0 3.99,0.47 6.03,1.52 0.25,0.13 0.34,0.43 0.21,0.67 -0.09,0.18 -0.26,0.28 -0.44,0.28zM3.5,9.72c-0.1,0 -0.2,-0.03 -0.29,-0.09 -0.23,-0.16 -0.28,-0.47 -0.12,-0.7 0.99,-1.4 2.25,-2.5 3.75,-3.27C9.98,4.04 14,4.03 17.15,5.65c1.5,0.77 2.76,1.86 3.75,3.25 0.16,0.22 0.11,0.54 -0.12,0.7 -0.23,0.16 -0.54,0.11 -0.7,-0.12 -0.9,-1.26 -2.04,-2.25 -3.39,-2.94 -2.87,-1.47 -6.54,-1.47 -9.4,0.01 -1.36,0.7 -2.5,1.7 -3.4,2.96 -0.08,0.14 -0.23,0.21 -0.39,0.21zM9.75,21.79c-0.13,0 -0.26,-0.05 -0.35,-0.15 -0.87,-0.87 -1.34,-1.43 -2.01,-2.64 -0.69,-1.23 -1.05,-2.73 -1.05,-4.34 0,-2.97 2.54,-5.39 5.66,-5.39s5.66,2.42 5.66,5.39c0,0.28 -0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5c0,-2.42 -2.09,-4.39 -4.66,-4.39 -2.57,0 -4.66,1.97 -4.66,4.39 0,1.44 0.32,2.77 0.93,3.85 0.64,1.15 1.08,1.64 1.85,2.42 0.19,0.2 0.19,0.51 0,0.71 -0.11,0.1 -0.24,0.15 -0.37,0.15zM16.92,19.94c-1.19,0 -2.24,-0.3 -3.1,-0.89 -1.49,-1.01 -2.38,-2.65 -2.38,-4.39 0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5c0,1.41 0.72,2.74 1.94,3.56 0.71,0.48 1.54,0.71 2.54,0.71 0.24,0 0.64,-0.03 1.04,-0.1 0.27,-0.05 0.53,0.13 0.58,0.41 0.05,0.27 -0.13,0.53 -0.41,0.58 -0.57,0.11 -1.07,0.12 -1.21,0.12zM14.91,22c-0.04,0 -0.09,-0.01 -0.13,-0.02 -1.59,-0.44 -2.63,-1.03 -3.72,-2.1 -1.4,-1.39 -2.17,-3.24 -2.17,-5.22 0,-1.62 1.38,-2.94 3.08,-2.94 1.7,0 3.08,1.32 3.08,2.94 0,1.07 0.93,1.94 2.08,1.94s2.08,-0.87 2.08,-1.94c0,-3.77 -3.25,-6.83 -7.25,-6.83 -2.84,0 -5.44,1.58 -6.61,4.03 -0.39,0.81 -0.59,1.76 -0.59,2.8 0,0.78 0.07,2.01 0.67,3.61 0.1,0.26 -0.03,0.55 -0.29,0.64 -0.26,0.1 -0.55,-0.04 -0.64,-0.29 -0.49,-1.31 -0.73,-2.61 -0.73,-3.96 0,-1.2 0.23,-2.29 0.68,-3.24 1.33,-2.79 4.28,-4.6 7.51,-4.6 4.55,0 8.25,3.51 8.25,7.83 0,1.62 -1.38,2.94 -3.08,2.94s-3.08,-1.32 -3.08,-2.94c0,-1.07 -0.93,-1.94 -2.08,-1.94s-2.08,0.87 -2.08,1.94c0,1.71 0.66,3.31 1.87,4.51 0.95,0.94 1.86,1.46 3.27,1.85 0.27,0.07 0.42,0.35 0.35,0.61 -0.05,0.23 -0.26,0.38 -0.47,0.38z"/> +</vector> diff --git a/res/layout/fingerprintlock.xml b/res/layout/fingerprintlock.xml new file mode 100644 index 0000000000..c1d54555ab --- /dev/null +++ b/res/layout/fingerprintlock.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ownCloud Android client application + + Copyright (C) 2017 Flole Systems + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2, + as published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:gravity="center_horizontal" + android:orientation="vertical" + xmlns:app="http://schemas.android.com/apk/res-auto" + + > + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:title="Nextcloud" + app:titleTextColor="@color/white" + app:layout_scrollFlags="scroll|enterAlways|snap" + app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:gravity="center_horizontal" + android:orientation="vertical" + android:padding="@dimen/standard_padding" > + + + <TextView + android:id="@+id/scanfingerprinttext" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/fingerprint_scan_finger" + android:textColor="@android:color/black" + android:gravity="center_horizontal" + android:padding="8dp" + android:textSize="32dp" + /> + <ImageView + android:id="@+id/fingerprinticon" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="16dp" + android:src="@drawable/ic_fingerprint" + android:scaleType="fitCenter" + android:tint="@color/actionbar_start_color"/> + + +</LinearLayout> +</LinearLayout> diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java new file mode 100644 index 0000000000..eccf180f43 --- /dev/null +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -0,0 +1,383 @@ +/** + * ownCloud Android client application + * + * @author Florian Lentz + * Copyright (C) 2017 Florian Lentz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +package com.owncloud.android.ui.activity; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.hardware.fingerprint.FingerprintManager; +import android.os.Build; +import android.os.Bundle; +import android.os.CancellationSignal; +import android.security.keystore.KeyGenParameterSpec; +import android.security.keystore.KeyPermanentlyInvalidatedException; +import android.security.keystore.KeyProperties; +import android.support.v4.app.ActivityCompat; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v7.app.AppCompatActivity; +import android.view.KeyEvent; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.owncloud.android.MainApp; +import com.owncloud.android.R; + +import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; + +public class FingerprintActivity extends AppCompatActivity { + + private static final String TAG = FingerprintActivity.class.getSimpleName(); + + public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT"; + + public final static String PREFERENCE_USE_FINGERPRINT = "use_fingerprint"; + + private KeyStore keyStore; + // Variable used for storing the key in the Android Keystore container + private static final String KEY_NAME = "Nextcloud"; + private Cipher cipher; + + FingerprintManager fingerprintManager; + + private CancellationSignal mCancellationSignal; + + private boolean mSelfCancelled; + + private TextView fingerprinttext; + + FingerprintHandler helper; + + FingerprintManager.CryptoObject cryptoObject; + + CancellationSignal cancellationSignal; + + /** + * Initializes the activity. + * + * @param savedInstanceState Previously saved state - irrelevant in this case + */ + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.fingerprintlock); + } + + private void startFingerprint() { + fingerprinttext = (TextView) findViewById(R.id.scanfingerprinttext); + + fingerprintManager = (FingerprintManager) MainApp.getAppContext().getSystemService(Context.FINGERPRINT_SERVICE); + + mCancellationSignal = new CancellationSignal(); + mSelfCancelled = false; + // The line below prevents the false positive inspection from Android Studio + // noinspection ResourceType + + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + return; + } + KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); + + if (!keyguardManager.isKeyguardSecure()) { + return; + }else{ + generateKey(); + + + if (cipherInit()) { + cryptoObject = new FingerprintManager.CryptoObject(cipher); + FingerprintHandler.Callback callback = new FingerprintHandler.Callback() { + @Override + public void onAuthenticated() { + fingerprintresult(true); + } + + @Override + public void onFailed(String error) { + Toast.makeText( + MainApp.getAppContext(), + error, + Toast.LENGTH_LONG) + .show(); + ImageView imageView = (ImageView)findViewById(R.id.fingerprinticon); + int[][] states = new int[][] { new int[] { android.R.attr.state_activated }, new int[] { -android.R.attr.state_activated } }; + int[] colors = new int[] { Color.parseColor("#FF0000"), Color.RED }; + ColorStateList csl = new ColorStateList(states, colors); + Drawable drawable = DrawableCompat.wrap(imageView.getDrawable()); + DrawableCompat.setTintList(drawable, csl); + imageView.setImageDrawable(drawable); + } + }; + + helper = new FingerprintHandler(this, fingerprinttext, callback); + cancellationSignal = new CancellationSignal(); + if (ActivityCompat.checkSelfPermission(MainApp.getAppContext(), Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + return; + } + fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, helper, null); + } + } + } + + @Override + public void onResume(){ + super.onResume(); + startFingerprint(); + ImageView imageView = (ImageView)findViewById(R.id.fingerprinticon); + imageView.setImageDrawable(getDrawable(R.drawable.ic_fingerprint)); + } + + + @Override + public void onStop(){ + super.onStop(); + cancellationSignal.cancel(); + } + + /** + * Overrides click on the BACK arrow to prevent fingerprint from being worked around. + * + * @param keyCode Key code of the key that triggered the down event. + * @param event Event triggered. + * @return 'True' when the key event was processed by this method. + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event){ + if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){ + return true; + } + return super.onKeyDown(keyCode, event); + } + + @TargetApi(Build.VERSION_CODES.M) + protected void generateKey() { + try { + keyStore = KeyStore.getInstance("AndroidKeyStore"); + } catch (Exception e) { + e.printStackTrace(); + } + + + KeyGenerator keyGenerator; + try { + keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + } catch (NoSuchAlgorithmException | NoSuchProviderException e) { + throw new RuntimeException("Failed to get KeyGenerator instance", e); + } + + + try { + keyStore.load(null); + keyGenerator.init(new + KeyGenParameterSpec.Builder(KEY_NAME, + KeyProperties.PURPOSE_ENCRYPT | + KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setUserAuthenticationRequired(true) + .setEncryptionPaddings( + KeyProperties.ENCRYPTION_PADDING_PKCS7) + .build()); + keyGenerator.generateKey(); + } catch (NoSuchAlgorithmException | + InvalidAlgorithmParameterException + | CertificateException | IOException e) { + throw new RuntimeException(e); + } + } + + + @TargetApi(Build.VERSION_CODES.M) + public boolean cipherInit() { + try { + cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); + } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { + throw new RuntimeException("Failed to get Cipher", e); + } + + + try { + keyStore.load(null); + SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, + null); + cipher.init(Cipher.ENCRYPT_MODE, key); + return true; + } catch (KeyPermanentlyInvalidatedException e) { + return false; + } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) { + throw new RuntimeException("Failed to init Cipher", e); + } + } + + + private void fingerprintresult(boolean fingerok) { + + if (fingerok) { + Intent resultIntent = new Intent(); + resultIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + resultIntent.putExtra(KEY_CHECK_RESULT, true); + setResult(RESULT_OK, resultIntent); + finish(); + } else { + showErrorAndRestart(R.string.fingerprint_unknown); + } + + + } + + + private void showErrorAndRestart(int errorMessage) { + CharSequence errorSeq = getString(errorMessage); + Toast.makeText(this, errorSeq, Toast.LENGTH_LONG).show(); + } + + + + final static public boolean isFingerprintCapable(Context context) { + FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); + + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + return false; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (!fingerprintManager.isHardwareDetected()) { + // Device doesn't support fingerprint authentication + return false; + } else if (!fingerprintManager.hasEnrolledFingerprints()) { + // User hasn't enrolled any fingerprints to authenticate with + return true; + } else { + // Everything is ready for fingerprint authentication + return true; + } + } + return false; + } + + final static public boolean isFingerprintReady(Context context) { + FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); + + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + return false; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (!fingerprintManager.isHardwareDetected()) { + // Device doesn't support fingerprint authentication + return false; + } else if (!fingerprintManager.hasEnrolledFingerprints()) { + // User hasn't enrolled any fingerprints to authenticate with + return false; + } else { + // Everything is ready for fingerprint authentication + return true; + } + } + return false; + } + + + +} +@SuppressLint("NewApi") +class FingerprintHandler extends FingerprintManager.AuthenticationCallback { + + + private Context context; + private TextView text; + private Callback callback; + + + // Constructor + public FingerprintHandler(Context mContext, TextView mtext, Callback mcallback) { + context = mContext; + text = mtext; + callback = mcallback; + } + + + + @Override + public void onAuthenticationError(int errMsgId, CharSequence errString) { + // this.update(String.valueOf(errString), false); + } + + + @Override + public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { + this.update(String.valueOf(helpString), false); + } + + + @Override + public void onAuthenticationFailed() { + this.update(MainApp.getAppContext().getString(R.string.fingerprint_unknown), false); + } + + + @Override + public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { + this.update("Fingerprint Authentication succeeded.", true); + } + + + public void update(final String e, Boolean success) { + if(success) { + text.postDelayed(new Runnable() { + @Override + public void run() { + callback.onAuthenticated(); + } + }, 0); + } else { + text.postDelayed(new Runnable() { + @Override + public void run() { + callback.onFailed(e); + } + }, 0); + } + } + + public interface Callback { + + void onAuthenticated(); + + void onFailed(String error); + + } +} \ No newline at end of file diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index dec71b5fea..17a3ed302e 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -44,6 +44,7 @@ <!-- WRITE_EXTERNAL_STORAGE may be enabled or disabled by the user after installation in API >= 23; the app needs to handle this --> + <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Next permissions are always approved in installation time, @@ -204,6 +205,7 @@ <service android:name=".media.MediaService" /> <activity android:name=".ui.activity.PassCodeActivity" /> + <activity android:name=".ui.activity.FingerprintActivity"/> <activity android:name=".ui.activity.ConflictsResolveActivity"/> <activity android:name=".ui.activity.GenericExplanationActivity"/> <activity android:name=".ui.activity.ErrorsWhileCopyingHandlerActivity"/> diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index 22bb937e60..4ac012dc89 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -93,6 +93,7 @@ public class Preferences extends PreferenceActivity private Uri mUri; private CheckBoxPreference pCode; + private CheckBoxPreference fPrint; private CheckBoxPreference mShowHiddenFiles; private Preference pAboutApp; private AppCompatDelegate mDelegate; @@ -156,6 +157,9 @@ public class Preferences extends PreferenceActivity // Register context menu for list of preferences. registerForContextMenu(getListView()); + PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("details"); + + pCode = (CheckBoxPreference) findPreference(PassCodeActivity.PREFERENCE_SET_PASSCODE); if (pCode != null) { pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @@ -178,6 +182,49 @@ public class Preferences extends PreferenceActivity }); } + boolean fPrintEnabled = getResources().getBoolean(R.bool.fingerprint_enabled); + fPrint = (CheckBoxPreference) findPreference(FingerprintActivity.PREFERENCE_USE_FINGERPRINT); + if (fPrint != null) { + if(FingerprintActivity.isFingerprintCapable(MainApp.getAppContext()) && fPrintEnabled) { + fPrint.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + Boolean incoming = (Boolean) newValue; + + if(FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) { + SharedPreferences appPrefs = + PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor editor = appPrefs.edit(); + editor.putBoolean("use_fingerprint", incoming); + editor.commit(); + return true; + } else { + if(incoming) { + Toast.makeText( + MainApp.getAppContext(), + R.string.prefs_fingerprint_notsetup, + Toast.LENGTH_LONG) + .show(); + fPrint.setChecked(false); + } + SharedPreferences appPrefs = + PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor editor = appPrefs.edit(); + editor.putBoolean("use_fingerprint", false); + editor.commit(); + return false; + } + } + }); + if(!FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) { + fPrint.setChecked(false); + } + + } else { + preferenceCategory.removePreference(fPrint); + } + } + mShowHiddenFiles = (CheckBoxPreference) findPreference("show_hidden_files"); mShowHiddenFiles.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override @@ -191,7 +238,7 @@ public class Preferences extends PreferenceActivity } }); - PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("more"); + preferenceCategory = (PreferenceCategory) findPreference("more"); boolean calendarContactsEnabled = getResources().getBoolean(R.bool.calendar_contacts_enabled); Preference pCalendarContacts = findPreference("calendar_contacts"); diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index ac5b777205..05a1d923cc 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -42,6 +42,8 @@ <string name="prefs_accounts">Konten</string> <string name="prefs_manage_accounts">Konten verwalten</string> <string name="prefs_passcode">PIN gesperrt</string> + <string name="prefs_fingerprint">Fingerabdruck gesperrt</string> + <string name="prefs_fingerprint_notsetup">Es sind keine Fingerabdrücke eingerichtet.</string> <string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string> <string name="prefs_instant_upload">Sofortiger Bilderupload</string> <string name="prefs_instant_upload_summary">Fotos von der Kamera sofort hochladen</string> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index b22b8ef25a..a7449afe03 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Accounts</string> <string name="prefs_manage_accounts">Manage accounts</string> <string name="prefs_passcode">Passcode lock</string> + <string name="prefs_fingerprint">Fingerprint lock</string> + <string name="prefs_fingerprint_notsetup">No fingerprints have been set up.</string> <string name="prefs_show_hidden_files">Show hidden files</string> <string name="prefs_instant_upload">Instant picture uploads</string> <string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string> @@ -611,6 +613,8 @@ <string name="welcome_feature_3_text">Keep your photos safe</string> <string name="whats_new_skip">Skip</string> + <string name="fingerprint_scan_finger">Please scan your finger</string> + <string name="fingerprint_unknown">Finger not recognized</string> <!-- User information --> <string name="user_info_full_name">Full name</string> diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index 66065bbbc5..e3a6e1243b 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -78,8 +78,9 @@ </PreferenceCategory> - <PreferenceCategory android:title="@string/prefs_category_details"> + <PreferenceCategory android:title="@string/prefs_category_details" android:key="details"> <android.preference.CheckBoxPreference android:title="@string/prefs_passcode" android:key="set_pincode" /> + <android.preference.CheckBoxPreference android:title="@string/prefs_fingerprint" android:key="use_fingerprint" /> <android.preference.CheckBoxPreference android:title="@string/prefs_show_hidden_files" android:key="show_hidden_files" /> </PreferenceCategory> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 4d93e4d335..f004d2393a 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -78,6 +78,7 @@ <bool name="bottom_toolbar_enabled">true</bool> <!-- Help, imprint and feedback --> + <bool name="fingerprint_enabled">true</bool> <bool name="calendar_contacts_enabled">true</bool> <bool name="help_enabled">true</bool> <bool name="imprint_enabled">false</bool> From 3b670ce17503c49c9628c2412f8929d13aea9734 Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Sat, 4 Feb 2017 23:23:10 +0100 Subject: [PATCH 740/881] Fixed some issues --- .../ui/activity/FingerprintActivity.java | 34 +++---------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java index eccf180f43..dae795ab8e 100644 --- a/src/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -64,8 +64,6 @@ import javax.crypto.SecretKey; public class FingerprintActivity extends AppCompatActivity { - private static final String TAG = FingerprintActivity.class.getSimpleName(); - public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT"; public final static String PREFERENCE_USE_FINGERPRINT = "use_fingerprint"; @@ -77,12 +75,6 @@ public class FingerprintActivity extends AppCompatActivity { FingerprintManager fingerprintManager; - private CancellationSignal mCancellationSignal; - - private boolean mSelfCancelled; - - private TextView fingerprinttext; - FingerprintHandler helper; FingerprintManager.CryptoObject cryptoObject; @@ -100,15 +92,10 @@ public class FingerprintActivity extends AppCompatActivity { } private void startFingerprint() { - fingerprinttext = (TextView) findViewById(R.id.scanfingerprinttext); + TextView fingerprinttext = (TextView) findViewById(R.id.scanfingerprinttext); fingerprintManager = (FingerprintManager) MainApp.getAppContext().getSystemService(Context.FINGERPRINT_SERVICE); - mCancellationSignal = new CancellationSignal(); - mSelfCancelled = false; - // The line below prevents the false positive inspection from Android Studio - // noinspection ResourceType - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { return; } @@ -145,7 +132,7 @@ public class FingerprintActivity extends AppCompatActivity { } }; - helper = new FingerprintHandler(this, fingerprinttext, callback); + helper = new FingerprintHandler(fingerprinttext, callback); cancellationSignal = new CancellationSignal(); if (ActivityCompat.checkSelfPermission(MainApp.getAppContext(), Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { return; @@ -296,16 +283,7 @@ public class FingerprintActivity extends AppCompatActivity { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (!fingerprintManager.isHardwareDetected()) { - // Device doesn't support fingerprint authentication - return false; - } else if (!fingerprintManager.hasEnrolledFingerprints()) { - // User hasn't enrolled any fingerprints to authenticate with - return false; - } else { - // Everything is ready for fingerprint authentication - return true; - } + return fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints(); } return false; } @@ -317,14 +295,12 @@ public class FingerprintActivity extends AppCompatActivity { class FingerprintHandler extends FingerprintManager.AuthenticationCallback { - private Context context; private TextView text; private Callback callback; // Constructor - public FingerprintHandler(Context mContext, TextView mtext, Callback mcallback) { - context = mContext; + FingerprintHandler(TextView mtext, Callback mcallback) { text = mtext; callback = mcallback; } @@ -373,7 +349,7 @@ class FingerprintHandler extends FingerprintManager.AuthenticationCallback { } } - public interface Callback { + interface Callback { void onAuthenticated(); From b6d6208bb8fb1fdbf887e2526840a3be20b17473 Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Sat, 4 Feb 2017 23:33:50 +0100 Subject: [PATCH 741/881] Fixed some issues --- .../ui/activity/FingerprintActivity.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java index dae795ab8e..e05416eb24 100644 --- a/src/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -185,7 +185,7 @@ public class FingerprintActivity extends AppCompatActivity { try { keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); } catch (NoSuchAlgorithmException | NoSuchProviderException e) { - throw new RuntimeException("Failed to get KeyGenerator instance", e); + return; } @@ -204,7 +204,7 @@ public class FingerprintActivity extends AppCompatActivity { } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException | CertificateException | IOException e) { - throw new RuntimeException(e); + return; } } @@ -214,7 +214,7 @@ public class FingerprintActivity extends AppCompatActivity { try { cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { - throw new RuntimeException("Failed to get Cipher", e); + return false; } @@ -227,7 +227,7 @@ public class FingerprintActivity extends AppCompatActivity { } catch (KeyPermanentlyInvalidatedException e) { return false; } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) { - throw new RuntimeException("Failed to init Cipher", e); + return false; } } @@ -262,16 +262,7 @@ public class FingerprintActivity extends AppCompatActivity { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (!fingerprintManager.isHardwareDetected()) { - // Device doesn't support fingerprint authentication - return false; - } else if (!fingerprintManager.hasEnrolledFingerprints()) { - // User hasn't enrolled any fingerprints to authenticate with - return true; - } else { - // Everything is ready for fingerprint authentication - return true; - } + return !(!fingerprintManager.isHardwareDetected() || !fingerprintManager.hasEnrolledFingerprints()); } return false; } From 8365ef8073d39a3cb350698541840e6746007803 Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Sat, 4 Feb 2017 23:35:06 +0100 Subject: [PATCH 742/881] Fixed some issues --- .../owncloud/android/ui/activity/FingerprintActivity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java index e05416eb24..789aabf721 100644 --- a/src/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -73,13 +73,13 @@ public class FingerprintActivity extends AppCompatActivity { private static final String KEY_NAME = "Nextcloud"; private Cipher cipher; - FingerprintManager fingerprintManager; + private FingerprintManager fingerprintManager; - FingerprintHandler helper; + private FingerprintHandler helper; - FingerprintManager.CryptoObject cryptoObject; + private FingerprintManager.CryptoObject cryptoObject; - CancellationSignal cancellationSignal; + private CancellationSignal cancellationSignal; /** * Initializes the activity. From ace94f187691e33fcc681e44368dd02060308a76 Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Sat, 4 Feb 2017 23:43:33 +0100 Subject: [PATCH 743/881] Made fingerprintmanager private --- src/com/owncloud/android/ui/activity/FingerprintActivity.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java index 789aabf721..66e74b6c98 100644 --- a/src/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -73,8 +73,6 @@ public class FingerprintActivity extends AppCompatActivity { private static final String KEY_NAME = "Nextcloud"; private Cipher cipher; - private FingerprintManager fingerprintManager; - private FingerprintHandler helper; private FingerprintManager.CryptoObject cryptoObject; @@ -94,7 +92,7 @@ public class FingerprintActivity extends AppCompatActivity { private void startFingerprint() { TextView fingerprinttext = (TextView) findViewById(R.id.scanfingerprinttext); - fingerprintManager = (FingerprintManager) MainApp.getAppContext().getSystemService(Context.FINGERPRINT_SERVICE); + FingerprintManager fingerprintManager = (FingerprintManager) MainApp.getAppContext().getSystemService(Context.FINGERPRINT_SERVICE); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { return; From 043ff2ad8f07481797eba9adc4e412d1a1a63376 Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Sun, 5 Feb 2017 14:40:24 +0100 Subject: [PATCH 744/881] Fixing issues mentioned in review. --- res/layout/fingerprintlock.xml | 17 +++++++++-------- .../ui/activity/FingerprintActivity.java | 16 ++++++++-------- src/main/AndroidManifest.xml | 2 +- src/main/res/values/strings.xml | 1 + 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/res/layout/fingerprintlock.xml b/res/layout/fingerprintlock.xml index c1d54555ab..360d8fec83 100644 --- a/res/layout/fingerprintlock.xml +++ b/res/layout/fingerprintlock.xml @@ -1,20 +1,21 @@ <?xml version="1.0" encoding="utf-8"?> <!-- - ownCloud Android client application + Nextcloud Android client application - Copyright (C) 2017 Flole Systems + Copyright (C) 2017 Florian Lentz - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2, - as published by the Free Software Foundation. + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + GNU AFFERO GENERAL PUBLIC LICENSE for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java index 66e74b6c98..2571732460 100644 --- a/src/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -1,21 +1,21 @@ /** - * ownCloud Android client application + * Nextcloud Android client application * * @author Florian Lentz * Copyright (C) 2017 Florian Lentz * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui.activity; diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 17a3ed302e..892ffaaacf 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -44,7 +44,6 @@ <!-- WRITE_EXTERNAL_STORAGE may be enabled or disabled by the user after installation in API >= 23; the app needs to handle this --> - <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Next permissions are always approved in installation time, @@ -57,6 +56,7 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> + <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <application diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a7449afe03..1b9f512669 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -613,6 +613,7 @@ <string name="welcome_feature_3_text">Keep your photos safe</string> <string name="whats_new_skip">Skip</string> + <string name="fingerprint_scan_finger">Please scan your finger</string> <string name="fingerprint_unknown">Finger not recognized</string> From 10f787b186bc978ef0947c74d72b8af614112f7f Mon Sep 17 00:00:00 2001 From: Flole998 <Flole998@users.noreply.github.com> Date: Sun, 5 Feb 2017 16:40:11 +0100 Subject: [PATCH 745/881] Update strings.xml --- src/main/res/values-de-rDE/strings.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index 05a1d923cc..ac5b777205 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -42,8 +42,6 @@ <string name="prefs_accounts">Konten</string> <string name="prefs_manage_accounts">Konten verwalten</string> <string name="prefs_passcode">PIN gesperrt</string> - <string name="prefs_fingerprint">Fingerabdruck gesperrt</string> - <string name="prefs_fingerprint_notsetup">Es sind keine Fingerabdrücke eingerichtet.</string> <string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string> <string name="prefs_instant_upload">Sofortiger Bilderupload</string> <string name="prefs_instant_upload_summary">Fotos von der Kamera sofort hochladen</string> From b291d6b3c1be01861ce5f85c038cb64638284131 Mon Sep 17 00:00:00 2001 From: Flole998 <Flole998@users.noreply.github.com> Date: Sun, 5 Feb 2017 16:40:31 +0100 Subject: [PATCH 746/881] Update strings.xml --- src/main/res/values-de-rDE/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index ac5b777205..03541684fc 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -596,7 +596,6 @@ <string name="welcome_feature_3_text">Schützen Sie Ihre Fotos</string> <string name="whats_new_skip">Überspringen</string> - <!-- User information --> <string name="user_info_full_name">Vollständiger Name</string> <string name="user_info_email">E-Mail</string> From cbb29e23eba1c53ff453293f39a5f8770731e8fb Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Mon, 6 Feb 2017 00:09:20 +0100 Subject: [PATCH 747/881] Removed useless check and double inverse --- src/com/owncloud/android/ui/activity/FingerprintActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java index 2571732460..5328191f9f 100644 --- a/src/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -260,7 +260,7 @@ public class FingerprintActivity extends AppCompatActivity { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return !(!fingerprintManager.isHardwareDetected() || !fingerprintManager.hasEnrolledFingerprints()); + return fingerprintManager.isHardwareDetected(); } return false; } From 674b20364ac470a2d02b37f24e9504a9fa9f6c6c Mon Sep 17 00:00:00 2001 From: Flole <flole@flole.de> Date: Wed, 15 Feb 2017 15:34:13 +0100 Subject: [PATCH 748/881] Fixed crashes when OEM removes Fingerprintmanager from system --- .../ui/activity/FingerprintActivity.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/com/owncloud/android/ui/activity/FingerprintActivity.java index 5328191f9f..6d7df6a2bc 100644 --- a/src/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -254,26 +254,34 @@ public class FingerprintActivity extends AppCompatActivity { final static public boolean isFingerprintCapable(Context context) { - FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); + try { + FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + return false; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return fingerprintManager.isHardwareDetected(); + } + } catch(Exception e) { return false; } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return fingerprintManager.isHardwareDetected(); - } return false; } final static public boolean isFingerprintReady(Context context) { - FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); + try { + FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + return false; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints(); + } + } catch(Exception e) { return false; } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints(); - } return false; } From 8bdb8614e6f1e0ff2de1f4a9ed7b1496ac1a446b Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 5 Apr 2017 19:21:02 +0200 Subject: [PATCH 749/881] fixes after rebase due to project structure changes --- .../com/owncloud/android/ui/activity/FingerprintActivity.java | 0 {res => src/main/res}/drawable/ic_fingerprint.xml | 0 {res => src/main/res}/layout/fingerprintlock.xml | 0 src/main/res/values/setup.xml | 1 + 4 files changed, 1 insertion(+) rename src/{ => main/java}/com/owncloud/android/ui/activity/FingerprintActivity.java (100%) rename {res => src/main/res}/drawable/ic_fingerprint.xml (100%) rename {res => src/main/res}/layout/fingerprintlock.xml (100%) diff --git a/src/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java similarity index 100% rename from src/com/owncloud/android/ui/activity/FingerprintActivity.java rename to src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java diff --git a/res/drawable/ic_fingerprint.xml b/src/main/res/drawable/ic_fingerprint.xml similarity index 100% rename from res/drawable/ic_fingerprint.xml rename to src/main/res/drawable/ic_fingerprint.xml diff --git a/res/layout/fingerprintlock.xml b/src/main/res/layout/fingerprintlock.xml similarity index 100% rename from res/layout/fingerprintlock.xml rename to src/main/res/layout/fingerprintlock.xml diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index f50d817c74..18550a2f43 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -81,6 +81,7 @@ <bool name="bottom_toolbar_enabled">false</bool> <!-- Help, imprint and feedback --> + <bool name="fingerprint_enabled">true</bool> <bool name="calendar_contacts_enabled">true</bool> <bool name="help_enabled">true</bool> <bool name="imprint_enabled">false</bool> From 744a1fc54930d8b314939569c4389f4873fa97de Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Tue, 18 Apr 2017 15:50:16 +0200 Subject: [PATCH 750/881] fix remove line --- src/main/res/values-de-rDE/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index 03541684fc..ac5b777205 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -596,6 +596,7 @@ <string name="welcome_feature_3_text">Schützen Sie Ihre Fotos</string> <string name="whats_new_skip">Überspringen</string> + <!-- User information --> <string name="user_info_full_name">Vollständiger Name</string> <string name="user_info_email">E-Mail</string> From ed59604d3f31f59bc115b7c9a7d13d39f74a02c0 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Wed, 19 Apr 2017 17:51:14 +0200 Subject: [PATCH 751/881] fixes after rebase --- fingerprint_icon-web.png | Bin 58648 -> 0 bytes src/main/res/layout/fingerprintlock.xml | 68 +++++++++++------------- 2 files changed, 32 insertions(+), 36 deletions(-) delete mode 100644 fingerprint_icon-web.png diff --git a/fingerprint_icon-web.png b/fingerprint_icon-web.png deleted file mode 100644 index 0e6fffde304996f969863e66a18120be138ae828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58648 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 diff --git a/src/main/res/layout/fingerprintlock.xml b/src/main/res/layout/fingerprintlock.xml index 360d8fec83..048b1bdd30 100644 --- a/src/main/res/layout/fingerprintlock.xml +++ b/src/main/res/layout/fingerprintlock.xml @@ -18,51 +18,47 @@ License along with this program. If not, see <http://www.gnu.org/licenses/>. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:gravity="center_horizontal" - android:orientation="vertical" - xmlns:app="http://schemas.android.com/apk/res-auto" - - > + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" - app:title="Nextcloud" - app:titleTextColor="@color/white" app:layout_scrollFlags="scroll|enterAlways|snap" - app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> + app:popupTheme="@style/ThemeOverlay.AppCompat.Light" + app:title="@string/app_name" + app:titleTextColor="@color/white"/> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:gravity="center_horizontal" - android:orientation="vertical" - android:padding="@dimen/standard_padding" > - - - <TextView - android:id="@+id/scanfingerprinttext" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/fingerprint_scan_finger" - android:textColor="@android:color/black" + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="fill_parent" android:gravity="center_horizontal" - android:padding="8dp" - android:textSize="32dp" - /> - <ImageView - android:id="@+id/fingerprinticon" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:padding="16dp" - android:src="@drawable/ic_fingerprint" - android:scaleType="fitCenter" - android:tint="@color/actionbar_start_color"/> + android:orientation="vertical" + android:padding="@dimen/standard_padding"> + <TextView + android:id="@+id/scanfingerprinttext" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:padding="8dp" + android:text="@string/fingerprint_scan_finger" + android:textColor="@android:color/black" + android:textSize="32dp"/> -</LinearLayout> + <ImageView + android:id="@+id/fingerprinticon" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="16dp" + android:scaleType="fitCenter" + android:src="@drawable/ic_fingerprint" + android:tint="@color/navigation_bar_start_color"/> + + </LinearLayout> </LinearLayout> From 9c1339b1e408976ee08a49de2d8acc32933e61d6 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 20 Apr 2017 10:32:45 +0200 Subject: [PATCH 752/881] prevent crash when fetching search event while rotating --- .../datamodel/ThumbnailsCacheManager.java | 4 +- .../ui/adapter/FileListListAdapter.java | 41 +++++++----- .../ui/fragment/OCFileListFragment.java | 64 ++++++++++++++++--- 3 files changed, 80 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index aa713432cd..ccf351f71a 100644 --- a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -189,7 +189,7 @@ public class ThumbnailsCacheManager { public ThumbnailGenerationTask(ImageView imageView, FileDataStorageManager storageManager, - Account account) { + Account account) throws IllegalArgumentException { // Use a WeakReference to ensure the ImageView can be garbage collected mImageViewReference = new WeakReference<ImageView>(imageView); if (storageManager == null) { @@ -577,7 +577,7 @@ public class ThumbnailsCacheManager { } private Bitmap doAvatarInBackground() { - String username = (String) mUsername; + String username = mUsername; final String imageKey = "a_" + username; diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java index 530f6fac24..8949df5f1b 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -49,6 +49,7 @@ import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; +import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.RemoteFile; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.services.OperationsService.OperationsServiceBinder; @@ -83,6 +84,7 @@ public class FileListListAdapter extends BaseAdapter { private FilesFilter mFilesFilter; private OCFile currentDirectory; + private static final String TAG = FileListListAdapter.class.getSimpleName(); public FileListListAdapter( boolean justFolders, @@ -365,25 +367,30 @@ public class FileListListAdapter extends BaseAdapter { } else { // generate new Thumbnail if (ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, fileIcon)) { - final ThumbnailsCacheManager.ThumbnailGenerationTask task = - new ThumbnailsCacheManager.ThumbnailGenerationTask( - fileIcon, mStorageManager, mAccount - ); - if (thumbnail == null) { - if (MimeTypeUtil.isVideo(file)) { - thumbnail = ThumbnailsCacheManager.mDefaultVideo; - } else { - thumbnail = ThumbnailsCacheManager.mDefaultImg; + try { + final ThumbnailsCacheManager.ThumbnailGenerationTask task = + new ThumbnailsCacheManager.ThumbnailGenerationTask( + fileIcon, mStorageManager, mAccount + ); + + if (thumbnail == null) { + if (MimeTypeUtil.isVideo(file)) { + thumbnail = ThumbnailsCacheManager.mDefaultVideo; + } else { + thumbnail = ThumbnailsCacheManager.mDefaultImg; + } } + final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable = + new ThumbnailsCacheManager.AsyncThumbnailDrawable( + mContext.getResources(), + thumbnail, + task + ); + fileIcon.setImageDrawable(asyncDrawable); + task.execute(file); + } catch (IllegalArgumentException e) { + Log_OC.d(TAG, "ThumbnailGenerationTask : " + e.getMessage()); } - final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable = - new ThumbnailsCacheManager.AsyncThumbnailDrawable( - mContext.getResources(), - thumbnail, - task - ); - fileIcon.setImageDrawable(asyncDrawable); - task.execute(file); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index cdb7406abb..4690161f3d 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -35,6 +35,7 @@ import android.os.Handler; import android.os.Looper; import android.preference.PreferenceManager; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.design.widget.BottomNavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; @@ -151,6 +152,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi private SearchType currentSearchType; private boolean searchFragment = false; + private SearchEvent searchEvent; + private AsyncTask remoteOperationAsyncTask; private enum MenuItemAddRemove { DO_NOTHING, REMOVE_SORT, REMOVE_GRID_AND_SORT, ADD_SORT, ADD_GRID_AND_SORT, ADD_GRID_AND_SORT_WITH_SEARCH, @@ -170,6 +173,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi mProgressBarActionModeColor = getResources().getColor(R.color.action_mode_background); mProgressBarColor = getResources().getColor(R.color.primary); mMultiChoiceModeListener = new MultiChoiceModeListener(); + searchFragment = false; } /** @@ -282,12 +286,20 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi @Override public void onResume() { super.onResume(); + + if (remoteOperationAsyncTask != null) { + remoteOperationAsyncTask.cancel(true); + } } @Override public void onDetach() { setOnRefreshListener(null); mContainerActivity = null; + + if (remoteOperationAsyncTask != null) { + remoteOperationAsyncTask.cancel(true); + } super.onDetach(); } @@ -341,8 +353,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } } - SearchEvent searchEvent = Parcels.unwrap(getArguments().getParcelable(OCFileListFragment.SEARCH_EVENT)); - if (searchEvent != null){ + searchEvent = Parcels.unwrap(getArguments().getParcelable(OCFileListFragment.SEARCH_EVENT)); + if (searchEvent != null) { onMessageEvent(searchEvent); } } @@ -670,6 +682,26 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi ((FileActivity) getActivity()).addDrawerListener(mMultiChoiceModeListener); } + @Override + public void onViewStateRestored(@Nullable Bundle savedInstanceState) { + super.onViewStateRestored(savedInstanceState); + + if (savedInstanceState != null) { + mAdapter = new FileListListAdapter( + mJustFolders, + getActivity(), + mContainerActivity, + this, + mContainerActivity.getStorageManager()); + + searchEvent = Parcels.unwrap(savedInstanceState.getParcelable(SEARCH_EVENT)); + } + + if (searchEvent != null) { + onMessageEvent(searchEvent); + } + } + /** * Saves the current listed folder. */ @@ -952,6 +984,11 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi public void refreshDirectory() { searchFragment = false; + + if (remoteOperationAsyncTask != null) { + remoteOperationAsyncTask.cancel(true); + } + listDirectory(getCurrentFile(), MainApp.isOnlyOnDevice(), false); } @@ -1312,25 +1349,32 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()); - AsyncTask task = new AsyncTask() { + remoteOperationAsyncTask = new AsyncTask() { @Override protected Object doInBackground(Object[] params) { - RemoteOperationResult remoteOperationResult = remoteOperation.execute(currentAccount, getContext()); + if (getContext() != null && !isCancelled()) { + RemoteOperationResult remoteOperationResult = remoteOperation.execute(currentAccount, getContext()); - if (remoteOperationResult.isSuccess() && remoteOperationResult.getData() != null) { - mAdapter.setData(remoteOperationResult.getData(), currentSearchType); + if (remoteOperationResult.isSuccess() && remoteOperationResult.getData() != null + && !isCancelled() && searchFragment) { + mAdapter.setData(remoteOperationResult.getData(), currentSearchType); + } + + return remoteOperationResult.isSuccess(); + } else { + return false; } - - return remoteOperationResult.isSuccess(); } @Override protected void onPostExecute(Object o) { - mAdapter.notifyDataSetChanged(); + if (!isCancelled()) { + mAdapter.notifyDataSetChanged(); + } } }; - task.execute(true); + remoteOperationAsyncTask.execute(true); if (event.getSearchType().equals(SearchOperation.SearchType.FILE_SEARCH)) { setEmptyListMessage(SearchType.FILE_SEARCH); From 95d9ea014c2da1c29c32ce1a3f3a17c967a992ab Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 20 Apr 2017 11:21:25 +0200 Subject: [PATCH 753/881] fix missing long click in "search" --- .../com/owncloud/android/ui/activity/FileDisplayActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 0b4fea067a..f36ebc5a6b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -393,6 +393,7 @@ public class FileDisplayActivity extends HookActivity args.putParcelable(OCFileListFragment.SEARCH_EVENT, getIntent().getParcelableExtra(OCFileListFragment.SEARCH_EVENT)); + args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, true); listOfFiles.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); From 9377f22f514ea6151e55ef505514767c2354718e Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 20 Apr 2017 11:26:22 +0200 Subject: [PATCH 754/881] swipe to refresh for "search" --- .../android/ui/fragment/OCFileListFragment.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 4690161f3d..7e4a242c1e 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1431,4 +1431,14 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi EventBus.getDefault().unregister(this); super.onStop(); } + + + @Override + public void onRefresh() { + super.onRefresh(); + + if (searchEvent != null) { + onMessageEvent(searchEvent); + } + } } From fe6171571f0a443f6bfb1c15520970b7e9bbc5f3 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 20 Apr 2017 15:34:36 +0200 Subject: [PATCH 755/881] prevent NPE if trying to store grid preference for favorites/shared --- .../owncloud/android/ui/fragment/OCFileListFragment.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index cdb7406abb..f432dffeb7 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1199,9 +1199,12 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi GRID_IS_PREFERED_PREFERENCE, Context.MODE_PRIVATE ); - SharedPreferences.Editor editor = setting.edit(); - editor.putBoolean(String.valueOf(mFile.getFileId()), setGrid); - editor.apply(); + // can be in case of favorites, shared + if (mFile != null) { + SharedPreferences.Editor editor = setting.edit(); + editor.putBoolean(String.valueOf(mFile.getFileId()), setGrid); + editor.apply(); + } } private void unsetAllMenuItems(final boolean unsetDrawer) { From 299f08694f29275d8c38d9d6fa6dcebaf8de1cf5 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 20 Apr 2017 21:51:08 +0200 Subject: [PATCH 756/881] fixes due to code review --- .../authentication/PassCodeManager.java | 7 +- .../ui/activity/FingerprintActivity.java | 154 +++++++++--------- .../android/ui/activity/Preferences.java | 21 ++- 3 files changed, 85 insertions(+), 97 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/PassCodeManager.java b/src/main/java/com/owncloud/android/authentication/PassCodeManager.java index 0317c9f982..ab3b46c913 100644 --- a/src/main/java/com/owncloud/android/authentication/PassCodeManager.java +++ b/src/main/java/com/owncloud/android/authentication/PassCodeManager.java @@ -125,10 +125,8 @@ public class PassCodeManager { return (appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false)); } - private boolean fingerprintShouldBeRequested(){ - if ((System.currentTimeMillis() - mTimestamp) > PASS_CODE_TIMEOUT && - mVisibleActivitiesCounter <= 0 - ){ + private boolean fingerprintShouldBeRequested() { + if ((System.currentTimeMillis() - mTimestamp) > PASS_CODE_TIMEOUT && mVisibleActivitiesCounter <= 0) { return fingerprintIsEnabled(); } return false; @@ -138,5 +136,4 @@ public class PassCodeManager { SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext()); return (appPrefs.getBoolean(FingerprintActivity.PREFERENCE_USE_FINGERPRINT, false)); } - } diff --git a/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java index 6d7df6a2bc..a28ce4bcbc 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -46,6 +46,7 @@ import android.widget.Toast; import com.owncloud.android.MainApp; import com.owncloud.android.R; +import com.owncloud.android.lib.common.utils.Log_OC; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; @@ -62,11 +63,17 @@ import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; +/** + * Activity to handle access to the app based on the fingerprint. + */ public class FingerprintActivity extends AppCompatActivity { + private static final String TAG = FingerprintActivity.class.getSimpleName(); + public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT"; public final static String PREFERENCE_USE_FINGERPRINT = "use_fingerprint"; + public static final String ANDROID_KEY_STORE = "AndroidKeyStore"; private KeyStore keyStore; // Variable used for storing the key in the Android Keystore container @@ -90,39 +97,39 @@ public class FingerprintActivity extends AppCompatActivity { } private void startFingerprint() { - TextView fingerprinttext = (TextView) findViewById(R.id.scanfingerprinttext); + TextView fingerprintTextView = (TextView) findViewById(R.id.scanfingerprinttext); - FingerprintManager fingerprintManager = (FingerprintManager) MainApp.getAppContext().getSystemService(Context.FINGERPRINT_SERVICE); + FingerprintManager fingerprintManager = + (FingerprintManager) MainApp.getAppContext().getSystemService(Context.FINGERPRINT_SERVICE); - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) + != PackageManager.PERMISSION_GRANTED) { return; } KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); if (!keyguardManager.isKeyguardSecure()) { return; - }else{ + } else { generateKey(); - if (cipherInit()) { cryptoObject = new FingerprintManager.CryptoObject(cipher); FingerprintHandler.Callback callback = new FingerprintHandler.Callback() { @Override public void onAuthenticated() { - fingerprintresult(true); + fingerprintResult(true); } @Override public void onFailed(String error) { - Toast.makeText( - MainApp.getAppContext(), - error, - Toast.LENGTH_LONG) - .show(); - ImageView imageView = (ImageView)findViewById(R.id.fingerprinticon); - int[][] states = new int[][] { new int[] { android.R.attr.state_activated }, new int[] { -android.R.attr.state_activated } }; - int[] colors = new int[] { Color.parseColor("#FF0000"), Color.RED }; + Toast.makeText(MainApp.getAppContext(), error, Toast.LENGTH_LONG).show(); + ImageView imageView = (ImageView) findViewById(R.id.fingerprinticon); + int[][] states = new int[][]{ + new int[]{android.R.attr.state_activated}, + new int[]{-android.R.attr.state_activated} + }; + int[] colors = new int[]{Color.parseColor("#FF0000"), Color.RED}; ColorStateList csl = new ColorStateList(states, colors); Drawable drawable = DrawableCompat.wrap(imageView.getDrawable()); DrawableCompat.setTintList(drawable, csl); @@ -130,9 +137,10 @@ public class FingerprintActivity extends AppCompatActivity { } }; - helper = new FingerprintHandler(fingerprinttext, callback); + helper = new FingerprintHandler(fingerprintTextView, callback); cancellationSignal = new CancellationSignal(); - if (ActivityCompat.checkSelfPermission(MainApp.getAppContext(), Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(MainApp.getAppContext(), Manifest.permission.USE_FINGERPRINT) + != PackageManager.PERMISSION_GRANTED) { return; } fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, helper, null); @@ -148,7 +156,6 @@ public class FingerprintActivity extends AppCompatActivity { imageView.setImageDrawable(getDrawable(R.drawable.ic_fingerprint)); } - @Override public void onStop(){ super.onStop(); @@ -158,9 +165,9 @@ public class FingerprintActivity extends AppCompatActivity { /** * Overrides click on the BACK arrow to prevent fingerprint from being worked around. * - * @param keyCode Key code of the key that triggered the down event. - * @param event Event triggered. - * @return 'True' when the key event was processed by this method. + * @param keyCode Key code of the key that triggered the down event. + * @param event Event triggered. + * @return 'True' when the key event was processed by this method. */ @Override public boolean onKeyDown(int keyCode, KeyEvent event){ @@ -173,97 +180,92 @@ public class FingerprintActivity extends AppCompatActivity { @TargetApi(Build.VERSION_CODES.M) protected void generateKey() { try { - keyStore = KeyStore.getInstance("AndroidKeyStore"); + keyStore = KeyStore.getInstance(ANDROID_KEY_STORE); } catch (Exception e) { - e.printStackTrace(); + Log_OC.e(TAG, "Error getting KeyStore", e); } - KeyGenerator keyGenerator; try { - keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE); } catch (NoSuchAlgorithmException | NoSuchProviderException e) { return; } - try { keyStore.load(null); - keyGenerator.init(new - KeyGenParameterSpec.Builder(KEY_NAME, - KeyProperties.PURPOSE_ENCRYPT | - KeyProperties.PURPOSE_DECRYPT) - .setBlockModes(KeyProperties.BLOCK_MODE_CBC) - .setUserAuthenticationRequired(true) - .setEncryptionPaddings( - KeyProperties.ENCRYPTION_PADDING_PKCS7) - .build()); + keyGenerator.init( + new KeyGenParameterSpec.Builder( + KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT + ) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setUserAuthenticationRequired(true) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + .build()); keyGenerator.generateKey(); - } catch (NoSuchAlgorithmException | - InvalidAlgorithmParameterException - | CertificateException | IOException e) { + } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException | CertificateException | IOException e) { return; } } - @TargetApi(Build.VERSION_CODES.M) public boolean cipherInit() { try { - cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); + cipher = Cipher.getInstance( + KeyProperties.KEY_ALGORITHM_AES + "/" + + KeyProperties.BLOCK_MODE_CBC + "/" + + KeyProperties.ENCRYPTION_PADDING_PKCS7); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { return false; } - try { keyStore.load(null); - SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, - null); + SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null); cipher.init(Cipher.ENCRYPT_MODE, key); return true; } catch (KeyPermanentlyInvalidatedException e) { return false; - } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) { + } catch (KeyStoreException + | CertificateException + | UnrecoverableKeyException + | IOException + | NoSuchAlgorithmException + | InvalidKeyException e) { return false; } } - - private void fingerprintresult(boolean fingerok) { - - if (fingerok) { - Intent resultIntent = new Intent(); - resultIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); - resultIntent.putExtra(KEY_CHECK_RESULT, true); - setResult(RESULT_OK, resultIntent); - finish(); - } else { - showErrorAndRestart(R.string.fingerprint_unknown); - } - - + private void fingerprintResult(boolean fingerok) { + if (fingerok) { + Intent resultIntent = new Intent(); + resultIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + resultIntent.putExtra(KEY_CHECK_RESULT, true); + setResult(RESULT_OK, resultIntent); + finish(); + } else { + showErrorAndRestart(R.string.fingerprint_unknown); + } } - private void showErrorAndRestart(int errorMessage) { CharSequence errorSeq = getString(errorMessage); Toast.makeText(this, errorSeq, Toast.LENGTH_LONG).show(); } - - final static public boolean isFingerprintCapable(Context context) { try { - FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); + FingerprintManager fingerprintManager = + (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) + != PackageManager.PERMISSION_GRANTED) { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return fingerprintManager.isHardwareDetected(); } - } catch(Exception e) { + } catch (Exception e) { return false; } return false; @@ -271,63 +273,56 @@ public class FingerprintActivity extends AppCompatActivity { final static public boolean isFingerprintReady(Context context) { try { - FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); + FingerprintManager fingerprintManager = + (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) + != PackageManager.PERMISSION_GRANTED) { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints(); } - } catch(Exception e) { + } catch (Exception e) { return false; } + return false; } - - - } + @SuppressLint("NewApi") class FingerprintHandler extends FingerprintManager.AuthenticationCallback { - private TextView text; private Callback callback; - // Constructor FingerprintHandler(TextView mtext, Callback mcallback) { text = mtext; callback = mcallback; } - - @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { - // this.update(String.valueOf(errString), false); + // this.update(String.valueOf(errString), false); } - @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { this.update(String.valueOf(helpString), false); } - @Override public void onAuthenticationFailed() { this.update(MainApp.getAppContext().getString(R.string.fingerprint_unknown), false); } - @Override public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { this.update("Fingerprint Authentication succeeded.", true); } - public void update(final String e, Boolean success) { if(success) { text.postDelayed(new Runnable() { @@ -347,10 +342,7 @@ class FingerprintHandler extends FingerprintManager.AuthenticationCallback { } interface Callback { - void onAuthenticated(); - void onFailed(String error); - } } \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index 4ac012dc89..2ac6342a44 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -157,7 +157,7 @@ public class Preferences extends PreferenceActivity // Register context menu for list of preferences. registerForContextMenu(getListView()); - PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("details"); + PreferenceCategory preferenceCategoryDetails = (PreferenceCategory) findPreference("details"); pCode = (CheckBoxPreference) findPreference(PassCodeActivity.PREFERENCE_SET_PASSCODE); @@ -221,7 +221,7 @@ public class Preferences extends PreferenceActivity } } else { - preferenceCategory.removePreference(fPrint); + preferenceCategoryDetails.removePreference(fPrint); } } @@ -233,12 +233,12 @@ public class Preferences extends PreferenceActivity PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); SharedPreferences.Editor editor = appPrefs.edit(); editor.putBoolean("show_hidden_files_pref", mShowHiddenFiles.isChecked()); - editor.commit(); + editor.apply(); return true; } }); - preferenceCategory = (PreferenceCategory) findPreference("more"); + PreferenceCategory preferenceCategoryMore = (PreferenceCategory) findPreference("more"); boolean calendarContactsEnabled = getResources().getBoolean(R.bool.calendar_contacts_enabled); Preference pCalendarContacts = findPreference("calendar_contacts"); @@ -261,7 +261,7 @@ public class Preferences extends PreferenceActivity } }); } else { - preferenceCategory.removePreference(pCalendarContacts); + preferenceCategoryMore.removePreference(pCalendarContacts); } } @@ -282,7 +282,7 @@ public class Preferences extends PreferenceActivity } }); } else { - preferenceCategory.removePreference(pHelp); + preferenceCategoryMore.removePreference(pHelp); } } @@ -314,7 +314,7 @@ public class Preferences extends PreferenceActivity } }); } else { - preferenceCategory.removePreference(pRecommend); + preferenceCategoryMore.removePreference(pRecommend); } } @@ -339,7 +339,7 @@ public class Preferences extends PreferenceActivity } }); } else { - preferenceCategory.removePreference(pFeedback); + preferenceCategoryMore.removePreference(pFeedback); } } @@ -357,7 +357,7 @@ public class Preferences extends PreferenceActivity } }); } else { - preferenceCategory.removePreference(pLogger); + preferenceCategoryMore.removePreference(pLogger); } } @@ -379,7 +379,7 @@ public class Preferences extends PreferenceActivity } }); } else { - preferenceCategory.removePreference(pImprint); + preferenceCategoryMore.removePreference(pImprint); } } @@ -412,7 +412,6 @@ public class Preferences extends PreferenceActivity return false; } }); - } mPrefInstantUploadCategory = (PreferenceCategory) findPreference("instant_uploading_category"); From f725ada65e6f9a2cee500e2c45c6a4f7d861d3bf Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 20 Apr 2017 23:17:25 +0200 Subject: [PATCH 757/881] Fix prefs --- src/main/java/com/owncloud/android/ui/activity/Preferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index ae18d51ab7..3e02713351 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -512,7 +512,7 @@ public class Preferences extends PreferenceActivity pAboutApp.setSummary(String.format(getString(R.string.about_version), appVersion)); } - loadExternalSettingLinks(preferenceCategory); + loadExternalSettingLinks(preferenceCategoryMore); loadStoragePath(); } From dcc216b3168e8d62fdc17924f617029fcc3788b7 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Fri, 21 Apr 2017 00:20:51 +0000 Subject: [PATCH 758/881] [tx-robot] updated from transifex --- src/main/res/values-de-rDE/strings.xml | 10 +++++++++- src/main/res/values-de/strings.xml | 10 +++++++++- src/main/res/values-el/strings.xml | 10 +++++++++- src/main/res/values-es-rMX/strings.xml | 1 - src/main/res/values-es/strings.xml | 1 - src/main/res/values-fi-rFI/strings.xml | 1 - src/main/res/values-fr/strings.xml | 10 +++++++++- src/main/res/values-hu-rHU/strings.xml | 1 - src/main/res/values-is/strings.xml | 1 - src/main/res/values-it/strings.xml | 1 - src/main/res/values-ja-rJP/strings.xml | 1 - src/main/res/values-nb-rNO/strings.xml | 1 - src/main/res/values-nl/strings.xml | 1 - src/main/res/values-pl/strings.xml | 10 +++++++++- src/main/res/values-pt-rBR/strings.xml | 10 +++++++++- src/main/res/values-ru/strings.xml | 10 +++++++++- src/main/res/values-tr/strings.xml | 10 +++++++++- src/main/res/values-zh-rCN/strings.xml | 1 - 18 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index ac5b777205..995e3cb14e 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Einstellungen</string> <string name="drawer_item_uploads_list">Uploads</string> <string name="drawer_item_activities">Aktivitäten</string> + <string name="drawer_item_notifications">Benachrichtigungen</string> <string name="drawer_quota">%1$s von %2$s verwendet</string> <string name="drawer_close">Schließen</string> <string name="drawer_open">Öffnen</string> @@ -571,6 +572,10 @@ <string name="activity_list_loading_activity">Lade Aktivitäten…</string> <string name="activity_list_no_results">Keine Aktivitäten gefunden.</string> + <string name="notifications_loading_activity">Lade Benachrichtigungen…</string> + <string name="notifications_no_results_headline">Keine Benachrichtigungen</string> + <string name="notifications_no_results_message">Bitte sehen Sie später noch einmal nach.</string> + <string name="upload_file_dialog_title">Dateinamen und -typ zum Hochladen eingeben</string> <string name="upload_file_dialog_filename">Dateiname</string> <string name="upload_file_dialog_filetype">Dateityp</string> @@ -610,5 +615,8 @@ <!-- Activities --> <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> + <!-- Notifications --> + <string name="new_notification_received">Neue Benachrichtigung erhalten</string> - </resources> + +</resources> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index aa3cc98834..dc81940efe 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Einstellungen</string> <string name="drawer_item_uploads_list">Uploads</string> <string name="drawer_item_activities">Aktivitäten</string> + <string name="drawer_item_notifications">Benachrichtigungen</string> <string name="drawer_quota">%1$s von %2$s verwendet</string> <string name="drawer_close">Schließen</string> <string name="drawer_open">Öffnen</string> @@ -571,6 +572,10 @@ <string name="activity_list_loading_activity">Lade Aktivitäten…</string> <string name="activity_list_no_results">Keine Aktivitäten gefunden.</string> + <string name="notifications_loading_activity">Lade Benachrichtigungen…</string> + <string name="notifications_no_results_headline">Keine Benachrichtigungen</string> + <string name="notifications_no_results_message">Bitte später noch einmal nachsehen.</string> + <string name="upload_file_dialog_title">Dateinamen und -typ zum Hochladen eingeben</string> <string name="upload_file_dialog_filename">Dateiname</string> <string name="upload_file_dialog_filetype">Dateityp</string> @@ -610,5 +615,8 @@ <!-- Activities --> <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> + <!-- Notifications --> + <string name="new_notification_received">Neue Benachrichtigung erhalten</string> - </resources> + +</resources> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index b381456a94..301a0c8880 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Ρυθμίσεις</string> <string name="drawer_item_uploads_list">Μεταφορτώσεις</string> <string name="drawer_item_activities">Δραστηριότητες</string> + <string name="drawer_item_notifications">Ειδοποιήσεις</string> <string name="drawer_quota">χρησιμοποιούνται %1$s από %2$s</string> <string name="drawer_close">Κλείσιμο</string> <string name="drawer_open">Άνοιγμα</string> @@ -571,6 +572,10 @@ <string name="activity_list_loading_activity">Γίνεται φόρτωση δραστηριοτήτων…</string> <string name="activity_list_no_results">Δεν βρέθηκαν δραστηριότητες.</string> + <string name="notifications_loading_activity">Φόρτωση ενημερώσεων…</string> + <string name="notifications_no_results_headline">Καμία ειδοποίηση</string> + <string name="notifications_no_results_message">Παρακαλούμε ελέγξτε ξανά αργότερα. </string> + <string name="upload_file_dialog_title">Εισαγωγή ονόματος και τύπου αρχείου μεταφόρτωσης</string> <string name="upload_file_dialog_filename">Όνομα αρχείου</string> <string name="upload_file_dialog_filetype">Τύπος αρχείου</string> @@ -610,5 +615,8 @@ <!-- Activities --> <string name="activities_no_results_headline">Καμία δραστηριότητα ακόμα</string> <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές & κοινόχρηστα</string> + <!-- Notifications --> + <string name="new_notification_received">Νέα ενημέρωση ελήφθη </string> - </resources> + +</resources> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 414def54b5..4ee6d1b730 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -610,5 +610,4 @@ en los últimos 7 días!</string> <!-- Activities --> <string name="activities_no_results_headline">Aún no hay actividades</string> <string name="activities_no_results_message">Este flujo le mostrará eventos tales como \nagregados, cambios & compartidos</string> - </resources> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index c8f5dd3585..be7a9e88cb 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -610,5 +610,4 @@ <!-- Activities --> <string name="activities_no_results_headline">Aun no hay actividad</string> <string name="activities_no_results_message">Esta secuencia le mostrará eventos como\nagregados, cambios& recursos compartidos</string> - </resources> diff --git a/src/main/res/values-fi-rFI/strings.xml b/src/main/res/values-fi-rFI/strings.xml index 0245688830..7c815500b3 100644 --- a/src/main/res/values-fi-rFI/strings.xml +++ b/src/main/res/values-fi-rFI/strings.xml @@ -561,5 +561,4 @@ <!-- Activities --> <string name="activities_no_results_headline">Ei vielä toimia</string> <string name="activities_no_results_message">Tähän luetteloon ilmestyy tapahtumakuvauksia, kuten\nlisäyksiä, muutoksia& jakamisia</string> - </resources> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 9e91e633ae..f611715618 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Paramètres</string> <string name="drawer_item_uploads_list">Historique des envois</string> <string name="drawer_item_activities">Activités</string> + <string name="drawer_item_notifications">Notifications</string> <string name="drawer_quota">%1$s utilisés sur %2$s</string> <string name="drawer_close">Fermer</string> <string name="drawer_open">Ouvrir</string> @@ -571,6 +572,10 @@ <string name="activity_list_loading_activity">Chargement des activités…</string> <string name="activity_list_no_results">Aucune activité trouvée.</string> + <string name="notifications_loading_activity">Chargement des notifications…</string> + <string name="notifications_no_results_headline">Aucune notification</string> + <string name="notifications_no_results_message">Veuillez revenir plus tard.</string> + <string name="upload_file_dialog_title">Spécifiez le nom et le type du fichier téléversé</string> <string name="upload_file_dialog_filename">Nom de fichier</string> <string name="upload_file_dialog_filetype">Type de fichier</string> @@ -610,5 +615,8 @@ <!-- Activities --> <string name="activities_no_results_headline">Aucune activité pour le moment</string> <string name="activities_no_results_message">Ce flux affichera des événements comme\n des ajouts, des changements & des partages</string> + <!-- Notifications --> + <string name="new_notification_received">Nouvelle notification reçue</string> - </resources> + +</resources> diff --git a/src/main/res/values-hu-rHU/strings.xml b/src/main/res/values-hu-rHU/strings.xml index 2a98f83ad1..5b68e93644 100644 --- a/src/main/res/values-hu-rHU/strings.xml +++ b/src/main/res/values-hu-rHU/strings.xml @@ -606,5 +606,4 @@ <!-- Activities --> <string name="activities_no_results_headline">Nincs még tevékenység</string> <string name="activities_no_results_message">Ez a folyam olyan eseményeket mutat mint\nbővítmények, változások és megosztások</string> - </resources> diff --git a/src/main/res/values-is/strings.xml b/src/main/res/values-is/strings.xml index e4b4bc9a9f..3e4ff59f41 100644 --- a/src/main/res/values-is/strings.xml +++ b/src/main/res/values-is/strings.xml @@ -610,5 +610,4 @@ <!-- Activities --> <string name="activities_no_results_headline">Engin virkni ennþá</string> <string name="activities_no_results_message">Streymið mun birta atburði á borð við\nviðbætingar, breytingar og deilingar</string> - </resources> diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index 5ce39aa40f..58ca1c2bb6 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -585,5 +585,4 @@ <!-- Activities --> <string name="activities_no_results_headline">Ancora nessuna attività</string> <string name="activities_no_results_message">Questo flusso mostrerà gli eventi come aggiunte, cambiamenti e condivisioni</string> - </resources> diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index c57813df57..6ac2bb2548 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -611,5 +611,4 @@ <string name="activities_no_results_headline">まだアクティビティはありません</string> <string name="activities_no_results_message">このタイムラインには、いいね\n 追加、変更、共有が表示されます</string> - </resources> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 210bfdb8e6..0149b3cbc8 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -597,5 +597,4 @@ <!-- Activities --> <string name="activities_no_results_headline">Ingen aktivitet enda</string> <string name="activities_no_results_message">Denne strømmen vil vise hendelser som\nf.eks. innlegging, endring og deling</string> - </resources> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 08a2a41fbe..3153171747 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -609,5 +609,4 @@ <!-- Activities --> <string name="activities_no_results_headline">Nog geen activiteit</string> <string name="activities_no_results_message">Deze stream laat gebeurtenissen zoals\ntoevoegingen, veranderingen & gedeelde bestanden zien</string> - </resources> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 5359b9fdd2..78c6dc4228 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Ustawienia</string> <string name="drawer_item_uploads_list">Wysłane</string> <string name="drawer_item_activities">Aktywności</string> + <string name="drawer_item_notifications">Powiadomienia</string> <string name="drawer_quota">Użyto %1$s z %2$s</string> <string name="drawer_close">Zamknij</string> <string name="drawer_open">Otwórz</string> @@ -573,6 +574,10 @@ <string name="activity_list_loading_activity">Ładuję aktywności…</string> <string name="activity_list_no_results">Nie znaleziono żadnych aktywności.</string> + <string name="notifications_loading_activity">Ładuję powiadomienia…</string> + <string name="notifications_no_results_headline">Brak powiadomień</string> + <string name="notifications_no_results_message">Proszę sprawdź później</string> + <string name="upload_file_dialog_title">Wprowadź nazwę i typ wysyłanego pliku</string> <string name="upload_file_dialog_filename">Nazwa pliku</string> <string name="upload_file_dialog_filetype">Typ pliku</string> @@ -612,5 +617,8 @@ <!-- Activities --> <string name="activities_no_results_headline">Brak aktywności</string> <string name="activities_no_results_message">Ten strumień pokaże zdarzenia jak\ndodatki, zmiany & udziały</string> + <!-- Notifications --> + <string name="new_notification_received">Otrzymano nowe powiadomienie</string> - </resources> + +</resources> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 4cfeae5fd8..0b684d740f 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Configurações</string> <string name="drawer_item_uploads_list">Envios</string> <string name="drawer_item_activities">Atividades</string> + <string name="drawer_item_notifications">Notificações</string> <string name="drawer_quota">%1$s de %2$s usados</string> <string name="drawer_close">Fechar</string> <string name="drawer_open">Abrir</string> @@ -571,6 +572,10 @@ foram encontrados para sua pesquisa! </string> <string name="activity_list_loading_activity">Carregando atividades…</string> <string name="activity_list_no_results">Nenhuma atividade encontrada.</string> + <string name="notifications_loading_activity">Carregando notificações…</string> + <string name="notifications_no_results_headline">Não há notificações</string> + <string name="notifications_no_results_message">Por favor verifique mais tarde.</string> + <string name="upload_file_dialog_title">Forneça o nome e o tipo de arquivo a enviar</string> <string name="upload_file_dialog_filename">Nome do Arquivo</string> <string name="upload_file_dialog_filetype">Tipo do Arquivo</string> @@ -610,5 +615,8 @@ foram encontrados para sua pesquisa! </string> <!-- Activities --> <string name="activities_no_results_headline">Nenhuma atividade ainda</string> <string name="activities_no_results_message">O stream irá mostrar eventos como\nadições, mudanças & compartilhamentos</string> + <!-- Notifications --> + <string name="new_notification_received">Nova notificação recebida</string> - </resources> + +</resources> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 7adb832146..6daf882d50 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Настройки</string> <string name="drawer_item_uploads_list">Загрузки</string> <string name="drawer_item_activities">События</string> + <string name="drawer_item_notifications">Уведомления</string> <string name="drawer_quota">%1$s of %2$s использовано</string> <string name="drawer_close">Закрыть</string> <string name="drawer_open">Открыть</string> @@ -575,6 +576,10 @@ <string name="activity_list_loading_activity">Загружаются события…</string> <string name="activity_list_no_results">Событий не найдено.</string> + <string name="notifications_loading_activity">Загрузка уведомлений…</string> + <string name="notifications_no_results_headline">Уведомлений нет</string> + <string name="notifications_no_results_message">Проверьте позже.</string> + <string name="upload_file_dialog_title">Ввод имени и типа загружаемого файла </string> <string name="upload_file_dialog_filename">Имя файла</string> <string name="upload_file_dialog_filetype">Тип файла</string> @@ -614,5 +619,8 @@ <!-- Activities --> <string name="activities_no_results_headline">Событий ещё нет</string> <string name="activities_no_results_message">Этот поток будет отображать события вроде\nдобавления, изменения файлов или открытия доступа к ним</string> + <!-- Notifications --> + <string name="new_notification_received">Получено новое уведомление</string> - </resources> + +</resources> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index 4419bb4fc9..b1440a9b10 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Ayarlar</string> <string name="drawer_item_uploads_list">Yüklemeler</string> <string name="drawer_item_activities">İşlemler</string> + <string name="drawer_item_notifications">Bildirimler</string> <string name="drawer_quota">%1$s / %2$s kullanıldı</string> <string name="drawer_close">Kapat</string> <string name="drawer_open">Aç</string> @@ -570,6 +571,10 @@ <string name="activity_list_loading_activity">İşlemler yükleniyor…</string> <string name="activity_list_no_results">Herhangi bir işlem bulunamadı.</string> + <string name="notifications_loading_activity">Bildirimler yükleniyor…</string> + <string name="notifications_no_results_headline">Herhangi bir bildirim yok</string> + <string name="notifications_no_results_message">Daha sonra yeniden bakın.</string> + <string name="upload_file_dialog_title">Yüklenecek dosya adını ve dosya türünü belirtin</string> <string name="upload_file_dialog_filename">Dosya adı</string> <string name="upload_file_dialog_filetype">Dosya türü</string> @@ -609,5 +614,8 @@ <!-- Activities --> <string name="activities_no_results_headline">Henüz bir işlem yapılmamış</string> <string name="activities_no_results_message">Bu akışta ekleme, değiştirme\nve paylaşım gibi işlemler görüntülenir</string> + <!-- Notifications --> + <string name="new_notification_received">Yeni bir bildirim var</string> - </resources> + +</resources> diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index ff6c2a3b3d..176c0af4bd 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -609,5 +609,4 @@ <!-- Activities --> <string name="activities_no_results_headline">暂无动态</string> <string name="activities_no_results_message">瀑布流中会显示诸如添加\n更改&分享之类的事件</string> - </resources> From 550ae613a15f729fa9272bc56dd772497b126858 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 21 Apr 2017 07:32:24 +0200 Subject: [PATCH 759/881] change all namings of beta/nightly to new "dev" --- CONTRIBUTING.md | 20 ++++---- README.md | 2 +- drawable_resources/launcher_beta.svg | 69 ---------------------------- src/main/res/values/setup.xml | 2 +- src/main/res/values/strings.xml | 2 +- 5 files changed, 13 insertions(+), 82 deletions(-) delete mode 100644 drawable_resources/launcher_beta.svg diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea5f9d4eb4..6d3d0e18b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,13 +22,13 @@ 1. Types 1. Stable 1. Release Candidate - 1. Beta + 1. Dev 1. Version Name and number 1. Release cycle 1. Release Process 1. Stable 1. Release Candidate - 1. Development Beta + 1. Development Dev # Guidelines @@ -128,10 +128,10 @@ _stable beta_ releases done via the Beta program of the Google Play store and f- Whenever a PR is reviewed/approved we put it on master. Before releasing a new stable version there is at least one release candidate. It is based on the current master and during this phase the master is feature freezed. After ~2 weeks with no error a stable version will be releaded, which is identically to the latest release candidate. -### Nightly +### Dev Done as a standalone app that can be installed in parallel to the stable app. -Any PR which is labelled "ready for nightly" will be automatically included in the nightly app. This label should only set by the main developers. -Same applies for the android-library. This repository also has a branch called beta which includes all upcoming features. The beta branch on this repository must always use the android-library beta branch. +Any PR which is labelled "ready for dev" will be automatically included in the dev app. This label should only set by the main developers. +Same applies for the android-library. This repository also has a branch called dev which includes all upcoming features. The dev branch on this repository must always use the android-library dev branch. ## Version Name and number ### Stable / Release candidate @@ -151,8 +151,8 @@ Examples for different versions: beware, that beta releases for an upcoming version will always use the minor and hotfix version of the release they are targeting. So to make sure the version code of the upcoming stable release will always be higher stable releases set the 2 beta digits to '99' as seen above in the examples. -### Nightly -For nightly the version name is in format YYYYMMDD. It is mainly as a reference for reporting bugs and is not related to stable/release candidates as it is an independent app. +### Dev +For dev the version name is in format YYYYMMDD. It is mainly as a reference for reporting bugs and is not related to stable/release candidates as it is an independent app. ## Release cycle * for each release we choose several PRs that will be included in the next release. Currently there are many open PRs from ownCloud, but after merging them, the intention is to choose the PRs that are ready (reviewed, tested) to get them merged very soon. @@ -180,7 +180,7 @@ Release Candidate releases are based on the git [master](https://github.com/next 2. Create a [release/tag](https://github.com/nextcloud/android/releases) in git. Tag name following the naming schema: ```rc-Mayor.Minor.Hotfix-betaIncrement``` (e.g. rc-1.2.0-12) naming the version number following the [semantic versioning schema](http://semver.org/) -### Nightly Release -Nightly releases are based on the git [beta](https://github.com/nextcloud/android/tree/beta) and are done independently from stable releases and integrate open PRs that might not be production ready or heavily tested but being put out there for people willing to test new features and provide valuable feedback on new features to be incorporated before a feature gets released in the stable app. +### Dev Release +Dev releases are based on the [dev](https://github.com/nextcloud/android/tree/dev) branch and are done independently from stable releases and integrate open PRs that might not be production ready or heavily tested but being put out there for people willing to test new features and provide valuable feedback on new features to be incorporated before a feature gets released in the stable app. -The deployment/build is done once a day automatically. If code has changed a new apk will be published on https://github.com/nextcloud/android/tree/beta/apks and it will also be available on f-droid. \ No newline at end of file +The deployment/build is done once a day automatically. If code has changed a new apk will be published [here](https://download.nextcloud.com/android/dev) and it will, with a little delay, be available on f-droid. \ No newline at end of file diff --git a/README.md b/README.md index 581c7b0009..c55c41cb3b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ if you want to join the Github organization just let us know and we’ll add you Make sure you read [SETUP.md](https://github.com/nextcloud/android/blob/master/SETUP.md) and [CONTRIBUTING.md](https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md) when you start working on this project. Basically: Fork this repository and contribute back using pull requests to the master branch. Easy starting points are also reviewing [pull requests](https://github.com/nextcloud/android/pulls) and working on [starter issue](https://github.com/nextcloud/android/issues?q=is%3Aopen+is%3Aissue+label%3A%22starter+issue%22). -**Nightly version** [nightly version](https://download.nextcloud.com/android/nightly/latest.apk) +**Dev version** [dev version](https://download.nextcloud.com/android/dev/latest.apk) **License:** [GPLv2](https://github.com/nextcloud/android/blob/master/LICENSE.txt) diff --git a/drawable_resources/launcher_beta.svg b/drawable_resources/launcher_beta.svg deleted file mode 100644 index cf7b95000b..0000000000 --- a/drawable_resources/launcher_beta.svg +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - enable-background="new 0 0 595.275 311.111" - xml:space="preserve" - height="32" - width="32" - version="1.1" - y="0px" - x="0px" - viewBox="0 0 32 31.999997" - id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="launcher_beta.svg" - inkscape:export-filename="C:\DEV\src\Android\nextcloud_android_beta\res\mipmap-xhdpi\ic_launcher.png" - inkscape:export-xdpi="270" - inkscape:export-ydpi="270"><metadata - id="metadata12"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs10" /><sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1005" - id="namedview8" - showgrid="false" - inkscape:zoom="3.6875" - inkscape:cx="1.0680032" - inkscape:cy="40.080182" - inkscape:window-x="-9" - inkscape:window-y="-9" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /><rect - rx="5" - ry="5" - height="32" - width="32" - y="-.0000052588" - x="0" - fill="#0082c9" - id="rect4" /><path - style="enable-background:accumulate;color-rendering:auto;text-decoration-color:#000000;color:#000000;isolation:auto;mix-blend-mode:normal;shape-rendering:auto;solid-color:#000000;block-progression:tb;text-decoration-line:none;image-rendering:auto;white-space:normal;text-indent:0;text-transform:none;text-decoration-style:solid" - d="m16.023 9.342c-3.1256 0.0003-5.7501 2.1404-6.552 5.0194-0.69991-1.5399-2.2405-2.6312-4.0305-2.6314-2.4366 0.000277-4.44 2.0038-4.4403 4.4405-0.00048201 2.4372 2.0032 4.4411 4.4403 4.4414 1.7902-0.000217 3.3298-1.0922 4.0296-2.6323 0.80161 2.8795 3.427 5.02 6.553 5.0203 3.1085 0.00024 5.7201-2.117 6.5383-4.9719 0.71125 1.5116 2.2282 2.5836 3.9976 2.5838 2.4376 0.000431 4.4416-2.0037 4.4412-4.4414-0.000235-2.4372-2.0041-4.4409-4.4412-4.4405-1.7695 0.000205-3.2873 1.072-3.9985 2.5838-0.8182-2.8548-3.4289-4.9721-6.5374-4.9719zm0 2.6067c2.3473-0.000156 4.2224 1.8745 4.2226 4.2219 0.000118 2.3477-1.875 4.223-4.2226 4.2228-2.3473-0.000228-4.2219-1.8754-4.2217-4.2228 0.000247-2.3471 1.8747-4.2216 4.2217-4.2219zm-10.583 2.388c1.0283 0.000118 1.8336 0.8055 1.8337 1.8338 0.000182 1.0285-0.80524 1.8346-1.8337 1.8347-1.0285-0.00012-1.8339-0.8062-1.8337-1.8347 0.000118-1.0283 0.80546-1.8337 1.8337-1.8338zm21.119 0c1.0285-0.00018 1.8345 0.80527 1.8346 1.8338 0.000245 1.0288-0.8059 1.8349-1.8346 1.8347-1.0285-0.00012-1.8339-0.8062-1.8338-1.8347 0.000118-1.0283 0.80549-1.8337 1.8338-1.8338z" - fill="#fff" - id="path6" /><text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5px;line-height:125%;font-family:Roboto;-inkscape-font-specification:'Roboto, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="8.3471136" - y="31.050848" - id="text4140" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - id="tspan4144" - x="8.3471136" - y="31.050848">B E T A</tspan></text> -</svg> \ No newline at end of file diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index f50d817c74..03dd707698 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -101,7 +101,7 @@ <bool name="participate_enabled">true</bool> <!-- Participate links --> <string name="fdroid_beta_link" translatable="false">https://f-droid.org/repository/browse/?fdid=com.nextcloud.android.beta</string> - <string name="beta_apk_link" translatable="false">https://download.nextcloud.com/android/nightly/latest.apk</string> + <string name="beta_apk_link" translatable="false">https://download.nextcloud.com/android/dev/latest.apk</string> <string name="play_store_register_beta" translatable="false">https://play.google.com/apps/testing/com.nextcloud.client</string> <string name="fdroid_link" translatable="false">https://f-droid.org/repository/browse/?fdid=com.nextcloud.client</string> <string name="irc_weblink" translatable="false">http://webchat.freenode.net?channels=nextcloud-mobile</string> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index b22b8ef25a..5a1ab2c327 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -549,7 +549,7 @@ <string name="participate_testing_bug_text">Found a bug? Something is odd?</string> <string name="participate_testing_report_text">Report an issue on Github</string> <string name="participate_testing_version_text">Interested in helping us testing the next Version?</string> - <string name="participate_beta_headline">Test the nightly version</string> + <string name="participate_beta_headline">Test the dev version</string> <string name="participate_beta_text">This includes all upcoming features and is very bleeding edge. Bugs/errors can occur and if they do, please report them to us.</string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_release_candidate_text">The release candidate (RC) is a snapshot of the upcoming release and it is expected to be stable. Testing your individual setup could help to ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid.</string> From 197ccb70948794c189df9ac360be1f6647527281 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 21 Apr 2017 08:02:49 +0200 Subject: [PATCH 760/881] bump library unify build.gradle files --- build.gradle | 2 +- build.gradle.modified | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 89b4d896e2..5eb6a47b61 100644 --- a/build.gradle +++ b/build.gradle @@ -177,7 +177,7 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' - compile 'com.github.nextcloud:android-library:-SNAPSHOT' + compile 'com.github.nextcloud:android-library:1.0.15' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' diff --git a/build.gradle.modified b/build.gradle.modified index d99ebed620..2779b3b377 100644 --- a/build.gradle.modified +++ b/build.gradle.modified @@ -33,7 +33,7 @@ ext { travisBuild = System.getenv("TRAVIS") == "true" - // allows for -Dpre-dex=false to be set :) + // allows for -Dpre-dex=false to be set preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) } @@ -101,7 +101,7 @@ android { // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure dexOptions { - // Skip pre-dexing whe`n running on Travis CI or when disabled via -Dpre-dex=false. + // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !travisBuild } @@ -116,6 +116,7 @@ android { packagingOptions { exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/LICENSE' } task checkstyle(type: Checkstyle) { @@ -176,7 +177,7 @@ dependencies { compile name: 'touch-image-view' compile 'com.android.support:multidex:1.0.1' - compile 'com.github.nextcloud:android-library:notifications-push-SNAPSHOT' + compile 'com.github.nextcloud:android-library:1.0.15' compile "com.android.support:support-v4:${supportLibraryVersion}" compile "com.android.support:design:${supportLibraryVersion}" compile 'com.jakewharton:disklrucache:2.0.2' @@ -189,7 +190,7 @@ dependencies { compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' compile 'org.greenrobot:eventbus:3.0.0' - + compile 'com.googlecode.ez-vcard:ez-vcard:0.10.2' compile 'com.google.android.gms:play-services:10.2.1' compile 'org.parceler:parceler-api:1.1.6' @@ -218,6 +219,7 @@ dependencies { //androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details //androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" + } configurations.all { From f33e022e7ba0e8070a93f23aa619985283023058 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 21 Apr 2017 08:28:17 +0200 Subject: [PATCH 761/881] fix mediaplayer for real this time --- .../com/owncloud/android/ui/preview/PreviewMediaFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 23f3fd1e86..838d64ef58 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -681,6 +681,8 @@ public class PreviewMediaFragment extends FileFragment implements } private void prepareMediaController() { + mMultiView.setVisibility(View.GONE); + mPreviewContainer.setVisibility(View.VISIBLE); mMediaServiceBinder.registerMediaController(mMediaController); if (mMediaController != null) { mMediaController.setMediaPlayer(mMediaServiceBinder); From ca1355bf10c5d8c497527f78609f7c7c6d8dfbe5 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 21 Apr 2017 12:36:43 +0200 Subject: [PATCH 762/881] Tweak davdroid config option --- .../java/com/owncloud/android/ui/activity/Preferences.java | 2 +- src/main/res/values/setup.xml | 4 ++-- src/modified/res/values/setup.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index 3e02713351..716f3d4d17 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -243,7 +243,7 @@ public class Preferences extends PreferenceActivity PreferenceCategory preferenceCategoryMore = (PreferenceCategory) findPreference("more"); - boolean calendarContactsEnabled = getResources().getBoolean(R.bool.calendar_contacts_enabled); + boolean calendarContactsEnabled = getResources().getBoolean(R.bool.davdroid_integration_enabled); Preference pCalendarContacts = findPreference("calendar_contacts"); if (pCalendarContacts != null) { if (calendarContactsEnabled) { diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 4d50689bcd..ebe812f7f0 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -87,9 +87,9 @@ <!-- Bottom toolbar --> <bool name="bottom_toolbar_enabled">false</bool> - <!-- Help, imprint and feedback --> + <!-- Help, imprint and feedback, and other things --> <bool name="fingerprint_enabled">true</bool> - <bool name="calendar_contacts_enabled">true</bool> + <bool name="davdroid_integration_enabled">true</bool> <bool name="help_enabled">true</bool> <bool name="imprint_enabled">false</bool> <bool name="recommend_enabled">true</bool> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index ef079f2e22..33ff337389 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -86,7 +86,7 @@ <!-- Help, imprint and feedback --> <bool name="fingerprint_enabled">true</bool> - <bool name="calendar_contacts_enabled">true</bool> + <bool name="davdroid_integration_enabled">true</bool> <bool name="help_enabled">true</bool> <bool name="imprint_enabled">false</bool> <bool name="recommend_enabled">true</bool> From 42f2ed267d6f98ad75cb590f161c40cda2a9037a Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 21 Apr 2017 13:49:39 +0200 Subject: [PATCH 763/881] disable FAB on searchViews --- .../com/owncloud/android/ui/fragment/OCFileListFragment.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index d1665b7f93..65e08d8ec2 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -992,6 +992,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi remoteOperationAsyncTask.cancel(true); } + setFabEnabled(true); listDirectory(getCurrentFile(), MainApp.isOnlyOnDevice(), false); } @@ -1269,6 +1270,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi if (getActivity() != null) { getActivity().invalidateOptionsMenu(); } + + setFabEnabled(true); } @Subscribe(threadMode = ThreadMode.BACKGROUND) @@ -1310,6 +1313,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi setEmptyListLoadingMessage(); mAdapter.setData(new ArrayList<>(), SearchType.NO_SEARCH); + setFabEnabled(false); + if (event.getUnsetType().equals(SearchEvent.UnsetType.UNSET_BOTTOM_NAV_BAR)) { unsetAllMenuItems(false); } else if (event.getUnsetType().equals(SearchEvent.UnsetType.UNSET_DRAWER)) { From 5319a63c3317369ea0fffef49ce5a3b94ad85bb2 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 21 Apr 2017 15:36:44 +0200 Subject: [PATCH 764/881] always refresh ocShares prior listing them to have an uptodate ocFile --- .../ui/adapter/FileListListAdapter.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java index 8949df5f1b..7b6b0b9a69 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -49,7 +49,9 @@ import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation; import com.owncloud.android.lib.resources.files.RemoteFile; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.services.OperationsService.OperationsServiceBinder; @@ -491,9 +493,19 @@ public class FileListListAdapter extends BaseAdapter { shares.add(ocShare); - OCFile ocFile = mStorageManager.getFileByPath(ocShare.getPath()); - if (!mFiles.contains(ocFile)) { - mFiles.add(ocFile); + // get ocFile from Server to have an up-to-date copy + ReadRemoteFileOperation operation = new ReadRemoteFileOperation(ocShare.getPath()); + RemoteOperationResult result = operation.execute(mAccount, mContext); + if (result.isSuccess()) { + OCFile file = FileStorageUtils.fillOCFile((RemoteFile) result.getData().get(0)); + + mStorageManager.saveFile(file); + + if (!mFiles.contains(file)) { + mFiles.add(file); + } + } else { + Log_OC.e(TAG, "Error in getting prop for file: " + ocShare.getPath()); } } } From 98f1641fe8a3aa3653775437b2cadeb6738b260e Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Sat, 22 Apr 2017 00:21:04 +0000 Subject: [PATCH 765/881] [tx-robot] updated from transifex --- src/main/res/values-cs-rCZ/strings.xml | 1 - src/main/res/values-da/strings.xml | 38 ++++++++++++++++- src/main/res/values-de-rDE/strings.xml | 28 ++++++++++++- src/main/res/values-de/strings.xml | 28 ++++++++++++- src/main/res/values-el/strings.xml | 1 - src/main/res/values-es-rMX/strings.xml | 39 +++++++++++++++++- src/main/res/values-es/strings.xml | 1 - src/main/res/values-fr/strings.xml | 28 ++++++++++++- src/main/res/values-hu-rHU/strings.xml | 1 - src/main/res/values-is/strings.xml | 1 - src/main/res/values-it/strings.xml | 36 ++++++++++++++++- src/main/res/values-ja-rJP/strings.xml | 1 - src/main/res/values-nb-rNO/strings.xml | 1 - src/main/res/values-nl/strings.xml | 1 - src/main/res/values-pl/strings.xml | 1 - src/main/res/values-pt-rBR/strings.xml | 28 ++++++++++++- src/main/res/values-ru/strings.xml | 56 +++++++++++++++++++------- src/main/res/values-sk-rSK/strings.xml | 1 - src/main/res/values-tr/strings.xml | 28 ++++++++++++- src/main/res/values-zh-rCN/strings.xml | 1 - 20 files changed, 283 insertions(+), 37 deletions(-) diff --git a/src/main/res/values-cs-rCZ/strings.xml b/src/main/res/values-cs-rCZ/strings.xml index 5feedec923..03aa07a1d9 100644 --- a/src/main/res/values-cs-rCZ/strings.xml +++ b/src/main/res/values-cs-rCZ/strings.xml @@ -505,7 +505,6 @@ <string name="participate_testing_bug_text">Našel jsi chybu? Něco nefunguje?</string> <string name="participate_testing_report_text">Nahlásit chybu na Github</string> <string name="participate_testing_version_text">Chceš nám pomoci testovat další verzi?</string> - <string name="participate_beta_headline">Testovat noční verzi</string> <string name="participate_beta_text">Zahrnuje všechny nadcházející funkce a pohybuje se na hraně stability. Mohou se vyskytnout chyby, a pokud ano, nahlašte nám je prosím.</string> <string name="participate_release_candidate_headline">Předběžná verze</string> <string name="participate_release_candidate_text">Předběžná verze nebo také Release Candidate (RC) je stabilní stav připravované, finální verze. Přihlas se jako tester v Play store nebo si najdi a instaluj hodící se verzi z F-Droid pod \"Verze\".</string> diff --git a/src/main/res/values-da/strings.xml b/src/main/res/values-da/strings.xml index 24116c46f9..76410d86af 100644 --- a/src/main/res/values-da/strings.xml +++ b/src/main/res/values-da/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Indstillinger</string> <string name="drawer_item_uploads_list">Uploade filer</string> <string name="drawer_item_activities">Aktiviteter</string> + <string name="drawer_item_notifications">Notifikationer</string> <string name="drawer_quota">%1$s af %2$s brugt</string> <string name="drawer_close">Luk</string> <string name="drawer_open">Åbn</string> @@ -42,6 +43,8 @@ <string name="prefs_accounts">Konti</string> <string name="prefs_manage_accounts">Administrer konti</string> <string name="prefs_passcode">Passcode-lås</string> + <string name="prefs_fingerprint">Fingeraftrykslås</string> + <string name="prefs_fingerprint_notsetup">Ingen fingeraftryk er blevet sat op.</string> <string name="prefs_show_hidden_files">Vis skjulte filer</string> <string name="prefs_instant_upload">Upload billeder straks</string> <string name="prefs_instant_upload_summary">Upload straks billeder taget med kameraet</string> @@ -109,6 +112,17 @@ <string name="file_list_empty_headline_server_search_photos">Ingen fotos</string> <string name="file_list_empty_search">Prøve at kigge i en anden mappe?</string> <string name="file_list_empty_recently_modified">Fandt ikke filer som var ændret i seneste 7 dage</string> + <string name="file_list_empty_recently_modified_filter">Ingen filer for din søgning, der var modificeret blev fundet +inden for de sidste 7 dage!</string> + <string name="file_list_empty_recently_added">Ingen nytilføjede filer fundet</string> + <string name="file_list_empty_recently_added_filter">Ingen nytilføjede filer for din søgning blev fundet!</string> + <string name="file_list_empty_text_photos">Upload nogle fotografier eller aktiver auto upload!</string> + <string name="file_list_empty_text_photos_filter">Ingen fotografier for din søgning blev fundet!</string> + <string name="file_list_empty_text_videos">Upload nogle videoer eller aktiver auto upload!</string> + <string name="file_list_empty_text_videos_filter">Ingen videoer for din søgning fundet</string> + <string name="upload_list_empty_headline">Ingen uploads tilgængelige</string> + <string name="upload_list_empty_text">Upload noget indhold eller aktiver øjeblikkelig upload!</string> + <string name="upload_list_empty_text_auto_upload">Upload noget indhold eller aktiver auto upload!</string> <string name="file_list_folder">mappe</string> <string name="file_list_folders">mapper</string> <string name="file_list_file">fil</string> @@ -141,6 +155,7 @@ <string name="about_title">Om</string> <string name="change_password">Skift kodeord</string> <string name="delete_account">Fjern konto</string> + <string name="delete_account_warning">Slet konto %s?\n\nDu kan ikke fortryde en sletning.</string> <string name="create_account">Opret konto</string> <string name="upload_chooser_title">Upload fra ...</string> <string name="uploader_info_dirname">Mappenavn</string> @@ -150,6 +165,7 @@ <string name="uploader_upload_succeeded_content_single">%1$s uploaded</string> <string name="uploader_upload_failed_ticker">Upload fejlede</string> <string name="uploader_upload_failed_content_single">Upload af %1$s kunne ikke gennemføres</string> + <string name="uploader_upload_failed_credentials_error">Upload fejlet, du skal logge på igen</string> <string name="uploads_view_title">Uploade filer</string> <string name="uploads_view_group_current_uploads">Nuværende</string> <string name="uploads_view_group_failed_uploads">Mislykkedes (tryk for forsøge igen)</string> @@ -158,6 +174,7 @@ <string name="uploads_view_upload_status_cancelled">Annulléret</string> <string name="uploads_view_upload_status_paused">Sat på pause</string> <string name="uploads_view_upload_status_failed_connection_error">Tilslutnings-fejl</string> + <string name="uploads_view_upload_status_failed_retry">Upload vil blive tilbagetrukket inden længe</string> <string name="uploads_view_upload_status_failed_credentials_error">Godkendelsesfejl</string> <string name="uploads_view_upload_status_failed_folder_error">Mappefejl</string> <string name="uploads_view_upload_status_failed_file_error">Filfejl</string> @@ -194,6 +211,7 @@ <string name="foreign_files_fail">Visse filer kunne ikke flyttes</string> <string name="foreign_files_local_text">Lokal: %1$s</string> <string name="foreign_files_remote_text">Fjernplacering: %1$s</string> + <string name="upload_query_move_foreign_files">Der er ikke nok plads til, at kopiere de valgte filer ind i %1$s mappen. Vil du flytte dem i stedet?</string> <string name="pass_code_enter_pass_code">Indtast venligst din adgangskode</string> <string name="pass_code_configure_your_pass_code">Angiv din passcode</string> @@ -225,6 +243,7 @@ <string name="media_play_pause_description">Afspil eller pause knap</string> <string name="media_forward_description">Hurtigt fremad-knap</string> + <string name="auth_getting_authorization">Skaffer autorisering …</string> <string name="auth_trying_to_login">Prøver at logge ind …</string> <string name="auth_no_net_conn_title">Ingen netværksforbindelse</string> <string name="auth_nossl_plain_ok_title">Sikker forbindelse ikke tilgængelig.</string> @@ -246,13 +265,19 @@ <string name="auth_unauthorized">Forkert brugernavn eller kodeord</string> <string name="auth_oauth_error">Mislykket godkendelse</string> <string name="auth_oauth_error_access_denied">Adgang afvist af autorisationsserver</string> + <string name="auth_wtf_reenter_URL">Uventet tilstand; indtast venligst server adressen igen</string> <string name="auth_expired_oauth_token_toast">Din godkendelse udløb. Gentag godkendelse</string> <string name="auth_expired_basic_auth_toast">Indtast venligst din nuværende adgangskode</string> <string name="auth_expired_saml_sso_token_toast">Din session udløb. Forbind venligst igen</string> + <string name="auth_connecting_auth_server">Forbinder til autoriseringsserver ...</string> <string name="auth_unsupported_auth_method">Serveren understøtter ikke denne godkendelsesmetode</string> <string name="auth_unsupported_multiaccount">%1$s understøtter ikke flere konti</string> - <string name="auth_account_does_not_exist">Kontoen findes endnu ikke på enheden</string> + <string name="auth_fail_get_user_name">Din server giver ikke et korrekt bruger id, kontakt venligst en administrator</string> + <string name="auth_can_not_auth_against_server">Kan ikke autorisere forbindelse til denne server</string> + <string name="auth_account_does_not_exist">Kontoen findes endnu ikke på enheden</string> + <string name="favorite">Gør tilgængelig unden internet</string> + <string name="unfavorite">Afmarker offline tilgængelighed</string> <string name="favorite_real">Angiv som favorit</string> <string name="unset_favorite_real">Fjern som favorit</string> <string name="common_rename">Omdøb</string> @@ -272,6 +297,8 @@ <string name="filename_forbidden_charaters_from_server">Filnavnet indeholder mindst ét ugyldigt tegn</string> <string name="filename_empty">Filnavnet kan ikke stå tomt.</string> <string name="wait_a_moment">Vent et øjeblik</string> + <string name="wait_checking_credentials">Undersøger lagrede certificeringer</string> + <string name="filedisplay_unexpected_bad_get_content">Uventet problem; vælg venligst filen fra en anden app</string> <string name="filedisplay_no_file_selected">Ingen fil blev valgt</string> <string name="activity_chooser_title">Send link til …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopierer fil fra privat lager.</string> @@ -301,7 +328,9 @@ <string name="ssl_validator_label_validity_to">Til:</string> <string name="ssl_validator_label_signature">Signatur:</string> <string name="ssl_validator_label_signature_algorithm">Algoritme:</string> + <string name="digest_algorithm_not_available">Denne fordøgelsesalgorytme er ikke tilgængelig på din telefon.</string> <string name="ssl_validator_label_certificate_fingerprint">Fingeraftryk:</string> + <string name="certificate_load_problem">Der er et problem med lagring af certificering.</string> <string name="ssl_validator_null_cert">Certifikatet kunne ikke vises.</string> <string name="ssl_validator_no_info_about_error">- Ingen information om fejlen</string> @@ -329,10 +358,13 @@ <string name="preview_image_error_unknown_format">Billede kan ikke vises</string> <string name="error__upload__local_file_not_copied">%1$s kunne ikke kopieres til %2$s lokale mappe</string> + <string name="prefs_instant_upload_path_title">Øjeblikkelig opload mappe</string> <string name="prefs_folder_sync_local_path_title">Lokal mappe</string> <string name="prefs_folder_sync_remote_path_title">Ekstern mappe</string> <string name="prefs_instant_upload_path_use_subfolders_title">Benyt undermapper</string> - <string name="share_link_no_support_share_api">Beklager, deling er ikke slået til på din server. Kontakt venligst din administrator.</string> + <string name="prefs_instant_upload_path_use_subfolders_summary">Lagre i undermapper baseret på år og måned</string> + + <string name="share_link_no_support_share_api">Beklager, deling er ikke slået til på din server. Kontakt venligst din administrator.</string> <string name="share_link_file_no_exist">Kan ikke dele. Tjek venligst om filen findes.</string> <string name="share_link_file_error">Der opstod en fejl ved deling af denne fil eller mappe</string> <string name="unshare_link_file_no_exist">Kan ikke fjerne deling. Tjek venligst om filen findes.</string> @@ -346,6 +378,8 @@ <string name="copy_link">Kopiér link</string> <string name="clipboard_text_copied">Kopieret til udklipsholder</string> + <string name="clipboard_no_text_to_copy">Ingen tekst modtaget til kopiering til udklipsholder</string> + <string name="clipboard_uxexpected_error">Uventet fejl under kopiering til udklipsholder</string> <string name="clipboard_label">Tekst kopieret fra %1$s</string> <string name="error_cant_bind_to_operations_service">Kritisk fejl: kan ikke udføre handlingerne</string> diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index 995e3cb14e..4bc520072c 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Konten</string> <string name="prefs_manage_accounts">Konten verwalten</string> <string name="prefs_passcode">PIN gesperrt</string> + <string name="prefs_fingerprint">Fingerabdruck-Sperre</string> + <string name="prefs_fingerprint_notsetup">Keine Fingerabdrücke eingerichtet.</string> <string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string> <string name="prefs_instant_upload">Sofortiger Bilderupload</string> <string name="prefs_instant_upload_summary">Fotos von der Kamera sofort hochladen</string> @@ -546,7 +548,6 @@ <string name="participate_testing_bug_text">Fehler gefunden? Merkwürdiges Verhalten?</string> <string name="participate_testing_report_text">Fehler melden auf Github</string> <string name="participate_testing_version_text">Möchten Sie uns beim Testen der nächsten Version unterstützen?</string> - <string name="participate_beta_headline">Teste die \"nightly\" Version</string> <string name="participate_beta_text">Dies beinhaltet neue Funktionalitäten und ist nicht vollumfänglich qualitätsgesichert. Es können daher Fehler/Bugs auftreten, melden Sie uns diese bitte.</string> <string name="participate_release_candidate_headline">Vorabversionen</string> <string name="participate_release_candidate_text">Eine Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test in der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version bei F-Droid unter „Versionen“.</string> @@ -602,6 +603,9 @@ <string name="whats_new_skip">Überspringen</string> + <string name="fingerprint_scan_finger">Bitte scannen Sie Ihren Finger</string> + <string name="fingerprint_unknown">Finger nicht erkannt</string> + <!-- User information --> <string name="user_info_full_name">Vollständiger Name</string> <string name="user_info_email">E-Mail</string> @@ -615,6 +619,28 @@ <!-- Activities --> <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> + <string name="webview_error">Fehler aufgetreten</string> + <string name="prefs_category_about">Über</string> + + <string name="actionbar_contacts">Adressen-Sicherung</string> + <string name="contacts_backup_button">Sicherung jetzt erstellen</string> + <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> + <string name="contacts_header_restore">Wiederherstellen</string> + <string name="contacts_header_backup">Sicherung</string> + <string name="contacts_automatic_backup">Adressen-Sicherung</string> + <string name="contacts_last_backup">Letzte Sicherung</string> + <string name="contacts_read_permission">Lese-Zugriffs-Erlaubnis für Adressen ist erforderlich</string> + <string name="contacts_write_permission">Schreib-Erlaubnis für Adressen ist erforderlich</string> + <string name="contactlist_title">Adressen wiederherstellen</string> + <string name="contaclist_restore_selected">Ausgewählte Adressen wiederherstellen</string> + <string name="contactlist_account_chooser_title">Konto für den Import auswählen</string> + <string name="contactlist_no_permission">Keine Berechtigung, es wurde nichts importiert!</string> + <string name="contacts_preference_choose_date">Datum auswählen</string> + <string name="contacts_preference_backup_never">nie</string> + <string name="contacts_preferences_no_file_found">Keine Datei gefunden</string> + <string name="contacts_preferences_backup_scheduled">Sicherung geplant und wird in Kürze starten</string> + <string name="contacts_preferences_import_scheduled">Import geplant und wird in Kürze starten</string> + <!-- Notifications --> <string name="new_notification_received">Neue Benachrichtigung erhalten</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index dc81940efe..d4138fd67d 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Konten</string> <string name="prefs_manage_accounts">Konten verwalten</string> <string name="prefs_passcode">PIN gesperrt</string> + <string name="prefs_fingerprint">Fingerabdruck-Sperre</string> + <string name="prefs_fingerprint_notsetup">Keine Fingerabdrücke eingerichtet.</string> <string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string> <string name="prefs_instant_upload">Sofortiger Bilder-Upload</string> <string name="prefs_instant_upload_summary">Lade Fotos von der Kamera sofort hoch</string> @@ -546,7 +548,6 @@ <string name="participate_testing_bug_text">Fehler gefunden? Komisches Verhalten?</string> <string name="participate_testing_report_text">Fehler melden auf Github</string> <string name="participate_testing_version_text">Interessiert uns beim Test der nächsten Version zu unterstützen?</string> - <string name="participate_beta_headline">Teste die \"nightly\" Version</string> <string name="participate_beta_text">Dies beinhaltet neue Funktionalitäten und ist nicht vollumfänglich qualitätsgesichert. Es können daher Fehler/Bugs auftreten, melde uns diese bitte.</string> <string name="participate_release_candidate_headline">Vorabversion</string> <string name="participate_release_candidate_text">Eine Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test in der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version bei F-Droid unter „Versionen“.</string> @@ -602,6 +603,9 @@ <string name="whats_new_skip">Überspringen</string> + <string name="fingerprint_scan_finger">Bitte scanne Deinen Finger</string> + <string name="fingerprint_unknown">Finger nicht erkannt</string> + <!-- User information --> <string name="user_info_full_name">Vollständiger Name</string> <string name="user_info_email">E-Mail</string> @@ -615,6 +619,28 @@ <!-- Activities --> <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> + <string name="webview_error">Fehler aufgetreten</string> + <string name="prefs_category_about">Über</string> + + <string name="actionbar_contacts">Adressen-Sicherung</string> + <string name="contacts_backup_button">Sicherung jetzt erstellen</string> + <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> + <string name="contacts_header_restore">Wiederherstellen</string> + <string name="contacts_header_backup">Sicherung</string> + <string name="contacts_automatic_backup">Adressen-Sicherung</string> + <string name="contacts_last_backup">Letzte Sicherung</string> + <string name="contacts_read_permission">Lese-Zugriffs-Erlaubnis für Adressen ist erforderlich</string> + <string name="contacts_write_permission">Schreib-Erlaubnis für Adressen ist erforderlich</string> + <string name="contactlist_title">Adressen wiederherstellen</string> + <string name="contaclist_restore_selected">Ausgewählte Adressen wiederherstellen</string> + <string name="contactlist_account_chooser_title">Konto für den Import auswählen</string> + <string name="contactlist_no_permission">Keine Berechtigung, es wurde nichts importiert!</string> + <string name="contacts_preference_choose_date">Datum auswählen</string> + <string name="contacts_preference_backup_never">nie</string> + <string name="contacts_preferences_no_file_found">Keine Datei gefunden</string> + <string name="contacts_preferences_backup_scheduled">Sicherung geplant und wird in Kürze starten</string> + <string name="contacts_preferences_import_scheduled">Import geplant und wird in Kürze starten</string> + <!-- Notifications --> <string name="new_notification_received">Neue Benachrichtigung erhalten</string> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 301a0c8880..d6dc1217ec 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -546,7 +546,6 @@ <string name="participate_testing_bug_text">Βρήκατε σφάλμα; Κάτι σας φαίνεται παράξενο;</string> <string name="participate_testing_report_text">Αναφέρετε σφάλμα στο Github</string> <string name="participate_testing_version_text">Σας ενδιαφέρει να μας βοηθήσετε να δοκιμάσουμε την επόμενη έκδοση;</string> - <string name="participate_beta_headline">Δοκιμάστε την έκδοση nightly</string> <string name="participate_beta_text">Αυτή περιέχει όλες τις επερχόμενες λειτουργίες και δαθέτει ότι τελευταίο έχει ενσωματωθεί. Σφάλματα/λάθη μπορεί να προκύψουν. Σας παρακαλούμε να μας τα αναφέρετε.</string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_release_candidate_text">Η υποψήφια κυκλοφορία (RC) είναι ένα στιγμιότυπο της επερχόμενης έκδοσης και αναμένεται να είναι σταθερή. Η δοκιμή της μεμονωμένης εγκατάστασής σας θα βοηθήσει στην εξασφάλιση αυτού. Εγγραφείτε για δοκιμές στο Play store ή χειροκίνητα αναζητείστε στο τμήμα \"εκδόσεις\" στο F-Droid.</string> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 4ee6d1b730..cfb7952462 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Ajustes</string> <string name="drawer_item_uploads_list">Cargas</string> <string name="drawer_item_activities">Actividades</string> + <string name="drawer_item_notifications">Notificaciones</string> <string name="drawer_quota">%1$s de %2$s usados</string> <string name="drawer_close">Cerrar</string> <string name="drawer_open">Abrir</string> @@ -42,6 +43,8 @@ <string name="prefs_accounts">Cuentas</string> <string name="prefs_manage_accounts">Administrar cuentas</string> <string name="prefs_passcode">Bloqueo de código de seguridad</string> + <string name="prefs_fingerprint">Bloqueo por huella digital</string> + <string name="prefs_fingerprint_notsetup">No se ha establecido ninguna huella digital. </string> <string name="prefs_show_hidden_files">Mostrar archivos escondidos</string> <string name="prefs_instant_upload">Carga instantánea de imágenes</string> <string name="prefs_instant_upload_summary">Cargar instantáneamente las fotografías tomadas por la cámara</string> @@ -545,7 +548,6 @@ en los últimos 7 días!</string> <string name="participate_testing_bug_text">¿Encontró una falla? ¿Hay algo raro?</string> <string name="participate_testing_report_text">Reportar un tema en Github</string> <string name="participate_testing_version_text">¿Le interesaría ayudarnos a probar la siguiente Versión?</string> - <string name="participate_beta_headline">Probar la versión nocturna</string> <string name="participate_beta_text">Esto incluye todas las próximas características y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, favor de reportarnoslos. </string> <string name="participate_release_candidate_headline">Candidato a lanzamiento</string> <string name="participate_release_candidate_text">El candidato a lanzamiento (CL) es una foto del más próximo lanzamiento y se espera que sea estable. Las pruebas a su configuración individual podría ayudarnos a asegurar esto. Regístrese para hacer pruebas en la Play Store o consulte directamente la sección de  \"versiones\" en F-Droid. </string> @@ -571,6 +573,10 @@ en los últimos 7 días!</string> <string name="activity_list_loading_activity">Cargando actividades…</string> <string name="activity_list_no_results">No se encontraron actividades. </string> + <string name="notifications_loading_activity">Cargando notificaciones…</string> + <string name="notifications_no_results_headline">No hay notificaciones</string> + <string name="notifications_no_results_message">Favor de verificar más tarde. </string> + <string name="upload_file_dialog_title">Ingrese el nombre del archivo y el tipo del archivo a cargar</string> <string name="upload_file_dialog_filename">Nombre de archivo</string> <string name="upload_file_dialog_filetype">Tipo de archivo</string> @@ -597,6 +603,9 @@ en los últimos 7 días!</string> <string name="whats_new_skip">Saltar</string> + <string name="fingerprint_scan_finger">Favor de escanear su dedo</string> + <string name="fingerprint_unknown">El dedo no ha sido reconocido</string> + <!-- User information --> <string name="user_info_full_name">Nombre completo</string> <string name="user_info_email">Correo electrónico</string> @@ -610,4 +619,30 @@ en los últimos 7 días!</string> <!-- Activities --> <string name="activities_no_results_headline">Aún no hay actividades</string> <string name="activities_no_results_message">Este flujo le mostrará eventos tales como \nagregados, cambios & compartidos</string> - </resources> + <string name="webview_error">Se presentó un error</string> + <string name="prefs_category_about">Acerca de</string> + + <string name="actionbar_contacts">Respaldo de contactos</string> + <string name="contacts_backup_button">Respaldar ahora</string> + <string name="contacts_restore_button">Restaurar el último respaldo</string> + <string name="contacts_header_restore">Restaurar</string> + <string name="contacts_header_backup">Respaldar</string> + <string name="contacts_automatic_backup">Respaldo de contactos</string> + <string name="contacts_last_backup">Último respaldo</string> + <string name="contacts_read_permission">Se requieren permisos de lectura para los contactos</string> + <string name="contacts_write_permission">Se requieren permisos de escritura para los contactos</string> + <string name="contactlist_title">Restaurar contactos</string> + <string name="contaclist_restore_selected">Restaurar los contactos seleccionados</string> + <string name="contactlist_account_chooser_title">Seleccione la cuenta para importar</string> + <string name="contactlist_no_permission">¡Sin permisos, nada ha sido importado!</string> + <string name="contacts_preference_choose_date">Seleccione una fecha</string> + <string name="contacts_preference_backup_never">nunca</string> + <string name="contacts_preferences_no_file_found">No se encontraron archivos</string> + <string name="contacts_preferences_backup_scheduled">El respaldo está calendarizado y deberá iniciar en breve</string> + <string name="contacts_preferences_import_scheduled">La importación está calendarizada y deberá iniciar en breve</string> + + <!-- Notifications --> + <string name="new_notification_received">No se han recibido nuevas notificaciones </string> + + +</resources> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index be7a9e88cb..b2756810f1 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -545,7 +545,6 @@ <string name="participate_testing_bug_text">¿Encontró un error? ¿Algo está mal?</string> <string name="participate_testing_report_text">Informar de un problema en Github</string> <string name="participate_testing_version_text">¿Está interesado en ayudarnos a probar la próxima versión?</string> - <string name="participate_beta_headline">Pruebar la versión \"nightly\" (de pruebas)</string> <string name="participate_beta_text">Esto incluye todas las características por llegar y está muy avazado en lo último. Pueden ocurrir fallos y errores, que si sucede, por favor infórmanos.</string> <string name="participate_release_candidate_headline">Versión a ser liberada</string> <string name="participate_release_candidate_text">La versión a ser liberada (release candidate - RC) es una instantánea de la próxima versión y se espera que sea estable. Probar su configuración individual podría ayudar a asegurar esto. Regístrese para probarla en Play Store o busque manualmente en la sección \"versiones\" de F-Droid.</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index f611715618..f10b380f7a 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Comptes</string> <string name="prefs_manage_accounts">Gestion des comptes</string> <string name="prefs_passcode">Code de sécurité</string> + <string name="prefs_fingerprint">Verrouillage par empreinte digitale</string> + <string name="prefs_fingerprint_notsetup">Aucune empreinte digitale n\'a été installée.</string> <string name="prefs_show_hidden_files">Afficher les fichiers masqués</string> <string name="prefs_instant_upload">Téléversement immédiat des photos</string> <string name="prefs_instant_upload_summary">Téléverser immédiatement les photos prises par la caméra</string> @@ -546,7 +548,6 @@ <string name="participate_testing_bug_text">Vous avez trouvé un bug ? Quelque chose vous semble étrange ?</string> <string name="participate_testing_report_text">Signaler un problème sur Github</string> <string name="participate_testing_version_text">Vous avez envie de nous aider en testant les futures versions ?</string> - <string name="participate_beta_headline">Testez la version Bêta</string> <string name="participate_beta_text">La version Beta inclut les dernières fonctionnalités qui sont encore toutes fraîches. Des erreurs peuvent se produire et si c\'est le cas, merci de nous les signaler.</string> <string name="participate_release_candidate_headline">Testez la version Release Candidate</string> <string name="participate_release_candidate_text">La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid.</string> @@ -602,6 +603,9 @@ <string name="whats_new_skip">Ignorer</string> + <string name="fingerprint_scan_finger">Veuillez scanner votre doigt</string> + <string name="fingerprint_unknown">Doigt non reconnu</string> + <!-- User information --> <string name="user_info_full_name">Nom complet</string> <string name="user_info_email">Adresse e-mail</string> @@ -615,6 +619,28 @@ <!-- Activities --> <string name="activities_no_results_headline">Aucune activité pour le moment</string> <string name="activities_no_results_message">Ce flux affichera des événements comme\n des ajouts, des changements & des partages</string> + <string name="webview_error">Une erreur est survenue</string> + <string name="prefs_category_about">À propos</string> + + <string name="actionbar_contacts">Copie de sauvegarde des contacts</string> + <string name="contacts_backup_button">Sauvegarder maintenant</string> + <string name="contacts_restore_button">Restaurer la dernière copie de sauvegarde</string> + <string name="contacts_header_restore">Restaurer</string> + <string name="contacts_header_backup">Copie de sauvegarde</string> + <string name="contacts_automatic_backup">Copie de sauvegarde des contacts</string> + <string name="contacts_last_backup">Dernière copie de sauvegarde</string> + <string name="contacts_read_permission">L\'autorisation de lecture des contacts est nécessaire</string> + <string name="contacts_write_permission">L\'autorisation d\'écriture des contacts est nécessaire</string> + <string name="contactlist_title">Restaurer les contacts</string> + <string name="contaclist_restore_selected">Restaurer les contacts sélectionnés</string> + <string name="contactlist_account_chooser_title">Choisissez un compte pour importer</string> + <string name="contactlist_no_permission">Aucune autorisation, rien d\'importé !</string> + <string name="contacts_preference_choose_date">Choisir la date</string> + <string name="contacts_preference_backup_never">jamais</string> + <string name="contacts_preferences_no_file_found">Aucun fichier trouvé</string> + <string name="contacts_preferences_backup_scheduled">Sauvegarde planifiée et va commencer prochainement</string> + <string name="contacts_preferences_import_scheduled">Importation planifiée et va commencer prochainement</string> + <!-- Notifications --> <string name="new_notification_received">Nouvelle notification reçue</string> diff --git a/src/main/res/values-hu-rHU/strings.xml b/src/main/res/values-hu-rHU/strings.xml index 5b68e93644..ffa5191c80 100644 --- a/src/main/res/values-hu-rHU/strings.xml +++ b/src/main/res/values-hu-rHU/strings.xml @@ -542,7 +542,6 @@ <string name="participate_testing_bug_text">Hibát találtál? Valami furcsa?</string> <string name="participate_testing_report_text">Jelentsd a problémát a Githubon</string> <string name="participate_testing_version_text">Érdekel a következő verzió tesztelési lehetősége?</string> - <string name="participate_beta_headline">Nightly verzió tesztelése</string> <string name="participate_release_candidate_headline">Kiadásra jelölt</string> <string name="participate_release_candidate_text">A kiadásra jelölt (RC) változat az egy pillanatképe a közelgő új változatnak, és stabilnak mondható. Az egyedi telepítésekkel segíthet nekünk, hogy ezt biztosítsuk. Jelentkezzen tesztelésre a Play Áruházban vagy manuálisan nézzen bele a verziók részbe F-Droid-on.</string> <string name="participate_contribute_headline">Aktívan hozzájárul</string> diff --git a/src/main/res/values-is/strings.xml b/src/main/res/values-is/strings.xml index 3e4ff59f41..e1a9917ebf 100644 --- a/src/main/res/values-is/strings.xml +++ b/src/main/res/values-is/strings.xml @@ -545,7 +545,6 @@ <string name="participate_testing_bug_text">Fannstu villu? Eitthvað er skrýtið?</string> <string name="participate_testing_report_text">Tilkynna um vandamál á Github</string> <string name="participate_testing_version_text">Hefurðu áhuga á að hjálpa okkur með næstu útgáfu?</string> - <string name="participate_beta_headline">Prófa náttfaraútgáfuna</string> <string name="participate_beta_text">Þetta innifelur alla nýjust eiginleika og er alveg á jaðri framþróunarinnar. Villur og hnökrar geta komið upp, og ef slíkt gerist skaltu endilega tilkynna um þær til okkar.</string> <string name="participate_release_candidate_headline">Forútgáfa</string> <string name="participate_release_candidate_text">Útgáfukandídatinn (release candidate = RC) er skyndiútgáfa af væntanlegri útgáfu og er ætlað að vera nokkuð stöðug. Þú getur hjálpað til við að tryggja stöðugleikann með því að prófa þína eigin uppsetningu. Skráðu þig í prófanir í Play Store eða handvirkt með því að fara í \"útgáfur\"-hlutann í F-Droid.</string> diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index 58ca1c2bb6..05b0653edc 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -21,12 +21,14 @@ <string name="drawer_item_favorites">Preferiti</string> <string name="drawer_item_photos">Foto</string> <string name="drawer_item_on_device">Su dispositivo</string> + <string name="drawer_item_recently_added">Aggiunto di recente</string> <string name="drawer_item_recently_modified">Modificato di recente</string> <string name="drawer_item_shared">Condiviso</string> <string name="drawer_item_videos">Video</string> <string name="drawer_item_settings">Impostazioni</string> <string name="drawer_item_uploads_list">Caricamenti</string> <string name="drawer_item_activities">Attività</string> + <string name="drawer_item_notifications">Notifiche</string> <string name="drawer_quota">%1$s di %2$s utilizzati</string> <string name="drawer_close">Chiudi</string> <string name="drawer_open">Apri</string> @@ -35,6 +37,7 @@ <string name="prefs_accounts">Account</string> <string name="prefs_manage_accounts">Gestisci account</string> <string name="prefs_passcode">Blocco con codice di sicurezza</string> + <string name="prefs_fingerprint">Blocco con impronta digitale</string> <string name="prefs_show_hidden_files">Mostra i file nascosti</string> <string name="prefs_instant_upload">Caricamenti istantanei delle foto</string> <string name="prefs_instant_upload_summary">Carica immediatamente le foto dalla fotocamera</string> @@ -93,9 +96,12 @@ <string name="file_list_empty_headline_search">Nessun risultato in questa cartella</string> <string name="file_list_empty_headline_server_search">Nessun risultato</string> <string name="file_list_empty_favorite_headline">Nessun preferito</string> + <string name="file_list_empty_shared_headline">Ancora nessuna condivisione</string> <string name="file_list_empty_headline_server_search_videos">Nessun video</string> <string name="file_list_empty_headline_server_search_photos">Nessuna foto</string> <string name="file_list_empty_search">Vuoi provare a cercare in un\'altra cartella?</string> + <string name="file_list_empty_text_photos_filter">Nessuna foto trovata per la tua ricerca!</string> + <string name="file_list_empty_text_videos_filter">Nessun video trovato per la tua ricerca!</string> <string name="upload_list_empty_headline">Nessun caricamento disponibile</string> <string name="upload_list_empty_text">Carica alcuni contenuti o attiva il caricamento istantaneo!</string> <string name="file_list_folder">cartella</string> @@ -253,6 +259,7 @@ <string name="favorite">Imposta come disponibile non in linea</string> <string name="unfavorite">Rimuovi come disponibile non in linea</string> + <string name="favorite_real">Imposta come preferito</string> <string name="common_rename">Rinomina</string> <string name="common_remove">Rimuovi</string> <string name="confirmation_remove_file_alert">Vuoi davvero rimuovere %1$s?</string> @@ -521,7 +528,6 @@ <string name="participate_testing_bug_text">Hai trovato un bug? Qualcosa di strano?</string> <string name="participate_testing_report_text">Segnala un problema su GitHub</string> <string name="participate_testing_version_text">Sei interessato ad aiutarci a provare la nostra prossima versione?</string> - <string name="participate_beta_headline">Prova la versione nigthly</string> <string name="participate_release_candidate_headline">Candidata al rilascio</string> <string name="participate_release_candidate_text">Questa candidata al rilascio (RC) è uno snapshot della prossima versione e dovrebbe essere stabile. La prova della tua specifica configurazione potrebbe aiutare ad assicurare che lo sia. Registrati per i test su Google Play o controlla manualmente nella sezione \"versioni\" su F-Droid.</string> <string name="participate_contribute_headline">Contribuisci attivamente</string> @@ -546,6 +552,8 @@ <string name="activity_list_loading_activity">Caricamento attività in corso …</string> <string name="activity_list_no_results">Nessuna attività trovata.</string> + <string name="notifications_loading_activity">Caricamento notifiche in corso…</string> + <string name="notifications_no_results_headline">Nessuna notifica</string> <string name="upload_file_dialog_title">Digita il nome e il tipo del file da caricare</string> <string name="upload_file_dialog_filename">Nome file</string> <string name="upload_file_dialog_filetype">Tipo file</string> @@ -572,6 +580,8 @@ <string name="whats_new_skip">Salta</string> + <string name="fingerprint_unknown">Dito non riconosciuto</string> + <!-- User information --> <string name="user_info_full_name">Nome completo</string> <string name="user_info_email">Posta elettronica</string> @@ -585,4 +595,26 @@ <!-- Activities --> <string name="activities_no_results_headline">Ancora nessuna attività</string> <string name="activities_no_results_message">Questo flusso mostrerà gli eventi come aggiunte, cambiamenti e condivisioni</string> - </resources> + <string name="webview_error">Si è verificato un errore</string> + <string name="prefs_category_about">Informazioni</string> + + <string name="actionbar_contacts">Backup contatti</string> + <string name="contacts_restore_button">Ripristina ultimo backup</string> + <string name="contacts_header_restore">Ripristino</string> + <string name="contacts_header_backup">Backup</string> + <string name="contacts_automatic_backup">Backup dei contatti</string> + <string name="contacts_last_backup">Ultimo backup</string> + <string name="contacts_read_permission">Permesso di lettura dei contatti richiesto</string> + <string name="contacts_write_permission">Permesso di scrittura per i contatti richiesto</string> + <string name="contactlist_title">Ripristina contatti</string> + <string name="contaclist_restore_selected">Ripristina contatti selezionati</string> + <string name="contactlist_account_chooser_title">Scegli account per l\'importazione</string> + <string name="contactlist_no_permission">Nessun permesso, non è stato importato niente!</string> + <string name="contacts_preference_choose_date">Scegli data</string> + <string name="contacts_preference_backup_never">mai</string> + <string name="contacts_preferences_no_file_found">Nessun file trovato</string> + <!-- Notifications --> + <string name="new_notification_received">Nuova notifica ricevuta</string> + + +</resources> diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index 6ac2bb2548..90e1796dd7 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -546,7 +546,6 @@ <string name="participate_testing_bug_text">バグがありましたか? なにか問題がありますか?</string> <string name="participate_testing_report_text">Githubでエラーを報告する</string> <string name="participate_testing_version_text">次のバージョンのテストに興味がありますか?</string> - <string name="participate_beta_headline">ナイトリーバージョンのテスト</string> <string name="participate_beta_text">これは、すべての最新の機能が含まれており、非常に最先端です。 バグ/エラーが発生する可能性があります。もしその場合は、私たちに報告してください。</string> <string name="participate_release_candidate_headline">リリース候補</string> <string name="participate_release_candidate_text">リリース候補(RC)は、今後のリリースのスナップショット であり、安定性が期待されます。 個々の設定をテストすることで、これを確実にすることができます。 Playストアでのテストに登録するか、F-Droidの「バージョン」セクションを手動で参照してください。</string> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 0149b3cbc8..c92cbf1d09 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -532,7 +532,6 @@ <string name="participate_testing_bug_text">Funnet en feil? Føles noe rart?</string> <string name="participate_testing_report_text">Meld en feil på Github</string> <string name="participate_testing_version_text">Er du interessert i å hjelpe oss å teste ned neste versjonen?</string> - <string name="participate_beta_headline">Test nattskiftversjonen</string> <string name="participate_beta_text">Dette inkluderer alle kommende funksjoner og er helt på kanten. Feil/feilmeldinger kan oppstå og i sådant fall, meld fra om dem til oss.</string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_release_candidate_text">Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid.</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 3153171747..ab7532e2c2 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -544,7 +544,6 @@ <string name="participate_testing_bug_text">Foutje gevonden? Of iets raars?</string> <string name="participate_testing_report_text">Meld het op Github</string> <string name="participate_testing_version_text">Geïnteresseerd om ons te helpen de volgende versie te testen?</string> - <string name="participate_beta_headline">Test de nightly-versie</string> <string name="participate_beta_text">Dit omvat alle komende opties en is zeer \'bleeding edge\'. Bugs/fouten kunnen voorkomen en in dat geval vragen we je die aan ons te melden.</string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_release_candidate_text">De Release Candidate (RC) is een kopie van de komende release en zou stabiel moeten zijn. Testen van jouw installatie kan ons helpen om dit te bevestigen. Meld je aan om te testen op de Play Store of bekijk handmatig de \"versies\"-sectie op F-Droid.</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 78c6dc4228..c4ad78b9b2 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -546,7 +546,6 @@ <string name="participate_testing_bug_text">Znaleziono błąd? Jest coś dziwnego?</string> <string name="participate_testing_report_text">Zgłoś błąd na GitHubie</string> <string name="participate_testing_version_text">Chcesz pomóc nam testować następną wersję?</string> - <string name="participate_beta_headline">Testuj wersję nocną</string> <string name="participate_beta_text">Zawiera to w sobie wszystkie nadchodzące funkcjonalności i jest bardzo ryzykowne. Mogą się pojawiać błędy. Jeśli będą proszę je do nas zgłosić.</string> <string name="participate_release_candidate_headline">Wydanie kandydujące</string> <string name="participate_release_candidate_text">Release Candidate (RC) jest zarysem nadchodzącego wydania i oczekujemy że będzie stabilne. Testowanie indywidualnej konfiguracji może pomóc, aby to zapewnić. Zapisz się do testowania w sklepie Play lub ręcznie szukaj w sekcji \"wersje\" na F-Droid.</string> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 0b684d740f..329ee18031 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Contas</string> <string name="prefs_manage_accounts">Gerenciar contas</string> <string name="prefs_passcode">Bloqueio de código de acesso</string> + <string name="prefs_fingerprint">Bloqueio por impressão digital</string> + <string name="prefs_fingerprint_notsetup">Nenhuma impressão digital foi configurada.</string> <string name="prefs_show_hidden_files">Mostrar arquivos escondidos</string> <string name="prefs_instant_upload">Envio automático de imagens</string> <string name="prefs_instant_upload_summary">Envia automaticamente as fotos tiradas com a câmera</string> @@ -546,7 +548,6 @@ foram encontrados para sua pesquisa! </string> <string name="participate_testing_bug_text">Encontrou um erro? Algo está estranho?</string> <string name="participate_testing_report_text">Relate o problema no Github</string> <string name="participate_testing_version_text">Está interessado em ajudar-nos a testar a próxima versão?</string> - <string name="participate_beta_headline">Teste a versão beta</string> <string name="participate_beta_text">Isso inclui todos os próximos recursos. Erros pode ocorrer e irão. Por favor, reporte-os a nós.</string> <string name="participate_release_candidate_headline">Candidato a versão</string> <string name="participate_release_candidate_text">O candidato à versão (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode ajudar a garantir isso. Registre-se para testar na Play Store ou procure manualmente na seção \"versões\" na F-Droid.</string> @@ -602,6 +603,9 @@ foram encontrados para sua pesquisa! </string> <string name="whats_new_skip">Pular</string> + <string name="fingerprint_scan_finger">Por favor escaneie sua impressão digital</string> + <string name="fingerprint_unknown">Impressão digital não reconhecida</string> + <!-- User information --> <string name="user_info_full_name">Nome completo</string> <string name="user_info_email">Email</string> @@ -615,6 +619,28 @@ foram encontrados para sua pesquisa! </string> <!-- Activities --> <string name="activities_no_results_headline">Nenhuma atividade ainda</string> <string name="activities_no_results_message">O stream irá mostrar eventos como\nadições, mudanças & compartilhamentos</string> + <string name="webview_error">Um erro ocorreu</string> + <string name="prefs_category_about">Sobre</string> + + <string name="actionbar_contacts">Backup dos contatos</string> + <string name="contacts_backup_button">Backup agora</string> + <string name="contacts_restore_button">Retornar último backup</string> + <string name="contacts_header_restore">Retornar</string> + <string name="contacts_header_backup">Backup</string> + <string name="contacts_automatic_backup">Backup dos contatos</string> + <string name="contacts_last_backup">Último backup</string> + <string name="contacts_read_permission">A permissão de leitura dos contatos é necessária</string> + <string name="contacts_write_permission">A permissão de gravação dos contatos é necessária</string> + <string name="contactlist_title">Restaurar contatos</string> + <string name="contaclist_restore_selected">Restaurar contatos selecionados</string> + <string name="contactlist_account_chooser_title">Escolha a conta a importar</string> + <string name="contactlist_no_permission">Sem permissão. Nada foi importado!</string> + <string name="contacts_preference_choose_date">Escolha a data</string> + <string name="contacts_preference_backup_never">nunca</string> + <string name="contacts_preferences_no_file_found">Nenhum arquivo encontrado</string> + <string name="contacts_preferences_backup_scheduled">Backup agendado e irá iniciar em breve</string> + <string name="contacts_preferences_import_scheduled">Backup importado e irá iniciar em breve</string> + <!-- Notifications --> <string name="new_notification_received">Nova notificação recebida</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 6daf882d50..3dee1dc64d 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Аккаунты</string> <string name="prefs_manage_accounts">Управление аккаунтами</string> <string name="prefs_passcode">Блокировка кодом</string> + <string name="prefs_fingerprint">Блокировка отпечатком пальца</string> + <string name="prefs_fingerprint_notsetup">Отпечатки не были настроены.</string> <string name="prefs_show_hidden_files">Показать скрытые файлы</string> <string name="prefs_instant_upload">Моментальная загрузка изображений</string> <string name="prefs_instant_upload_summary">Немедленно загружать изображения, сделанные камерой</string> @@ -136,7 +138,7 @@ <string name="filedetails_sync_file">Синхронизировать</string> <string name="filedetails_renamed_in_upload_msg">Файл был переименован в %1$s во время загрузки</string> <string name="list_layout">Вид списка</string> - <string name="action_share">Общий доступ</string> + <string name="action_share">Поделиться</string> <string name="common_yes">Да</string> <string name="common_no">Нет</string> <string name="common_ok">ОК</string> @@ -212,11 +214,11 @@ <string name="foreign_files_local_text">Локальные: %1$s</string> <string name="foreign_files_remote_text">Удалённые: %1$s</string> <string name="upload_query_move_foreign_files">Недостаточно места для копирования выбранных файлов в папку %1$s. Вы хотите их переместить?</string> - <string name="pass_code_enter_pass_code">Пожалуйста укажите ваш код</string> + <string name="pass_code_enter_pass_code">Введите ваш код</string> - <string name="pass_code_configure_your_pass_code">Укажите ваш код</string> + <string name="pass_code_configure_your_pass_code">Введите код</string> <string name="pass_code_configure_your_pass_code_explanation">Код будет запрашиваться каждый раз при запуске приложения</string> - <string name="pass_code_reenter_your_pass_code">Пожалуйста укажите ваш код ещё раз</string> + <string name="pass_code_reenter_your_pass_code">Введите ваш код ещё раз</string> <string name="pass_code_remove_your_pass_code">Убрать код</string> <string name="pass_code_mismatch">Коды не совпадают</string> <string name="pass_code_wrong">Некорректный код</string> @@ -267,9 +269,9 @@ <string name="auth_oauth_error_access_denied">Сервер авторизации отказал в доступе</string> <string name="auth_wtf_reenter_URL">Неожиданное состояние; пожалуйста укажите адрес сервера повторно</string> <string name="auth_expired_oauth_token_toast">Время авторизации истекло. Пожалуйста, авторизуйтесь снова</string> - <string name="auth_expired_basic_auth_toast">Пожалуйста укажите текущий пароль</string> + <string name="auth_expired_basic_auth_toast">Введите текущий пароль</string> <string name="auth_expired_saml_sso_token_toast">Время сессии истекло. Пожалуйста, подключитесь снова</string> - <string name="auth_connecting_auth_server">Подключение к серверу авторизации ...</string> + <string name="auth_connecting_auth_server">Подключение к серверу аутентификации…</string> <string name="auth_unsupported_auth_method">Сервер не поддерживает выбранный метод аутентификации</string> <string name="auth_unsupported_multiaccount">%1$s не поддерживает множественные аккаунты</string> <string name="auth_fail_get_user_name">Сервер не вернул верный пользовательский идентификатор. Пожалуйста, свяжитесь с вашим администратором</string> @@ -369,7 +371,7 @@ <string name="share_link_file_error">При попытке поделиться этим файлом или каталогом произошла ошибка</string> <string name="unshare_link_file_no_exist">Невозможно закрыть доступ. Убедитесь что файл существует</string> <string name="unshare_link_file_error">При попытке закрыть доступ к этому файлу или каталогу произошла ошибка</string> - <string name="update_link_file_no_exist">Не удается обновить. Пожалуйста, проверьте, существует ли файл</string> + <string name="update_link_file_no_exist">Обновить не удалось. Проверьте, существует ли файл</string> <string name="update_link_file_error">Произошла ошибка во время обновления ссылки доступа</string> <string name="share_link_password_title">Введите пароль</string> <string name="share_link_empty_password">Вы должны ввести пароль</string> @@ -417,7 +419,7 @@ <string name="file_migration_failed_while_updating_index">ОШИБКА: При обновлении индекса</string> <string name="file_migration_directory_already_exists">Каталог с данными уже существует. Что делать?</string> - <string name="file_migration_override_data_folder">Отвергать</string> + <string name="file_migration_override_data_folder">Перезаписать</string> <string name="file_migration_use_data_folder">Использовать существующий</string> <string name="prefs_category_accounts">Аккаунты</string> @@ -427,7 +429,7 @@ <string name="actionbar_logger">Журналы</string> <string name="log_send_history_button">Отправить историю</string> - <string name="log_send_no_mail_app">Программа для отправки журналов не найдена. Пожалуйста установите почтовое приложение.</string> + <string name="log_send_no_mail_app">Программа для отправки журналов не найдена. Установите приложение для работы с почтой.</string> <string name="log_send_mail_subject">Журналы приложения %1$s для Android</string> <string name="log_progress_dialog_text">Загрузка данных …</string> @@ -486,7 +488,7 @@ <string name="pref_behaviour_entries_keep_file">оставлен в исходном каталоге</string> <string name="pref_behaviour_entries_move">перемещен в каталог приложения</string> <string name="pref_behaviour_entries_delete_file">удалён</string> - <string name="prefs_storage_path">Путь хранилища</string> + <string name="prefs_storage_path">Путь к хранилищу</string> <string name="prefs_common">Основные</string> <string name="share_dialog_title">Общий доступ</string> @@ -504,7 +506,7 @@ <string name="share_with_title">Поделиться с …</string> <string name="share_with_edit_title">Поделиться с %1$s</string> - <string name="share_search">Найти</string> + <string name="share_search">Поиск</string> <string name="search_users_and_groups_hint">Поиск пользователей и групп</string> <string name="share_group_clarification">%1$s (группа)</string> @@ -513,13 +515,13 @@ <string name="share_known_remote_clarification">%1$s ( в %2$s )</string> <string name="share_sharee_unavailable">Извините, версия вашего сервера не позволяет поделиться с пользователями через клиент. \nПожалуйста обратитесь к администратору</string> - <string name="share_privilege_can_share">можно поделиться</string> - <string name="share_privilege_can_edit">можно редактировать</string> + <string name="share_privilege_can_share">может делиться с другими</string> + <string name="share_privilege_can_edit">может редактировать</string> <string name="share_privilege_can_edit_create">создать</string> <string name="share_privilege_can_edit_change">изменить</string> <string name="share_privilege_can_edit_delete">удалить</string> <string name="edit_share_unshare">Закрыть общий доступ</string> - <string name="edit_share_done">завершено</string> + <string name="edit_share_done">готово</string> <string name="action_retry_uploads">Повторить неудавшиеся</string> <string name="action_clear_failed_uploads">Очистить неудавшиеся</string> @@ -548,7 +550,6 @@ <string name="participate_testing_bug_text">Нашли ошибку? Заметили необычное поведение программы?</string> <string name="participate_testing_report_text">Сообщить о проблеме на Github</string> <string name="participate_testing_version_text">Вам интересно участие в тестировании следующих версий?</string> - <string name="participate_beta_headline">Протестируйте \"ночную\" версию</string> <string name="participate_beta_text">Она включает в себя все готовящиеся возможности с самой передовой. Могут появляться баги, в таком случае, напишите о них нам</string> <string name="participate_release_candidate_headline">Кандидат в релизы</string> <string name="participate_release_candidate_text">Релиз-кандидат (RC) - это текущее состояние готовящегося выпуска, и, ожидается, что он будет стабильным. Проверка с вашими индивидуальными настройками может помочь убедится в этом. Зарегистрируйтесь для тестирования в Google Play или используйте раздел \"версии\" в каталоге приложений F-Droid.</string> @@ -606,6 +607,9 @@ <string name="whats_new_skip">Пропустить</string> + <string name="fingerprint_scan_finger">Приложите палец</string> + <string name="fingerprint_unknown">Отпечаток не распознан</string> + <!-- User information --> <string name="user_info_full_name">Полное имя</string> <string name="user_info_email">Эл. почта</string> @@ -619,6 +623,28 @@ <!-- Activities --> <string name="activities_no_results_headline">Событий ещё нет</string> <string name="activities_no_results_message">Этот поток будет отображать события вроде\nдобавления, изменения файлов или открытия доступа к ним</string> + <string name="webview_error">Произошла ошибка</string> + <string name="prefs_category_about">О программе</string> + + <string name="actionbar_contacts">Резервное копирование контактов</string> + <string name="contacts_backup_button">Создать резервную копию сейчас</string> + <string name="contacts_restore_button">Восстановить из резервной копии</string> + <string name="contacts_header_restore">Восстановить</string> + <string name="contacts_header_backup">Резервное копирование</string> + <string name="contacts_automatic_backup">Резервное копирование контактов</string> + <string name="contacts_last_backup">Последнее резервное копирование</string> + <string name="contacts_read_permission">Требуется разрешение на чтение контактов</string> + <string name="contacts_write_permission">Требуется разрешение на запись контактов</string> + <string name="contactlist_title">Восстановить контакты</string> + <string name="contaclist_restore_selected">Восстановить выбранные контакты</string> + <string name="contactlist_account_chooser_title">Выберите аккаунт для импорта</string> + <string name="contactlist_no_permission">Отсутствуют разрешения, ничего не импортировано!</string> + <string name="contacts_preference_choose_date">Выберите дату</string> + <string name="contacts_preference_backup_never">никогда</string> + <string name="contacts_preferences_no_file_found">Файл не найден</string> + <string name="contacts_preferences_backup_scheduled">Резервное копирование запланировано и скоро начётся</string> + <string name="contacts_preferences_import_scheduled">Импорт запланирован и скоро начнётся</string> + <!-- Notifications --> <string name="new_notification_received">Получено новое уведомление</string> diff --git a/src/main/res/values-sk-rSK/strings.xml b/src/main/res/values-sk-rSK/strings.xml index 4e6333ad18..1195bfb9d9 100644 --- a/src/main/res/values-sk-rSK/strings.xml +++ b/src/main/res/values-sk-rSK/strings.xml @@ -512,7 +512,6 @@ <string name="participate_testing_bug_text">Našli ste chybu? Niečo nefunguje?</string> <string name="participate_testing_report_text">Nahlásiť chybu na Githube</string> <string name="participate_testing_version_text">Máte záujem pomôcť nám s testovaním ďalšej Verzie?</string> - <string name="participate_beta_headline">Testovať nočnú verziu</string> <string name="participate_beta_text">Táto verzia obsahuje všetký pripravované funkcie. Je veľmi nestabilná a môže obsahovať chyby. Ak na ne natrafíte, prosím nahláste nám ich. </string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_contribute_headline">Aktívne prispievať</string> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index b1440a9b10..83e8479e28 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Hesaplar</string> <string name="prefs_manage_accounts">Hesap yönetimi</string> <string name="prefs_passcode">Parola kod kilidi</string> + <string name="prefs_fingerprint">Parmak izi kilidi</string> + <string name="prefs_fingerprint_notsetup">Henüz bir parmak izi ayarlanmamış.</string> <string name="prefs_show_hidden_files">Gizli dosyaları görüntüle</string> <string name="prefs_instant_upload">Fotoğraflar anında yüklensin</string> <string name="prefs_instant_upload_summary">Kamera ile çekilen fotoğraflar anında yüklensin</string> @@ -545,7 +547,6 @@ <string name="participate_testing_bug_text">Bir hata mı buldunuz? Bir gariplik mi var?</string> <string name="participate_testing_report_text">Github üzerinden bir sorun bildirin</string> <string name="participate_testing_version_text">Gelecek sürümler için bize yardımcı olmak ister misiniz?</string> - <string name="participate_beta_headline">Gecelik sürümü deneyin</string> <string name="participate_beta_text">Bu sürümde tüm yeni özellikler bulunur ve çok taze olduğundan hata ve sorunlar olabilir. Bir hata ya da soruna rastlarsanız bize iletin.</string> <string name="participate_release_candidate_headline">Yayın adayı</string> <string name="participate_release_candidate_text">Yayın adayı (Release Candidate, RC) yayınlanacak sürümün bir kopyasıdır ve kararlı olması beklenir. Kişisel olarak kullanmanız kararlı olduğundan emin olmamızı sağlar. Denemek için Play Store üzerinden kayıt olun ya da el ile F-Droid üzerindeki \"sürümlere\" bakın.</string> @@ -601,6 +602,9 @@ <string name="whats_new_skip">Atla</string> + <string name="fingerprint_scan_finger">Lütfen parmağınızı tarayın</string> + <string name="fingerprint_unknown">Parmak tanınamadı</string> + <!-- User information --> <string name="user_info_full_name">Tam ad</string> <string name="user_info_email">E-posta</string> @@ -614,6 +618,28 @@ <!-- Activities --> <string name="activities_no_results_headline">Henüz bir işlem yapılmamış</string> <string name="activities_no_results_message">Bu akışta ekleme, değiştirme\nve paylaşım gibi işlemler görüntülenir</string> + <string name="webview_error">Sorun çıktı</string> + <string name="prefs_category_about">Hakkında</string> + + <string name="actionbar_contacts">Kişileri Yedekle</string> + <string name="contacts_backup_button">Şimdi yedekle</string> + <string name="contacts_restore_button">Son Yedeği Geri Yükle</string> + <string name="contacts_header_restore">Geri Yükle</string> + <string name="contacts_header_backup">Yedekle</string> + <string name="contacts_automatic_backup">Kişileri Yedekle</string> + <string name="contacts_last_backup">Son Yedek</string> + <string name="contacts_read_permission">Kişileri okuma izni gerekiyor</string> + <string name="contacts_write_permission">Kişilere yazma izni gerekiyor</string> + <string name="contactlist_title">Kişileri geri yükle</string> + <string name="contaclist_restore_selected">Seçilmiş kişileri geri yükle</string> + <string name="contactlist_account_chooser_title">Alınacak hesabı seçin</string> + <string name="contactlist_no_permission">İzin verilmemiş olduğundan hiçbir şey alınamadı!</string> + <string name="contacts_preference_choose_date">Tarih seçin</string> + <string name="contacts_preference_backup_never">asla</string> + <string name="contacts_preferences_no_file_found">Herhangi bir dosya bulunamadı</string> + <string name="contacts_preferences_backup_scheduled">Yedekleme zamanlandı ve kısa süre sonra başlatılacak</string> + <string name="contacts_preferences_import_scheduled">Alma işlemi zamanlandı ve kısa süre sonra başlatılacak</string> + <!-- Notifications --> <string name="new_notification_received">Yeni bir bildirim var</string> diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 176c0af4bd..980ec933fa 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -545,7 +545,6 @@ <string name="participate_testing_bug_text">发现一个错误?事情很奇怪?</string> <string name="participate_testing_report_text">在GIthub在报告问题</string> <string name="participate_testing_version_text">有感兴趣帮我们测试下一个版本吗?</string> - <string name="participate_beta_headline">测试每日构建版本</string> <string name="participate_beta_text">这包括所有即将加入的特性,有相当的风险。如果Bug 或错误发生,请向我们报告。</string> <string name="participate_release_candidate_headline">发行候选版本</string> <string name="participate_release_candidate_text">候选发行版(RC)是下一个版本的快照,希望它是稳定的,你可以帮助测试以确认这一点。可以注册登陆在应用商店或手工在F-Droid的版本部分查找,并进行测试。</string> From a70967efc0711bd1f4f5f5953fae4cf2c4ca711b Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Sun, 23 Apr 2017 00:20:25 +0000 Subject: [PATCH 766/881] [tx-robot] updated from transifex --- src/main/res/values-de-rDE/strings.xml | 1 + src/main/res/values-de/strings.xml | 1 + src/main/res/values-fr/strings.xml | 1 + src/main/res/values-nl/strings.xml | 39 +++++++++++++++++++++++++- src/main/res/values-pt-rBR/strings.xml | 1 + src/main/res/values-ru/strings.xml | 1 + 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index 4bc520072c..d857352cae 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -548,6 +548,7 @@ <string name="participate_testing_bug_text">Fehler gefunden? Merkwürdiges Verhalten?</string> <string name="participate_testing_report_text">Fehler melden auf Github</string> <string name="participate_testing_version_text">Möchten Sie uns beim Testen der nächsten Version unterstützen?</string> + <string name="participate_beta_headline">Testen Sie die Beta-Version</string> <string name="participate_beta_text">Dies beinhaltet neue Funktionalitäten und ist nicht vollumfänglich qualitätsgesichert. Es können daher Fehler/Bugs auftreten, melden Sie uns diese bitte.</string> <string name="participate_release_candidate_headline">Vorabversionen</string> <string name="participate_release_candidate_text">Eine Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test in der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version bei F-Droid unter „Versionen“.</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index d4138fd67d..d7b9e37a8e 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -548,6 +548,7 @@ <string name="participate_testing_bug_text">Fehler gefunden? Komisches Verhalten?</string> <string name="participate_testing_report_text">Fehler melden auf Github</string> <string name="participate_testing_version_text">Interessiert uns beim Test der nächsten Version zu unterstützen?</string> + <string name="participate_beta_headline">Teste die Entwicklerversion</string> <string name="participate_beta_text">Dies beinhaltet neue Funktionalitäten und ist nicht vollumfänglich qualitätsgesichert. Es können daher Fehler/Bugs auftreten, melde uns diese bitte.</string> <string name="participate_release_candidate_headline">Vorabversion</string> <string name="participate_release_candidate_text">Eine Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test in der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version bei F-Droid unter „Versionen“.</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index f10b380f7a..d1d808b062 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -548,6 +548,7 @@ <string name="participate_testing_bug_text">Vous avez trouvé un bug ? Quelque chose vous semble étrange ?</string> <string name="participate_testing_report_text">Signaler un problème sur Github</string> <string name="participate_testing_version_text">Vous avez envie de nous aider en testant les futures versions ?</string> + <string name="participate_beta_headline">Testez la version Bêta</string> <string name="participate_beta_text">La version Beta inclut les dernières fonctionnalités qui sont encore toutes fraîches. Des erreurs peuvent se produire et si c\'est le cas, merci de nous les signaler.</string> <string name="participate_release_candidate_headline">Testez la version Release Candidate</string> <string name="participate_release_candidate_text">La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid.</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index ab7532e2c2..f17e580343 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Instellingen</string> <string name="drawer_item_uploads_list">Uploads</string> <string name="drawer_item_activities">Activiteiten</string> + <string name="drawer_item_notifications">Meldingen</string> <string name="drawer_quota">%1$s van %2$s gebruikt</string> <string name="drawer_close">Sluiten</string> <string name="drawer_open">Openen</string> @@ -42,6 +43,8 @@ <string name="prefs_accounts">Accounts</string> <string name="prefs_manage_accounts">Accounts beheren</string> <string name="prefs_passcode">Toegangscode</string> + <string name="prefs_fingerprint">Vingerafdrukbeveiliging</string> + <string name="prefs_fingerprint_notsetup">Er zijn geen vingerafdrukken ingesteld.</string> <string name="prefs_show_hidden_files">Verborgen bestanden weergeven</string> <string name="prefs_instant_upload">Directe upload van afbeeldingen</string> <string name="prefs_instant_upload_summary">Direct uploaden van foto\'s genomen met de camera</string> @@ -544,6 +547,7 @@ <string name="participate_testing_bug_text">Foutje gevonden? Of iets raars?</string> <string name="participate_testing_report_text">Meld het op Github</string> <string name="participate_testing_version_text">Geïnteresseerd om ons te helpen de volgende versie te testen?</string> + <string name="participate_beta_headline">Test de dev versie</string> <string name="participate_beta_text">Dit omvat alle komende opties en is zeer \'bleeding edge\'. Bugs/fouten kunnen voorkomen en in dat geval vragen we je die aan ons te melden.</string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_release_candidate_text">De Release Candidate (RC) is een kopie van de komende release en zou stabiel moeten zijn. Testen van jouw installatie kan ons helpen om dit te bevestigen. Meld je aan om te testen op de Play Store of bekijk handmatig de \"versies\"-sectie op F-Droid.</string> @@ -569,6 +573,10 @@ <string name="activity_list_loading_activity">Laden activiteiten…</string> <string name="activity_list_no_results">Geen activiteiten gevonden.</string> + <string name="notifications_loading_activity">Laden meldingen…</string> + <string name="notifications_no_results_headline">Geen meldingen</string> + <string name="notifications_no_results_message">Controleer later opnieuw.</string> + <string name="upload_file_dialog_title">Opgeven upload bestandsnaam en bestandstype</string> <string name="upload_file_dialog_filename">Bestandsnaam</string> <string name="upload_file_dialog_filetype">Bestandstype</string> @@ -595,6 +603,9 @@ <string name="whats_new_skip">Overslaan</string> + <string name="fingerprint_scan_finger">Scan je vinger</string> + <string name="fingerprint_unknown">Vinger niet herkend</string> + <!-- User information --> <string name="user_info_full_name">Volledige naam</string> <string name="user_info_email">E-mailadres</string> @@ -608,4 +619,30 @@ <!-- Activities --> <string name="activities_no_results_headline">Nog geen activiteit</string> <string name="activities_no_results_message">Deze stream laat gebeurtenissen zoals\ntoevoegingen, veranderingen & gedeelde bestanden zien</string> - </resources> + <string name="webview_error">Er heeft zich een fout voorgedaan</string> + <string name="prefs_category_about">Over</string> + + <string name="actionbar_contacts">Contactpersonen backup</string> + <string name="contacts_backup_button">Nu backupppen</string> + <string name="contacts_restore_button">Herstel de laatste backup</string> + <string name="contacts_header_restore">Herstellen</string> + <string name="contacts_header_backup">Backuppen</string> + <string name="contacts_automatic_backup">Contactpersonen backup</string> + <string name="contacts_last_backup">Laatsts backup</string> + <string name="contacts_read_permission">Leesrechten voor contactpersonen vereist</string> + <string name="contacts_write_permission">Schrijfrechten voor contactpersonen vereist</string> + <string name="contactlist_title">Herstellen contactpersonen</string> + <string name="contaclist_restore_selected">Herstel de geselecteerde contactpersonen</string> + <string name="contactlist_account_chooser_title">Kies een account voor import</string> + <string name="contactlist_no_permission">Geen permissies, niets geïnporteerd!</string> + <string name="contacts_preference_choose_date">Kies datum</string> + <string name="contacts_preference_backup_never">nooit</string> + <string name="contacts_preferences_no_file_found">Geen bestand gevonden</string> + <string name="contacts_preferences_backup_scheduled">Backup ingepland en zal zo starten</string> + <string name="contacts_preferences_import_scheduled">Import ingepland en zal zo starten</string> + + <!-- Notifications --> + <string name="new_notification_received">Nieuwe meldingen ontvangen</string> + + +</resources> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 329ee18031..cc695afe75 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -548,6 +548,7 @@ foram encontrados para sua pesquisa! </string> <string name="participate_testing_bug_text">Encontrou um erro? Algo está estranho?</string> <string name="participate_testing_report_text">Relate o problema no Github</string> <string name="participate_testing_version_text">Está interessado em ajudar-nos a testar a próxima versão?</string> + <string name="participate_beta_headline">Teste a versão dev</string> <string name="participate_beta_text">Isso inclui todos os próximos recursos. Erros pode ocorrer e irão. Por favor, reporte-os a nós.</string> <string name="participate_release_candidate_headline">Candidato a versão</string> <string name="participate_release_candidate_text">O candidato à versão (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode ajudar a garantir isso. Registre-se para testar na Play Store ou procure manualmente na seção \"versões\" na F-Droid.</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 3dee1dc64d..3b3516d5f9 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -550,6 +550,7 @@ <string name="participate_testing_bug_text">Нашли ошибку? Заметили необычное поведение программы?</string> <string name="participate_testing_report_text">Сообщить о проблеме на Github</string> <string name="participate_testing_version_text">Вам интересно участие в тестировании следующих версий?</string> + <string name="participate_beta_headline">Протестируйте разрабатываемую версию</string> <string name="participate_beta_text">Она включает в себя все готовящиеся возможности с самой передовой. Могут появляться баги, в таком случае, напишите о них нам</string> <string name="participate_release_candidate_headline">Кандидат в релизы</string> <string name="participate_release_candidate_text">Релиз-кандидат (RC) - это текущее состояние готовящегося выпуска, и, ожидается, что он будет стабильным. Проверка с вашими индивидуальными настройками может помочь убедится в этом. Зарегистрируйтесь для тестирования в Google Play или используйте раздел \"версии\" в каталоге приложений F-Droid.</string> From 081c058b4cb42f7655399460a17b68ad760dd97d Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Mon, 24 Apr 2017 00:20:35 +0000 Subject: [PATCH 767/881] [tx-robot] updated from transifex --- src/main/res/values-fi-rFI/strings.xml | 1 + src/main/res/values-tr/strings.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/res/values-fi-rFI/strings.xml b/src/main/res/values-fi-rFI/strings.xml index 7c815500b3..fb60e46cca 100644 --- a/src/main/res/values-fi-rFI/strings.xml +++ b/src/main/res/values-fi-rFI/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Asetukset</string> <string name="drawer_item_uploads_list">Lataukset</string> <string name="drawer_item_activities">Toimet</string> + <string name="drawer_item_notifications">Ilmoitukset</string> <string name="drawer_quota">%1$s / %2$s käytetty</string> <string name="drawer_close">Sulje</string> <string name="drawer_open">Avaa</string> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index 83e8479e28..aa0897a0f1 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -547,6 +547,7 @@ <string name="participate_testing_bug_text">Bir hata mı buldunuz? Bir gariplik mi var?</string> <string name="participate_testing_report_text">Github üzerinden bir sorun bildirin</string> <string name="participate_testing_version_text">Gelecek sürümler için bize yardımcı olmak ister misiniz?</string> + <string name="participate_beta_headline">Geliştirici sürümünü deneyin</string> <string name="participate_beta_text">Bu sürümde tüm yeni özellikler bulunur ve çok taze olduğundan hata ve sorunlar olabilir. Bir hata ya da soruna rastlarsanız bize iletin.</string> <string name="participate_release_candidate_headline">Yayın adayı</string> <string name="participate_release_candidate_text">Yayın adayı (Release Candidate, RC) yayınlanacak sürümün bir kopyasıdır ve kararlı olması beklenir. Kişisel olarak kullanmanız kararlı olduğundan emin olmamızı sağlar. Denemek için Play Store üzerinden kayıt olun ya da el ile F-Droid üzerindeki \"sürümlere\" bakın.</string> From 6ee4ab23c7c77ba2e539ff7f69f30d9cb0a0326a Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 21 Apr 2017 12:41:40 +0200 Subject: [PATCH 768/881] show correct header for searchViews --- .../ui/fragment/OCFileListFragment.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index d1665b7f93..e61383b3af 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1268,6 +1268,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi menuItemAddRemoveValue = MenuItemAddRemove.ADD_GRID_AND_SORT_WITH_SEARCH; if (getActivity() != null) { getActivity().invalidateOptionsMenu(); + ((FileDisplayActivity) getActivity()).getSupportActionBar(). + setTitle(R.string.default_display_name_for_root_folder); } } @@ -1335,6 +1337,37 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi currentSearchType = SearchType.SHARED_FILTER; } + // set title + if (getActivity() instanceof FileDisplayActivity) { + int title; + + switch (currentSearchType) { + case FAVORITE_SEARCH: + title = R.string.drawer_item_favorites; + break; + case PHOTO_SEARCH: + title = R.string.drawer_item_photos; + break; + case VIDEO_SEARCH: + title = R.string.drawer_item_videos; + break; + case RECENTLY_ADDED_SEARCH: + title = R.string.drawer_item_recently_added; + break; + case RECENTLY_MODIFIED_SEARCH: + title = R.string.drawer_item_recently_modified; + break; + case SHARED_FILTER: + title = R.string.drawer_item_shared; + break; + default: + title = R.string.default_display_name_for_root_folder; + break; + } + + ((FileDisplayActivity) getActivity()).getSupportActionBar().setTitle(title); + } + Runnable switchViewsRunnable = new Runnable() { @Override public void run() { From 5f3a1ce9bbfd810f86c87cafc16cbb6a061f43e8 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 24 Apr 2017 10:16:48 +0200 Subject: [PATCH 769/881] #871 make favorite icon yellow and fix headline adding "yet" --- ...r_light_grey.svg => ic_star_light_yellow.svg} | 13 +++++++------ .../ui/fragment/ExtendedListFragment.java | 4 ++-- .../res/drawable-hdpi/ic_star_light_grey.png | Bin 1793 -> 0 bytes .../res/drawable-hdpi/ic_star_light_yellow.png | Bin 0 -> 2116 bytes .../res/drawable-mdpi/ic_star_light_grey.png | Bin 1234 -> 0 bytes .../res/drawable-mdpi/ic_star_light_yellow.png | Bin 0 -> 1465 bytes .../res/drawable-xhdpi/ic_star_light_grey.png | Bin 2346 -> 0 bytes .../res/drawable-xhdpi/ic_star_light_yellow.png | Bin 0 -> 2814 bytes .../res/drawable-xxhdpi/ic_star_light_grey.png | Bin 3501 -> 0 bytes .../res/drawable-xxhdpi/ic_star_light_yellow.png | Bin 0 -> 4223 bytes .../res/drawable-xxxhdpi/ic_star_light_grey.png | Bin 4819 -> 0 bytes .../drawable-xxxhdpi/ic_star_light_yellow.png | Bin 0 -> 5891 bytes src/main/res/values/strings.xml | 2 +- 13 files changed, 10 insertions(+), 9 deletions(-) rename drawable_resources/{ic_star_light_grey.svg => ic_star_light_yellow.svg} (81%) delete mode 100644 src/main/res/drawable-hdpi/ic_star_light_grey.png create mode 100644 src/main/res/drawable-hdpi/ic_star_light_yellow.png delete mode 100644 src/main/res/drawable-mdpi/ic_star_light_grey.png create mode 100644 src/main/res/drawable-mdpi/ic_star_light_yellow.png delete mode 100644 src/main/res/drawable-xhdpi/ic_star_light_grey.png create mode 100644 src/main/res/drawable-xhdpi/ic_star_light_yellow.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_star_light_grey.png create mode 100644 src/main/res/drawable-xxhdpi/ic_star_light_yellow.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_star_light_grey.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_star_light_yellow.png diff --git a/drawable_resources/ic_star_light_grey.svg b/drawable_resources/ic_star_light_yellow.svg similarity index 81% rename from drawable_resources/ic_star_light_grey.svg rename to drawable_resources/ic_star_light_yellow.svg index f1d57fb690..fd7532bd8b 100644 --- a/drawable_resources/ic_star_light_grey.svg +++ b/drawable_resources/ic_star_light_yellow.svg @@ -12,11 +12,11 @@ height="24" viewBox="0 0 24 24" id="svg4" - sodipodi:docname="ic_star_light_grey.svg" + sodipodi:docname="ic_star_light_yellow.svg" inkscape:version="0.92.1 r15371" - inkscape:export-filename="C:\DEV\src\Android\Nextcloud\favourites\src\main\res\drawable-xxxhdpi\ic_star_light_grey.png" - inkscape:export-xdpi="1152" - inkscape:export-ydpi="1152"> + inkscape:export-filename="C:\DEV\src\Android\Nextcloud\showSearchViewHeaders\src\main\res\drawable-mdpi\ic_star_light_yellow.png" + inkscape:export-xdpi="288" + inkscape:export-ydpi="288"> <metadata id="metadata10"> <rdf:RDF> @@ -25,6 +25,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> </cc:Work> </rdf:RDF> </metadata> @@ -44,7 +45,7 @@ id="namedview6" showgrid="false" inkscape:zoom="9.8333333" - inkscape:cx="12" + inkscape:cx="-42.61017" inkscape:cy="12" inkscape:window-x="-9" inkscape:window-y="-9" @@ -53,5 +54,5 @@ <path d="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z" id="path2" - style="fill:#000000;fill-opacity:1;opacity:0.5" /> + style="fill:#ffcc00;fill-opacity:1;opacity:0.5" /> </svg> diff --git a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 6128d96b3f..a3b4f10d97 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -658,7 +658,7 @@ public class ExtendedListFragment extends Fragment R.string.file_list_empty, R.drawable.ic_search_light_grey); } else if (searchType == SearchType.FAVORITE_SEARCH) { setMessageForEmptyList(R.string.file_list_empty_favorite_headline, - R.string.file_list_empty_favorites_filter_list, R.drawable.ic_star_light_grey); + R.string.file_list_empty_favorites_filter_list, R.drawable.ic_star_light_yellow); } else if (searchType == SearchType.VIDEO_SEARCH) { setMessageForEmptyList(R.string.file_list_empty_headline_server_search_videos, R.string.file_list_empty_text_videos, R.drawable.ic_list_empty_video); @@ -676,7 +676,7 @@ public class ExtendedListFragment extends Fragment R.string.file_list_empty_search, R.drawable.ic_search_light_grey); } else if (searchType == SearchType.FAVORITE_SEARCH_FILTER) { setMessageForEmptyList(R.string.file_list_empty_headline_server_search, - R.string.file_list_empty_favorites_filter, R.drawable.ic_star_light_grey); + R.string.file_list_empty_favorites_filter, R.drawable.ic_star_light_yellow); } else if (searchType == SearchType.VIDEO_SEARCH_FILTER) { setMessageForEmptyList(R.string.file_list_empty_headline_server_search_videos, R.string.file_list_empty_text_videos_filter, R.drawable.ic_list_empty_video); diff --git a/src/main/res/drawable-hdpi/ic_star_light_grey.png b/src/main/res/drawable-hdpi/ic_star_light_grey.png deleted file mode 100644 index 5bc906dd36b771cc6898e7d4b917b79d0510b83a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 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 diff --git a/src/main/res/drawable-hdpi/ic_star_light_yellow.png b/src/main/res/drawable-hdpi/ic_star_light_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..a74f45bd2c6b06c091781f701e4f2dc305e9a667 GIT binary patch literal 2116 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 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_star_light_grey.png b/src/main/res/drawable-mdpi/ic_star_light_grey.png deleted file mode 100644 index 9421cd68c830a54f3d6526da88282e08c379cb80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1234 zcmV;@1TFiCP)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004b3#c}2nYxW zd<bNS00009a7bBm001mY001mY0i`{bsQ>@~8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11W!psK~#90?c3Rp6jc<*@y{TPERG9<2m+#_f+B(-n3(9hzW6t4 zjQfK=xR98rk4QA)5`u{`CWA!TbY^fAn8AnBLz=Osx~uxu0;zA(>D%2^w@&}6?zyMV zxkX1uM@L7;t;!uu8?cP+n80k)hAgqFX#<vVr1xqKZ4zh$p2E|(t6^Ji&?bSN!)h_? z4>oMe4ca2mDje$jd{|5TV_O7z5_k7~p1_`lY`KZH2=si$cdc;NZ4hV+9?JNBC$`pX z%l~MDKzUcn;o7WNfu;pohkZG}@5B0<Y{{f)fevC#&hKmRY)!Ug(xgCRBK8@?VGY{Z zq(HlI-w@l~i^nUrWks44sK_+l*p%OtK=<R30^9Gx=89~|r73}q2p?30Vf<Bcnh@wt zJX2!716Z5bmVq=O&;cP*QO2=9u`L6sTc9zcMaN}^=19~j&^Y#D(+GV`_WBr4V$l$c zdN$UH)Wq7}`%-(I$O=v@+a@K~Fpqyk4tuuOp6|8i`r0#CD07fJfp%e|NQJH!e|V|A z^nNSxH!k<R&-Jx0;^(ZLR_Am$hgaR4$hwtTFZ-m<;;of-%1dir#*ZSPYfTb8F@NB7 zoLgywL3!VQ@x4fDO{TM}75suX#7J3@VG`pD;!4_p2S>N76?}{Ladps!!&VNi<0mmo z>{4?ql92285})?k11VZsnZ|jMs%SddR+I&NfMZ2=DpPwphtr}gla~!_6Z3czr;6@a zwm3I~lXy(~<DpA<4ZoGyd6eqqJbu6q+%rNyRWdE6@xRJ;Flu@Cst5xnHI&fG;UwM` z6H94Q)V~*d#=ye~`b)tve5mC8S3fBi2uz8y^{D2;fJJ;Frt&1DUO_R9-$fWu_v(x* zcn{yD?6itMabAS+d(@Y=nG?=<Ds{(I1$$@kXGMKyaRFzm=(s9@)`%P2y4WT^byJ$E z1lp!vAGBIUOJ%AOC~Lh>)l_oK+ex4uRdiZ~Kx1M-c-=gtg7~Wnfi`QP0xE8rlV?4v z5U7daRoStt5U3JgFeJCVK-YS&vLqKMb#OIdxK(3WoW@7uhVy0RR+Vj(_-Uck!Q2z# zfs`W5;A0#WmCkvQV>&CY#-a{?T27s-D5(WHWcVq50mt!<>~!b_d@Zi1?S^*;Ggc@g zmm&2K8`cL*iQzQpOkc$pB8Bma$bqM_VJK1xG>!)bY%`0`aH3$}7ey6xw-72X2fnpu z%awx1$Ry<u+bLF$WwD5_#Be$@!ZG@X-45BqZcOB(lB8Qw3bbE#PWo4|dg6oxIbtEs zlqiR95;NCwF7=K(GARXm$<0&zobWS8#Y&OX%nRRiR`{L%*=|9i)N3jqv`XZFh%<Z~ zpBu5{G9;%&4D|wD6eoRY_$`jwd8#XDi+CvR4Bo{zMvI7xvLJ@tDKSw@ic(bW(v~{e wD;#tiR(*^KTlO|>NJmFUM@L6TN5^f<e@u<9LDR%GegFUf07*qoM6N<$g8f27oB#j- diff --git a/src/main/res/drawable-mdpi/ic_star_light_yellow.png b/src/main/res/drawable-mdpi/ic_star_light_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..78333fdda69739996fe5e1566aad44be524828ba GIT binary patch literal 1465 zcmV;q1xEUbP)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004b3#c}2nYxW zd<bNS00009a7bBm001mY001mY0i`{bsQ>@~8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11vW`UK~#90?VD?F6jd0<f6v+N_QnE&a!F~`AOT&GQo03iQQv4R zFAUKb#Sh@u;6te4y&{oB6JsDGip9hbShj?MRf!QWk!VoRux+=una3Ahn!;XZ_RIw{ zzgO+dd7k<2f6x8QLPA19LPA1<1@tUi^dfyx>sX12TEIORMsOI3TE<FZV~|eJi{UAh zr*(`~QR}%&Yz$(KVU#pViZu*HE$1$=Fh~`HVbAgfm%JV$6``bMVqp*yJc+V;`F|zL zW9*1f(K7KcXo0;|*HZE5tRpu_3v2=gs&2SEszo-3ujpPPH;8nDnxf=GR8o^j4bn4o z<FK=C0mDu$(i5Vj8WN(UgCU@!?tPaIl-=P8swOgnR1t*XrUeaoJrteJ=xWe7+fg2B zTFzxH``H$PqMAf!ka`%#BOLN0F-R})2!_X74sh726Kn`jQeC2{K`tY>h^LtO7W%6I z2;Cq(K_~ExkI+FKqsz9QW`tjZHZX|N=_4{jmR;8MG$B-jDnolav*Qs}k4>{pLNiDw z$xtMR%ftSYu%040og`yXT0`3UHuMbLC|Nq`!X-<JEG}I@H^M3mSsc0%vZ&?$Ls$gL zD6>EbLkX8zpj`QT3ZYDf5<9sgg5&Qob<iSPNwJPadVwAct8nNgMGw%68|@m&Glm&p z8iyHDOye>I%#daphubpDueHL`brW_n#T;)yWh2XF$xhe0^l(`ELVKz{gF^|!(RyJG zo0y(uHE9l_Y_cRXUI;fy@u}?Q-}*(GpeN{LBX8kGw;l?Jt4wiBUSYOTp_V#nRSXvx z#f@e*YaQVtSNTfbZr*Ww8pU*+eZXs;mkDvfptyV|c}}+);`xJWfgFYdXoC(ujtCCI zm$HXT-okvK1^N-*g$HD)7s@Q~nLNvN@1Z`?N!C&3J(Tr+bA*EM4{$_=`P*N38)%Up z4DaC7IJSuc!tZo&RCY1#KSi797-_N`K*_b6%PNMSP`;317TQT;Wi(PnDDo2UvW<Ke zIL9z2MbLH=Ssku*oP8*-q7m&>3NFe?$y2bG(lT0P2g;i?I`0Ys!#pmZOP(t>(*`o( z(~I=6z(Jrli2PLuQ!I^Cf7nhPNK=qOZeZ#!0IlP4D+qHSAcM3>N2oghhCUq&W@aBu zXPTl94e<>zB~5QIugU~tkVY_Zlwh72j6sVL7?h$vh_u!XQbjOqv7NUm4g*0P3E8hf zKd{022}W!5Fm8Y0Y~P@AqzhN;&$e$+Kz%`rJOBo18wLrBl><S)#M>bKnQTjMjnzW9 z1{`Ldk1+h=PXO!md$PV_>tJ{GS>jR8F~S`Tr(}qU6<3ewdA0+u18Y6yOVbbh=vhbI zbT&!R-|`8#;Gh)g=9J`^uezP*iWa$w@;t%|Eguqe#Mz)$w_Xj`5su3ce>Eyr*$q6c zlU!n&QG_R2$ZoYCvSyG@lA+AThI@EI3Bxz{HK(RXj@!T|m1Z{ztf?=A%{ob@R;~1d zy&5#b7V35SOFMn%S;M!ojXA%MxUbp0SaU(F7#8URuK9h=N^CZ<+ErWmjSR<S7dLG@ zWVzX$<1&U(U~5&OIR=QmLBbS<ui4Ed8=L3%BYU|8e5~i$j$sscMYFRwS+z0`(nA=e z@@r+m1<q080~ul>2y<2<d9KjKhrns>zD1_=+xq!}onxOOn^E4!aDzEc$aCDVk=L`1 z%WPzp{lEaqVHx4iD0Ebz1#((oFzh!_YidzM3k+%@W(S!G2?+@a2?+@a|1bUn>XK`e Tg%8J`00000NkvXXu0mjf$=!*4 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_star_light_grey.png b/src/main/res/drawable-xhdpi/ic_star_light_grey.png deleted file mode 100644 index 40dd6fdcda1fc525dc18f1f9e5eb6c3d4f1c0868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2346 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 DS9TrE diff --git a/src/main/res/drawable-xhdpi/ic_star_light_yellow.png b/src/main/res/drawable-xhdpi/ic_star_light_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc55e98bed601ead1e177e5b80b563cf8cafe53 GIT binary patch literal 2814 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 QYybcN07*qoM6N<$g2mJ`6aWAK literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/ic_star_light_grey.png b/src/main/res/drawable-xxhdpi/ic_star_light_grey.png deleted file mode 100644 index b655930680953de52cfe5c1beb9430df44bf6865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3501 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 EKVm0xy8r+H diff --git a/src/main/res/drawable-xxhdpi/ic_star_light_yellow.png b/src/main/res/drawable-xxhdpi/ic_star_light_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbe2de29c3ea37b2724ae58d3461d9b3e11a01c GIT binary patch literal 4223 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 RV|^B|S(@6Kkc~0-{{v{oyG8&2 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_star_light_grey.png b/src/main/res/drawable-xxxhdpi/ic_star_light_grey.png deleted file mode 100644 index f35d7cb709f6dde535127bb1e3e8b0dd1981ef51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4819 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 UYT^q4@B#|Z)k14ltJ^>LKWeP>g#Z8m diff --git a/src/main/res/drawable-xxxhdpi/ic_star_light_yellow.png b/src/main/res/drawable-xxxhdpi/ic_star_light_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..8770db97831e7d191bab2071e4eea69dd94e4ebf GIT binary patch literal 5891 zcmb_ghgTENw<iGvLh(xpf)HxxHG;Izlp<Y9KtMnugeEP3hN_{r5UMmOp-7i5hy{Zn zp$UTGml8S%0*X{YLErj&=e<ARoj2#~+1<~~z5BU$X71d($(9z^SRof7G&D4<#zy+q zG&CTgzZc^<8X6j|*hV~XqYJ)jjA8^@B%^y0@Xi!y<Pc0l(<1%%0->vAcL0z##K1np zCcq;EhYrHf;BYv3Z~r^NZs<Uad_a)rqi>oQX=u3d#`;%Kp+#TkW`k|lqxyGuUUZBa z;nm&P5dCZ&Ej=4_E0x)y6YWfD=1TrWQ@?4$#~+OzROLAxl`C~&3p>1(zE<AjsFw0` zbf?1KmV_q7sk{klV4L!94*o7B&H&HIX#cnA!i?mUkhkC`#~lsLQeF==qX;dpowM!3 z#;5a#F-iZY7V6gP+j(L7GcwWr#v&5$Zci41o{OSnY+Hkj^?ZwL>8P>TrsB$3oWP(s zG(-8b^cjyFkJzX8TS%gNHpFPt!%$auVfj`Z%hZP)O~Wh#Aa>T@#piaoT$(1}zapQW z46i`xTEA9joBxgzgAsCn*5WJW?-k0CNBMpWuj<)(+}TTp4+BF=b1_FDglM{KBeoiR zrN_M#3u$WS>IFKgC+0Z^0nS?u&YF2T!Q3u?vLpP2harm@?f^iA`AdNZO~>&d+Iy%b znc6fLN$W>S+da=PZ=0AMhS|TF31zP0Ax1uKcZ)p!l?toPgc#YmyZORhZ@gQuM0cjO zN%b3LaY_q0I1C60H#Y7RJXs3O<SKy}<zn>OX@6Zj{`BiB9A>qi8EFL?+*85o7)H=8 zOdFp6B|0YBRSwP)v%UUGHTdp6$)Q+JRf-FmA?rt&i}Uq5{*`t}XhFWw&r$-EJ8D(W zuSBv8%0V-zImNeO+&%R1M5JHbA-jGSzcpy^-BTqRcK+8)*qp`}5#<ASQMy62G9OZ~ z58}>G-{EXGI1c^GvCAs{jHftLt7N=q<WlEu#v4E~%>+TUA5p8Z+1tA!Efgk*9QNaR zRPn%71u>E+^1x|O8Jh9(7SD?JzDjXc-VYnlpa`GG<^Gam6|%FPhq-UMLO}&MYr)%% zCKVffMO5gcY}g45nnB|#;a!$R<`^bwBaKbBXEV(#L4z^2ROSW~S5xN(bO3lZljSd@ zX7Nhl@td-~4zb!QFvqqsl5skBQM_|TZI+W-QkerWB8RDIX*b#Im4l@<`8=V-7ugGn z5q>e>`Z{H50qnWMImPpyj|m(%E}M35pmgayuG_p33*3y75<UY~!@n@&&02hl?**J& z!%;_6MWVAn!h@`f(j*a63Z%+=K&Ye!4;iv(i-#bi)@km|@O1uU6TV-APZ`3#$Hf^u zq*I8=L0N&I8O7zC&;G>`4M0B}3*;9N@GwAyPsMq!LztVDkxW16zoD3x3c8G;t$=g& z)0MghaTnfsPQ_wVcX(7=5)zM_cmBzeg<6hRhCQB8_RO{izTDS8m9(O=pq`6;!Ac3# zi!_#lT4u(va8yNl7je(EJ~aXiLjPSxk?Z!EEejSCOUMMc9zBZdkve|-8`6+<#vb;i z^?lZDX%bkm7tQ;8W{T&dblqDLSUQIN8`*vbY50zCm(VhcV@WQB)G#_Kg@q%vf+yiB z(xjp`n+DNUwgvTzfr)AEUQOl~%fUl0xX%g4Qf#gkSq!e1LL?~-W-_2(QR`m$ShBd+ zK1^@90zA}~@e835Me)iX@0nzAdI4v(0j)V?#0s0m$7+a`-U2kYV(+25@^3uN{7_r+ zTHM?cv}RjkCveyjR1d#Op95@J)_#EnbrH^H%4q8+fLaMeGMxaDy*BoQ-L>{*YK5|t zj)FCaY%u{=fB8BnzI*eJd5}JRj_Mqhp<xdudd|7QeB4BUg9&Q++uie1#H*|C&JXiJ zEs0a!_jHLjcv+_%&vZ;IYVdn-^ZMfc#|G7_`+zv-5m-y@+flLTJ>efyiuFK@@&bmG z7i$x;c6eHpOma33VS43d;2}^%AxEQbfXTH|XqhjwE`1I|XYhGD5;}Rjm-pK)Os}vS zJQOR^DCyYuCz!1ke`$2cH~wl#;XK++y?d1;gwmbP`(v|XTDy8&J{)5S!sI{v5(B<| zJ&@|T(p7ZNnn#)>8+?GKFClriE9UhkchUonmqeQA*4#w7ve=jSYgsFXFSl+gZG+}2 zneBV+iT>SoiqEHUL(}!``!~b!@}yL}zbjNY0-+K{%wr?snDS}lIWN&Wff}0=jBye- zw5qc)HFypW32(Gau~TLCJq^Y$W%}oZVLV!N2midk5^up@kC=(_995=hDyAXylD)5r zBdYM;U~#5`H;8w(9#ee*w)TV8AOrGH`-Gut+ktC{bscxA?J&HOVWVd}dOYp^w=Z{} zG&?=5p)%aRg-+ne4nYj6c5M?meiDl?;iA;Ihu)7LvB^&u^UdYdy<OhuuY3K+xurqA z4{q6|PEqbh-QDp?$S~&5rW>(DXW@+-FZG63%{iO>BtBA!ml8r6NEn{~8iHc3eBmg> z{FdXr4eThyGyJlZann{}ENWQFy~@!(8<pRKFz3rITFHutOW7H~4*P=SzCCs-ON3~t zvP3j4xJBD`If`9PL6<c*D%724V~{Aoq#T;HB}%O;E@W;!ECf&VIAn^uAGk(r)4O9- z6tAfkH{2%LKHF@{@HYuzZ-s2wl_kLku+V&w#Y@n}e-z`fyepTUIC&Hfw_jTO8KyAG zW9-!bI+|O+gJ?(7@RNDq591B^V{Yy5v$f3vi&5))pYe8|5x-%}awPo(*CUbH{Ppoo zDKB>8HoOeaLde;v@;7s_dn^O@2joI_d4&10XR4Au4(`fGYkpx1LKM6c8?YERM&1%y z?SOa6h+ID5B?dgZ-w1!&(>E4VV0AlZY<Vj0pu@nOiO3|b{#n3Xd-`3tYeK~c1)u(F zsypfB7~@&dcPuRP-z~gv4y~HN1nM07d46GN0`<z!Z;?=s3Mz4hoxrx>pbzQAJ`DRk z30t;(jj$&7Pxr~D)82{nWFOR`h+QoSihcQ2$HZic`QZIvMVzCL0bGUHS+FjJOET@Q z&`p6b0^z}}P^Sk7a<U>_oZm0*eD}kt!S=~Q7<#(NM^6NoY)B6k3`E?D(D;?n$6M!o zYGp`wwpkJxPxP#dtl)=WLdN<W&DaSsNU8RI@T}sG_e1N9^_&g{mG}J7S8MqeF$-3? zS({*RGqyu%xPk;#H1Nq?jGOSN?8eh<i}|C86sGA#WUA4om}Xf!Z-JyxjfK14QmUHv zDggRCJeCq(Fblfst#rvo*YcI$9o16$Z~Mgt@VlDkl75C&5Ju%pTX&{;@f;P=VET}> zhhON4ULy5eg`#~}>LIotmt*MOfv0I0@n2-0d+!1n#6l^Z&Vo%R#EBZS3;*C*+Y0Oi zL_g}=No8>TRrr~ikvuxyixCiYuLnHRVmb{_T`k9xG&1idjBy54{{;~)E3ZQSj`j!q zN5CW4I45=hva8k_fCXLBq&onoAh9)0lSi4esx`$P3ZT+n4u>;axBxNCQSI|L&o{Un zwN-!?aBK!@LPAbPMXXgRTy2rPT4aUDYssdK01I(@igLQ!<mG0A)}_4m@0Cb$KqN!5 z%{QQHC<GnJKJ^8eI*`JD!G5fhD(?YE-4uo}a!a)SMg%qiBuyba)p<J_*WTiC;9OOB zT}}tFw{@P+H`Y%Y{xUCvY+OX@3HGxS$T)6xekizmE1dTSOw2o8R)_}K3*#yMSKn@T z2w@&yJ$FU^n7FKm20jd&w|I)8-LFxR_yax@%`f36k9UN+xt`-`eDf#Uzw`8SFE~`{ zg75c;buS6H58=2<A-8mCRP>R2$C^ZBq-W+;wZs)<W2ySWl}H<qZ2`OD5IcWVcbidT zT40gq-1w=Pq+bGLgSKJh8a6V<Qim`3{Tr4ePiGy`?uyFfd3RN`+qT4NddO?<WPP%1 z|Ld;%qbI~H;7k;oQhSlV!ps8$bS0=)F@_Eu?p5tbdRKxS6Vh5TA;6Z1^2{`o?gM7C z25;xe84?^%!QTWh7OD6D!F*gf+p+P9(OQ6pb80S?>3?L0fDSKt6f4!mLw&SU@(W9X ztSA}3zOkZ%(tbKFU|9_C=#sh?4_Ua&kg5tyeK_Z3@(?wCSMmKOGPM%#R>-js#1J}% z%W1FzT^?|8=iApz8UKn*4P8CHd#D_NmdH`jqyI?vOStoW&kFh6f<qrIFgJye8e<>_ zo;d*vcLFOTc_MCtu?8>VYM5-Lo$6M)Bb$}P{!`tm@@93v0X-M{T)=Z0<uc_UX;RX( zBtxKPWpaZ$r=sZqj!Ls0b#0InYRTf8GmF(M2k<hc$1PT%w|)N`B{Id;<{$Uj6k1+9 z549w0(}!=YT3t1Fe^*o599@06Oj)~-nOpRSm3Ua<gLCtH#Ri*P-=!~vTCZ^`KrKh8 z=*FL;Laa54I|Acz6VGb#w>>!9m!`Ini63kGER<m7Nsl0s{x_x?#Yjq$?$Bz7b)@0^ zmo)a*#oe?<v0yD6)&}(Uy25gUbW1NT?j`UtK;&4Q0xA;afrBM>Rj6f=z-=YN7dt!? z&4((Z(hI_SX7pSNQ86A4Np2Rs&1$vyW%uyi&v<S9+m+yy><_7`3<v!EM)X{q$YDpq zWOuO9hYm-F)bo9SpYkkAi@IEM@;?-eJgdPkm#^rYSWP4vJE3%U$5T}lLayBQMd>1% zZ+J7P{2Uc#N8FpSdUa!&B<RC0-=fE98QkZ!j*cSrT?xnv^*Vm2x*u+_LIS76vgxj; zLnOHY=NGWMYWO`uMr)&%fsUE<DM<SXQJ9_C;ST0WAjf5><;ReBMkQam(()maK5{d* zV{)+B)FR+HJo9s&_=Rg0^jyNow;BW>!GeqTdmwAqIw}CGtP_v!2aUEAe(ly<O@>IC zJhy}YQSKw=0FN4mmUQ7nQD9IKkmXJ-A`|;YTIT*HMPX&&6q5@`UDK1#E=DpdzPm6{ z1(dE;!H32$^oD<4rWMG*AUHlnPl8XR0-S>96}#$xSgglkeY?6KVb;nLWPr}Oc|}Ho z%Wy#2qHPpM&;+0|+uo)(Ov)^&F%U_JhPb8XbE_ygO4qzjfcbrDi<g<81|WF(&XPS@ z8px@!TYgSs5p5{lcM~o6+Ys!C_gJTcH0d*t)0>V(WjjVP3`F0)57Ch3>785<EKl06 zP*&>pmL`eY7s&H(F-1uj+mpB26<3e;<?(5XhGevB=eqk~5Y-3c=&TdmUE%%^QlpM! zVh%BAaLdB)1mp9Hdb$7n6uJ=IG%FdwsAguLF)2#m*!QJ%0is$xz(aCK{+VbW4~F&6 z%D2_ctXnGNut$sF8=*9m9q4WQPyK8tT_7R8Eb)gyn0B6&CX5r@`M9^{uh2#gw)>1( zR1A!0I5{2ub4SQfgZYyX(wLd}q&v7zd=UbY*jOv|kt^Nmx<6l0+GMlLL#$O3sfuao zC2mH2lssF!_%y-KUjBzr8XilKa1!kOS8%H~FF1b-Q*@{aA}j`lKAYcIM63KHX4-~D z(u#?WEbW%!Ri&`hxiN+ENc+xI-bG&II|u%21GA5rKWxYS{J~*B|B-M?ID>sqE2+-Q z^f(H&qmBp#JlefH+L{h|pzBiAENf;4JA{d*0#+&ZBKnVx=j)i56c@z^p3Z_dvZmah zF7|%~uZN{GU|C!Xbht7~&sW4j*DvNWPV?~9e)sGSR{kP417zL%!KK0tBX*07xx4g# z_-_TBoqoa*8U}w#qzgK9Lu1_v@tpkY_1(h^<imaLs8dlfB75L8t|S4vR@j{6&G;!v zwtK3PwbSu9pi{>=;NUHKTFRyDVLENBd%#Yl#P`;ne;g{nK4u+9c>VyJrDuGrp4}C) z6fLsycS0J1h>gqe>sFdHt6x^p*K5|8Hh$hhpk`1JdSs^Gsjsg`oH&gg?uoxT)w^q- zJJ7RR#rp`T*}L7`(~j_)lLgV&pWo?yVj4N7mH)0j<3b_^<3g`(_%jhhob+XI*@wYR zQM!jdm}_-S>#U*a8N#aM>%ci0v$YQSPIy@0y5u|Uu~3lP9_VXHk79sYo=tQyZ~>83 zD*U7@7!^rLF5FtL_Be&PvE0^70;;+X=9T+TGl7y$!@j_dAlDsCCGSG|v8ow6Tb9%} zPOa!iix`h%c(a1-54Rv+)ruU-c{~t{Hmz>+?MpqUq^*c3uKqmHS+L4lJ-S5C--hT9 z<nNhUMRL*zKOwZymlvDnd1^4*r5`xq)fhA>@LN)j|FQpE)TtauBG7a}QqBtP<04u> z(jtYAw0-!+_Id?s!qP>1+8>;Svggk&c8eK4)fWEs>YSs!*pF*2O72OJ8bc4Y(dKuv zbSO$wAWN5aF{X<bcOjdM;9GjT$+~w&t&kX4wA~Z%X0)r%n~obVIKCJAcIneXO{Cpt zwxDR{Ni^?>xBz*hgZ-04_Z(qD!176z7Rzh?rhfoql&N)z5pfVj-`-P&Cy^q%=;=2; zT^Bg#JPd2`KDH*`!TOXY$z1}HT+if($fF9&gDAd57Yf!Gn}su36{w_bUy<1%HP#-V zhkes&TZuQNO9!5vIW2;32`|!J0r$41jK)n4{ZKD9YYsk89K6-{oSh=mzDt;;G`Y=L z^h_((d#~BVQ8{M~!36H#8h)Kx#-e~S1m}uG;R**xC-4=4(!uJ0g5_%YRc!a{N)c{~ zEEpxZ5n<%60YRiEO804gY8jp%O1M;fN_w7O3Ljt%oF6)+J7y%N8+P|)0alcO>&)Bf zSD)#UGq%?9GPN5&zCBdn4{o!0sgEobUmax>bfHB1klb`-nwe(uKP!kjbY1Cvf@-rm zqA5N1N#)FynbZ1DonufdT`~R5L1>4nvo^CrKl}XJuypA`5N#1<7qh6&zi+OUZzZz$ z$t!CuFTqvjj{gmf#k(FnL4r$jNqa^F?nI2}X+F2M`2dVnXX?%BnyLtMo}M)6Vb0X} z`#EQzSc@#BeaW@%Q^9c_myt?-jY`BMMqg&tBoJwz=;}3NrmSL~-|(={FV=c<u>^2S zePrts4cUm8c(g;5pg}(yvhK%JP{=>wymlTk{iUCNv%b7Ckb&$&BKkS5`^Fu%2jxRv z-1%Jvxi!9p_P!V+*VN(cMd1Q1d<c|TsOxS0pP1a+?2Eo#2k~N>(Q+Cck|AB}=M}$9 zmF7?-hiM#N5_73x>&mm6IE&7$&?2qT4Ugg<WUCWjFogVB5UF!{^*ibpLdSzBI&7vp z8NGqo;CaunEqkY6eJtRZfuc-Y|ANtv&;(Duz?5JFg-iQ3x|f*$2CNg8mP)G`T1S($ z1ZPjt|3tuBhPlkS`m&A7;nDjqDY0tj=5f25Z!BHtLpY^LkDXs{opJ*|tU&j_$)#16 z%)Vv$PAL8?OB8KB7Vh8-oxat2FmYw$@mDg!oXkYrx5XK)i9W@~zBJdlRndn4%ddp+ z8*KvV<TS59>m_F(pX_ibke30@3NN5=(f@yLr^gSnVRd}q7xJHgAJ#O+1{V5_S6yTN E3$859J^%m! literal 0 HcmV?d00001 diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index e41ce968da..6d24c7ee77 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -105,7 +105,7 @@ <string name="local_file_list_empty">There are no files in this folder.</string> <string name="file_list_empty_headline_search">No results in this folder</string> <string name="file_list_empty_headline_server_search">No results</string> - <string name="file_list_empty_favorite_headline">No favorites</string> + <string name="file_list_empty_favorite_headline">No favorites yet</string> <string name="file_list_empty_shared_headline">Nothing shared yet</string> <string name="file_list_empty_shared">Files and folders you share will show up here</string> <string name="file_list_empty_headline_server_search_videos">No videos</string> From 87b810b959c2729d423747322571552cceaffacf Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 24 Apr 2017 11:56:53 +0200 Subject: [PATCH 770/881] add title method --- .../ui/fragment/OCFileListFragment.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index e61383b3af..5cc998cc8e 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -36,6 +36,7 @@ import android.os.Looper; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.StringRes; import android.support.design.widget.BottomNavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; @@ -1268,8 +1269,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi menuItemAddRemoveValue = MenuItemAddRemove.ADD_GRID_AND_SORT_WITH_SEARCH; if (getActivity() != null) { getActivity().invalidateOptionsMenu(); - ((FileDisplayActivity) getActivity()).getSupportActionBar(). - setTitle(R.string.default_display_name_for_root_folder); + setTitle(R.string.default_display_name_for_root_folder); } } @@ -1339,33 +1339,29 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi // set title if (getActivity() instanceof FileDisplayActivity) { - int title; - switch (currentSearchType) { case FAVORITE_SEARCH: - title = R.string.drawer_item_favorites; + setTitle(R.string.drawer_item_favorites); break; case PHOTO_SEARCH: - title = R.string.drawer_item_photos; + setTitle(R.string.drawer_item_photos); break; case VIDEO_SEARCH: - title = R.string.drawer_item_videos; + setTitle(R.string.drawer_item_videos); break; case RECENTLY_ADDED_SEARCH: - title = R.string.drawer_item_recently_added; + setTitle(R.string.drawer_item_recently_added); break; case RECENTLY_MODIFIED_SEARCH: - title = R.string.drawer_item_recently_modified; + setTitle(R.string.drawer_item_recently_modified); break; case SHARED_FILTER: - title = R.string.drawer_item_shared; + setTitle(R.string.drawer_item_shared); break; default: - title = R.string.default_display_name_for_root_folder; + setTitle(R.string.default_display_name_for_root_folder); break; } - - ((FileDisplayActivity) getActivity()).getSupportActionBar().setTitle(title); } Runnable switchViewsRunnable = new Runnable() { @@ -1459,6 +1455,10 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } } + private void setTitle(@StringRes int title) { + ((FileDisplayActivity) getActivity()).getSupportActionBar().setTitle(title); + } + @Override public void onStart() { super.onStart(); From 4d9df8073aa891ddb0e84178b83acffcbe7a4449 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Tue, 25 Apr 2017 00:20:25 +0000 Subject: [PATCH 771/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 27 ++++++++++++++++++ src/main/res/values-es-rMX/strings.xml | 1 + src/main/res/values-ja-rJP/strings.xml | 39 +++++++++++++++++++++++++- src/main/res/values-pt-rBR/strings.xml | 2 +- 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index d6dc1217ec..021b319c4d 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -43,6 +43,8 @@ <string name="prefs_accounts">Λογαριασμοί</string> <string name="prefs_manage_accounts">Διαχείριση λογαριασμών</string> <string name="prefs_passcode">Κλείδωμα με κωδικό πρόσβασης</string> + <string name="prefs_fingerprint">Κλείδωμα με αποτύπωμα</string> + <string name="prefs_fingerprint_notsetup">Δεν έχει οριστεί αποτύπωμα</string> <string name="prefs_show_hidden_files">Εμφάνιση κρυφών αρχείων</string> <string name="prefs_instant_upload">Άμεση μεταφόρτωση εικόνων</string> <string name="prefs_instant_upload_summary">Άμεση μεταφόρτωση φωτογραφιών από την κάμερα</string> @@ -546,6 +548,7 @@ <string name="participate_testing_bug_text">Βρήκατε σφάλμα; Κάτι σας φαίνεται παράξενο;</string> <string name="participate_testing_report_text">Αναφέρετε σφάλμα στο Github</string> <string name="participate_testing_version_text">Σας ενδιαφέρει να μας βοηθήσετε να δοκιμάσουμε την επόμενη έκδοση;</string> + <string name="participate_beta_headline">Δοκιμή της εκδοσης προς ανάπτυξη</string> <string name="participate_beta_text">Αυτή περιέχει όλες τις επερχόμενες λειτουργίες και δαθέτει ότι τελευταίο έχει ενσωματωθεί. Σφάλματα/λάθη μπορεί να προκύψουν. Σας παρακαλούμε να μας τα αναφέρετε.</string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_release_candidate_text">Η υποψήφια κυκλοφορία (RC) είναι ένα στιγμιότυπο της επερχόμενης έκδοσης και αναμένεται να είναι σταθερή. Η δοκιμή της μεμονωμένης εγκατάστασής σας θα βοηθήσει στην εξασφάλιση αυτού. Εγγραφείτε για δοκιμές στο Play store ή χειροκίνητα αναζητείστε στο τμήμα \"εκδόσεις\" στο F-Droid.</string> @@ -601,6 +604,9 @@ <string name="whats_new_skip">Παράλειψη</string> + <string name="fingerprint_scan_finger">Παρακαλώ σαρρώστε το αποτύπωμά σας</string> + <string name="fingerprint_unknown">Το αποτύπωμα δεν αναγνωρίστηκε</string> + <!-- User information --> <string name="user_info_full_name">Πλήρες όνομα</string> <string name="user_info_email">Ηλεκτρονικό ταχυδρομείο</string> @@ -614,6 +620,27 @@ <!-- Activities --> <string name="activities_no_results_headline">Καμία δραστηριότητα ακόμα</string> <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές & κοινόχρηστα</string> + <string name="webview_error">Παρουσιάστηκε σφάλμα</string> + <string name="prefs_category_about">Περί</string> + + <string name="actionbar_contacts">Αντίγραφο ασφαλείας επαφών</string> + <string name="contacts_backup_button">Δημιουργία αντιγράφου ασφαλείας τώρα</string> + <string name="contacts_restore_button">Επαναφορά τελευταίου αντιγράφου ασφαλείας</string> + <string name="contacts_header_restore">Επαναφορά</string> + <string name="contacts_header_backup">Αντίγραφο ασφαλείας</string> + <string name="contacts_automatic_backup">Αντίγραφο ασφαλείας επαφών</string> + <string name="contacts_last_backup">Τελευταίο αντίγραφο ασφαλείας</string> + <string name="contacts_read_permission">Απαιτείτούνται δικαιώματα ανάγνωσης για τις επαφές</string> + <string name="contacts_write_permission">Απαιτείτούνται δικαιώματα εγγραφής για τις επαφές</string> + <string name="contactlist_title">Επαναφορά επαφών</string> + <string name="contaclist_restore_selected">Επαναφορά επιλεγμένων επαφών</string> + <string name="contactlist_account_chooser_title">Επιλογή λογαριασμού για εισαγωγή</string> + <string name="contacts_preference_choose_date">Επιλογή ημερομηνίας</string> + <string name="contacts_preference_backup_never">ποτέ</string> + <string name="contacts_preferences_no_file_found">Δεν βρέθηκε αρχείο</string> + <string name="contacts_preferences_backup_scheduled">Η λήψη αντιγράφου αφαλείας έχει προγραμματιστεί και θα ξεκινήσει σύντομα</string> + <string name="contacts_preferences_import_scheduled">Η εισαγωγή έχει προγραμματιστεί και θα ξεκινήσει σύντομα</string> + <!-- Notifications --> <string name="new_notification_received">Νέα ενημέρωση ελήφθη </string> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index cfb7952462..937eca660f 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -548,6 +548,7 @@ en los últimos 7 días!</string> <string name="participate_testing_bug_text">¿Encontró una falla? ¿Hay algo raro?</string> <string name="participate_testing_report_text">Reportar un tema en Github</string> <string name="participate_testing_version_text">¿Le interesaría ayudarnos a probar la siguiente Versión?</string> + <string name="participate_beta_headline">Probar la versión de desarrollo</string> <string name="participate_beta_text">Esto incluye todas las próximas características y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, favor de reportarnoslos. </string> <string name="participate_release_candidate_headline">Candidato a lanzamiento</string> <string name="participate_release_candidate_text">El candidato a lanzamiento (CL) es una foto del más próximo lanzamiento y se espera que sea estable. Las pruebas a su configuración individual podría ayudarnos a asegurar esto. Regístrese para hacer pruebas en la Play Store o consulte directamente la sección de  \"versiones\" en F-Droid. </string> diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index 90e1796dd7..4086824227 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">設定</string> <string name="drawer_item_uploads_list">アップロード</string> <string name="drawer_item_activities">アクティビティ</string> + <string name="drawer_item_notifications">通知</string> <string name="drawer_quota">%2$s 中%1$s が使われています。</string> <string name="drawer_close">閉じる</string> <string name="drawer_open">開く</string> @@ -42,6 +43,8 @@ <string name="prefs_accounts">アカウント</string> <string name="prefs_manage_accounts">アカウント管理</string> <string name="prefs_passcode">パスコードロック</string> + <string name="prefs_fingerprint">指紋ロック</string> + <string name="prefs_fingerprint_notsetup">指紋は設定されていません。</string> <string name="prefs_show_hidden_files">隠しファイルを表示</string> <string name="prefs_instant_upload">自動画像アップロード</string> <string name="prefs_instant_upload_summary">カメラで撮影した画像を自動アップロード</string> @@ -546,6 +549,7 @@ <string name="participate_testing_bug_text">バグがありましたか? なにか問題がありますか?</string> <string name="participate_testing_report_text">Githubでエラーを報告する</string> <string name="participate_testing_version_text">次のバージョンのテストに興味がありますか?</string> + <string name="participate_beta_headline">開発バージョンをテスト</string> <string name="participate_beta_text">これは、すべての最新の機能が含まれており、非常に最先端です。 バグ/エラーが発生する可能性があります。もしその場合は、私たちに報告してください。</string> <string name="participate_release_candidate_headline">リリース候補</string> <string name="participate_release_candidate_text">リリース候補(RC)は、今後のリリースのスナップショット であり、安定性が期待されます。 個々の設定をテストすることで、これを確実にすることができます。 Playストアでのテストに登録するか、F-Droidの「バージョン」セクションを手動で参照してください。</string> @@ -570,6 +574,10 @@ <string name="activity_list_loading_activity">アクティビティの読み込み中…</string> <string name="activity_list_no_results">アクティビティが見つかりません。</string> + <string name="notifications_loading_activity">通知の読み込み中…</string> + <string name="notifications_no_results_headline">通知なし</string> + <string name="notifications_no_results_message">後で確認してください。</string> + <string name="upload_file_dialog_title">アップロードファイル名とファイルタイプを入力</string> <string name="upload_file_dialog_filename">ファイル名</string> <string name="upload_file_dialog_filetype">ファイルタイプ</string> @@ -596,6 +604,9 @@ <string name="whats_new_skip">スキップ</string> + <string name="fingerprint_scan_finger">指紋をスキャンしてください</string> + <string name="fingerprint_unknown">指紋が認識できません</string> + <!-- User information --> <string name="user_info_full_name">氏名</string> <string name="user_info_email">メール</string> @@ -610,4 +621,30 @@ <string name="activities_no_results_headline">まだアクティビティはありません</string> <string name="activities_no_results_message">このタイムラインには、いいね\n 追加、変更、共有が表示されます</string> - </resources> + <string name="webview_error">エラーが発生しました</string> + <string name="prefs_category_about">アプリについて</string> + + <string name="actionbar_contacts">アドレス帳バックアップ</string> + <string name="contacts_backup_button">今すぐバックアップ</string> + <string name="contacts_restore_button">前回のバックアップを復元</string> + <string name="contacts_header_restore">復元</string> + <string name="contacts_header_backup">バックアップ</string> + <string name="contacts_automatic_backup">アドレス帳バックアップ</string> + <string name="contacts_last_backup">前回のバックアップ</string> + <string name="contacts_read_permission">アドレス帳の読み取りアクセス許可が必要です</string> + <string name="contacts_write_permission">アドレス帳の書き込みアクセス許可が必要です</string> + <string name="contactlist_title">アドレス帳を復元</string> + <string name="contaclist_restore_selected">選択したアドレス帳を復元</string> + <string name="contactlist_account_chooser_title">インポートするアカウントを選択</string> + <string name="contactlist_no_permission">アクセス許可がありません。インポートできません!</string> + <string name="contacts_preference_choose_date">日付を選択</string> + <string name="contacts_preference_backup_never">しない</string> + <string name="contacts_preferences_no_file_found">ファイルが見つかりません</string> + <string name="contacts_preferences_backup_scheduled">バックアップをスケジュールしました。まもなく開始します</string> + <string name="contacts_preferences_import_scheduled">インポートをスケジュールしました。まもなく開始します</string> + + <!-- Notifications --> + <string name="new_notification_received">新しい通知を受け取りました</string> + + +</resources> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index cc695afe75..13b10f08e6 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -51,7 +51,7 @@ <string name="prefs_instant_video_upload">Envio automático de vídeos</string> <string name="prefs_instant_video_upload_summary">Envia automaticamente os vídeos feitos com a câmera</string> <string name="prefs_log_title">Habilitar login</string> - <string name="prefs_log_summary">Isto é usado para registrar problemas</string> + <string name="prefs_log_summary">Usado para registrar problemas</string> <string name="prefs_log_title_history">Histórico de logins</string> <string name="prefs_log_summary_history">Mostra os registros gravados</string> <string name="prefs_log_delete_history_button">Excluir histórico</string> From 3d716026975d6e34035389b5f89d5943e47d39c8 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Wed, 26 Apr 2017 00:22:16 +0000 Subject: [PATCH 772/881] [tx-robot] updated from transifex --- src/main/res/values-da/strings.xml | 1 - src/main/res/values-de-rDE/strings.xml | 1 - src/main/res/values-de/strings.xml | 1 - src/main/res/values-el/strings.xml | 1 - src/main/res/values-es-rMX/strings.xml | 1 - src/main/res/values-es/strings.xml | 1 - src/main/res/values-fi-rFI/strings.xml | 1 - src/main/res/values-fr/strings.xml | 1 - src/main/res/values-hu-rHU/strings.xml | 1 - src/main/res/values-is/strings.xml | 1 - src/main/res/values-it/strings.xml | 1 - src/main/res/values-ja-rJP/strings.xml | 1 - src/main/res/values-nb-rNO/strings.xml | 53 +++++++++++++++++++++++++- src/main/res/values-nl/strings.xml | 1 - src/main/res/values-pl/strings.xml | 1 - src/main/res/values-pt-rBR/strings.xml | 29 +++++++------- src/main/res/values-ru/strings.xml | 1 - src/main/res/values-tr/strings.xml | 1 - src/main/res/values-zh-rCN/strings.xml | 40 ++++++++++++++++++- 19 files changed, 103 insertions(+), 35 deletions(-) diff --git a/src/main/res/values-da/strings.xml b/src/main/res/values-da/strings.xml index 76410d86af..46f79a9426 100644 --- a/src/main/res/values-da/strings.xml +++ b/src/main/res/values-da/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Der er ingen filer i denne mappe.</string> <string name="file_list_empty_headline_search">Intet resultat for denne mappe</string> <string name="file_list_empty_headline_server_search">Ingen resultater</string> - <string name="file_list_empty_favorite_headline">Ingen favoritter</string> <string name="file_list_empty_shared_headline">Intet er delt endnu</string> <string name="file_list_empty_shared">Filer og mapper du deler vil blive vist her</string> <string name="file_list_empty_headline_server_search_videos">Ingen videoer</string> diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index d857352cae..0262b8893f 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</string> <string name="file_list_empty_headline_search">Keine Ergebnisse in diesem Ordner</string> <string name="file_list_empty_headline_server_search">Keine Ergebnisse</string> - <string name="file_list_empty_favorite_headline">Keine Favoriten</string> <string name="file_list_empty_shared_headline">Noch nichts geteilt</string> <string name="file_list_empty_shared">Dateien und Ordner, die Sie teilen, werden hier erscheinen</string> <string name="file_list_empty_headline_server_search_videos">Keine Videos</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index d7b9e37a8e..ad7c5fe11e 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</string> <string name="file_list_empty_headline_search">Keine Ergebnisse in diesem Ordner</string> <string name="file_list_empty_headline_server_search">Keine Ergebnisse</string> - <string name="file_list_empty_favorite_headline">Keine Favoriten</string> <string name="file_list_empty_shared_headline">Noch nichts geteilt</string> <string name="file_list_empty_shared">Von dir geteilte Dateien und Ordner werden hier erscheinen</string> <string name="file_list_empty_headline_server_search_videos">Keine Videos</string> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 021b319c4d..9148029045 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Δεν υπάρχουν αρχεία σε αυτό τον φάκελο.</string> <string name="file_list_empty_headline_search">Κανενα αποτέλεσμα σε αυτον τον φάκελο</string> <string name="file_list_empty_headline_server_search">Κανένα αποτέλεσμα</string> - <string name="file_list_empty_favorite_headline">Κανένα αγαπημένο</string> <string name="file_list_empty_shared_headline">Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής</string> <string name="file_list_empty_shared">Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανίζονται εδώ</string> <string name="file_list_empty_headline_server_search_videos">Κανένα βίντεο</string> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 937eca660f..d6b9cac861 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">No hay archivos en esta carpeta</string> <string name="file_list_empty_headline_search">No hay resultados en esta carpeta</string> <string name="file_list_empty_headline_server_search">No hay resultados</string> - <string name="file_list_empty_favorite_headline">No hay favoritos</string> <string name="file_list_empty_shared_headline">Aún no hay nada compartido</string> <string name="file_list_empty_shared">Los archivos y carpetas que comparta se mostrarán aquí. </string> <string name="file_list_empty_headline_server_search_videos">No hay videos</string> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index b2756810f1..a55d659165 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -102,7 +102,6 @@ <string name="local_file_list_empty">No hay archivos en esta carpeta.</string> <string name="file_list_empty_headline_search">No hay resultados en esta carpeta</string> <string name="file_list_empty_headline_server_search">Sin resultados</string> - <string name="file_list_empty_favorite_headline">Sin favoritos</string> <string name="file_list_empty_shared_headline">Aún no hay nada compartido</string> <string name="file_list_empty_shared">Aquí aparecerán los archivos y carpetas que usted comparta</string> <string name="file_list_empty_headline_server_search_videos">No hay videos</string> diff --git a/src/main/res/values-fi-rFI/strings.xml b/src/main/res/values-fi-rFI/strings.xml index fb60e46cca..38d4cb57f2 100644 --- a/src/main/res/values-fi-rFI/strings.xml +++ b/src/main/res/values-fi-rFI/strings.xml @@ -100,7 +100,6 @@ <string name="local_file_list_empty">Tässä kansiossa ei ole tiedostoja</string> <string name="file_list_empty_headline_search">Ei kohteita tässä kansiossa</string> <string name="file_list_empty_headline_server_search">Ei tuloksia</string> - <string name="file_list_empty_favorite_headline">Ei suosikkeja</string> <string name="file_list_empty_shared_headline">Ei mitään jaettua</string> <string name="file_list_empty_headline_server_search_videos">Ei videoita</string> <string name="file_list_empty_headline_server_search_photos">Ei kuvia</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index d1d808b062..cf950b3afe 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Aucun fichier n\'est présent dans ce dossier.</string> <string name="file_list_empty_headline_search">Aucun résultat dans ce dossier</string> <string name="file_list_empty_headline_server_search">Aucun résultat</string> - <string name="file_list_empty_favorite_headline">Aucun favori</string> <string name="file_list_empty_shared_headline">Rien n\'est partagé pour l\'instant</string> <string name="file_list_empty_shared">Les fichiers et dossiers que vous partagez apparaîtront ici</string> <string name="file_list_empty_headline_server_search_videos">Aucune vidéo</string> diff --git a/src/main/res/values-hu-rHU/strings.xml b/src/main/res/values-hu-rHU/strings.xml index ffa5191c80..82bab3bccb 100644 --- a/src/main/res/values-hu-rHU/strings.xml +++ b/src/main/res/values-hu-rHU/strings.xml @@ -103,7 +103,6 @@ <string name="local_file_list_empty">Nincs fájl ebben a mappában.</string> <string name="file_list_empty_headline_search">Nincsenek eredmények ebben a mappában</string> <string name="file_list_empty_headline_server_search">Nincsenek eredmények</string> - <string name="file_list_empty_favorite_headline">Nincsenek kedvencek</string> <string name="file_list_empty_shared_headline">Nincs semmi megosztva</string> <string name="file_list_empty_shared">Az Ön által megosztott fájlok és mappák itt jelennek meg</string> <string name="file_list_empty_headline_server_search_videos">Nincsenek videók</string> diff --git a/src/main/res/values-is/strings.xml b/src/main/res/values-is/strings.xml index e1a9917ebf..73db85ff47 100644 --- a/src/main/res/values-is/strings.xml +++ b/src/main/res/values-is/strings.xml @@ -102,7 +102,6 @@ <string name="local_file_list_empty">Það eru engar skrár í þessari möppu.</string> <string name="file_list_empty_headline_search">Engar niðurstöður í þessari möppu</string> <string name="file_list_empty_headline_server_search">Engar niðurstöður</string> - <string name="file_list_empty_favorite_headline">Engin eftirlæti</string> <string name="file_list_empty_shared_headline">Engu deilt ennþá</string> <string name="file_list_empty_shared">Skrár og möppur sem þú deilir birtast hér</string> <string name="file_list_empty_headline_server_search_videos">Engin myndskeið</string> diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index 05b0653edc..50e38cf770 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -95,7 +95,6 @@ <string name="local_file_list_empty">Non ci sono file in questa cartella.</string> <string name="file_list_empty_headline_search">Nessun risultato in questa cartella</string> <string name="file_list_empty_headline_server_search">Nessun risultato</string> - <string name="file_list_empty_favorite_headline">Nessun preferito</string> <string name="file_list_empty_shared_headline">Ancora nessuna condivisione</string> <string name="file_list_empty_headline_server_search_videos">Nessun video</string> <string name="file_list_empty_headline_server_search_photos">Nessuna foto</string> diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index 4086824227..6af1428d3c 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -106,7 +106,6 @@ <string name="local_file_list_empty">このフォルダーにはファイルがありません。</string> <string name="file_list_empty_headline_search">このフォルダーの結果はありません</string> <string name="file_list_empty_headline_server_search">結果なし</string> - <string name="file_list_empty_favorite_headline">お気に入りなし</string> <string name="file_list_empty_shared_headline">まだ何も共有されていません</string> <string name="file_list_empty_shared">共有したファイルやフォルダーは、ここに表示されます。</string> <string name="file_list_empty_headline_server_search_videos">ビデオなし</string> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index c92cbf1d09..e7676df8f9 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Innstillinger</string> <string name="drawer_item_uploads_list">Opplastinger</string> <string name="drawer_item_activities">Aktiviteter</string> + <string name="drawer_item_notifications">Varsler</string> <string name="drawer_quota">%1$s av %2$s brukt</string> <string name="drawer_close">Lukk</string> <string name="drawer_open">Åpne</string> @@ -42,6 +43,8 @@ <string name="prefs_accounts">Kontoer</string> <string name="prefs_manage_accounts">Håndter kontoer</string> <string name="prefs_passcode">Passordlås</string> + <string name="prefs_fingerprint">Fingeravtrykkslås</string> + <string name="prefs_fingerprint_notsetup">Det har ikke blitt satt opp noen fingeravtrykk.</string> <string name="prefs_show_hidden_files">Vis skjulte filer</string> <string name="prefs_instant_upload">Umiddelbare bildeopplastninger</string> <string name="prefs_instant_upload_summary">Last opp bilder tatt av kameraet umiddelbart</string> @@ -94,20 +97,31 @@ <string name="file_list_seconds_ago">for få sekunder siden</string> <string name="file_list_empty_headline">Ingen filer her</string> <string name="file_list_empty">Last opp innhold eller synkroniser med enhetene dine.</string> + <string name="file_list_empty_favorites">Marker noen filer som favoritter eller synkroniser enhetene dine!</string> + <string name="file_list_empty_favorites_filter_list">Filer og mapper du markerer som favoritter vil vises her</string> + <string name="file_list_empty_favorites_filter">Din spørring returnerte ingen filer markert som favoritter!</string> <string name="file_list_loading">Laster…</string> <string name="file_list_no_app_for_file_type">Ingen applikasjon funnet for filtypen!</string> <string name="local_file_list_empty">Det er ingen filer i denne mappen.</string> <string name="file_list_empty_headline_search">Ingen resultater i denne mappen</string> <string name="file_list_empty_headline_server_search">Ingen resultater</string> - <string name="file_list_empty_favorite_headline">Ingen favoritter</string> <string name="file_list_empty_shared_headline">Ingenting delt enda</string> <string name="file_list_empty_shared">Filer og mapper som du deler vil bli vist her</string> <string name="file_list_empty_headline_server_search_videos">Ingen videoer</string> <string name="file_list_empty_headline_server_search_photos">Ingen bilder</string> <string name="file_list_empty_search">Vil du prøve i en annen mappe?</string> + <string name="file_list_empty_recently_modified">Fant ingen filer endret de siste syv dagene</string> + <string name="file_list_empty_recently_modified_filter">Spørringen din returnerte ingen filer endret + de siste syv dagene!</string> + <string name="file_list_empty_recently_added">Fant ingen nylig tillagte filer</string> + <string name="file_list_empty_recently_added_filter">Din spørring returnerte ingen filer som nylig er blitt lagt til!</string> <string name="file_list_empty_text_photos">Last opp noen bilder eller aktiver automatisk opplasting!</string> + <string name="file_list_empty_text_photos_filter">Din spørring returnerte ingen bilder!</string> + <string name="file_list_empty_text_videos">Last opp noen videoer eller skru på automatisk opplasting!</string> + <string name="file_list_empty_text_videos_filter">Din spørring returnerte ingen vidoer!</string> <string name="upload_list_empty_headline">Ingen opplastinger tilgjengelig</string> <string name="upload_list_empty_text">Last opp innhold eller aktiver umiddelbar opplasting.</string> + <string name="upload_list_empty_text_auto_upload">Last opp noe innhold eller aktiver automatisk opplasting!</string> <string name="file_list_folder">mappe</string> <string name="file_list_folders">mapper</string> <string name="file_list_file">fil</string> @@ -264,6 +278,7 @@ <string name="favorite">Sett som tilgjengelig frakoblet</string> <string name="unfavorite">Fjern som tilgjengelig frakoblet</string> <string name="favorite_real">Sett som favoritt</string> + <string name="unset_favorite_real">Fjern favorittmarkering</string> <string name="common_rename">Endre navn</string> <string name="common_remove">Fjern</string> <string name="confirmation_remove_file_alert">Vil du virkelig fjerne %1$s?</string> @@ -532,6 +547,7 @@ <string name="participate_testing_bug_text">Funnet en feil? Føles noe rart?</string> <string name="participate_testing_report_text">Meld en feil på Github</string> <string name="participate_testing_version_text">Er du interessert i å hjelpe oss å teste ned neste versjonen?</string> + <string name="participate_beta_headline">Test utvikler-versjonen</string> <string name="participate_beta_text">Dette inkluderer alle kommende funksjoner og er helt på kanten. Feil/feilmeldinger kan oppstå og i sådant fall, meld fra om dem til oss.</string> <string name="participate_release_candidate_headline">Release candidate</string> <string name="participate_release_candidate_text">Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid.</string> @@ -557,6 +573,10 @@ <string name="activity_list_loading_activity">Laster inn aktiviteter…</string> <string name="activity_list_no_results">Ingen aktiviteter funnet.</string> + <string name="notifications_loading_activity">Lsater inn varsler…</string> + <string name="notifications_no_results_headline">Ingen varsler</string> + <string name="notifications_no_results_message">Kom innom senere og ta en titt.</string> + <string name="upload_file_dialog_title">Legg inn filnavn og -type for opplasting</string> <string name="upload_file_dialog_filename">Filnavn</string> <string name="upload_file_dialog_filetype">Filtype</string> @@ -583,6 +603,9 @@ <string name="whats_new_skip">Hopp over</string> + <string name="fingerprint_scan_finger">Skann fingeren din</string> + <string name="fingerprint_unknown">Gjenkjenner ikke finger</string> + <!-- User information --> <string name="user_info_full_name">Fullt navn</string> <string name="user_info_email">E-post</string> @@ -596,4 +619,30 @@ <!-- Activities --> <string name="activities_no_results_headline">Ingen aktivitet enda</string> <string name="activities_no_results_message">Denne strømmen vil vise hendelser som\nf.eks. innlegging, endring og deling</string> - </resources> + <string name="webview_error">Feil oppstod</string> + <string name="prefs_category_about">Om</string> + + <string name="actionbar_contacts">Sikkerhetskopiering av kontakter</string> + <string name="contacts_backup_button">Sikkerhetskopier nå</string> + <string name="contacts_restore_button">Gjenopprett fra siste sikkerhetskopiering</string> + <string name="contacts_header_restore">Gjenopprett</string> + <string name="contacts_header_backup">Sikkerhetskopier</string> + <string name="contacts_automatic_backup">Sikkerhetskopi av kontakter</string> + <string name="contacts_last_backup">Siste sikkerhetskopi</string> + <string name="contacts_read_permission">Lesetilgang til kontaktliste trengs</string> + <string name="contacts_write_permission">Skrivetilgang til kontaktliste trengs</string> + <string name="contactlist_title">Gjenopprett kontakter</string> + <string name="contaclist_restore_selected">Gjenopprett valgte kontakter</string> + <string name="contactlist_account_chooser_title">Velg konto for import</string> + <string name="contactlist_no_permission">Ingen tilgang, ingenting importert!</string> + <string name="contacts_preference_choose_date">Velg dato</string> + <string name="contacts_preference_backup_never">aldri</string> + <string name="contacts_preferences_no_file_found">Ingen fil funnet</string> + <string name="contacts_preferences_backup_scheduled">Sikkerhetskopi planlagt og i snarlig effektuering</string> + <string name="contacts_preferences_import_scheduled">Importering planlagt og i snarlig effektuering</string> + + <!-- Notifications --> + <string name="new_notification_received">Nytt varsel mottatt</string> + + +</resources> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index f17e580343..e13ba129ed 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Er staan geen bestanden in deze map.</string> <string name="file_list_empty_headline_search">Geen resultaten in deze map</string> <string name="file_list_empty_headline_server_search">Geen resultaten</string> - <string name="file_list_empty_favorite_headline">Geen favorieten</string> <string name="file_list_empty_shared_headline">Nog niets gedeeld</string> <string name="file_list_empty_shared">Bestanden en mappen die je deelt, worden hier getoond</string> <string name="file_list_empty_headline_server_search_videos">Geen video\'s</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index c4ad78b9b2..41a82e3dbb 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -103,7 +103,6 @@ <string name="local_file_list_empty">Nie ma plików w tym folderze.</string> <string name="file_list_empty_headline_search">Brak wyników w tym folderze</string> <string name="file_list_empty_headline_server_search">Brak wyników</string> - <string name="file_list_empty_favorite_headline">Brak ulubionych</string> <string name="file_list_empty_shared_headline">Nic nie jest jeszcze współdzielone</string> <string name="file_list_empty_shared">Pliki i foldery, które współdzielisz pokażą się tutaj</string> <string name="file_list_empty_headline_server_search_videos">Brak plików wideo</string> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 13b10f08e6..b25a4ecf00 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -45,7 +45,7 @@ <string name="prefs_passcode">Bloqueio de código de acesso</string> <string name="prefs_fingerprint">Bloqueio por impressão digital</string> <string name="prefs_fingerprint_notsetup">Nenhuma impressão digital foi configurada.</string> - <string name="prefs_show_hidden_files">Mostrar arquivos escondidos</string> + <string name="prefs_show_hidden_files">Mostrar arquivos ocultos</string> <string name="prefs_instant_upload">Envio automático de imagens</string> <string name="prefs_instant_upload_summary">Envia automaticamente as fotos tiradas com a câmera</string> <string name="prefs_instant_video_upload">Envio automático de vídeos</string> @@ -84,9 +84,9 @@ <string name="uploader_wrn_no_account_setup_btn_text">Instalação</string> <string name="uploader_wrn_no_account_quit_btn_text">Sair</string> <string name="uploader_error_title_no_file_to_upload">Nenhum arquivo para envio</string> - <string name="uploader_error_message_received_piece_of_text">%1$s não pode enviar um pedaço de texto como um arquivo.</string> + <string name="uploader_error_message_received_piece_of_text">%1$s não pôde enviar um pedaço de texto como um arquivo.</string> <string name="uploader_error_message_no_file_to_upload">Os dados recebidos não incluem um arquivo válido.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">O arquivo não pode ser enviado</string> + <string name="uploader_error_title_file_cannot_be_uploaded">O arquivo não pôde ser enviado</string> <string name="uploader_error_message_read_permission_not_granted">%1$s não tem permissão para ler um arquivo recebido</string> <string name="uploader_error_message_source_file_not_found">Arquivo para envio não foi encontrado em sua localização. Verifique se o arquivo existe.</string> <string name="uploader_error_message_source_file_not_copied">Ocorreu um erro ao copiar o arquivo para uma pasta temporária. Por favor, tente enviar novamente.</string> @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Não existe nenhum arquivo nesta pasta.</string> <string name="file_list_empty_headline_search">Nenhum resultado nesta pasta</string> <string name="file_list_empty_headline_server_search">Sem resultados</string> - <string name="file_list_empty_favorite_headline">Sem favoritos</string> <string name="file_list_empty_shared_headline">Nada compartilhado ainda</string> <string name="file_list_empty_shared">Arquivos e pastas que você compartilhar serão mostrados aqui</string> <string name="file_list_empty_headline_server_search_videos"> Sem vídeos</string> @@ -196,7 +195,7 @@ foram encontrados para sua pesquisa! </string> <string name="common_choose_account">Escolha a conta</string> <string name="sync_fail_ticker">Falha na sincronização</string> <string name="sync_fail_ticker_unauthorized">Falha na sincronização, você precisa se logar novamente</string> - <string name="sync_fail_content">A sincronização de %1$s não pode ser finalizada</string> + <string name="sync_fail_content">A sincronização de %1$s não pôde ser finalizada</string> <string name="sync_fail_content_unauthorized">Senha inválida para %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Conflitos encontrados</string> <string name="sync_conflicts_in_favourites_content">%1$d arquivos \"manter sincronizados\" não puderam ser sincronizados</string> @@ -253,7 +252,7 @@ foram encontrados para sua pesquisa! </string> <string name="auth_account_not_new">Já existe no dispositivo uma conta para o mesmo usuário e servidor</string> <string name="auth_account_not_the_same">As informações que o usuário digitou não correspondem ao usuário da conta</string> <string name="auth_unknown_error_title">Ocorreu um erro desconhecido!</string> - <string name="auth_unknown_host_title">Não pode encontrar host</string> + <string name="auth_unknown_host_title">Não foi possível encontrar o host</string> <string name="auth_incorrect_path_title">Instância de servidor não encontrada</string> <string name="auth_timeout_title">O servidor demorou demais a responder</string> <string name="auth_incorrect_address_title">Formato de endereço de servidor errado</string> @@ -290,9 +289,9 @@ foram encontrados para sua pesquisa! </string> <string name="rename_dialog_title">Digite um novo nome</string> <string name="rename_local_fail_msg">Cópia local não pôde ser renomeada. Tente outro nome</string> <string name="rename_server_fail_msg">Renomeação não pôde ser finalizada</string> - <string name="sync_file_fail_msg">Arquivo remoto não pode ser verificado</string> + <string name="sync_file_fail_msg">Arquivo remoto não pôde ser verificado</string> <string name="sync_file_nothing_to_do_msg">Conteúdo do arquivo já foi sincronizado</string> - <string name="create_dir_fail_msg">A pasta não pode ser criada</string> + <string name="create_dir_fail_msg">A pasta não pôde ser criada</string> <string name="filename_forbidden_characters">Caracteres proibidos: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">O nome do arquivo contém pelo menos um caractere inválido </string> <string name="filename_empty">O nome do arquivo não pode estar vazio</string> @@ -306,13 +305,13 @@ foram encontrados para sua pesquisa! </string> <string name="oauth_check_onoff">Login com oAuth2</string> <string name="oauth_login_connection">Conectando-se a oAuth2 servidor...</string> - <string name="ssl_validator_header">A identidade do site não pode ser verificada</string> + <string name="ssl_validator_header">A identidade do site não pôde ser verificada</string> <string name="ssl_validator_reason_cert_not_trusted">- O certificado do servidor não é confiável</string> <string name="ssl_validator_reason_cert_expired">- O certificado do servidor expirou</string> - <string name="ssl_validator_reason_cert_not_yet_valid">- A data de validade do certificado do servidor está no futuro</string> + <string name="ssl_validator_reason_cert_not_yet_valid">- A data de expiração do certificado do servidor está no futuro</string> <string name="ssl_validator_reason_hostname_not_verified">- A URL do host não confere com o host do certificado</string> <string name="ssl_validator_question">Você confia nesse certificado mesmo assim?</string> - <string name="ssl_validator_not_saved">O certificado não pode ser salvo</string> + <string name="ssl_validator_not_saved">O certificado não pôde ser salvo</string> <string name="ssl_validator_btn_details_see">Detalhes</string> <string name="ssl_validator_btn_details_hide">Ocultar</string> <string name="ssl_validator_label_subject">Emitido para:</string> @@ -331,7 +330,7 @@ foram encontrados para sua pesquisa! </string> <string name="digest_algorithm_not_available">Este algoritmo de resumo não está disponível no seu telefone.</string> <string name="ssl_validator_label_certificate_fingerprint">Impressão digital:</string> <string name="certificate_load_problem">Existe um problema ao carregar o certificado.</string> - <string name="ssl_validator_null_cert">O certificado não pode ser mostrado.</string> + <string name="ssl_validator_null_cert">O certificado não pôde ser mostrado.</string> <string name="ssl_validator_no_info_about_error">- Nenhuma informação sobre o erro</string> <string name="placeholder_sentence">Este é um espaço reservado</string> @@ -355,7 +354,7 @@ foram encontrados para sua pesquisa! </string> <string name="preview_sorry">Desculpe isso!</string> <string name="preview_image_description">Pré-visualização da imagem</string> - <string name="preview_image_error_unknown_format">Imagem não pode ser mostrada</string> + <string name="preview_image_error_unknown_format">Imagem não pôde ser mostrada</string> <string name="error__upload__local_file_not_copied">%1$s não pôde ser copiado para pasta local %2$s</string> <string name="prefs_instant_upload_path_title">Pasta de envio automático</string> @@ -382,12 +381,12 @@ foram encontrados para sua pesquisa! </string> <string name="clipboard_uxexpected_error">Erro inesperado ao copiar para a área de transferência</string> <string name="clipboard_label">Texto copiado de %1$s</string> - <string name="error_cant_bind_to_operations_service">Erro crítico: não pode executar as operações</string> + <string name="error_cant_bind_to_operations_service">Erro crítico: não foi possível executar as operações</string> <string name="network_error_socket_exception">Ocorreu um erro durante a conexão com o servidor.</string> <string name="network_error_socket_timeout_exception">Ocorreu um erro enquanto se espera pelo servidor, a operação pode não ter sido executada</string> <string name="network_error_connect_timeout_exception">Ocorreu um erro enquanto se espera pelo servidor, a operação pode não ter sido executada</string> - <string name="network_host_not_available">A operação não pode ser concluída, o servidor está indisponível</string> + <string name="network_host_not_available">A operação não pôde ser concluída pois o servidor está indisponível</string> <string name="forbidden_permissions">Você não tem permissão %s</string> <string name="forbidden_permissions_rename">para renomear este arquivo</string> <string name="forbidden_permissions_delete">para excluir este arquivo</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 3b3516d5f9..1faf6f1bea 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -107,7 +107,6 @@ <string name="local_file_list_empty">В этом каталоге нет файлов.</string> <string name="file_list_empty_headline_search">В этой папке результатов не найдено</string> <string name="file_list_empty_headline_server_search">Результаты отсутствуют</string> - <string name="file_list_empty_favorite_headline">Избранное отсутствует</string> <string name="file_list_empty_shared_headline">Вы ещё ничем не поделились</string> <string name="file_list_empty_shared">Здесь появятся файлы и каталоги, которыми вы поделитесь</string> <string name="file_list_empty_headline_server_search_videos">Видео отсуствуют</string> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index aa0897a0f1..59218e18ba 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -105,7 +105,6 @@ <string name="local_file_list_empty">Bu klasörde herhangi bir dosya yok.</string> <string name="file_list_empty_headline_search">Bu klasörde herhangi bir sonuç yok</string> <string name="file_list_empty_headline_server_search">Herhangi bir sonuç bulunamadı</string> - <string name="file_list_empty_favorite_headline">Herhangi bir sık kullanılan öge bulunamadı</string> <string name="file_list_empty_shared_headline">Henüz hiçbir şey paylaşılmamış</string> <string name="file_list_empty_shared">Paylaştığınız dosya ve klasörler burada görüntülenir</string> <string name="file_list_empty_headline_server_search_videos">Herhangi bir görüntü bulunamadı</string> diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 980ec933fa..3911e542c6 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">设置</string> <string name="drawer_item_uploads_list">上传</string> <string name="drawer_item_activities">动态</string> + <string name="drawer_item_notifications">提示</string> <string name="drawer_quota">%1$s 之 %2$s 已使用</string> <string name="drawer_close">关闭</string> <string name="drawer_open">打开</string> @@ -42,6 +43,8 @@ <string name="prefs_accounts">账号</string> <string name="prefs_manage_accounts">管理账号</string> <string name="prefs_passcode">密码锁</string> + <string name="prefs_fingerprint">指纹锁</string> + <string name="prefs_fingerprint_notsetup">指纹锁没有设置</string> <string name="prefs_show_hidden_files">显示隐藏文件</string> <string name="prefs_instant_upload">即时图片上传</string> <string name="prefs_instant_upload_summary">即时上传相机拍摄的图片</string> @@ -103,7 +106,6 @@ <string name="local_file_list_empty">在该文件夹中不存在文件。</string> <string name="file_list_empty_headline_search">此文件夹无结果</string> <string name="file_list_empty_headline_server_search">没有结果</string> - <string name="file_list_empty_favorite_headline">无收藏</string> <string name="file_list_empty_shared_headline">还没有共享过文件</string> <string name="file_list_empty_shared">您共享的文件和文件夹将显示在这里</string> <string name="file_list_empty_headline_server_search_videos">无视频</string> @@ -545,6 +547,7 @@ <string name="participate_testing_bug_text">发现一个错误?事情很奇怪?</string> <string name="participate_testing_report_text">在GIthub在报告问题</string> <string name="participate_testing_version_text">有感兴趣帮我们测试下一个版本吗?</string> + <string name="participate_beta_headline">检查这个设备的版本</string> <string name="participate_beta_text">这包括所有即将加入的特性,有相当的风险。如果Bug 或错误发生,请向我们报告。</string> <string name="participate_release_candidate_headline">发行候选版本</string> <string name="participate_release_candidate_text">候选发行版(RC)是下一个版本的快照,希望它是稳定的,你可以帮助测试以确认这一点。可以注册登陆在应用商店或手工在F-Droid的版本部分查找,并进行测试。</string> @@ -569,6 +572,10 @@ <string name="activity_list_loading_activity">正在加载动态…</string> <string name="activity_list_no_results">未找到动态</string> + <string name="notifications_loading_activity">加载提示…</string> + <string name="notifications_no_results_headline">没有提示</string> + <string name="notifications_no_results_message">请稍后核对</string> + <string name="upload_file_dialog_title">输入上传的文件名和文件类型</string> <string name="upload_file_dialog_filename">文件名</string> <string name="upload_file_dialog_filetype">文件类型</string> @@ -595,6 +602,9 @@ <string name="whats_new_skip">跳过</string> + <string name="fingerprint_scan_finger">请扫描你的手指</string> + <string name="fingerprint_unknown">手指未被识别</string> + <!-- User information --> <string name="user_info_full_name">全名</string> <string name="user_info_email">电子邮件</string> @@ -608,4 +618,30 @@ <!-- Activities --> <string name="activities_no_results_headline">暂无动态</string> <string name="activities_no_results_message">瀑布流中会显示诸如添加\n更改&分享之类的事件</string> - </resources> + <string name="webview_error">发生错误</string> + <string name="prefs_category_about">关于</string> + + <string name="actionbar_contacts">联系人备份</string> + <string name="contacts_backup_button">现在备份</string> + <string name="contacts_restore_button">恢复上次备份</string> + <string name="contacts_header_restore">恢复</string> + <string name="contacts_header_backup">备份</string> + <string name="contacts_automatic_backup">联系人备份</string> + <string name="contacts_last_backup">上次备份</string> + <string name="contacts_read_permission">需要联系人的读书权限</string> + <string name="contacts_write_permission">需要联系人的写权限</string> + <string name="contactlist_title">恢复联系人</string> + <string name="contaclist_restore_selected">恢复选中的联系人</string> + <string name="contactlist_account_chooser_title">选择客户导入</string> + <string name="contactlist_no_permission">没有权限,无法导入!</string> + <string name="contacts_preference_choose_date">选择时间</string> + <string name="contacts_preference_backup_never">永远不</string> + <string name="contacts_preferences_no_file_found">没有文件被发现</string> + <string name="contacts_preferences_backup_scheduled">备份已经排期,稍后将开始</string> + <string name="contacts_preferences_import_scheduled">导入已经排期,稍后将开始</string> + + <!-- Notifications --> + <string name="new_notification_received">收到新提示</string> + + +</resources> From 92f12ac6a921c6a131e2491ffdc322267b7725cd Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 26 Apr 2017 15:23:39 +0200 Subject: [PATCH 773/881] if webview show app name --- .../android/ui/activity/WhatsNewActivity.java | 15 ++++++++++++--- src/main/res/layout/whats_new_activity.xml | 9 ++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java index 42fd9399e1..b4cb98eca8 100644 --- a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java @@ -78,7 +78,9 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa final boolean isBeta = getResources().getBoolean(R.bool.is_beta); String[] urls = getResources().getStringArray(R.array.whatsnew_urls); - if (urls.length > 0) { + boolean showWebView = urls.length > 0; + + if (showWebView) { FeaturesWebViewAdapter featuresWebViewAdapter = new FeaturesWebViewAdapter(getSupportFragmentManager(), urls); mProgress.setNumberOfSteps(featuresWebViewAdapter.getCount()); @@ -124,7 +126,14 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa }); TextView tv = (TextView)findViewById(R.id.welcomeText); - tv.setText(isFirstRun() ? R.string.empty : R.string.whats_new_title); + + if (showWebView) { + tv.setText(R.string.app_name); + } else if (isFirstRun()) { + tv.setText(R.string.empty); + } else { + tv.setText(R.string.whats_new_title); + } updateNextButtonIfNeeded(); } @@ -235,7 +244,7 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mWebUrl = getArguments() != null ? (String)getArguments().getString("url") : null; + mWebUrl = getArguments() != null ? getArguments().getString("url") : null; } @Nullable diff --git a/src/main/res/layout/whats_new_activity.xml b/src/main/res/layout/whats_new_activity.xml index 72f4904530..c00c3d4562 100644 --- a/src/main/res/layout/whats_new_activity.xml +++ b/src/main/res/layout/whats_new_activity.xml @@ -29,12 +29,15 @@ android:id="@+id/welcomeText" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_margin="5dp" + android:layout_marginBottom="5dp" + android:layout_marginLeft="10dp" + android:layout_marginStart="10dp" + android:layout_marginTop="5dp" android:layout_weight="6" - android:gravity="center" + android:gravity="center_vertical" android:text="@string/placeholder_sentence" android:textAppearance="?android:attr/textAppearanceLarge" - android:textColor="@color/login_text_hint_color"/> + android:textColor="@color/white"/> <android.support.v4.view.ViewPager android:id="@+id/contentPanel" From 5415a42f145e8873ba236ad15c1de4551ff46d3c Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Wed, 26 Apr 2017 15:15:55 +0000 Subject: [PATCH 774/881] [tx-robot] updated from transifex --- src/main/res/values-de-rDE/strings.xml | 1 + src/main/res/values-de/strings.xml | 1 + src/main/res/values-is/strings.xml | 40 +++++++++++++++++++++++++- src/main/res/values-nl/strings.xml | 1 + src/main/res/values-pt-rBR/strings.xml | 1 + src/main/res/values-ru/strings.xml | 1 + 6 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index 0262b8893f..b2deac4823 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -105,6 +105,7 @@ <string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</string> <string name="file_list_empty_headline_search">Keine Ergebnisse in diesem Ordner</string> <string name="file_list_empty_headline_server_search">Keine Ergebnisse</string> + <string name="file_list_empty_favorite_headline">Noch keine Favoriten vorhanden</string> <string name="file_list_empty_shared_headline">Noch nichts geteilt</string> <string name="file_list_empty_shared">Dateien und Ordner, die Sie teilen, werden hier erscheinen</string> <string name="file_list_empty_headline_server_search_videos">Keine Videos</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index ad7c5fe11e..92b5c5c514 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -105,6 +105,7 @@ <string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</string> <string name="file_list_empty_headline_search">Keine Ergebnisse in diesem Ordner</string> <string name="file_list_empty_headline_server_search">Keine Ergebnisse</string> + <string name="file_list_empty_favorite_headline">Noch keine Favoriten vorhanden</string> <string name="file_list_empty_shared_headline">Noch nichts geteilt</string> <string name="file_list_empty_shared">Von dir geteilte Dateien und Ordner werden hier erscheinen</string> <string name="file_list_empty_headline_server_search_videos">Keine Videos</string> diff --git a/src/main/res/values-is/strings.xml b/src/main/res/values-is/strings.xml index 73db85ff47..c2d1aaff72 100644 --- a/src/main/res/values-is/strings.xml +++ b/src/main/res/values-is/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Stillingar</string> <string name="drawer_item_uploads_list">Innsendingar</string> <string name="drawer_item_activities">Virkni</string> + <string name="drawer_item_notifications">Tilkynningar</string> <string name="drawer_quota">%1$s af %2$s notað</string> <string name="drawer_close">Loka</string> <string name="drawer_open">Opna</string> @@ -42,6 +43,8 @@ <string name="prefs_accounts">Notandaaðgangar</string> <string name="prefs_manage_accounts">Sýsla með notandaaðganga</string> <string name="prefs_passcode">Læsing með lykilkóða</string> + <string name="prefs_fingerprint">Fingrafaralás</string> + <string name="prefs_fingerprint_notsetup">Engin fingraför hafa verið sett inn.</string> <string name="prefs_show_hidden_files">Sýna faldar skrár</string> <string name="prefs_instant_upload">Hlaða strax inn myndum</string> <string name="prefs_instant_upload_summary">Hlaða strax inn myndum teknum á myndavél</string> @@ -102,6 +105,7 @@ <string name="local_file_list_empty">Það eru engar skrár í þessari möppu.</string> <string name="file_list_empty_headline_search">Engar niðurstöður í þessari möppu</string> <string name="file_list_empty_headline_server_search">Engar niðurstöður</string> + <string name="file_list_empty_favorite_headline">Engin eftirlæti ennþá</string> <string name="file_list_empty_shared_headline">Engu deilt ennþá</string> <string name="file_list_empty_shared">Skrár og möppur sem þú deilir birtast hér</string> <string name="file_list_empty_headline_server_search_videos">Engin myndskeið</string> @@ -544,6 +548,7 @@ <string name="participate_testing_bug_text">Fannstu villu? Eitthvað er skrýtið?</string> <string name="participate_testing_report_text">Tilkynna um vandamál á Github</string> <string name="participate_testing_version_text">Hefurðu áhuga á að hjálpa okkur með næstu útgáfu?</string> + <string name="participate_beta_headline">Prófaðu þróunarútgáfuna</string> <string name="participate_beta_text">Þetta innifelur alla nýjust eiginleika og er alveg á jaðri framþróunarinnar. Villur og hnökrar geta komið upp, og ef slíkt gerist skaltu endilega tilkynna um þær til okkar.</string> <string name="participate_release_candidate_headline">Forútgáfa</string> <string name="participate_release_candidate_text">Útgáfukandídatinn (release candidate = RC) er skyndiútgáfa af væntanlegri útgáfu og er ætlað að vera nokkuð stöðug. Þú getur hjálpað til við að tryggja stöðugleikann með því að prófa þína eigin uppsetningu. Skráðu þig í prófanir í Play Store eða handvirkt með því að fara í \"útgáfur\"-hlutann í F-Droid.</string> @@ -569,6 +574,10 @@ <string name="activity_list_loading_activity">Hleð inn virkniupplýsingum …</string> <string name="activity_list_no_results">Engin virkni fannst.</string> + <string name="notifications_loading_activity">Hleð inn tilkynningum …</string> + <string name="notifications_no_results_headline">Engar tilkynningar</string> + <string name="notifications_no_results_message">Athugaðu aftur síðar.</string> + <string name="upload_file_dialog_title">Settu inn skráaheiti og skráagerð fyrir innsendingu</string> <string name="upload_file_dialog_filename">Skráarheiti</string> <string name="upload_file_dialog_filetype">Skráartegund</string> @@ -595,6 +604,9 @@ <string name="whats_new_skip">Sleppa</string> + <string name="fingerprint_scan_finger">Skannaðu fingurinn þinn</string> + <string name="fingerprint_unknown">Fingrafar þekktist ekki</string> + <!-- User information --> <string name="user_info_full_name">Fullt nafn</string> <string name="user_info_email">Tölvupóstfang</string> @@ -608,4 +620,30 @@ <!-- Activities --> <string name="activities_no_results_headline">Engin virkni ennþá</string> <string name="activities_no_results_message">Streymið mun birta atburði á borð við\nviðbætingar, breytingar og deilingar</string> - </resources> + <string name="webview_error">Villa átti sér stað</string> + <string name="prefs_category_about">Um hugbúnaðinn</string> + + <string name="actionbar_contacts">Öryggisafrit af tengiliðum</string> + <string name="contacts_backup_button">Taka öryggisafrit núna</string> + <string name="contacts_restore_button">Endurheimta síðasta öryggisafrit</string> + <string name="contacts_header_restore">Endurheimta</string> + <string name="contacts_header_backup">Taka öryggisafrit</string> + <string name="contacts_automatic_backup">Öryggisafrit af tengiliðum</string> + <string name="contacts_last_backup">Síðasta öryggisafrit</string> + <string name="contacts_read_permission">Nauðsynlegt er að hafa lesheimildir fyrir tengiliði</string> + <string name="contacts_write_permission">Nauðsynlegt er að hafa skrifheimildir fyrir tengiliði</string> + <string name="contactlist_title">Endurheimta tengiliði</string> + <string name="contaclist_restore_selected">Endurheimta valda tengiliði</string> + <string name="contactlist_account_chooser_title">Veldu notandaaðgang fyrir innflutning</string> + <string name="contactlist_no_permission">Engar aðgangsheimildir, ekkert flutt inn!</string> + <string name="contacts_preference_choose_date">Veldu dagsetningu</string> + <string name="contacts_preference_backup_never">aldrei</string> + <string name="contacts_preferences_no_file_found">Engin skrá fannst</string> + <string name="contacts_preferences_backup_scheduled">Öryggisafritun er á áætlun og mun hefjast fljótlega</string> + <string name="contacts_preferences_import_scheduled">Innflutningur er á áætlun og mun hefjast fljótlega</string> + + <!-- Notifications --> + <string name="new_notification_received">Tók á móti nýrri tilkynningu</string> + + +</resources> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index e13ba129ed..d580d28513 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -105,6 +105,7 @@ <string name="local_file_list_empty">Er staan geen bestanden in deze map.</string> <string name="file_list_empty_headline_search">Geen resultaten in deze map</string> <string name="file_list_empty_headline_server_search">Geen resultaten</string> + <string name="file_list_empty_favorite_headline">Nog geen favorieten</string> <string name="file_list_empty_shared_headline">Nog niets gedeeld</string> <string name="file_list_empty_shared">Bestanden en mappen die je deelt, worden hier getoond</string> <string name="file_list_empty_headline_server_search_videos">Geen video\'s</string> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index b25a4ecf00..3b464afda1 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -105,6 +105,7 @@ <string name="local_file_list_empty">Não existe nenhum arquivo nesta pasta.</string> <string name="file_list_empty_headline_search">Nenhum resultado nesta pasta</string> <string name="file_list_empty_headline_server_search">Sem resultados</string> + <string name="file_list_empty_favorite_headline">Nenhum favorito ainda</string> <string name="file_list_empty_shared_headline">Nada compartilhado ainda</string> <string name="file_list_empty_shared">Arquivos e pastas que você compartilhar serão mostrados aqui</string> <string name="file_list_empty_headline_server_search_videos"> Sem vídeos</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 1faf6f1bea..2160b8de18 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -107,6 +107,7 @@ <string name="local_file_list_empty">В этом каталоге нет файлов.</string> <string name="file_list_empty_headline_search">В этой папке результатов не найдено</string> <string name="file_list_empty_headline_server_search">Результаты отсутствуют</string> + <string name="file_list_empty_favorite_headline">Избранного ещё нет</string> <string name="file_list_empty_shared_headline">Вы ещё ничем не поделились</string> <string name="file_list_empty_shared">Здесь появятся файлы и каталоги, которыми вы поделитесь</string> <string name="file_list_empty_headline_server_search_videos">Видео отсуствуют</string> From 4efd85c748f03337326c4cf76202238bc1173b03 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Wed, 26 Apr 2017 15:19:56 +0000 Subject: [PATCH 775/881] [tx-robot] updated from transifex --- src/main/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 3911e542c6..f6046fd8a6 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -572,7 +572,7 @@ <string name="activity_list_loading_activity">正在加载动态…</string> <string name="activity_list_no_results">未找到动态</string> - <string name="notifications_loading_activity">加载提示…</string> + <string name="notifications_loading_activity">加载提示…</string> <string name="notifications_no_results_headline">没有提示</string> <string name="notifications_no_results_message">请稍后核对</string> From 0b6423ce726f5550cf27ef41adb4e54b7162677b Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Fri, 21 Apr 2017 17:43:55 -0500 Subject: [PATCH 776/881] Bug #843 was Fixed PreviewImageActivity is removed from the stack activity --- .../ui/activity/FileDisplayActivity.java | 17 +++++++++++++++++ .../ui/preview/PreviewImageActivity.java | 2 ++ 2 files changed, 19 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 60720de47e..fc240c4e5f 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -451,6 +451,16 @@ public class FileDisplayActivity extends HookActivity } } + //Is called with the flag FLAG_ACTIVITY_SINGLE_TOP and set the new file and intent + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + if(intent.getAction()!=null && intent.getAction().equalsIgnoreCase(ACTION_DETAILS)){ + setIntent(intent); + setFile((OCFile)intent.getParcelableExtra(EXTRA_FILE)); + } + } + private Fragment chooseInitialSecondFragment(OCFile file) { Fragment secondFragment = null; if (file != null && !file.isFolder()) { @@ -987,6 +997,13 @@ public class FileDisplayActivity extends HookActivity getListOfFilesFragment().getFabMain().collapse(); } else { // all closed + + //if PreviewImageActivity called this activity and mDualPane==false then calls PreviewImageActivity again + if((getIntent().getAction()!=null && getIntent().getAction().equalsIgnoreCase(ACTION_DETAILS)) && !mDualPane){ + getIntent().setAction(null); + startImagePreview(getFile()); + } + OCFileListFragment listOfFiles = getListOfFilesFragment(); if (mDualPane || getSecondFragment() == null) { OCFile currentDir = getCurrentDir(); diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java index 4396353ac7..3d4676ce4c 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -304,9 +304,11 @@ public class PreviewImageActivity extends FileActivity implements showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, file); showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this)); + showDetailsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(showDetailsIntent); int pos = mPreviewImagePagerAdapter.getFilePosition(file); file = mPreviewImagePagerAdapter.getFileAt(pos); + finish(); } private void requestForDownload(OCFile file) { From 41494099f237b1c88c82590d1b5d907e738e1563 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 21 Apr 2017 11:37:03 +0200 Subject: [PATCH 777/881] bottom bar in all activities --- .../ui/activity/ActivitiesListActivity.java | 9 ++ .../activity/ContactsPreferenceActivity.java | 8 ++ .../ui/activity/FolderSyncActivity.java | 9 ++ .../ui/activity/NotificationsActivity.java | 9 ++ .../ui/activity/UploadListActivity.java | 10 +++ .../ui/fragment/OCFileListFragment.java | 59 ++++--------- .../owncloud/android/utils/DisplayUtils.java | 85 +++++++++++++++++++ src/main/res/layout/activity_list_layout.xml | 21 ++++- src/main/res/layout/contacts_preference.xml | 25 +++++- src/main/res/layout/folder_sync_layout.xml | 20 ++++- src/main/res/layout/notifications_layout.xml | 20 ++++- src/main/res/layout/upload_list_layout.xml | 27 ++++-- 12 files changed, 243 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java b/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java index 5573f1ac73..661e956c65 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java @@ -28,6 +28,7 @@ import android.accounts.OperationCanceledException; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.BottomNavigationView; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; @@ -50,6 +51,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.activities.GetRemoteActivitiesOperation; import com.owncloud.android.ui.adapter.ActivityListAdapter; +import com.owncloud.android.utils.DisplayUtils; import java.io.IOException; import java.util.ArrayList; @@ -163,6 +165,13 @@ public class ActivitiesListActivity extends FileActivity { recyclerView.setLayoutManager(layoutManager); recyclerView.addItemDecoration(dividerItemDecoration); + BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view); + + if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) { + bottomNavigationView.setVisibility(View.VISIBLE); + DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1); + } + fetchAndSetData(); } diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index f82ba510dd..5315e1c69d 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -29,6 +29,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.design.widget.BottomNavigationView; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; @@ -119,6 +120,13 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag } else { lastBackup.setText(DisplayUtils.getRelativeTimestamp(getBaseContext(), lastBackupTimestamp)); } + + BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view); + + if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) { + bottomNavigationView.setVisibility(View.VISIBLE); + DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1); + } } @Override diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java index 6442896352..2fcf84b554 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; +import android.support.design.widget.BottomNavigationView; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.GridLayoutManager; @@ -48,6 +49,7 @@ import com.owncloud.android.ui.adapter.FolderSyncAdapter; import com.owncloud.android.ui.decoration.MediaGridItemDecoration; import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment; import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable; +import com.owncloud.android.utils.DisplayUtils; import java.io.File; import java.util.ArrayList; @@ -117,6 +119,13 @@ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapte mRecyclerView.setLayoutManager(lm); mRecyclerView.setAdapter(mAdapter); + BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view); + + if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) { + bottomNavigationView.setVisibility(View.VISIBLE); + DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1); + } + load(gridWidth * 2); } diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 7f5e5b1357..0461ae5456 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -28,6 +28,7 @@ import android.accounts.OperationCanceledException; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.BottomNavigationView; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; @@ -51,6 +52,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; import com.owncloud.android.lib.resources.notifications.models.Notification; import com.owncloud.android.ui.adapter.NotificationListAdapter; +import com.owncloud.android.utils.DisplayUtils; import java.io.IOException; import java.util.List; @@ -168,6 +170,13 @@ public class NotificationsActivity extends FileActivity { recyclerView.setLayoutManager(layoutManager); recyclerView.addItemDecoration(dividerItemDecoration); + BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view); + + if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) { + bottomNavigationView.setVisibility(View.VISIBLE); + DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1); + } + fetchAndSetData(); } diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index 4b8bbd18c6..72f515b4ec 100755 --- a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -33,10 +33,12 @@ import android.content.ServiceConnection; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; +import android.support.design.widget.BottomNavigationView; import android.support.v4.app.FragmentTransaction; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; import android.widget.Toast; import com.owncloud.android.R; @@ -52,6 +54,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.CheckCurrentCredentialsOperation; import com.owncloud.android.ui.fragment.UploadListFragment; +import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeTypeUtil; import java.io.File; @@ -103,6 +106,13 @@ public class UploadListActivity extends FileActivity implements UploadListFragme } // else, the Fragment Manager makes the job on configuration changes getSupportActionBar().setTitle(getString(R.string.uploads_view_title)); + + BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view); + + if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) { + bottomNavigationView.setVisibility(View.VISIBLE); + DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1); + } } private void createUploadListFragment(){ diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 98b30e2229..7c58bdacf0 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -34,7 +34,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.design.widget.BottomNavigationView; @@ -84,7 +83,6 @@ import com.owncloud.android.ui.dialog.RenameFileDialogFragment; import com.owncloud.android.ui.events.ChangeMenuEvent; import com.owncloud.android.ui.events.DummyDrawerEvent; import com.owncloud.android.ui.events.FavoriteEvent; -import com.owncloud.android.ui.events.MenuItemClickEvent; import com.owncloud.android.ui.events.SearchEvent; import com.owncloud.android.ui.helpers.SparseBooleanArrayParcelable; import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface; @@ -219,7 +217,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) { bottomNavigationView.setVisibility(View.VISIBLE); - prepareBottomNavigationView(); + DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), getActivity(), R.id.nav_bar_files); } if (!getResources().getBoolean(R.bool.bottom_toolbar_enabled) || savedInstanceState != null) { @@ -247,44 +245,6 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi return v; } - private void prepareBottomNavigationView() { - if (getResources().getBoolean(R.bool.use_home)) { - bottomNavigationView.getMenu().findItem(R.id.nav_bar_files).setTitle(getResources(). - getString(R.string.drawer_item_home)); - bottomNavigationView.getMenu().findItem(R.id.nav_bar_files).setIcon(R.drawable.ic_home); - } - - bottomNavigationView.setOnNavigationItemSelectedListener( - new BottomNavigationView.OnNavigationItemSelectedListener() { - @Override - public boolean onNavigationItemSelected(@NonNull MenuItem item) { - switch (item.getItemId()) { - case R.id.nav_bar_files: - EventBus.getDefault().post(new MenuItemClickEvent(item)); - menuItemAddRemoveValue = MenuItemAddRemove.ADD_GRID_AND_SORT_WITH_SEARCH; - if (getActivity() != null) { - getActivity().invalidateOptionsMenu(); - } - break; - case R.id.nav_bar_favorites: - EventBus.getDefault().post(new SearchEvent("", SearchOperation.SearchType.FAVORITE_SEARCH, - SearchEvent.UnsetType.UNSET_DRAWER)); - break; - case R.id.nav_bar_photos: - EventBus.getDefault().post(new SearchEvent("image/%", - SearchOperation.SearchType.CONTENT_TYPE_SEARCH, SearchEvent.UnsetType.UNSET_DRAWER)); - break; - case R.id.nav_bar_settings: - EventBus.getDefault().post(new MenuItemClickEvent(item)); - break; - default: - break; - } - return true; - } - }); - } - @Override public void onResume() { super.onResume(); @@ -1369,6 +1329,21 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } } + if (bottomNavigationView != null && searchEvent != null) { + switch (currentSearchType) { + case FAVORITE_SEARCH: + DisplayUtils.setBottomBarItem(bottomNavigationView, R.id.nav_bar_favorites); + break; + case PHOTO_SEARCH: + DisplayUtils.setBottomBarItem(bottomNavigationView, R.id.nav_bar_photos); + break; + + default: + DisplayUtils.setBottomBarItem(bottomNavigationView, -1); + break; + } + } + Runnable switchViewsRunnable = new Runnable() { @Override public void run() { @@ -1458,6 +1433,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } else { new Handler(Looper.getMainLooper()).post(switchViewsRunnable); } + + searchEvent = null; } private void setTitle(@StringRes int title) { diff --git a/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/src/main/java/com/owncloud/android/utils/DisplayUtils.java index 16584fc1fb..c5d1a76057 100644 --- a/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -28,6 +28,7 @@ import android.accounts.Account; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Point; @@ -37,6 +38,8 @@ import android.graphics.drawable.PictureDrawable; import android.net.Uri; import android.os.Build; import android.support.annotation.ColorInt; +import android.support.annotation.NonNull; +import android.support.design.widget.BottomNavigationView; import android.support.design.widget.Snackbar; import android.support.v4.app.FragmentActivity; import android.support.v4.content.ContextCompat; @@ -44,6 +47,8 @@ import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.format.DateUtils; import android.text.style.StyleSpan; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.widget.ImageButton; import android.widget.ProgressBar; @@ -63,11 +68,19 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.files.SearchOperation; import com.owncloud.android.ui.TextDrawable; +import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.ToolbarActivity; +import com.owncloud.android.ui.events.MenuItemClickEvent; +import com.owncloud.android.ui.events.SearchEvent; +import com.owncloud.android.ui.fragment.OCFileListFragment; import com.owncloud.android.utils.svg.SvgDecoder; import com.owncloud.android.utils.svg.SvgDrawableTranscoder; +import org.greenrobot.eventbus.EventBus; +import org.parceler.Parcels; + import java.io.InputStream; import java.math.BigDecimal; import java.net.IDN; @@ -561,4 +574,76 @@ public class DisplayUtils { .load(uri) .into(imageView); } + + public static void setupBottomBar(BottomNavigationView view, Resources resources, final Activity activity, + int checkedMenuItem) { + + Menu menu = view.getMenu(); + + if (resources.getBoolean(R.bool.use_home)) { + menu.findItem(R.id.nav_bar_files).setTitle(resources. + getString(R.string.drawer_item_home)); + menu.findItem(R.id.nav_bar_files).setIcon(R.drawable.ic_home); + } + + setBottomBarItem(view, checkedMenuItem); + + view.setOnNavigationItemSelectedListener( + new BottomNavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.nav_bar_files: + EventBus.getDefault().post(new MenuItemClickEvent(item)); + if (activity != null) { + activity.invalidateOptionsMenu(); + } + break; + case R.id.nav_bar_favorites: + SearchEvent favoritesEvent = new SearchEvent("", + SearchOperation.SearchType.FAVORITE_SEARCH, + SearchEvent.UnsetType.UNSET_DRAWER); + + switchToSearchFragment(activity, favoritesEvent); + break; + case R.id.nav_bar_photos: + SearchEvent photosEvent = new SearchEvent("image/%", + SearchOperation.SearchType.CONTENT_TYPE_SEARCH, + SearchEvent.UnsetType.UNSET_DRAWER); + + switchToSearchFragment(activity, photosEvent); + break; + case R.id.nav_bar_settings: + EventBus.getDefault().post(new MenuItemClickEvent(item)); + break; + default: + break; + } + return true; + } + }); + } + + public static void setBottomBarItem(BottomNavigationView view, int checkedMenuItem) { + Menu menu = view.getMenu(); + + for (int i = 0; i < menu.size(); i++) { + menu.getItem(i).setChecked(false); + } + + if (checkedMenuItem != -1) { + menu.findItem(checkedMenuItem).setChecked(true); + } + } + + private static void switchToSearchFragment(Activity activity, SearchEvent event) { + if (activity instanceof FileDisplayActivity) { + EventBus.getDefault().post(event); + } else { + Intent recentlyAddedIntent = new Intent(activity.getBaseContext(), FileDisplayActivity.class); + recentlyAddedIntent.putExtra(OCFileListFragment.SEARCH_EVENT, Parcels.wrap(event)); + recentlyAddedIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + activity.startActivity(recentlyAddedIntent); + } + } } diff --git a/src/main/res/layout/activity_list_layout.xml b/src/main/res/layout/activity_list_layout.xml index 65fd79983a..a1d8dd5d4a 100644 --- a/src/main/res/layout/activity_list_layout.xml +++ b/src/main/res/layout/activity_list_layout.xml @@ -18,6 +18,7 @@ License along with this program. If not, see <http://www.gnu.org/licenses/>. --> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" @@ -25,7 +26,7 @@ android:fitsSystemWindows="true"> <!-- The main content view --> - <LinearLayout + <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> @@ -35,7 +36,9 @@ <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_above="@+id/bottom_navigation_view" + android:layout_below="@+id/appbar"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_containing_list" @@ -70,7 +73,19 @@ </FrameLayout> - </LinearLayout> + <android.support.design.widget.BottomNavigationView + android:id="@+id/bottom_navigation_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:visibility="gone" + app:itemBackground="@color/primary_button_background_color" + app:itemIconTint="@color/primary_button_text_color" + app:itemTextColor="@color/primary_button_text_color" + app:menu="@menu/navigation_bar_menu"/> + + </RelativeLayout> + <include layout="@layout/drawer" diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml index 80dedfd8f1..fb4a59172f 100644 --- a/src/main/res/layout/contacts_preference.xml +++ b/src/main/res/layout/contacts_preference.xml @@ -19,6 +19,7 @@ License along with this program. If not, see <http://www.gnu.org/licenses/>. --> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" @@ -26,7 +27,7 @@ android:fitsSystemWindows="true"> <!-- The main content view --> - <LinearLayout + <RelativeLayout android:id="@+id/contacts_linear_layout" android:layout_width="match_parent" android:layout_height="match_parent" @@ -35,6 +36,13 @@ <include layout="@layout/toolbar_standard"/> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/bottom_navigation_view" + android:layout_below="@+id/appbar" + android:orientation="vertical"> + <TextView android:id="@+id/contacts_header_backup" android:layout_width="match_parent" @@ -109,7 +117,20 @@ android:text="@string/contacts_preference_choose_date" android:theme="@style/Button.Primary"/> - </LinearLayout> + </LinearLayout> + + <android.support.design.widget.BottomNavigationView + android:id="@+id/bottom_navigation_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:visibility="gone" + app:itemBackground="@color/primary_button_background_color" + app:itemIconTint="@color/primary_button_text_color" + app:itemTextColor="@color/primary_button_text_color" + app:menu="@menu/navigation_bar_menu"/> + + </RelativeLayout> <include layout="@layout/drawer" diff --git a/src/main/res/layout/folder_sync_layout.xml b/src/main/res/layout/folder_sync_layout.xml index 093ad15af7..7b94cca802 100644 --- a/src/main/res/layout/folder_sync_layout.xml +++ b/src/main/res/layout/folder_sync_layout.xml @@ -20,13 +20,14 @@ --> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:fitsSystemWindows="true"> <!-- The main content view --> - <LinearLayout + <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> @@ -36,7 +37,9 @@ <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_above="@+id/bottom_navigation_view" + android:layout_below="@+id/appbar"> <android.support.v7.widget.RecyclerView android:id="@android:id/list" @@ -85,7 +88,18 @@ android:visibility="gone" /> </FrameLayout> - </LinearLayout> + <android.support.design.widget.BottomNavigationView + android:id="@+id/bottom_navigation_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:visibility="gone" + app:itemBackground="@color/primary_button_background_color" + app:itemIconTint="@color/primary_button_text_color" + app:itemTextColor="@color/primary_button_text_color" + app:menu="@menu/navigation_bar_menu"/> + + </RelativeLayout> <include layout="@layout/drawer" diff --git a/src/main/res/layout/notifications_layout.xml b/src/main/res/layout/notifications_layout.xml index 5916db6ae2..e911209106 100644 --- a/src/main/res/layout/notifications_layout.xml +++ b/src/main/res/layout/notifications_layout.xml @@ -19,6 +19,7 @@ License along with this program. If not, see <http://www.gnu.org/licenses/>. --> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" @@ -26,7 +27,7 @@ android:fitsSystemWindows="true"> <!-- The main content view --> - <LinearLayout + <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> @@ -36,7 +37,9 @@ <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_above="@+id/bottom_navigation_view" + android:layout_below="@+id/appbar"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_containing_list" @@ -71,7 +74,18 @@ </FrameLayout> - </LinearLayout> + <android.support.design.widget.BottomNavigationView + android:id="@+id/bottom_navigation_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:visibility="gone" + app:itemBackground="@color/primary_button_background_color" + app:itemIconTint="@color/primary_button_text_color" + app:itemTextColor="@color/primary_button_text_color" + app:menu="@menu/navigation_bar_menu"/> + + </RelativeLayout> <include layout="@layout/drawer" diff --git a/src/main/res/layout/upload_list_layout.xml b/src/main/res/layout/upload_list_layout.xml index 8ecceab07d..b520bba8c9 100755 --- a/src/main/res/layout/upload_list_layout.xml +++ b/src/main/res/layout/upload_list_layout.xml @@ -17,14 +17,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. --> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/drawer_layout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:clickable="true" - android:fitsSystemWindows="true"> + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/drawer_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clickable="true" + android:fitsSystemWindows="true"> <!-- The main content view --> - <LinearLayout + <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> @@ -37,7 +38,19 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background_color"/> - </LinearLayout> + + <android.support.design.widget.BottomNavigationView + android:id="@+id/bottom_navigation_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:visibility="gone" + app:itemBackground="@color/primary_button_background_color" + app:itemIconTint="@color/primary_button_text_color" + app:itemTextColor="@color/primary_button_text_color" + app:menu="@menu/navigation_bar_menu"/> + + </RelativeLayout> <include layout="@layout/drawer" From 726a02f39c2a9bc706ad874ab2afca08eddf5721 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 22 Mar 2017 20:23:22 +0100 Subject: [PATCH 778/881] Revert "remove firebase from branding branch and put it into branch "analytics"" This reverts commit 71ea26df3186e0c76f30c81c388fa077affc844d. --- build.gradle | 2 ++ .../java/com/owncloud/android/MainApp.java | 20 +++++++++++++++++ .../authentication/AuthenticatorActivity.java | 2 ++ .../ErrorsWhileCopyingHandlerActivity.java | 7 ++++++ .../ui/activity/FolderPickerActivity.java | 5 ++++- .../ui/activity/FolderSyncActivity.java | 6 +++++ .../activity/GenericExplanationActivity.java | 7 ++++++ .../ui/activity/LogHistoryActivity.java | 7 ++++++ .../ui/activity/ManageAccountsActivity.java | 6 +++++ .../ui/activity/ManageSpaceActivity.java | 7 ++++++ .../ui/activity/ParticipateActivity.java | 6 +++++ .../android/ui/activity/PassCodeActivity.java | 7 ++++++ .../android/ui/activity/Preferences.java | 1 + .../ui/activity/UploadFilesActivity.java | 7 ++++++ .../ui/activity/UploadListActivity.java | 5 ++++- .../ui/activity/UploadPathActivity.java | 7 ++++++ .../android/ui/activity/WhatsNewActivity.java | 6 +++++ .../ui/fragment/EditShareFragment.java | 9 ++++++++ .../ui/fragment/FileDetailFragment.java | 7 ++++++ .../ui/fragment/LocalFileListFragment.java | 22 +++++++++++++------ .../ui/fragment/OCFileListFragment.java | 4 ++++ .../ui/fragment/SearchShareesFragment.java | 9 ++++++++ .../ui/fragment/ShareFileFragment.java | 9 ++++++++ .../ui/fragment/UploadListFragment.java | 11 +++++++++- .../ui/preview/PreviewImageFragment.java | 10 +++++++++ .../ui/preview/PreviewMediaFragment.java | 6 ++++- .../ui/preview/PreviewTextFragment.java | 4 ++++ .../ui/preview/PreviewVideoActivity.java | 6 +++++ 28 files changed, 194 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 5eb6a47b61..03c578a3bf 100644 --- a/build.gradle +++ b/build.gradle @@ -197,6 +197,8 @@ dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.caverock:androidsvg:1.2.1' + + modifiedCompile 'com.google.firebase:firebase-core:10.2.0' /// dependencies for local unit tests testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' diff --git a/src/main/java/com/owncloud/android/MainApp.java b/src/main/java/com/owncloud/android/MainApp.java index b0af28157a..2926641641 100644 --- a/src/main/java/com/owncloud/android/MainApp.java +++ b/src/main/java/com/owncloud/android/MainApp.java @@ -34,6 +34,7 @@ import android.support.multidex.MultiDexApplication; import android.support.v4.util.Pair; import com.evernote.android.job.JobManager; +import com.google.firebase.analytics.FirebaseAnalytics; import com.owncloud.android.authentication.PassCodeManager; import com.owncloud.android.datamodel.SyncedFolder; import com.owncloud.android.datamodel.SyncedFolderProvider; @@ -80,6 +81,8 @@ public class MainApp extends MultiDexApplication { private static SyncedFolderObserverService mObserverService; + private static FirebaseAnalytics firebaseAnalytics; + @SuppressWarnings("unused") private boolean mBound; @@ -89,6 +92,12 @@ public class MainApp extends MultiDexApplication { JobManager.create(this).addJobCreator(new NCJobCreator()); MainApp.mContext = getApplicationContext(); + firebaseAnalytics = FirebaseAnalytics.getInstance(this); + + if (!getResources().getBoolean(R.bool.analytics_enabled)) { + firebaseAnalytics.setAnalyticsCollectionEnabled(false); + } + SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); MainApp.storagePath = appPrefs.getString(Preferences.PreferenceKeys.STORAGE_PATH, Environment. @@ -329,4 +338,15 @@ public class MainApp extends MultiDexApplication { } }; + public static FirebaseAnalytics getFirebaseAnalyticsInstance() { + /* + In order for Firebase Analytics to work, you also need to + put a proper google-services.json in src/custom folder + + If that file is flawed, nothing will be sent to Firebase + */ + return firebaseAnalytics; + } + + } diff --git a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index 3a72048608..8e89fba468 100644 --- a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -804,6 +804,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity protected void onResume() { super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + if (!webViewLoginMethod) { // bound here to avoid spurious changes triggered by Android on device rotations mHostUrlInput.setOnFocusChangeListener(this); diff --git a/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java b/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java index c06f23ce30..400d6fb45a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java @@ -39,6 +39,7 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@ -133,6 +134,12 @@ public class ErrorsWhileCopyingHandlerActivity extends AppCompatActivity okBtn.setOnClickListener(this); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + /** * Customized adapter, showing the local files as main text in two-lines list item and the * remote files as the secondary text. diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java index 80633260b7..622a77c734 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java @@ -40,6 +40,7 @@ import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperation; @@ -103,7 +104,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C caption = getIntent().getStringExtra(EXTRA_ACTION); } else { caption = getString(R.string.default_display_name_for_root_folder); - } + }; getSupportActionBar().setTitle(caption); setIndeterminate(mSyncInProgress); @@ -236,6 +237,8 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C super.onResume(); Log_OC.e(TAG, "onResume() start"); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + // refresh list of files refreshListOfFilesFragment(false); diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java index 2fcf84b554..ee52758f6c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java @@ -99,6 +99,12 @@ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapte setupContent(); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + /** * sets up the UI elements and loads all media/synced folders. */ diff --git a/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java b/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java index 8798ff028d..9f2c1613cb 100644 --- a/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java @@ -32,6 +32,7 @@ import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import java.util.ArrayList; @@ -84,6 +85,12 @@ public class GenericExplanationActivity extends AppCompatActivity { } } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + public class ExplanationListAdapterView extends ArrayAdapter<String> { ArrayList<String> mList; diff --git a/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java b/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java index 8670b137f8..41a6b1e395 100644 --- a/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java @@ -36,6 +36,7 @@ import android.widget.Button; import android.widget.TextView; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.dialog.LoadingDialog; @@ -118,6 +119,12 @@ public class LogHistoryActivity extends ToolbarActivity { } } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { boolean retval = true; diff --git a/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java index eb2c5f8888..91496cc4d5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java @@ -131,6 +131,12 @@ public class ManageAccountsActivity extends FileActivity initializeComponentGetters(); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java index 290fb4f6df..c34096cecd 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java @@ -32,6 +32,7 @@ import android.widget.Button; import android.widget.TextView; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; @@ -68,6 +69,12 @@ public class ManageSpaceActivity extends AppCompatActivity { } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { boolean retval = true; diff --git a/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java b/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java index 20cef6d12d..2cdc92c81b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java @@ -30,6 +30,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; /** @@ -56,6 +57,11 @@ public class ParticipateActivity extends FileActivity { setupContent(); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } private void setupContent() { TextView rcView = (TextView) findViewById(R.id.participate_release_candidate_text); diff --git a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java index 0481db1801..6c02ff7fcd 100644 --- a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java @@ -38,6 +38,7 @@ import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; @@ -140,6 +141,12 @@ public class PassCodeActivity extends AppCompatActivity { setTextListeners(); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + /** * Enables or disables the cancel button to allow the user interrupt the ACTION * requested to the activity. diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index 716f3d4d17..09210a8ffd 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -612,6 +612,7 @@ public class Preferences extends PreferenceActivity @Override protected void onResume() { super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 0b96808c1e..32a413e1a8 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -41,6 +41,7 @@ import android.widget.Button; import android.widget.Spinner; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.utils.Log_OC; @@ -319,6 +320,12 @@ public class UploadFilesActivity extends FileActivity implements Log_OC.d(TAG, "onSaveInstanceState() end"); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + /** * Pushes a directory to the drop down list * @param directory to push diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index 72f515b4ec..868b8bae7c 100755 --- a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -41,6 +41,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; @@ -128,6 +129,8 @@ public class UploadListActivity extends FileActivity implements UploadListFragme Log_OC.v(TAG, "onResume() start"); super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + // Listen for upload messages mUploadMessagesReceiver = new UploadMessagesReceiver(); IntentFilter uploadIntentFilter = new IntentFilter(); @@ -331,7 +334,7 @@ public class UploadListActivity extends FileActivity implements UploadListFragme mUploaderBinder = null; } } - } + }; /** * Once the file upload has changed its status -> update uploads list view diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java index a74d06e382..f5148c52aa 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java @@ -23,6 +23,7 @@ import android.accounts.Account; import android.os.Bundle; import android.view.View.OnClickListener; +import com.owncloud.android.MainApp; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; @@ -48,6 +49,12 @@ public class UploadPathActivity extends FolderPickerActivity implements FileFrag setFile(folder); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + /** * Called when the ownCloud {@link Account} associated to the Activity was * just updated. diff --git a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java index 42fd9399e1..4a63348702 100644 --- a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java @@ -129,6 +129,12 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa updateNextButtonIfNeeded(); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } + @Override public void onBackPressed() { onFinish(); diff --git a/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java b/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java index 2355f270c2..10f4fb9e74 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java @@ -32,6 +32,7 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@ -376,6 +377,14 @@ public class EditShareFragment extends Fragment { } + @Override + public void onResume() { + super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } + } + /** * Get {@link OCShare} instance from DB and updates the UI. * diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 4093623eab..1cefd21d12 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -107,6 +107,13 @@ public class FileDetailFragment extends FileFragment implements OnClickListener mProgressListener = null; } + @Override + public void onResume() { + super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } + } @Override public void onActivityCreated(Bundle savedInstanceState) { diff --git a/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java index fa64d59af0..e7f46d611e 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -32,6 +32,7 @@ import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.adapter.LocalFileListAdapter; @@ -64,6 +65,13 @@ public class LocalFileListFragment extends ExtendedListFragment { setHasOptionsMenu(true); } + @Override + public void onResume() { + super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } + } /** * {@inheritDoc} @@ -133,7 +141,7 @@ public class LocalFileListFragment extends ExtendedListFragment { } else { /// Click on a file ImageView checkBoxV = (ImageView) v.findViewById(R.id.custom_checkbox); if (checkBoxV != null) { - if (getListView().isItemChecked(position)) { + if (((AbsListView)getListView()).isItemChecked(position)) { checkBoxV.setImageResource(R.drawable.ic_checkbox_marked); } else { checkBoxV.setImageResource(R.drawable.ic_checkbox_blank_outline); @@ -214,7 +222,7 @@ public class LocalFileListFragment extends ExtendedListFragment { } // by now, only files in the same directory will be kept as selected - mCurrentListView.clearChoices(); + ((AbsListView)mCurrentListView).clearChoices(); mAdapter.swapDirectory(directory); if (mDirectory == null || !mDirectory.equals(directory)) { mCurrentListView.setSelection(0); @@ -230,7 +238,7 @@ public class LocalFileListFragment extends ExtendedListFragment { */ public String[] getCheckedFilePaths() { ArrayList<String> result = new ArrayList<String>(); - SparseBooleanArray positions = mCurrentListView.getCheckedItemPositions(); + SparseBooleanArray positions = ((AbsListView)mCurrentListView).getCheckedItemPositions(); if (positions.size() > 0) { for (int i = 0; i < positions.size(); i++) { if (positions.get(positions.keyAt(i)) == true) { @@ -262,7 +270,7 @@ public class LocalFileListFragment extends ExtendedListFragment { * @param select <code>true</code> to select all, <code>false</code> to deselect all */ public void selectAllFiles(boolean select) { - AbsListView listView = getListView(); + AbsListView listView = (AbsListView) getListView(); for (int position = 0; position < listView.getCount(); position++) { File file = (File) mAdapter.getItem(position); if (file.isFile()) { @@ -281,7 +289,7 @@ public class LocalFileListFragment extends ExtendedListFragment { * * @param directory */ - void onDirectoryClick(File directory); + public void onDirectoryClick(File directory); /** * Callback method invoked when a file (non directory) @@ -289,7 +297,7 @@ public class LocalFileListFragment extends ExtendedListFragment { * * @param file */ - void onFileClick(File file); + public void onFileClick(File file); /** @@ -298,7 +306,7 @@ public class LocalFileListFragment extends ExtendedListFragment { * * @return Directory to list firstly. Can be NULL. */ - File getInitialDirectory(); + public File getInitialDirectory(); } diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 7c58bdacf0..a94ebf4301 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -252,6 +252,10 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi if (remoteOperationAsyncTask != null) { remoteOperationAsyncTask.cancel(true); } + + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } } @Override diff --git a/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java index 5f3349c583..648a9c54d8 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java @@ -35,6 +35,7 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.ListView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; @@ -104,6 +105,14 @@ public class SearchShareesFragment extends Fragment implements ShareUserListAdap } + @Override + public void onResume() { + super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } + } + /** * {@inheritDoc} */ diff --git a/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java index 759dd4c574..a9fe309bf9 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java @@ -44,6 +44,7 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; @@ -177,6 +178,14 @@ public class ShareFileFragment extends Fragment implements ShareUserListAdapter. } } + @Override + public void onResume() { + super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { diff --git a/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java index 8d6f6d5cb4..dd6b0a29f2 100755 --- a/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java @@ -27,6 +27,7 @@ import android.view.ViewGroup; import android.widget.ExpandableListView; import android.widget.ListView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.db.OCUpload; import com.owncloud.android.lib.common.utils.Log_OC; @@ -72,6 +73,14 @@ public class UploadListFragment extends ExpandableListFragment { return v; } + @Override + public void onResume() { + super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } + } + @Override public void onRefresh() { // remove the progress circle as soon as pull is triggered, like in the list of files @@ -135,7 +144,7 @@ public class UploadListFragment extends ExpandableListFragment { * @param file the file that has been clicked on. * @return return true if click was handled. */ - boolean onUploadItemClick(OCUpload file); + public boolean onUploadItemClick(OCUpload file); } public void binderReady(){ diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index 2dac16be5a..bc71d59758 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -51,6 +51,8 @@ import android.widget.TextView; import com.caverock.androidsvg.SVG; import com.caverock.androidsvg.SVGParseException; + +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -374,6 +376,14 @@ public class PreviewImageFragment extends FileFragment { mContainerActivity.showDetails(getFile()); } + @Override + public void onResume() { + super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } + } + @Override public void onPause() { super.onPause(); diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 838d64ef58..fa96852f2f 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -54,6 +54,7 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -236,7 +237,7 @@ public class PreviewMediaFragment extends FileFragment implements } else { - file = savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_FILE); + file = (OCFile) savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_FILE); setFile(file); mAccount = savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_ACCOUNT); mSavedPlaybackPosition = @@ -564,6 +565,9 @@ public class PreviewMediaFragment extends FileFragment implements @Override public void onResume() { super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } Log_OC.v(TAG, "onResume"); } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index 9d976fb25e..ce08b2030a 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -34,6 +34,7 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -416,6 +417,9 @@ public class PreviewTextFragment extends FileFragment { @Override public void onResume() { super.onResume(); + if (getActivity() != null) { + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + } Log_OC.e(TAG, "onResume"); } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java index 1ef2cc62d3..17e2734dfd 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@ -33,6 +33,7 @@ import android.support.v7.app.AlertDialog; import android.widget.MediaController; import android.widget.VideoView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.accounts.AccountUtils; @@ -105,6 +106,11 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi mVideoPlayer.setKeepScreenOn(true); } + @Override + protected void onResume() { + super.onResume(); + MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + } /** * {@inheritDoc} From 9130635fa1b9ba7b18a08cb54177c2924c2a8d8c Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 26 Apr 2017 21:11:27 +0200 Subject: [PATCH 779/881] Progress on Analytics magic --- build.gradle | 8 + build.gradle.modified | 9 + .../android/utils/AnalyticsUtils.java | 29 ++ src/main/AndroidManifest.xml | 2 - .../java/com/owncloud/android/MainApp.java | 26 +- .../authentication/AuthenticatorActivity.java | 3 +- .../com/owncloud/android/db/OCUpload.java | 44 ++-- .../android/db/PreferenceManager.java | 8 +- .../com/owncloud/android/db/ProviderMeta.java | 41 ++- .../com/owncloud/android/db/UploadResult.java | 30 +-- .../files/BootupBroadcastReceiver.java | 31 ++- .../android/files/FileMenuFilter.java | 71 +++-- .../files/InstantUploadBroadcastReceiver.java | 32 +-- .../android/media/MediaControlView.java | 133 +++++----- .../owncloud/android/media/MediaService.java | 240 ++++++++--------- .../android/media/MediaServiceBinder.java | 51 ++-- .../operations/DownloadFileOperation.java | 16 +- .../operations/OAuth2GetAccessToken.java | 18 +- .../android/operations/UnshareOperation.java | 2 - .../observer/FileObserverService.java | 10 +- .../AbstractOwnCloudSyncAdapter.java | 16 +- .../ui/CheckBoxPreferenceWithLongTitle.java | 28 +- .../com/owncloud/android/ui/CustomPopup.java | 29 +- .../owncloud/android/ui/ExtendedListView.java | 29 +- .../android/ui/NavigationDrawerItem.java | 32 +-- .../android/ui/PreferenceWithLongSummary.java | 28 +- .../android/ui/RadioButtonPreference.java | 27 +- .../owncloud/android/ui/SquareImageView.java | 23 +- .../android/ui/SquareLinearLayout.java | 23 +- .../com/owncloud/android/ui/TextDrawable.java | 8 +- .../android/ui/activity/ComponentsGetter.java | 2 +- .../ui/activity/CopyToClipboardActivity.java | 8 +- .../ErrorsWhileCopyingHandlerActivity.java | 3 +- .../android/ui/activity/FileActivity.java | 1 - .../ui/activity/FolderPickerActivity.java | 3 +- .../ui/activity/FolderSyncActivity.java | 2 +- .../activity/GenericExplanationActivity.java | 3 +- .../ui/activity/LogHistoryActivity.java | 3 +- .../ui/activity/ManageAccountsActivity.java | 2 +- .../ui/activity/ManageSpaceActivity.java | 3 +- .../ui/activity/ParticipateActivity.java | 3 +- .../android/ui/activity/PassCodeActivity.java | 3 +- .../android/ui/activity/Preferences.java | 2 +- .../android/ui/activity/StorageMigration.java | 2 +- .../ui/activity/UploadFilesActivity.java | 3 +- .../ui/activity/UploadListActivity.java | 3 +- .../ui/activity/UploadPathActivity.java | 3 +- .../android/ui/activity/WhatsNewActivity.java | 2 +- ...rtificateCombinedExceptionViewAdapter.java | 6 +- .../android/ui/adapter/DiskLruImageCache.java | 16 +- .../ui/adapter/SslCertificateViewAdapter.java | 11 +- .../ui/adapter/SslErrorViewAdapter.java | 5 +- .../adapter/X509CertificateViewAdapter.java | 14 +- .../android/ui/dialog/ChangelogDialog.java | 2 +- .../ui/dialog/ConfirmationDialogFragment.java | 2 +- .../ui/dialog/ConflictsResolveDialog.java | 2 +- .../ui/dialog/CreateFolderDialogFragment.java | 12 +- .../ui/dialog/CredentialsDialogFragment.java | 10 +- .../android/ui/dialog/LoadingDialog.java | 4 +- .../ui/dialog/RenameFileDialogFragment.java | 3 +- .../android/ui/dialog/SamlWebViewDialog.java | 2 +- .../android/ui/dialog/ShareLinkToDialog.java | 12 +- .../dialog/SharePasswordDialogFragment.java | 2 +- .../ui/dialog/SslUntrustedCertDialog.java | 10 +- .../android/ui/dialog/SslValidatorDialog.java | 29 +- .../ui/dialog/UploadSourceDialogFragment.java | 2 +- .../ui/errorhandling/ExceptionHandler.java | 6 +- .../ui/fragment/EditShareFragment.java | 3 +- .../ui/fragment/FileDetailFragment.java | 2 +- .../ui/fragment/LocalFileListFragment.java | 3 +- .../ui/fragment/OCFileListFragment.java | 2 +- .../ui/fragment/SearchShareesFragment.java | 3 +- .../ui/fragment/ShareFileFragment.java | 3 +- .../ui/fragment/UploadListFragment.java | 3 +- .../ui/helpers/FileOperationsHelper.java | 3 - .../ui/notifications/NotificationUtils.java | 8 +- .../ui/preview/FileDownloadFragment.java | 11 +- .../ui/preview/PreviewImageFragment.java | 4 +- .../ui/preview/PreviewImagePagerAdapter.java | 14 +- .../ui/preview/PreviewMediaFragment.java | 3 +- .../ui/preview/PreviewTextFragment.java | 3 +- .../ui/preview/PreviewVideoActivity.java | 3 +- .../owncloud/android/utils/BitmapUtils.java | 137 +++++----- .../android/utils/ConnectivityUtils.java | 34 +-- .../android/utils/DialogMenuItem.java | 25 +- .../owncloud/android/utils/DisplayUtils.java | 55 ++-- .../android/utils/ErrorMessageAdapter.java | 37 ++- .../android/utils/FileStorageUtils.java | 107 ++++---- .../utils/GetShareWithUsersAsyncTask.java | 31 +-- .../com/owncloud/android/utils/MimeType.java | 23 +- .../owncloud/android/utils/MimeTypeUtil.java | 25 +- .../android/utils/OwnCloudSession.java | 27 +- .../android/utils/PermissionUtil.java | 3 +- .../owncloud/android/utils/UploadUtils.java | 25 +- .../com/owncloud/android/utils/UriUtils.java | 50 ++-- .../android/widgets/ActionEditText.java | 37 ++- src/main/res/values/setup.xml | 4 +- src/modified/AndroidManifest.xml | 5 +- .../com/owncloud/android/ModifiedMainApp.java | 40 +++ .../android/utils/AnalyticsUtils.java | 32 +++ src/modified/res/values/setup.xml | 4 +- src/zstore/AndroidManifest.xml | 100 +++++++ src/zstore/google-services.json | 35 +++ .../ModifiedAuthenticatorActivity.java | 41 +++ .../firebase/NCFirebaseInstanceIDService.java | 45 ++++ .../firebase/NCFirebaseMessagingService.java | 66 +++++ .../activity/ModifiedFileDisplayActivity.java | 36 +++ .../android/utils/AnalyticsUtils.java | 29 ++ .../android/utils/GooglePlayUtils.java | 49 ++++ .../com/owncloud/android/utils/PushUtils.java | 248 ++++++++++++++++++ src/zstore/res/values/setup.xml | 137 ++++++++++ 111 files changed, 1817 insertions(+), 986 deletions(-) create mode 100644 src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java create mode 100644 src/modified/java/com/owncloud/android/ModifiedMainApp.java create mode 100644 src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java create mode 100644 src/zstore/AndroidManifest.xml create mode 100644 src/zstore/google-services.json create mode 100644 src/zstore/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java create mode 100644 src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java create mode 100644 src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java create mode 100644 src/zstore/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java create mode 100644 src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java create mode 100644 src/zstore/java/com/owncloud/android/utils/GooglePlayUtils.java create mode 100644 src/zstore/java/com/owncloud/android/utils/PushUtils.java create mode 100644 src/zstore/res/values/setup.xml diff --git a/build.gradle b/build.gradle index 03c578a3bf..4abbb2500c 100644 --- a/build.gradle +++ b/build.gradle @@ -78,10 +78,12 @@ android { // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure productFlavors { + // used for f-droid generic { applicationId 'com.nextcloud.client' } + // both need .modified gradle file in place of the regular one modified { // structure is: // domain tld @@ -89,6 +91,12 @@ android { // .client applicationId 'com.custom.client' } + + zstore { + applicationId 'com.nextcloud.client' + } + + } configurations { diff --git a/build.gradle.modified b/build.gradle.modified index 2779b3b377..af9a993cdf 100644 --- a/build.gradle.modified +++ b/build.gradle.modified @@ -78,10 +78,12 @@ android { // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure productFlavors { + // used for f-droid generic { applicationId 'com.nextcloud.client' } + // both need .modified gradle file in place of the regular one modified { // structure is: // domain tld @@ -89,6 +91,12 @@ android { // .client applicationId 'com.custom.client' } + + zstore { + applicationId 'com.nextcloud.client' + } + + } configurations { @@ -191,6 +199,7 @@ dependencies { annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' compile 'org.greenrobot:eventbus:3.0.0' compile 'com.googlecode.ez-vcard:ez-vcard:0.10.2' + compile 'com.google.android.gms:play-services:10.2.1' compile 'org.parceler:parceler-api:1.1.6' diff --git a/src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java new file mode 100644 index 0000000000..bd6c89ed2e --- /dev/null +++ b/src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java @@ -0,0 +1,29 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.utils; + +import android.app.Activity; + +public class AnalyticsUtils { + public static void setCurrentScreenName(Activity activity, String s, String s1) { + // do nothing + } + +} diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 8b6326ae77..25ab45a60e 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -263,8 +263,6 @@ <service android:name=".services.observer.FileObserverService" /> - <service android:name="com.evernote.android.job.gcm.PlatformGcmService" tools:node="remove"/> - <activity android:name=".ui.activity.CopyToClipboardActivity" android:icon="@drawable/copy_link" diff --git a/src/main/java/com/owncloud/android/MainApp.java b/src/main/java/com/owncloud/android/MainApp.java index 2926641641..ba0d8bff52 100644 --- a/src/main/java/com/owncloud/android/MainApp.java +++ b/src/main/java/com/owncloud/android/MainApp.java @@ -34,7 +34,6 @@ import android.support.multidex.MultiDexApplication; import android.support.v4.util.Pair; import com.evernote.android.job.JobManager; -import com.google.firebase.analytics.FirebaseAnalytics; import com.owncloud.android.authentication.PassCodeManager; import com.owncloud.android.datamodel.SyncedFolder; import com.owncloud.android.datamodel.SyncedFolderProvider; @@ -81,8 +80,6 @@ public class MainApp extends MultiDexApplication { private static SyncedFolderObserverService mObserverService; - private static FirebaseAnalytics firebaseAnalytics; - @SuppressWarnings("unused") private boolean mBound; @@ -91,13 +88,6 @@ public class MainApp extends MultiDexApplication { super.onCreate(); JobManager.create(this).addJobCreator(new NCJobCreator()); MainApp.mContext = getApplicationContext(); - - firebaseAnalytics = FirebaseAnalytics.getInstance(this); - - if (!getResources().getBoolean(R.bool.analytics_enabled)) { - firebaseAnalytics.setAnalyticsCollectionEnabled(false); - } - SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); MainApp.storagePath = appPrefs.getString(Preferences.PreferenceKeys.STORAGE_PATH, Environment. @@ -287,6 +277,7 @@ public class MainApp extends MultiDexApplication { syncedFolderProvider.updateAutoUploadPaths(mContext); } } + private void cleanOldEntries() { // previous versions of application created broken entries in the SyncedFolderProvider // database, and this cleans all that and leaves 1 (newest) entry per synced folder @@ -321,7 +312,9 @@ public class MainApp extends MultiDexApplication { } } - /** Defines callbacks for service binding, passed to bindService() */ + /** + * Defines callbacks for service binding, passed to bindService() + */ private ServiceConnection syncedFolderObserverServiceConnection = new ServiceConnection() { @Override @@ -338,15 +331,4 @@ public class MainApp extends MultiDexApplication { } }; - public static FirebaseAnalytics getFirebaseAnalyticsInstance() { - /* - In order for Firebase Analytics to work, you also need to - put a proper google-services.json in src/custom folder - - If that file is flawed, nothing will be sent to Firebase - */ - return firebaseAnalytics; - } - - } diff --git a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index 8e89fba468..6aab6ccfbe 100644 --- a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -113,6 +113,7 @@ import com.owncloud.android.ui.dialog.IndeterminateProgressDialog; import com.owncloud.android.ui.dialog.SamlWebViewDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.DisplayUtils; import java.security.cert.X509Certificate; @@ -804,7 +805,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); if (!webViewLoginMethod) { // bound here to avoid spurious changes triggered by Android on device rotations diff --git a/src/main/java/com/owncloud/android/db/OCUpload.java b/src/main/java/com/owncloud/android/db/OCUpload.java index d47f68f816..1029b634e4 100644 --- a/src/main/java/com/owncloud/android/db/OCUpload.java +++ b/src/main/java/com/owncloud/android/db/OCUpload.java @@ -1,23 +1,22 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author LukeOwncloud - * @author masensio - * @author David A. Velasco - * Copyright (C) 2016 ownCloud Inc. + * @author LukeOwncloud + * @author masensio + * @author David A. Velasco + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.db; @@ -41,7 +40,7 @@ import java.io.File; /** * Stores all information in order to start upload operations. PersistentUploadObject can * be stored persistently by {@link UploadsStorageManager}. - * + * */ public class OCUpload implements Parcelable { @@ -158,6 +157,7 @@ public class OCUpload implements Parcelable { public void setUploadId(long id) { mId = id; } + public long getUploadId() { return mId; } @@ -220,7 +220,7 @@ public class OCUpload implements Parcelable { /** - * @return File size + * @return File size */ public long getFileSize() { return mFileSize; @@ -306,7 +306,7 @@ public class OCUpload implements Parcelable { mUploadEndTimeStamp = uploadEndTimestamp; } - public long getUploadEndTimestamp(){ + public long getUploadEndTimestamp() { return mUploadEndTimeStamp; } @@ -318,8 +318,8 @@ public class OCUpload implements Parcelable { String localPath = getLocalPath() != null ? getLocalPath() : ""; return localPath + " status:" + getUploadStatus() + " result:" + (getLastResult() == null ? "null" : getLastResult().getValue()); - } catch (NullPointerException e){ - Log_OC.d(TAG, "Exception " + e.toString() ); + } catch (NullPointerException e) { + Log_OC.d(TAG, "Exception " + e.toString()); return (e.toString()); } } @@ -392,6 +392,8 @@ public class OCUpload implements Parcelable { dest.writeInt(mCreatedBy); } - enum CanUploadFileNowStatus {NOW, LATER, FILE_GONE, ERROR}; + enum CanUploadFileNowStatus {NOW, LATER, FILE_GONE, ERROR} + + ; } diff --git a/src/main/java/com/owncloud/android/db/PreferenceManager.java b/src/main/java/com/owncloud/android/db/PreferenceManager.java index 32313dbddc..182ef0a708 100644 --- a/src/main/java/com/owncloud/android/db/PreferenceManager.java +++ b/src/main/java/com/owncloud/android/db/PreferenceManager.java @@ -97,9 +97,11 @@ public abstract class PreferenceManager { public static boolean instantVideoUploadViaWiFiOnly(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_VIDEO_UPLOAD_ON_WIFI, false); } + public static boolean instantPictureUploadWhenChargingOnly(Context context) { return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_upload_on_charging", false); } + public static boolean instantVideoUploadWhenChargingOnly(Context context) { return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_video_upload_on_charging", false); } @@ -237,7 +239,7 @@ public abstract class PreferenceManager { /** * Saves the legacy cleaning flag which the user has set last. * - * @param context Caller {@link Context}, used to access to shared preferences manager. + * @param context Caller {@link Context}, used to access to shared preferences manager. * @param legacyClean flag if it is a legacy cleaning */ public static void setLegacyClean(Context context, boolean legacyClean) { @@ -247,7 +249,7 @@ public abstract class PreferenceManager { /** * Saves the legacy cleaning flag which the user has set last. * - * @param context Caller {@link Context}, used to access to shared preferences manager. + * @param context Caller {@link Context}, used to access to shared preferences manager. * @param pathUpdate flag if it is a auto upload path update */ public static void setAutoUploadPathsUpdate(Context context, boolean pathUpdate) { @@ -268,7 +270,7 @@ public abstract class PreferenceManager { /** * Saves the uploader behavior which the user has set last. * - * @param context Caller {@link Context}, used to access to shared preferences manager. + * @param context Caller {@link Context}, used to access to shared preferences manager. * @param uploaderBehaviour the uploader behavior */ public static void setUploaderBehaviour(Context context, int uploaderBehaviour) { diff --git a/src/main/java/com/owncloud/android/db/ProviderMeta.java b/src/main/java/com/owncloud/android/db/ProviderMeta.java index 5329db315e..e00bdc7fd0 100644 --- a/src/main/java/com/owncloud/android/db/ProviderMeta.java +++ b/src/main/java/com/owncloud/android/db/ProviderMeta.java @@ -1,24 +1,23 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author Bartek Przybylski - * @author David A. Velasco - * @author masensio - * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2016 ownCloud Inc. + * @author Bartek Przybylski + * @author David A. Velasco + * @author masensio + * Copyright (C) 2011 Bartek Przybylski + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.db; @@ -89,13 +88,13 @@ public class ProviderMeta { public static final String FILE_PERMISSIONS = "permissions"; public static final String FILE_REMOTE_ID = "remote_id"; public static final String FILE_UPDATE_THUMBNAIL = "update_thumbnail"; - public static final String FILE_IS_DOWNLOADING= "is_downloading"; + public static final String FILE_IS_DOWNLOADING = "is_downloading"; public static final String FILE_ETAG_IN_CONFLICT = "etag_in_conflict"; public static final String FILE_FAVORITE = "favorite"; public static final String FILE_DEFAULT_SORT_ORDER = FILE_NAME + " collate nocase asc"; - + // Columns of ocshares table public static final String OCSHARES_FILE_SOURCE = "file_source"; public static final String OCSHARES_ITEM_SOURCE = "item_source"; @@ -111,8 +110,8 @@ public class ProviderMeta { public static final String OCSHARES_USER_ID = "user_id"; public static final String OCSHARES_ID_REMOTE_SHARED = "id_remote_shared"; public static final String OCSHARES_ACCOUNT_OWNER = "owner_share"; - - public static final String OCSHARES_DEFAULT_SORT_ORDER = OCSHARES_FILE_SOURCE + + public static final String OCSHARES_DEFAULT_SORT_ORDER = OCSHARES_FILE_SOURCE + " collate nocase asc"; // Columns of capabilities table @@ -160,7 +159,7 @@ public class ProviderMeta { public static final String UPLOADS_UPLOAD_END_TIMESTAMP = "upload_end_timestamp"; public static final String UPLOADS_LAST_RESULT = "last_result"; public static final String UPLOADS_CREATED_BY = "created_by"; - public static final String UPLOADS_DEFAULT_SORT_ORDER = ProviderTableMeta._ID + " collate nocase desc"; + public static final String UPLOADS_DEFAULT_SORT_ORDER = ProviderTableMeta._ID + " collate nocase desc"; // Columns of synced folder table public static final String SYNCED_FOLDER_LOCAL_PATH = "local_path"; diff --git a/src/main/java/com/owncloud/android/db/UploadResult.java b/src/main/java/com/owncloud/android/db/UploadResult.java index f6eca94459..82c587fdaa 100644 --- a/src/main/java/com/owncloud/android/db/UploadResult.java +++ b/src/main/java/com/owncloud/android/db/UploadResult.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author masensio - * Copyright (C) 2016 ownCloud Inc. + * @author masensio + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.db; @@ -46,6 +45,7 @@ public enum UploadResult { public int getValue() { return value; } + public static UploadResult fromValue(int value) { switch (value) { case -1: @@ -78,9 +78,9 @@ public enum UploadResult { return null; } - public static UploadResult fromOperationResult(RemoteOperationResult result){ + public static UploadResult fromOperationResult(RemoteOperationResult result) { // messy :( - switch (result.getCode()){ + switch (result.getCode()) { case OK: return UPLOADED; case NO_NETWORK_CONNECTION: diff --git a/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java b/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java index 3e89be4afa..76d499b691 100644 --- a/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java +++ b/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java @@ -1,22 +1,21 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2012 Bartek Przybylski - * Copyright (C) 2015 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2012 Bartek Przybylski + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.files; @@ -36,12 +35,12 @@ import com.owncloud.android.services.observer.FileObserverService; public class BootupBroadcastReceiver extends BroadcastReceiver { private static final String TAG = BootupBroadcastReceiver.class.getSimpleName(); - + /** * Receives broadcast intent reporting that the system was just boot up. * * Starts {@link FileObserverService} to enable observation of favourite files. - * + * * @param context The context where the receiver is running. * @param intent The intent received. */ diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index b3cbb988c4..6c00ab1f9c 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2015 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.files; @@ -118,7 +117,7 @@ public class FileMenuFilter { private void hideAll(Menu menu) { MenuItem item; - for (int i=0; i<menu.size(); i++) { + for (int i = 0; i < menu.size(); i++) { item = menu.getItem(i); item.setVisible(false); item.setEnabled(false); @@ -134,7 +133,7 @@ public class FileMenuFilter { * @param toShow List to save the options that must be shown in the menu. * @param toHide List to save the options that must be shown in the menu. */ - private void filter(List<Integer> toShow, List <Integer> toHide) { + private void filter(List<Integer> toShow, List<Integer> toHide) { boolean synchronizing = anyFileSynchronizing(); /// decision is taken for each possible action on a file in the menu @@ -197,13 +196,13 @@ public class FileMenuFilter { } // SHARE FILE - boolean shareViaLinkAllowed = (mContext != null && + boolean shareViaLinkAllowed = (mContext != null && mContext.getResources().getBoolean(R.bool.share_via_link_feature)); - boolean shareWithUsersAllowed = (mContext != null && + boolean shareWithUsersAllowed = (mContext != null && mContext.getResources().getBoolean(R.bool.share_with_users_feature)); OCCapability capability = mComponentsGetter.getStorageManager().getCapability(mAccount.name); - boolean shareApiEnabled = capability != null && + boolean shareApiEnabled = capability != null && (capability.getFilesSharingApiEnabled().isTrue() || capability.getFilesSharingApiEnabled().isUnknown() ); @@ -267,9 +266,9 @@ public class FileMenuFilter { FileUploaderBinder uploaderBinder = mComponentsGetter.getFileUploaderBinder(); FileDownloaderBinder downloaderBinder = mComponentsGetter.getFileDownloaderBinder(); synchronizing = ( - anyFileSynchronizing(opsBinder) || // comparing local and remote - anyFileDownloading(downloaderBinder) || - anyFileUploading(uploaderBinder) + anyFileSynchronizing(opsBinder) || // comparing local and remote + anyFileDownloading(downloaderBinder) || + anyFileUploading(uploaderBinder) ); } return synchronizing; @@ -278,7 +277,7 @@ public class FileMenuFilter { private boolean anyFileSynchronizing(OperationsServiceBinder opsBinder) { boolean synchronizing = false; if (opsBinder != null) { - for (Iterator<OCFile> iterator = mFiles.iterator(); !synchronizing && iterator.hasNext();) { + for (Iterator<OCFile> iterator = mFiles.iterator(); !synchronizing && iterator.hasNext(); ) { synchronizing = opsBinder.isSynchronizing(mAccount, iterator.next()); } } @@ -288,7 +287,7 @@ public class FileMenuFilter { private boolean anyFileDownloading(FileDownloaderBinder downloaderBinder) { boolean downloading = false; if (downloaderBinder != null) { - for (Iterator<OCFile> iterator = mFiles.iterator(); !downloading && iterator.hasNext();) { + for (Iterator<OCFile> iterator = mFiles.iterator(); !downloading && iterator.hasNext(); ) { downloading = downloaderBinder.isDownloading(mAccount, iterator.next()); } } @@ -298,7 +297,7 @@ public class FileMenuFilter { private boolean anyFileUploading(FileUploaderBinder uploaderBinder) { boolean uploading = false; if (uploaderBinder != null) { - for (Iterator<OCFile> iterator = mFiles.iterator(); !uploading && iterator.hasNext();) { + for (Iterator<OCFile> iterator = mFiles.iterator(); !uploading && iterator.hasNext(); ) { uploading = uploaderBinder.isUploading(mAccount, iterator.next()); } } @@ -318,8 +317,8 @@ public class FileMenuFilter { } private boolean containsFolder() { - for(OCFile file: mFiles) { - if(file.isFolder()) { + for (OCFile file : mFiles) { + if (file.isFolder()) { return true; } } @@ -327,8 +326,8 @@ public class FileMenuFilter { } private boolean anyFileDown() { - for(OCFile file: mFiles) { - if(file.isDown()) { + for (OCFile file : mFiles) { + if (file.isDown()) { return true; } } @@ -336,8 +335,8 @@ public class FileMenuFilter { } private boolean allKeptAvailableOffline() { - for(OCFile file: mFiles) { - if(!file.isAvailableOffline()) { + for (OCFile file : mFiles) { + if (!file.isAvailableOffline()) { return false; } } @@ -345,8 +344,8 @@ public class FileMenuFilter { } private boolean allFavorites() { - for(OCFile file: mFiles) { - if(!file.getIsFavorite()) { + for (OCFile file : mFiles) { + if (!file.getIsFavorite()) { return false; } } @@ -354,8 +353,8 @@ public class FileMenuFilter { } private boolean allNotFavorites() { - for(OCFile file: mFiles) { - if(file.getIsFavorite()) { + for (OCFile file : mFiles) { + if (file.getIsFavorite()) { return false; } } @@ -363,8 +362,8 @@ public class FileMenuFilter { } private boolean allNotKeptAvailableOffline() { - for(OCFile file: mFiles) { - if(file.isAvailableOffline()) { + for (OCFile file : mFiles) { + if (file.isAvailableOffline()) { return false; } } diff --git a/src/main/java/com/owncloud/android/files/InstantUploadBroadcastReceiver.java b/src/main/java/com/owncloud/android/files/InstantUploadBroadcastReceiver.java index 6796477c5e..34b07b64d4 100644 --- a/src/main/java/com/owncloud/android/files/InstantUploadBroadcastReceiver.java +++ b/src/main/java/com/owncloud/android/files/InstantUploadBroadcastReceiver.java @@ -1,22 +1,22 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author Bartek Przybylski - * @author David A. Velasco - * Copyright (C) 2012 Bartek Przybylski - * Copyright (C) 2016 ownCloud Inc. + * @author Bartek Przybylski + * @author David A. Velasco + * Copyright (C) 2012 Bartek Przybylski + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.files; @@ -103,7 +103,7 @@ public class InstantUploadBroadcastReceiver extends BroadcastReceiver { } String[] CONTENT_PROJECTION = { - Images.Media.DATA, Images.Media.DISPLAY_NAME, Images.Media.MIME_TYPE, Images.Media.SIZE }; + Images.Media.DATA, Images.Media.DISPLAY_NAME, Images.Media.MIME_TYPE, Images.Media.SIZE}; int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE); @@ -136,7 +136,7 @@ public class InstantUploadBroadcastReceiver extends BroadcastReceiver { int behaviour = getUploadBehaviour(context); Boolean subfolderByDate = PreferenceManager.instantPictureUploadPathUseSubfolders(context); - SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); String uploadPathdef = context.getString(R.string.instant_upload_path); String uploadPath = pref.getString("instant_upload_path", uploadPathdef); diff --git a/src/main/java/com/owncloud/android/media/MediaControlView.java b/src/main/java/com/owncloud/android/media/MediaControlView.java index f36048aa9e..a55ebc4a6c 100644 --- a/src/main/java/com/owncloud/android/media/MediaControlView.java +++ b/src/main/java/com/owncloud/android/media/MediaControlView.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2015 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.media; @@ -48,31 +47,31 @@ import java.util.Locale; /** * View containing controls for a {@link MediaPlayer}. - * + * * Holds buttons "play / pause", "rewind", "fast forward" * and a progress slider. - * + * * It synchronizes itself with the state of the * {@link MediaPlayer}. */ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeListener, OnTouchListener */ implements OnClickListener, OnSeekBarChangeListener { - private MediaPlayerControl mPlayer; - private Context mContext; - private View mRoot; - private ProgressBar mProgress; - private TextView mEndTime, mCurrentTime; - private boolean mDragging; - private static final int SHOW_PROGRESS = 1; - private ImageButton mPauseButton; - private ImageButton mFfwdButton; - private ImageButton mRewButton; - + private MediaPlayerControl mPlayer; + private Context mContext; + private View mRoot; + private ProgressBar mProgress; + private TextView mEndTime, mCurrentTime; + private boolean mDragging; + private static final int SHOW_PROGRESS = 1; + private ImageButton mPauseButton; + private ImageButton mFfwdButton; + private ImageButton mRewButton; + public MediaControlView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; - + FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT @@ -81,7 +80,7 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi mRoot = inflate.inflate(R.layout.media_control, null); initControllerView(mRoot); addView(mRoot, frameParams); - + setFocusable(true); setFocusableInTouchMode(true); setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); @@ -189,15 +188,15 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi return false; } */ - - + + public void setMediaPlayer(MediaPlayerControl player) { mPlayer = player; mHandler.sendEmptyMessage(SHOW_PROGRESS); updatePausePlay(); } - + private void initControllerView(View v) { mPauseButton = (ImageButton) v.findViewById(R.id.playBtn); if (mPauseButton != null) { @@ -231,7 +230,7 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi mCurrentTime = (TextView) v.findViewById(R.id.currentTimeText); } - + /** * Disable pause or seek buttons if the stream cannot be paused or seeked. * This requires the control interface to be a MediaPlayerControlExt @@ -254,8 +253,8 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi // the buttons. } } - - + + private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -275,7 +274,7 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi int seconds = totalSeconds % 60; int minutes = (totalSeconds / 60) % 60; - int hours = totalSeconds / 3600; + int hours = totalSeconds / 3600; final StringBuilder mFormatBuilder = new StringBuilder(); final Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault()); @@ -296,7 +295,7 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi if (duration > 0) { // use long to avoid overflow long pos = 1000L * position / duration; - mProgress.setProgress( (int) pos); + mProgress.setProgress((int) pos); } int percent = mPlayer.getBufferPercentage(); mProgress.setSecondaryProgress(percent * 10); @@ -310,14 +309,14 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi } return position; } - + @Override public boolean dispatchKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); final boolean uniqueDown = event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_DOWN; - if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK + if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || keyCode == KeyEvent.KEYCODE_SPACE) { if (uniqueDown) { @@ -393,34 +392,34 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi int pos; boolean playing = mPlayer.isPlaying(); switch (v.getId()) { - - case R.id.playBtn: - doPauseResume(); - break; - case R.id.rewindBtn: - pos = mPlayer.getCurrentPosition(); - pos -= 5000; - mPlayer.seekTo(pos); - if (!playing) { - mPlayer.pause(); // necessary in some 2.3.x devices - } - setProgress(); - break; + case R.id.playBtn: + doPauseResume(); + break; - case R.id.forwardBtn: - pos = mPlayer.getCurrentPosition(); - pos += 15000; - mPlayer.seekTo(pos); - if (!playing) { - mPlayer.pause(); // necessary in some 2.3.x devices - } - setProgress(); - break; + case R.id.rewindBtn: + pos = mPlayer.getCurrentPosition(); + pos -= 5000; + mPlayer.seekTo(pos); + if (!playing) { + mPlayer.pause(); // necessary in some 2.3.x devices + } + setProgress(); + break; + + case R.id.forwardBtn: + pos = mPlayer.getCurrentPosition(); + pos += 15000; + mPlayer.seekTo(pos); + if (!playing) { + mPlayer.pause(); // necessary in some 2.3.x devices + } + setProgress(); + break; } } - - + + @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (!fromUser) { @@ -431,16 +430,16 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi long duration = mPlayer.getDuration(); long newposition = (duration * progress) / 1000L; - mPlayer.seekTo( (int) newposition); + mPlayer.seekTo((int) newposition); if (mCurrentTime != null) { mCurrentTime.setText(stringForTime((int) newposition)); } } - + /** * Called in devices with touchpad when the user starts to adjust the * position of the seekbar's thumb. - * + * * Will be followed by several onProgressChanged notifications. */ @Override @@ -449,7 +448,7 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi mHandler.removeMessages(SHOW_PROGRESS); // grants no more updates with media player progress while dragging } - + /** * Called in devices with touchpad when the user finishes the * adjusting of the seekbar. @@ -473,5 +472,5 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi super.onInitializeAccessibilityNodeInfo(info); info.setClassName(MediaControlView.class.getName()); } - + } diff --git a/src/main/java/com/owncloud/android/media/MediaService.java b/src/main/java/com/owncloud/android/media/MediaService.java index e91a4fd4f4..409943bdcf 100644 --- a/src/main/java/com/owncloud/android/media/MediaService.java +++ b/src/main/java/com/owncloud/android/media/MediaService.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2016 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.media; @@ -49,18 +48,18 @@ import java.io.IOException; /** * Service that handles media playback, both audio and video. - * + * * Waits for Intents which signal the service to perform specific operations: Play, Pause, * Rewind, etc. */ public class MediaService extends Service implements OnCompletionListener, OnPreparedListener, - OnErrorListener, AudioManager.OnAudioFocusChangeListener { + OnErrorListener, AudioManager.OnAudioFocusChangeListener { private static final String TAG = MediaService.class.getSimpleName(); private static final String MY_PACKAGE = MediaService.class.getPackage() != null ? MediaService.class.getPackage().getName() : "com.owncloud.android.media"; - + /// Intent actions that we are prepared to handle public static final String ACTION_PLAY_FILE = MY_PACKAGE + ".action.PLAY_FILE"; public static final String ACTION_STOP_ALL = MY_PACKAGE + ".action.STOP_ALL"; @@ -77,49 +76,51 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** Time To keep the control panel visible when the user does not use it */ public static final int MEDIA_CONTROL_SHORT_LIFE = 4000; - + /** Time To keep the control panel visible when the user does not use it */ public static final int MEDIA_CONTROL_PERMANENT = 0; - + /** Volume to set when audio focus is lost and ducking is allowed */ private static final float DUCK_VOLUME = 0.1f; /** Media player instance */ private MediaPlayer mPlayer = null; - + /** Reference to the system AudioManager */ private AudioManager mAudioManager = null; - + /** Values to indicate the state of the service */ enum State { STOPPED, - PREPARING, - PLAYING, - PAUSED - }; - + PREPARING, + PLAYING, + PAUSED + } + + ; + /** Current state */ private State mState = State.STOPPED; - + /** Possible focus values */ enum AudioFocus { - NO_FOCUS, - NO_FOCUS_CAN_DUCK, - FOCUS + NO_FOCUS, + NO_FOCUS_CAN_DUCK, + FOCUS } - + /** Current focus state */ private AudioFocus mAudioFocus = AudioFocus.NO_FOCUS; - + /** 'True' when the current song is streaming from the network */ private boolean mIsStreaming = false; /** Wifi lock kept to prevents the device from shutting off the radio when streaming a file. */ private WifiLock mWifiLock; - + private static final String MEDIA_WIFI_LOCK_TAG = MY_PACKAGE + ".WIFI_LOCK"; /** Notification to keep in the notification bar while a song is playing */ @@ -127,16 +128,16 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** File being played */ private OCFile mFile; - + /** Account holding the file being played */ private Account mAccount; - /** Flag signaling if the audio should be played immediately when the file is prepared */ + /** Flag signaling if the audio should be played immediately when the file is prepared */ protected boolean mPlayOnPrepared; /** Position, in miliseconds, where the audio should be started */ private int mStartPosition; - + /** Interface to access the service through binding */ private IBinder mBinder; @@ -145,21 +146,21 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** Notification builder to create notifications, new reuse way since Android 6 */ private NotificationCompat.Builder mNotificationBuilder; - + /** * Helper method to get an error message suitable to show to users for errors occurred in media playback, - * + * * @param context A context to access string resources. * @param what See {@link MediaPlayer.OnErrorListener#onError(MediaPlayer, int, int) * @param extra See {@link MediaPlayer.OnErrorListener#onError(MediaPlayer, int, int) - * @return Message suitable to users. + * @return Message suitable to users. */ public static String getMessageForMediaError(Context context, int what, int extra) { int messageId; - + if (what == OC_MEDIA_ERROR) { messageId = extra; - + } else if (extra == MediaPlayer.MEDIA_ERROR_UNSUPPORTED) { /* Added in API level 17 Bitstream is conforming to the related coding standard or file spec, @@ -174,14 +175,14 @@ public class MediaService extends Service implements OnCompletionListener, OnPre Constant Value: -1004 (0xfffffc14) */ messageId = R.string.media_err_io; - + } else if (extra == MediaPlayer.MEDIA_ERROR_MALFORMED) { /* Added in API level 17 Bitstream is not conforming to the related coding standard or file spec. Constant Value: -1007 (0xfffffc11) */ messageId = R.string.media_err_malformed; - + } else if (extra == MediaPlayer.MEDIA_ERROR_TIMED_OUT) { /* Added in API level 17 Some operation takes too long to complete, usually more than 3-5 seconds. @@ -196,7 +197,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre Constant Value: 200 (0x000000c8) */ messageId = R.string.media_err_invalid_progressive_playback; - + } else { /* MediaPlayer.MEDIA_ERROR_UNKNOWN Added in API level 1 @@ -215,10 +216,9 @@ public class MediaService extends Service implements OnCompletionListener, OnPre } - /** * Initialize a service instance - * + * * {@inheritDoc} */ @Override @@ -236,18 +236,18 @@ public class MediaService extends Service implements OnCompletionListener, OnPre mBinder = new MediaServiceBinder(this); } - + /** * Entry point for Intents requesting actions, sent here via startService. - * + * * {@inheritDoc} */ @Override public int onStartCommand(Intent intent, int flags, int startId) { String action = intent.getAction(); - if (action.equals(ACTION_PLAY_FILE)) { + if (action.equals(ACTION_PLAY_FILE)) { processPlayFileRequest(intent); - + } else if (action.equals(ACTION_STOP_ALL)) { processStopRequest(true); } @@ -258,9 +258,9 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** * Processes a request to play a media file received as a parameter - * + * * TODO If a new request is received when a file is being prepared, it is ignored. Is this what we want? - * + * * @param intent Intent received in the request with the data to identify the file to play. */ private void processPlayFileRequest(Intent intent) { @@ -274,7 +274,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre } } - + /** * Processes a request to play a media file. */ @@ -286,7 +286,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre if (mState == State.STOPPED) { // (re)start playback playMedia(); - + } else if (mState == State.PAUSED) { // continue playback mState = State.PLAYING; @@ -295,7 +295,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre } } - + /** * Makes sure the media player exists and has been reset. This will create the media player * if needed. reset the existing media player if one already exists. @@ -311,7 +311,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre mPlayer.setOnPreparedListener(this); mPlayer.setOnCompletionListener(this); mPlayer.setOnErrorListener(this); - + } else { mPlayer.reset(); } @@ -328,11 +328,11 @@ public class MediaService extends Service implements OnCompletionListener, OnPre // TODO polite audio focus, instead of keep it owned; or not? } } - - + + /** * Processes a request to stop the playback. - * + * * @param force When 'true', the playback is stopped no matter the value of mState */ protected void processStopRequest(boolean force) { @@ -345,7 +345,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre stopSelf(); // service is no longer necessary } } - + /** * Releases resources used by the service for playback. This includes the "foreground service" @@ -370,20 +370,20 @@ public class MediaService extends Service implements OnCompletionListener, OnPre } } - + /** * Fully releases the audio focus. */ private void giveUpAudioFocus() { - if (mAudioFocus == AudioFocus.FOCUS - && mAudioManager != null - && AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.abandonAudioFocus(this)) { - + if (mAudioFocus == AudioFocus.FOCUS + && mAudioManager != null + && AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.abandonAudioFocus(this)) { + mAudioFocus = AudioFocus.NO_FOCUS; } } - + /** * Reconfigures MediaPlayer according to audio focus settings and starts/restarts it. */ @@ -391,42 +391,42 @@ public class MediaService extends Service implements OnCompletionListener, OnPre if (mPlayer == null) { throw new IllegalStateException("mPlayer is NULL"); } - + if (mAudioFocus == AudioFocus.NO_FOCUS) { if (mPlayer.isPlaying()) { mPlayer.pause(); // have to be polite; but mState is not changed, to resume when focus is received again } - - } else { + + } else { if (mAudioFocus == AudioFocus.NO_FOCUS_CAN_DUCK) { mPlayer.setVolume(DUCK_VOLUME, DUCK_VOLUME); - + } else { mPlayer.setVolume(1.0f, 1.0f); // full volume } - + if (!mPlayer.isPlaying()) { mPlayer.start(); } } } - + /** * Requests the audio focus to the Audio Manager */ private void tryToGetAudioFocus() { - if (mAudioFocus != AudioFocus.FOCUS - && mAudioManager != null - && (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.requestAudioFocus( this, - AudioManager.STREAM_MUSIC, - AudioManager.AUDIOFOCUS_GAIN)) + if (mAudioFocus != AudioFocus.FOCUS + && mAudioManager != null + && (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.requestAudioFocus(this, + AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN)) ) { mAudioFocus = AudioFocus.FOCUS; } } - + /** * Starts playing the current media file. */ @@ -435,11 +435,11 @@ public class MediaService extends Service implements OnCompletionListener, OnPre releaseResources(false); // release everything except MediaPlayer try { - if (mFile == null) { + if (mFile == null) { Toast.makeText(this, R.string.media_err_nothing_to_play, Toast.LENGTH_LONG).show(); processStopRequest(true); return; - + } else if (mAccount == null) { Toast.makeText(this, R.string.media_err_not_in_owncloud, Toast.LENGTH_LONG).show(); processStopRequest(true); @@ -456,7 +456,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre mIsStreaming = url.startsWith("http:") || url.startsWith("https:"); */ mIsStreaming = false; - + mPlayer.setDataSource(url); mState = State.PREPARING; @@ -466,30 +466,30 @@ public class MediaService extends Service implements OnCompletionListener, OnPre mPlayer.prepareAsync(); // prevent the Wifi from going to sleep when streaming - if (mIsStreaming) { + if (mIsStreaming) { mWifiLock.acquire(); } else if (mWifiLock.isHeld()) { mWifiLock.release(); } - + } catch (SecurityException e) { Log_OC.e(TAG, "SecurityException playing " + mAccount.name + mFile.getRemotePath(), e); Toast.makeText(this, String.format(getString(R.string.media_err_security_ex), mFile.getFileName()), Toast.LENGTH_LONG).show(); processStopRequest(true); - + } catch (IOException e) { Log_OC.e(TAG, "IOException playing " + mAccount.name + mFile.getRemotePath(), e); Toast.makeText(this, String.format(getString(R.string.media_err_io_ex), mFile.getFileName()), Toast.LENGTH_LONG).show(); processStopRequest(true); - + } catch (IllegalStateException e) { Log_OC.e(TAG, "IllegalStateException " + mAccount.name + mFile.getRemotePath(), e); Toast.makeText(this, String.format(getString(R.string.media_err_unexpected), mFile.getFileName()), Toast.LENGTH_LONG).show(); processStopRequest(true); - + } catch (IllegalArgumentException e) { Log_OC.e(TAG, "IllegalArgumentException " + mAccount.name + mFile.getRemotePath(), e); Toast.makeText(this, String.format(getString(R.string.media_err_unexpected), mFile.getFileName()), @@ -498,7 +498,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre } } - + /** Called when media player is done playing current song. */ public void onCompletion(MediaPlayer player) { Toast.makeText(this, String.format(getString(R.string.media_event_done, mFile.getFileName())), Toast.LENGTH_LONG).show(); @@ -513,9 +513,9 @@ public class MediaService extends Service implements OnCompletionListener, OnPre } return; } - - /** + + /** * Called when media player is done preparing. * * Time to start. @@ -531,14 +531,14 @@ public class MediaService extends Service implements OnCompletionListener, OnPre if (!mPlayOnPrepared) { processPauseRequest(); } - + if (mMediaController != null) { mMediaController.updatePausePlay(); } } - - /** + + /** * Updates the status notification */ private void updateNotification(String content) { @@ -562,12 +562,12 @@ public class MediaService extends Service implements OnCompletionListener, OnPre mNotificationManager.notify(R.string.media_notif_ticker, mNotificationBuilder.build()); } - + /** * Configures the service as a foreground service. - * + * * The system will avoid finishing the service as much as possible when resources as low. - * + * * A notification must be created to keep the user aware of the existance of the service. */ private void setUpAsForeground(String content) { @@ -579,7 +579,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre //mNotification.tickerText = text; mNotificationBuilder.setWhen(System.currentTimeMillis()); mNotificationBuilder.setOngoing(true); - + /// includes a pending intent in the notification showing the details view of the file Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class); showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, mFile); @@ -597,22 +597,22 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** * Called when there's an error playing media. - * + * * Warns the user about the error and resets the media player. */ public boolean onError(MediaPlayer mp, int what, int extra) { Log_OC.e(TAG, "Error in audio playback, what = " + what + ", extra = " + extra); - + String message = getMessageForMediaError(this, what, extra); Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); - + processStopRequest(true); - return true; + return true; } /** * Called by the system when another app tries to play some sound. - * + * * {@inheritDoc} */ @Override @@ -624,22 +624,22 @@ public class MediaService extends Service implements OnCompletionListener, OnPre if (mState == State.PLAYING) { configAndStartMediaPlayer(); } - + } else if (focusChange < 0) { // focus loss; check AudioManager.AUDIOFOCUS_* values boolean canDuck = AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK == focusChange; - mAudioFocus = canDuck ? AudioFocus.NO_FOCUS_CAN_DUCK : AudioFocus.NO_FOCUS; - // start/restart/pause media player with new focus settings - if (mPlayer != null && mPlayer.isPlaying()) { - configAndStartMediaPlayer(); - } + mAudioFocus = canDuck ? AudioFocus.NO_FOCUS_CAN_DUCK : AudioFocus.NO_FOCUS; + // start/restart/pause media player with new focus settings + if (mPlayer != null && mPlayer.isPlaying()) { + configAndStartMediaPlayer(); + } } - + } /** * Called when the service is finished for final clean-up. - * + * * {@inheritDoc} */ @Override @@ -650,7 +650,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre stopForeground(true); super.onDestroy(); } - + /** * Provides a binder object that clients can use to perform operations on the MediaPlayer managed by the MediaService. @@ -659,16 +659,16 @@ public class MediaService extends Service implements OnCompletionListener, OnPre public IBinder onBind(Intent arg) { return mBinder; } - - + + /** * Called when ALL the bound clients were onbound. - * + * * The service is destroyed if playback stopped or paused */ @Override public boolean onUnbind(Intent intent) { - if (mState == State.PAUSED || mState == State.STOPPED) { + if (mState == State.PAUSED || mState == State.STOPPED) { processStopRequest(false); } return false; // not accepting rebinding (default behaviour) @@ -677,9 +677,9 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** * Accesses the current MediaPlayer instance in the service. - * + * * To be handled carefully. Visibility is protected to be accessed only - * + * * @return Current MediaPlayer instance handled by MediaService. */ protected MediaPlayer getPlayer() { @@ -689,18 +689,18 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** * Accesses the current OCFile loaded in the service. - * - * @return The current OCFile loaded in the service. + * + * @return The current OCFile loaded in the service. */ protected OCFile getCurrentFile() { return mFile; } - + /** * Accesses the current {@link State} of the MediaService. - * - * @return The current {@link State} of the MediaService. + * + * @return The current {@link State} of the MediaService. */ protected State getState() { return mState; diff --git a/src/main/java/com/owncloud/android/media/MediaServiceBinder.java b/src/main/java/com/owncloud/android/media/MediaServiceBinder.java index e7d58aaee7..7dff43071f 100644 --- a/src/main/java/com/owncloud/android/media/MediaServiceBinder.java +++ b/src/main/java/com/owncloud/android/media/MediaServiceBinder.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2016 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.media; @@ -34,7 +33,7 @@ import com.owncloud.android.media.MediaService.State; /** * Binder allowing client components to perform operations on on the MediaPlayer managed by a MediaService instance. - * + * * Provides the operations of {@link MediaController.MediaPlayerControl}, and an extra method to check if * an {@link OCFile} instance is handled by the MediaService. */ @@ -45,10 +44,10 @@ public class MediaServiceBinder extends Binder implements MediaController.MediaP * {@link MediaService} instance to access with the binder */ private MediaService mService = null; - + /** * Public constructor - * + * * @param service A {@link MediaService} instance to access with the binder */ public MediaServiceBinder(MediaService service) { @@ -57,13 +56,13 @@ public class MediaServiceBinder extends Binder implements MediaController.MediaP } mService = service; } - - + + public boolean isPlaying(OCFile mFile) { - return (mFile != null && mFile.equals(mService.getCurrentFile())); + return (mFile != null && mFile.equals(mService.getCurrentFile())); } - + @Override public boolean canPause() { return true; @@ -110,10 +109,10 @@ public class MediaServiceBinder extends Binder implements MediaController.MediaP } } - + /** * Reports if the MediaService is playing a file or not. - * + * * Considers that the file is being played when it is in preparation because the expected * client of this method is a {@link MediaController} , and we do not want that the 'play' * button is shown when the file is being prepared by the MediaService. @@ -124,7 +123,7 @@ public class MediaServiceBinder extends Binder implements MediaController.MediaP return (currentState == State.PLAYING || (currentState == State.PREPARING && mService.mPlayOnPrepared)); } - + @Override public void pause() { Log_OC.d(TAG, "Pausing through binder..."); @@ -146,7 +145,7 @@ public class MediaServiceBinder extends Binder implements MediaController.MediaP Log_OC.d(TAG, "Starting through binder..."); mService.processPlayRequest(); // this will finish the service if there is no file preloaded to play } - + public void start(Account account, OCFile file, boolean playImmediately, int position) { Log_OC.d(TAG, "Loading and starting through binder..."); Intent i = new Intent(mService, MediaService.class); @@ -162,12 +161,12 @@ public class MediaServiceBinder extends Binder implements MediaController.MediaP public void registerMediaController(MediaControlView mediaController) { mService.setMediaContoller(mediaController); } - + public void unregisterMediaController(MediaControlView mediaController) { if (mediaController != null && mediaController == mService.getMediaController()) { mService.setMediaContoller(null); } - + } public boolean isInPlaybackState() { diff --git a/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java b/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java index e2d56b29ed..a3ab47aa05 100644 --- a/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java +++ b/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java @@ -21,15 +21,12 @@ package com.owncloud.android.operations; -import java.io.File; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; +import android.accounts.Account; +import android.webkit.MimeTypeMap; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; import com.owncloud.android.lib.common.operations.OperationCancelledException; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -37,8 +34,11 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation; import com.owncloud.android.utils.FileStorageUtils; -import android.accounts.Account; -import android.webkit.MimeTypeMap; +import java.io.File; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; /** * Remote mDownloadOperation performing the download of a file to an ownCloud server diff --git a/src/main/java/com/owncloud/android/operations/OAuth2GetAccessToken.java b/src/main/java/com/owncloud/android/operations/OAuth2GetAccessToken.java index 91f039d9f0..0f89c56655 100644 --- a/src/main/java/com/owncloud/android/operations/OAuth2GetAccessToken.java +++ b/src/main/java/com/owncloud/android/operations/OAuth2GetAccessToken.java @@ -19,15 +19,6 @@ package com.owncloud.android.operations; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.NameValuePair; -import org.json.JSONException; -import org.json.JSONObject; - import com.owncloud.android.authentication.OAuth2Constants; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.RemoteOperation; @@ -35,6 +26,15 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.PostMethod; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + public class OAuth2GetAccessToken extends RemoteOperation { diff --git a/src/main/java/com/owncloud/android/operations/UnshareOperation.java b/src/main/java/com/owncloud/android/operations/UnshareOperation.java index 54aefb7f80..de2f879fd4 100644 --- a/src/main/java/com/owncloud/android/operations/UnshareOperation.java +++ b/src/main/java/com/owncloud/android/operations/UnshareOperation.java @@ -23,7 +23,6 @@ package com.owncloud.android.operations; import android.content.Context; import com.owncloud.android.datamodel.OCFile; - import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; @@ -32,7 +31,6 @@ import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.RemoveRemoteShareOperation; import com.owncloud.android.lib.resources.shares.ShareType; - import com.owncloud.android.operations.common.SyncOperation; import java.util.ArrayList; diff --git a/src/main/java/com/owncloud/android/services/observer/FileObserverService.java b/src/main/java/com/owncloud/android/services/observer/FileObserverService.java index 0fba9dc9b9..375165cdb7 100644 --- a/src/main/java/com/owncloud/android/services/observer/FileObserverService.java +++ b/src/main/java/com/owncloud/android/services/observer/FileObserverService.java @@ -21,11 +21,6 @@ package com.owncloud.android.services.observer; -import java.io.File; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - import android.accounts.Account; import android.app.Service; import android.content.BroadcastReceiver; @@ -44,6 +39,11 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.SynchronizeFileOperation; import com.owncloud.android.utils.FileStorageUtils; +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + /** * Service keeping a list of {@link FolderObserver} instances that watch for local diff --git a/src/main/java/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java index bb07a5ac1b..bb03d11734 100644 --- a/src/main/java/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java @@ -22,14 +22,6 @@ package com.owncloud.android.syncadapter; -import java.io.IOException; - -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; -import com.owncloud.android.lib.common.OwnCloudAccount; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; - import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; @@ -38,6 +30,14 @@ import android.content.AbstractThreadedSyncAdapter; import android.content.ContentProviderClient; import android.content.Context; +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; + +import java.io.IOException; + /** * Base synchronization adapter for ownCloud designed to be subclassed for different * resource types, like FileSync, ConcatsSync, CalendarSync, etc.. diff --git a/src/main/java/com/owncloud/android/ui/CheckBoxPreferenceWithLongTitle.java b/src/main/java/com/owncloud/android/ui/CheckBoxPreferenceWithLongTitle.java index b451fca320..c64a16776e 100644 --- a/src/main/java/com/owncloud/android/ui/CheckBoxPreferenceWithLongTitle.java +++ b/src/main/java/com/owncloud/android/ui/CheckBoxPreferenceWithLongTitle.java @@ -1,31 +1,30 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2014 ownCloud Inc. + * Copyright (C) 2014 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; import android.content.Context; +import android.preference.CheckBoxPreference; import android.util.AttributeSet; import android.view.View; import android.widget.TextView; -import android.preference.CheckBoxPreference; -public class CheckBoxPreferenceWithLongTitle extends CheckBoxPreference{ +public class CheckBoxPreferenceWithLongTitle extends CheckBoxPreference { public CheckBoxPreferenceWithLongTitle(Context context) { super(context); @@ -34,6 +33,7 @@ public class CheckBoxPreferenceWithLongTitle extends CheckBoxPreference{ public CheckBoxPreferenceWithLongTitle(Context context, AttributeSet attrs) { super(context, attrs); } + public CheckBoxPreferenceWithLongTitle(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/src/main/java/com/owncloud/android/ui/CustomPopup.java b/src/main/java/com/owncloud/android/ui/CustomPopup.java index 44f8976f62..21a3ef1e29 100644 --- a/src/main/java/com/owncloud/android/ui/CustomPopup.java +++ b/src/main/java/com/owncloud/android/ui/CustomPopup.java @@ -1,22 +1,21 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author Lorensius. W. T - * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2015 ownCloud Inc. + * @author Lorensius. W. T + * Copyright (C) 2011 Bartek Przybylski + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; @@ -28,9 +27,9 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.WindowManager; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; +import android.view.WindowManager; import android.widget.PopupWindow; /** diff --git a/src/main/java/com/owncloud/android/ui/ExtendedListView.java b/src/main/java/com/owncloud/android/ui/ExtendedListView.java index 2258764375..0e2397b44e 100644 --- a/src/main/java/com/owncloud/android/ui/ExtendedListView.java +++ b/src/main/java/com/owncloud/android/ui/ExtendedListView.java @@ -1,22 +1,21 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2012 Bartek Przybylski - * Copyright (C) 2012-2015 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2012 Bartek Przybylski + * Copyright (C) 2012-2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; @@ -57,7 +56,7 @@ public class ExtendedListView extends ListView { * */ @Override - protected void onDraw (Canvas canvas) { + protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mPositionToSetAndCenter > 0) { Log_OC.v(TAG, "Centering around position " + mPositionToSetAndCenter); diff --git a/src/main/java/com/owncloud/android/ui/NavigationDrawerItem.java b/src/main/java/com/owncloud/android/ui/NavigationDrawerItem.java index 0dad197d30..9e09b52762 100644 --- a/src/main/java/com/owncloud/android/ui/NavigationDrawerItem.java +++ b/src/main/java/com/owncloud/android/ui/NavigationDrawerItem.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author masensio - * Copyright (C) 2015 ownCloud Inc. + * @author masensio + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; @@ -27,13 +26,14 @@ public class NavigationDrawerItem { private int mIcon; // Constructors - public NavigationDrawerItem(){} + public NavigationDrawerItem() { + } - public NavigationDrawerItem(String title){ + public NavigationDrawerItem(String title) { mTitle = title; } - public NavigationDrawerItem(String title, String contentDescription, int icon){ + public NavigationDrawerItem(String title, String contentDescription, int icon) { mTitle = title; mContentDescription = contentDescription; mIcon = icon; diff --git a/src/main/java/com/owncloud/android/ui/PreferenceWithLongSummary.java b/src/main/java/com/owncloud/android/ui/PreferenceWithLongSummary.java index 946a41e08a..c2a5300606 100644 --- a/src/main/java/com/owncloud/android/ui/PreferenceWithLongSummary.java +++ b/src/main/java/com/owncloud/android/ui/PreferenceWithLongSummary.java @@ -1,32 +1,31 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2014 ownCloud Inc. + * Copyright (C) 2014 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; import android.content.Context; +import android.preference.Preference; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.TextView; -import android.preference.Preference; -public class PreferenceWithLongSummary extends Preference{ +public class PreferenceWithLongSummary extends Preference { public PreferenceWithLongSummary(Context context) { super(context); @@ -35,6 +34,7 @@ public class PreferenceWithLongSummary extends Preference{ public PreferenceWithLongSummary(Context context, AttributeSet attrs) { super(context, attrs); } + public PreferenceWithLongSummary(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/src/main/java/com/owncloud/android/ui/RadioButtonPreference.java b/src/main/java/com/owncloud/android/ui/RadioButtonPreference.java index 4437cce268..a2de742ccd 100644 --- a/src/main/java/com/owncloud/android/ui/RadioButtonPreference.java +++ b/src/main/java/com/owncloud/android/ui/RadioButtonPreference.java @@ -1,20 +1,19 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; @@ -26,12 +25,12 @@ import android.view.View; import com.owncloud.android.R; public class RadioButtonPreference extends CheckBoxPreference implements View.OnLongClickListener { - + public RadioButtonPreference(Context context) { super(context, null, android.R.attr.checkBoxPreferenceStyle); setWidgetLayoutResource(R.layout.preference_widget_radiobutton); } - + @Override public boolean onLongClick(View v) { return true; diff --git a/src/main/java/com/owncloud/android/ui/SquareImageView.java b/src/main/java/com/owncloud/android/ui/SquareImageView.java index b1613fdc8a..d7d89f6fbf 100644 --- a/src/main/java/com/owncloud/android/ui/SquareImageView.java +++ b/src/main/java/com/owncloud/android/ui/SquareImageView.java @@ -1,20 +1,19 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; diff --git a/src/main/java/com/owncloud/android/ui/SquareLinearLayout.java b/src/main/java/com/owncloud/android/ui/SquareLinearLayout.java index c65c51f17e..c6a6e45a8b 100644 --- a/src/main/java/com/owncloud/android/ui/SquareLinearLayout.java +++ b/src/main/java/com/owncloud/android/ui/SquareLinearLayout.java @@ -1,20 +1,19 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.ui; diff --git a/src/main/java/com/owncloud/android/ui/TextDrawable.java b/src/main/java/com/owncloud/android/ui/TextDrawable.java index 12a24c4d12..aab89f0617 100644 --- a/src/main/java/com/owncloud/android/ui/TextDrawable.java +++ b/src/main/java/com/owncloud/android/ui/TextDrawable.java @@ -91,7 +91,7 @@ public class TextDrawable extends Drawable { * @param radiusInDp the circle's radius * @return the avatar as a TextDrawable * @throws UnsupportedEncodingException if the charset is not supported when calculating the color values - * @throws NoSuchAlgorithmException if the specified algorithm is not available when calculating the color values + * @throws NoSuchAlgorithmException if the specified algorithm is not available when calculating the color values */ @NonNull public static TextDrawable createAvatar(String accountName, float radiusInDp) throws @@ -104,11 +104,11 @@ public class TextDrawable extends Drawable { * creates an avatar in form of a TextDrawable with the first letter of a name in a circle with the * given radius. * - * @param name the name - * @param radiusInDp the circle's radius + * @param name the name + * @param radiusInDp the circle's radius * @return the avatar as a TextDrawable * @throws UnsupportedEncodingException if the charset is not supported when calculating the color values - * @throws NoSuchAlgorithmException if the specified algorithm is not available when calculating the color values + * @throws NoSuchAlgorithmException if the specified algorithm is not available when calculating the color values */ @NonNull public static TextDrawable createNamedAvatar(String name, float radiusInDp) throws diff --git a/src/main/java/com/owncloud/android/ui/activity/ComponentsGetter.java b/src/main/java/com/owncloud/android/ui/activity/ComponentsGetter.java index eae5e60372..8c5d35eb52 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ComponentsGetter.java +++ b/src/main/java/com/owncloud/android/ui/activity/ComponentsGetter.java @@ -21,10 +21,10 @@ package com.owncloud.android.ui.activity; import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.services.OperationsService.OperationsServiceBinder; +import com.owncloud.android.ui.helpers.FileOperationsHelper; public interface ComponentsGetter { diff --git a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java index 4d00cb29d8..a04d9413a5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java @@ -20,16 +20,16 @@ package com.owncloud.android.ui.activity; -import com.owncloud.android.R; -import com.owncloud.android.lib.common.utils.Log_OC; - import android.app.Activity; import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Intent; import android.os.Bundle; -import android.content.ClipboardManager; import android.widget.Toast; +import com.owncloud.android.R; +import com.owncloud.android.lib.common.utils.Log_OC; + /** * Activity copying the text of the received Intent into the system clibpoard. */ diff --git a/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java b/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java index 400d6fb45a..9d81a231e2 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java @@ -39,7 +39,6 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@ -137,7 +136,7 @@ public class ErrorsWhileCopyingHandlerActivity extends AppCompatActivity @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } /** diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 4413dc6796..dbd3b23a1b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -42,7 +42,6 @@ import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.OCFile; - import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java index 622a77c734..8515767e43 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java @@ -40,7 +40,6 @@ import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperation; @@ -237,7 +236,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C super.onResume(); Log_OC.e(TAG, "onResume() start"); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); // refresh list of files refreshListOfFilesFragment(false); diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java index ee52758f6c..189d7cae78 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java @@ -102,7 +102,7 @@ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapte @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } /** diff --git a/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java b/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java index 9f2c1613cb..0814a60d81 100644 --- a/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java @@ -32,7 +32,6 @@ import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import java.util.ArrayList; @@ -88,7 +87,7 @@ public class GenericExplanationActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } public class ExplanationListAdapterView extends ArrayAdapter<String> { diff --git a/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java b/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java index 41a6b1e395..e0585afd73 100644 --- a/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java @@ -36,7 +36,6 @@ import android.widget.Button; import android.widget.TextView; import android.widget.Toast; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.dialog.LoadingDialog; @@ -122,7 +121,7 @@ public class LogHistoryActivity extends ToolbarActivity { @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } @Override diff --git a/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java index 91496cc4d5..af902631bd 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java @@ -134,7 +134,7 @@ public class ManageAccountsActivity extends FileActivity @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } @Override diff --git a/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java index c34096cecd..017ce8dcf5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java @@ -32,7 +32,6 @@ import android.widget.Button; import android.widget.TextView; import android.widget.Toast; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; @@ -72,7 +71,7 @@ public class ManageSpaceActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } @Override diff --git a/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java b/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java index 2cdc92c81b..0453f6091a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java @@ -30,7 +30,6 @@ import android.view.MenuItem; import android.view.View; import android.widget.TextView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; /** @@ -60,7 +59,7 @@ public class ParticipateActivity extends FileActivity { @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } private void setupContent() { diff --git a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java index 6c02ff7fcd..b4be20b7f6 100644 --- a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java @@ -38,7 +38,6 @@ import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; @@ -144,7 +143,7 @@ public class PassCodeActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } /** diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index 09210a8ffd..ba5d4e76a1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -612,7 +612,7 @@ public class Preferences extends PreferenceActivity @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); diff --git a/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java b/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java index f1caf51c0a..8d63138c06 100644 --- a/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java +++ b/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java @@ -22,8 +22,8 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.accounts.AccountManager; -import android.app.ProgressDialog; import android.app.AlertDialog; +import android.app.ProgressDialog; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 32a413e1a8..170871dd98 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -41,7 +41,6 @@ import android.widget.Button; import android.widget.Spinner; import android.widget.TextView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.utils.Log_OC; @@ -323,7 +322,7 @@ public class UploadFilesActivity extends FileActivity implements @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } /** diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index 868b8bae7c..c832fa823e 100755 --- a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -41,7 +41,6 @@ import android.view.MenuItem; import android.view.View; import android.widget.Toast; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; @@ -129,7 +128,7 @@ public class UploadListActivity extends FileActivity implements UploadListFragme Log_OC.v(TAG, "onResume() start"); super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); // Listen for upload messages mUploadMessagesReceiver = new UploadMessagesReceiver(); diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java index f5148c52aa..2bf30bee9d 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java @@ -23,7 +23,6 @@ import android.accounts.Account; import android.os.Bundle; import android.view.View.OnClickListener; -import com.owncloud.android.MainApp; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; @@ -52,7 +51,7 @@ public class UploadPathActivity extends FolderPickerActivity implements FileFrag @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } /** diff --git a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java index 4a63348702..721194e30b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java @@ -132,7 +132,7 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } @Override diff --git a/src/main/java/com/owncloud/android/ui/adapter/CertificateCombinedExceptionViewAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/CertificateCombinedExceptionViewAdapter.java index 2528cb2db5..16291fe232 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/CertificateCombinedExceptionViewAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/CertificateCombinedExceptionViewAdapter.java @@ -20,13 +20,13 @@ */ package com.owncloud.android.ui.adapter; +import android.view.View; +import android.widget.TextView; + import com.owncloud.android.R; import com.owncloud.android.lib.common.network.CertificateCombinedException; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; -import android.view.View; -import android.widget.TextView; - /** * TODO * diff --git a/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.java b/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.java index 03331d7f43..e4ab19e0b4 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.java +++ b/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.java @@ -19,14 +19,6 @@ package com.owncloud.android.ui.adapter; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; @@ -35,6 +27,14 @@ import com.jakewharton.disklrucache.DiskLruCache; import com.owncloud.android.BuildConfig; import com.owncloud.android.lib.common.utils.Log_OC; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + public class DiskLruImageCache { private DiskLruCache mDiskCache; diff --git a/src/main/java/com/owncloud/android/ui/adapter/SslCertificateViewAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/SslCertificateViewAdapter.java index 716561498b..cc00c01746 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/SslCertificateViewAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/SslCertificateViewAdapter.java @@ -20,15 +20,16 @@ */ package com.owncloud.android.ui.adapter; -import java.text.DateFormat; -import java.util.Date; - -import com.owncloud.android.R; -import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import android.net.http.SslCertificate; import android.view.View; import android.widget.TextView; +import com.owncloud.android.R; +import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; + +import java.text.DateFormat; +import java.util.Date; + /** * TODO */ diff --git a/src/main/java/com/owncloud/android/ui/adapter/SslErrorViewAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/SslErrorViewAdapter.java index 7ac7144689..3cf1009719 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/SslErrorViewAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/SslErrorViewAdapter.java @@ -20,12 +20,13 @@ */ package com.owncloud.android.ui.adapter; -import com.owncloud.android.R; -import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import android.net.http.SslError; import android.view.View; import android.widget.TextView; +import com.owncloud.android.R; +import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; + /** * Dialog to show an Untrusted Certificate */ diff --git a/src/main/java/com/owncloud/android/ui/adapter/X509CertificateViewAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/X509CertificateViewAdapter.java index 48acd77f62..7078c126b1 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/X509CertificateViewAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/X509CertificateViewAdapter.java @@ -20,6 +20,13 @@ */ package com.owncloud.android.ui.adapter; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import com.owncloud.android.R; +import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; + import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateEncodingException; @@ -31,13 +38,6 @@ import java.util.Map; import javax.security.auth.x500.X500Principal; -import com.owncloud.android.R; -import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; - -import android.util.Log; -import android.view.View; -import android.widget.TextView; - /** * */ diff --git a/src/main/java/com/owncloud/android/ui/dialog/ChangelogDialog.java b/src/main/java/com/owncloud/android/ui/dialog/ChangelogDialog.java index 59cecd8e60..54108735d1 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/ChangelogDialog.java +++ b/src/main/java/com/owncloud/android/ui/dialog/ChangelogDialog.java @@ -19,11 +19,11 @@ package com.owncloud.android.ui.dialog; -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import android.webkit.WebView; import com.owncloud.android.R; diff --git a/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 2eaeb5f9fe..f36c6ce603 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -20,11 +20,11 @@ package com.owncloud.android.ui.dialog; -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import com.owncloud.android.R; diff --git a/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java b/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java index 5e673ea869..862ff1dc29 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java +++ b/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java @@ -21,13 +21,13 @@ package com.owncloud.android.ui.dialog; -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import com.owncloud.android.R; diff --git a/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java b/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java index 7b58f4d863..e1c6b9b8b0 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java +++ b/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java @@ -20,16 +20,11 @@ package com.owncloud.android.ui.dialog; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.resources.files.FileUtils; -import com.owncloud.android.ui.activity.ComponentsGetter; - -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager.LayoutParams; @@ -37,6 +32,11 @@ import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.resources.files.FileUtils; +import com.owncloud.android.ui.activity.ComponentsGetter; + /** * Dialog to input the name for a new folder to create. * diff --git a/src/main/java/com/owncloud/android/ui/dialog/CredentialsDialogFragment.java b/src/main/java/com/owncloud/android/ui/dialog/CredentialsDialogFragment.java index a15fb3ee79..adb647d1e6 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/CredentialsDialogFragment.java +++ b/src/main/java/com/owncloud/android/ui/dialog/CredentialsDialogFragment.java @@ -19,15 +19,12 @@ package com.owncloud.android.ui.dialog; -import com.owncloud.android.R; -import com.owncloud.android.authentication.AuthenticatorActivity; - -import android.support.v7.app.AlertDialog; import android.app.Dialog; -import android.support.v7.app.AlertDialog.Builder; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AlertDialog.Builder; import android.text.InputType; import android.view.WindowManager.LayoutParams; import android.webkit.HttpAuthHandler; @@ -35,6 +32,9 @@ import android.webkit.WebView; import android.widget.EditText; import android.widget.LinearLayout; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AuthenticatorActivity; + /** diff --git a/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java b/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java index 253b4152b9..c9fe06fec5 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java +++ b/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java @@ -18,8 +18,6 @@ */ package com.owncloud.android.ui.dialog; -import com.owncloud.android.R; - import android.app.Dialog; import android.graphics.PorterDuff; import android.os.Bundle; @@ -31,6 +29,8 @@ import android.view.Window; import android.widget.ProgressBar; import android.widget.TextView; +import com.owncloud.android.R; + public class LoadingDialog extends DialogFragment { private String mMessage; diff --git a/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java b/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java index c08311509e..2b0035a8de 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java +++ b/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java @@ -25,11 +25,12 @@ package com.owncloud.android.ui.dialog; * * Triggers the rename operation. */ -import android.support.v7.app.AlertDialog; + import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager.LayoutParams; diff --git a/src/main/java/com/owncloud/android/ui/dialog/SamlWebViewDialog.java b/src/main/java/com/owncloud/android/ui/dialog/SamlWebViewDialog.java index 9bae3059ed..aff7b97f12 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/SamlWebViewDialog.java +++ b/src/main/java/com/owncloud/android/ui/dialog/SamlWebViewDialog.java @@ -28,8 +28,8 @@ import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java b/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java index 29eaac2b30..7bde39e60b 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java +++ b/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java @@ -20,12 +20,6 @@ package com.owncloud.android.ui.dialog; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.ComponentName; import android.content.Context; @@ -36,6 +30,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -47,6 +42,11 @@ import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.activity.CopyToClipboardActivity; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + /** * Dialog showing a list activities able to resolve a given Intent, * filtering out the activities matching give package names. diff --git a/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java b/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java index 06f52582e1..1bec58493a 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java +++ b/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java @@ -18,11 +18,11 @@ */ package com.owncloud.android.ui.dialog; -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; diff --git a/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java b/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java index d4b496ec4a..d9d9715406 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java +++ b/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java @@ -20,10 +20,6 @@ */ package com.owncloud.android.ui.dialog; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.security.cert.X509Certificate; - import android.app.Activity; import android.app.Dialog; import android.net.http.SslError; @@ -31,9 +27,9 @@ import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; -import android.view.View.OnClickListener; import android.webkit.SslErrorHandler; import android.widget.Button; @@ -46,6 +42,10 @@ import com.owncloud.android.ui.adapter.SslCertificateViewAdapter; import com.owncloud.android.ui.adapter.SslErrorViewAdapter; import com.owncloud.android.ui.adapter.X509CertificateViewAdapter; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.security.cert.X509Certificate; + /** * Dialog to show information about an untrusted certificate and allow the user * to decide trust on it or not. diff --git a/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java b/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java index cbcbad27f3..423784ad52 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java +++ b/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java @@ -20,6 +20,20 @@ package com.owncloud.android.ui.dialog; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.TextView; + +import com.owncloud.android.R; +import com.owncloud.android.lib.common.network.CertificateCombinedException; +import com.owncloud.android.lib.common.network.NetworkUtils; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.utils.Log_OC; + import java.io.IOException; import java.security.GeneralSecurityException; import java.security.KeyStoreException; @@ -32,21 +46,6 @@ import java.util.Map; import javax.security.auth.x500.X500Principal; -import com.owncloud.android.R; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.TextView; - -import com.owncloud.android.lib.common.network.CertificateCombinedException; -import com.owncloud.android.lib.common.network.NetworkUtils; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; - /** * Dialog to request the user about a certificate that could not be validated with the certificates store in the system. */ diff --git a/src/main/java/com/owncloud/android/ui/dialog/UploadSourceDialogFragment.java b/src/main/java/com/owncloud/android/ui/dialog/UploadSourceDialogFragment.java index bee23ca035..0bfd852310 100644 --- a/src/main/java/com/owncloud/android/ui/dialog/UploadSourceDialogFragment.java +++ b/src/main/java/com/owncloud/android/ui/dialog/UploadSourceDialogFragment.java @@ -20,13 +20,13 @@ package com.owncloud.android.ui.dialog; import android.accounts.Account; -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; diff --git a/src/main/java/com/owncloud/android/ui/errorhandling/ExceptionHandler.java b/src/main/java/com/owncloud/android/ui/errorhandling/ExceptionHandler.java index f32c44ea3b..9fbacf3535 100755 --- a/src/main/java/com/owncloud/android/ui/errorhandling/ExceptionHandler.java +++ b/src/main/java/com/owncloud/android/ui/errorhandling/ExceptionHandler.java @@ -19,14 +19,14 @@ */ package com.owncloud.android.ui.errorhandling; -import java.io.PrintWriter; -import java.io.StringWriter; - import android.app.Activity; import android.content.Intent; import android.os.Build; import android.util.Log; +import java.io.PrintWriter; +import java.io.StringWriter; + public class ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler { private final Activity mContext; diff --git a/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java b/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java index 10f4fb9e74..429391da63 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java @@ -32,7 +32,6 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@ -381,7 +380,7 @@ public class EditShareFragment extends Fragment { public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 1cefd21d12..1173e1c619 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -111,7 +111,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java index e7f46d611e..83c6ebf1b1 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -32,7 +32,6 @@ import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.adapter.LocalFileListAdapter; @@ -69,7 +68,7 @@ public class LocalFileListFragment extends ExtendedListFragment { public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index a94ebf4301..daadb03bd0 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -254,7 +254,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi } if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java index 648a9c54d8..d60400b621 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java @@ -35,7 +35,6 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.ListView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; @@ -109,7 +108,7 @@ public class SearchShareesFragment extends Fragment implements ShareUserListAdap public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java index a9fe309bf9..90acebc2bc 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java @@ -44,7 +44,6 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; @@ -182,7 +181,7 @@ public class ShareFileFragment extends Fragment implements ShareUserListAdapter. public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java index dd6b0a29f2..b4fc307115 100755 --- a/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java @@ -27,7 +27,6 @@ import android.view.ViewGroup; import android.widget.ExpandableListView; import android.widget.ListView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.db.OCUpload; import com.owncloud.android.lib.common.utils.Log_OC; @@ -77,7 +76,7 @@ public class UploadListFragment extends ExpandableListFragment { public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index a0d21f5866..f49fc4e5e0 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -63,9 +63,6 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static com.owncloud.android.R.drawable.file; -import static com.owncloud.android.R.layout.files; - /** * */ diff --git a/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java b/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java index 252c549b11..9e96cc187e 100644 --- a/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java +++ b/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java @@ -19,17 +19,19 @@ package com.owncloud.android.ui.notifications; -import java.util.Random; - import android.app.NotificationManager; import android.content.Context; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; import android.support.v4.app.NotificationCompat; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import com.owncloud.android.R; +import java.util.Random; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + public class NotificationUtils { /** diff --git a/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java b/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java index e4cbe96d5f..419ff5a7b7 100644 --- a/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java @@ -19,12 +19,6 @@ */ package com.owncloud.android.ui.preview; -import java.lang.ref.WeakReference; - -import com.owncloud.android.R; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.ui.fragment.FileFragment; - import android.accounts.Account; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -36,10 +30,15 @@ import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.DisplayUtils; +import java.lang.ref.WeakReference; + /** * This Fragment is used to monitor the progress of a file downloading. diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index bc71d59758..78cb4893ce 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -51,8 +51,6 @@ import android.widget.TextView; import com.caverock.androidsvg.SVG; import com.caverock.androidsvg.SVGParseException; - -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -380,7 +378,7 @@ public class PreviewImageFragment extends FileFragment { public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java index 4800b68dfb..d58dfb5bf3 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java @@ -19,13 +19,6 @@ */ package com.owncloud.android.ui.preview; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.Vector; - import android.accounts.Account; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -37,6 +30,13 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.FileStorageUtils; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.Vector; + /** * Adapter class that provides Fragment instances */ diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index fa96852f2f..bcd123a732 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -54,7 +54,6 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -566,7 +565,7 @@ public class PreviewMediaFragment extends FileFragment implements public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } Log_OC.v(TAG, "onResume"); } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index ce08b2030a..b7fee9286c 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -34,7 +34,6 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -418,7 +417,7 @@ public class PreviewTextFragment extends FileFragment { public void onResume() { super.onResume(); if (getActivity() != null) { - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(getActivity(), SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } Log_OC.e(TAG, "onResume"); } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java index 17e2734dfd..c01f3d244f 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@ -33,7 +33,6 @@ import android.support.v7.app.AlertDialog; import android.widget.MediaController; import android.widget.VideoView; -import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.accounts.AccountUtils; @@ -109,7 +108,7 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi @Override protected void onResume() { super.onResume(); - MainApp.getFirebaseAnalyticsInstance().setCurrentScreen(this, SCREEN_NAME, TAG); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } /** diff --git a/src/main/java/com/owncloud/android/utils/BitmapUtils.java b/src/main/java/com/owncloud/android/utils/BitmapUtils.java index 891ecdb98a..2954259e11 100644 --- a/src/main/java/com/owncloud/android/utils/BitmapUtils.java +++ b/src/main/java/com/owncloud/android/utils/BitmapUtils.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2015 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; @@ -40,19 +39,19 @@ import java.util.Locale; * Utility class with methods for decoding Bitmaps. */ public class BitmapUtils { - - + + /** * Decodes a bitmap from a file containing it minimizing the memory use, known that the bitmap * will be drawn in a surface of reqWidth x reqHeight - * + * * @param srcPath Absolute path to the file containing the image. * @param reqWidth Width of the surface where the Bitmap will be drawn on, in pixels. * @param reqHeight Height of the surface where the Bitmap will be drawn on, in pixels. * @return */ public static Bitmap decodeSampledBitmapFromFile(String srcPath, int reqWidth, int reqHeight) { - + // set desired options that will affect the size of the bitmap final Options options = new Options(); options.inScaled = true; @@ -63,39 +62,39 @@ public class BitmapUtils { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { options.inMutable = false; } - + // make a false load of the bitmap to get its dimensions options.inJustDecodeBounds = true; - - BitmapFactory.decodeFile(srcPath, options); - + + BitmapFactory.decodeFile(srcPath, options); + // calculate factor to subsample the bitmap options.inSampleSize = calculateSampleFactor(options, reqWidth, reqHeight); // decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(srcPath, options); - } + } /** * Calculates a proper value for options.inSampleSize in order to decode a Bitmap minimizing * the memory overload and covering a target surface of reqWidth x reqHeight if the original * image is big enough. - * + * * @param options Bitmap decoding options; options.outHeight and options.inHeight should * be set. * @param reqWidth Width of the surface where the Bitmap will be drawn on, in pixels. * @param reqHeight Height of the surface where the Bitmap will be drawn on, in pixels. - * @return The largest inSampleSize value that is a power of 2 and keeps both + * @return The largest inSampleSize value that is a power of 2 and keeps both * height and width larger than reqWidth and reqHeight. */ private static int calculateSampleFactor(Options options, int reqWidth, int reqHeight) { - + final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; - + if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; @@ -107,10 +106,10 @@ public class BitmapUtils { inSampleSize *= 2; } } - + return inSampleSize; } - + /** * Rotate bitmap according to EXIF orientation. * Cf. http://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/ @@ -118,64 +117,54 @@ public class BitmapUtils { * @param storagePath Path to source file of bitmap. Needed for EXIF information. * @return correctly EXIF-rotated bitmap */ - public static Bitmap rotateImage(Bitmap bitmap, String storagePath){ + public static Bitmap rotateImage(Bitmap bitmap, String storagePath) { Bitmap resultBitmap = bitmap; - try - { + try { ExifInterface exifInterface = new ExifInterface(storagePath); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); Matrix matrix = new Matrix(); // 1: nothing to do - + // 2 - if (orientation == ExifInterface.ORIENTATION_FLIP_HORIZONTAL) - { + if (orientation == ExifInterface.ORIENTATION_FLIP_HORIZONTAL) { matrix.postScale(-1.0f, 1.0f); } // 3 - else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) - { + else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { matrix.postRotate(180); } // 4 - else if (orientation == ExifInterface.ORIENTATION_FLIP_VERTICAL) - { + else if (orientation == ExifInterface.ORIENTATION_FLIP_VERTICAL) { matrix.postScale(1.0f, -1.0f); } // 5 - else if (orientation == ExifInterface.ORIENTATION_TRANSPOSE) - { + else if (orientation == ExifInterface.ORIENTATION_TRANSPOSE) { matrix.postRotate(-90); matrix.postScale(1.0f, -1.0f); } // 6 - else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) - { + else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { matrix.postRotate(90); } // 7 - else if (orientation == ExifInterface.ORIENTATION_TRANSVERSE) - { + else if (orientation == ExifInterface.ORIENTATION_TRANSVERSE) { matrix.postRotate(90); matrix.postScale(1.0f, -1.0f); } // 8 - else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) - { + else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { matrix.postRotate(270); - } - + } + // Rotate the bitmap resultBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); if (!resultBitmap.equals(bitmap)) { bitmap.recycle(); } - } - catch (Exception exception) - { + } catch (Exception exception) { Log_OC.e("BitmapUtil", "Could not rotate the image: " + storagePath); } return resultBitmap; @@ -192,24 +181,20 @@ public class BitmapUtils { * gfxbuilder-core/src/main/com/camick/awt/HSLColor.java */ @SuppressWarnings("PMD.MethodNamingConventions") - public static int[] HSLtoRGB(float h, float s, float l, float alpha) - { - if (s <0.0f || s > 100.0f) - { + public static int[] HSLtoRGB(float h, float s, float l, float alpha) { + if (s < 0.0f || s > 100.0f) { String message = "Color parameter outside of expected range - Saturation"; - throw new IllegalArgumentException( message ); + throw new IllegalArgumentException(message); } - if (l <0.0f || l > 100.0f) - { + if (l < 0.0f || l > 100.0f) { String message = "Color parameter outside of expected range - Luminance"; - throw new IllegalArgumentException( message ); + throw new IllegalArgumentException(message); } - if (alpha <0.0f || alpha > 1.0f) - { + if (alpha < 0.0f || alpha > 1.0f) { String message = "Color parameter outside of expected range - Alpha"; - throw new IllegalArgumentException( message ); + throw new IllegalArgumentException(message); } // Formula needs all values between 0 - 1. @@ -237,29 +222,29 @@ public class BitmapUtils { } @SuppressWarnings("PMD.MethodNamingConventions") - private static float HueToRGB(float p, float q, float h){ - if (h < 0) { + private static float HueToRGB(float p, float q, float h) { + if (h < 0) { h += 1; } - if (h > 1 ) { + if (h > 1) { h -= 1; } - if (6 * h < 1) { - return p + ((q - p) * 6 * h); - } + if (6 * h < 1) { + return p + ((q - p) * 6 * h); + } - if (2 * h < 1 ) { - return q; - } + if (2 * h < 1) { + return q; + } - if (3 * h < 2) { - return p + ( (q - p) * 6 * ((2.0f / 3.0f) - h) ); - } + if (3 * h < 2) { + return p + ((q - p) * 6 * ((2.0f / 3.0f) - h)); + } - return p; - } + return p; + } /** * calculates the RGB value based on a given account name. diff --git a/src/main/java/com/owncloud/android/utils/ConnectivityUtils.java b/src/main/java/com/owncloud/android/utils/ConnectivityUtils.java index c9a1780b97..99be666126 100644 --- a/src/main/java/com/owncloud/android/utils/ConnectivityUtils.java +++ b/src/main/java/com/owncloud/android/utils/ConnectivityUtils.java @@ -1,20 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2016 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; @@ -24,8 +24,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.support.v4.net.ConnectivityManagerCompat; import android.os.BatteryManager; +import android.support.v4.net.ConnectivityManagerCompat; import com.owncloud.android.lib.common.utils.Log_OC; @@ -37,9 +37,9 @@ public class ConnectivityUtils { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); boolean result = cm != null && cm.getActiveNetworkInfo() != null - && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI - && cm.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED - && !ConnectivityManagerCompat.isActiveNetworkMetered(cm); + && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI + && cm.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED + && !ConnectivityManagerCompat.isActiveNetworkMetered(cm); Log_OC.d(TAG, "is AppConnectedViaWifi returns " + result); return result; } @@ -49,7 +49,7 @@ public class ConnectivityUtils { return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected(); } - public static boolean isCharging(Context context){ + public static boolean isCharging(Context context) { IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); diff --git a/src/main/java/com/owncloud/android/utils/DialogMenuItem.java b/src/main/java/com/owncloud/android/utils/DialogMenuItem.java index 630085b355..cde348b5b0 100644 --- a/src/main/java/com/owncloud/android/utils/DialogMenuItem.java +++ b/src/main/java/com/owncloud/android/utils/DialogMenuItem.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author Andy Scherzinger - * Copyright (C) 2015 ownCloud Inc. + * @author Andy Scherzinger + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; diff --git a/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/src/main/java/com/owncloud/android/utils/DisplayUtils.java index c5d1a76057..a6af423123 100644 --- a/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -1,25 +1,25 @@ /** - * Nextcloud Android client application + * Nextcloud Android client application * - * @author Andy Scherzinger - * @author Bartek Przybylski - * @author David A. Velasco - * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2015 ownCloud Inc. - * Copyright (C) 2016 Andy Scherzinger + * @author Andy Scherzinger + * @author Bartek Przybylski + * @author David A. Velasco + * Copyright (C) 2011 Bartek Przybylski + * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2016 Andy Scherzinger * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * - * You should have received a copy of the GNU Affero General Public - * License along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; @@ -97,8 +97,8 @@ import java.util.Set; public class DisplayUtils { private static final String TAG = DisplayUtils.class.getSimpleName(); - private static final String[] sizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" }; - private static final int[] sizeScales = { 0, 0, 1, 1, 1, 2, 2, 2, 2 }; + private static final String[] sizeSuffixes = {"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; + private static final int[] sizeScales = {0, 0, 1, 1, 1, 2, 2, 2, 2}; private static final int RELATIVE_THRESHOLD_WARNING = 90; private static final int RELATIVE_THRESHOLD_CRITICAL = 95; private static final String MIME_TYPE_UNKNOWN = "Unknown type"; @@ -154,7 +154,7 @@ public class DisplayUtils { /** * Converts MIME types like "image/jpg" to more end user friendly output * like "JPG image". - * + * * @param mimetype MIME type to convert * @return A human friendly version of the MIME type, {@link #MIME_TYPE_UNKNOWN} if it can't be converted */ @@ -219,7 +219,7 @@ public class DisplayUtils { return TWITTER_HANDLE_PREFIX + handle; } } - + /** * Converts an internationalized domain name (IDN) in an URL to and from ASCII/Unicode. * @@ -231,7 +231,7 @@ public class DisplayUtils { public static String convertIdn(String url, boolean toASCII) { String urlNoDots = url; - String dots=""; + String dots = ""; while (urlNoDots.startsWith(".")) { urlNoDots = url.substring(1); dots = dots + "."; @@ -360,8 +360,8 @@ public class DisplayUtils { public static String getPathWithoutLastSlash(String path) { // Remove last slash from path - if (path.length() > 1 && path.charAt(path.length()-1) == OCFile.PATH_SEPARATOR.charAt(0)) { - path = path.substring(0, path.length()-1); + if (path.length() > 1 && path.charAt(path.length() - 1) == OCFile.PATH_SEPARATOR.charAt(0)) { + path = path.substring(0, path.length() - 1); } return path; } @@ -424,7 +424,7 @@ public class DisplayUtils { if (seekBar != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { colorPreLollipopHorizontalProgressBar(seekBar); - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { int color = seekBar.getResources().getColor(R.color.color_accent); seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN); seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN); @@ -484,6 +484,7 @@ public class DisplayUtils { public interface AvatarGenerationListener { void avatarGenerated(Drawable avatarDrawable, Object callContext); + boolean shouldCallGeneratedCallback(String tag, Object callContext); } @@ -496,7 +497,7 @@ public class DisplayUtils { * @param storageManager reference for caching purposes */ public static void setAvatar(Account account, AvatarGenerationListener listener, float avatarRadius, Resources resources, - FileDataStorageManager storageManager, Object callContext) { + FileDataStorageManager storageManager, Object callContext) { if (account != null) { if (callContext instanceof View) { ((View) callContext).setContentDescription(account.name); @@ -525,7 +526,7 @@ public class DisplayUtils { final ThumbnailsCacheManager.AsyncAvatarDrawable asyncDrawable = new ThumbnailsCacheManager.AsyncAvatarDrawable(resources, thumbnail, task); listener.avatarGenerated(BitmapUtils.bitmapToCircularBitmapDrawable( - resources, asyncDrawable.getBitmap()), callContext); + resources, asyncDrawable.getBitmap()), callContext); } task.execute(account.name); } diff --git a/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java b/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java index 860a2dcd0f..59b3b6de28 100644 --- a/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java +++ b/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author masensio - * Copyright (C) 2014 ownCloud Inc. + * @author masensio + * Copyright (C) 2014 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -55,7 +54,7 @@ public class ErrorMessageAdapter { public static String getErrorCauseMessage(RemoteOperationResult result, RemoteOperation operation, Resources res) { - + String message = null; if (!result.isSuccess() && isNetworkError(result.getCode())) { @@ -72,7 +71,7 @@ public class ErrorMessageAdapter { || result.getCode() == ResultCode.LOCAL_STORAGE_NOT_COPIED) { message = String.format( res.getString(R.string.error__upload__local_file_not_copied), - ((UploadFileOperation) operation).getFileName(), + ((UploadFileOperation) operation).getFileName(), res.getString(R.string.app_name)); /* } else if (result.getCode() == ResultCode.QUOTA_EXCEEDED) { @@ -107,7 +106,7 @@ public class ErrorMessageAdapter { } else { message = String.format( res.getString(R.string.downloader_download_failed_content), new File( - ((DownloadFileOperation) operation).getSavePath()).getName()); + ((DownloadFileOperation) operation).getSavePath()).getName()); } } @@ -163,12 +162,12 @@ public class ErrorMessageAdapter { message = res.getString(R.string.create_dir_fail_msg); } } else if (operation instanceof CreateShareViaLinkOperation || - operation instanceof CreateShareWithShareeOperation) { + operation instanceof CreateShareWithShareeOperation) { if (result.getData() != null && result.getData().size() > 0) { message = (String) result.getData().get(0); // share API sends its own error messages - } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { + } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { message = res.getString(R.string.share_link_file_no_exist); } else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) { @@ -200,7 +199,7 @@ public class ErrorMessageAdapter { } } else if (operation instanceof UpdateShareViaLinkOperation || - operation instanceof UpdateSharePermissionsOperation) { + operation instanceof UpdateSharePermissionsOperation) { if (result.getData() != null && result.getData().size() > 0) { message = (String) result.getData().get(0); // share API sends its own error messages diff --git a/src/main/java/com/owncloud/android/utils/FileStorageUtils.java b/src/main/java/com/owncloud/android/utils/FileStorageUtils.java index 5275557a11..173cc704c6 100644 --- a/src/main/java/com/owncloud/android/utils/FileStorageUtils.java +++ b/src/main/java/com/owncloud/android/utils/FileStorageUtils.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author David A. Velasco - * Copyright (C) 2016 ownCloud Inc. + * @author David A. Velasco + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; @@ -115,8 +114,8 @@ public class FileStorageUtils { File savePath = new File(MainApp.getStoragePath()); return savePath.getUsableSpace(); } - - public static String getLogPath() { + + public static String getLogPath() { return MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + "log"; } @@ -166,10 +165,10 @@ public class FileStorageUtils { Boolean subfolderByDate) { String subPath = ""; if (subfolderByDate) { - subPath = getSubpathFromDate(dateTaken, current); + subPath = getSubpathFromDate(dateTaken, current); } - return remotePath + OCFile.PATH_SEPARATOR + subPath + (fileName == null ? "" : fileName); + return remotePath + OCFile.PATH_SEPARATOR + subPath + (fileName == null ? "" : fileName); } public static String getInstantUploadFilePath(String remotePath, @@ -202,23 +201,23 @@ public class FileStorageUtils { } return uploadVideoPath + OCFile.PATH_SEPARATOR + subPath + (fileName == null ? "" : fileName); } - + public static String getParentPath(String remotePath) { String parentPath = new File(remotePath).getParent(); parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + OCFile.PATH_SEPARATOR; return parentPath; } - + /** * Creates and populates a new {@link OCFile} object with the data read from the server. - * + * * @param remote remote file read from the server (remote file or folder). - * @return New OCFile instance representing the remote resource described by remote. + * @return New OCFile instance representing the remote resource described by remote. */ public static OCFile fillOCFile(RemoteFile remote) { OCFile file = new OCFile(remote.getRemotePath()); file.setCreationTimestamp(remote.getCreationTimestamp()); - if (remote.getMimeType().equalsIgnoreCase(MimeType.DIRECTORY)){ + if (remote.getMimeType().equalsIgnoreCase(MimeType.DIRECTORY)) { file.setFileLength(remote.getSize()); } else { file.setFileLength(remote.getLength()); @@ -231,14 +230,14 @@ public class FileStorageUtils { file.setFavorite(remote.getIsFavorite()); return file; } - + /** * Creates and populates a new {@link RemoteFile} object with the data read from an {@link OCFile}. - * + * * @param ocFile OCFile - * @return New RemoteFile instance representing the resource described by ocFile. + * @return New RemoteFile instance representing the resource described by ocFile. */ - public static RemoteFile fillRemoteFile(OCFile ocFile){ + public static RemoteFile fillRemoteFile(OCFile ocFile) { RemoteFile file = new RemoteFile(ocFile.getRemotePath()); file.setCreationTimestamp(ocFile.getCreationTimestamp()); file.setLength(ocFile.getFileLength()); @@ -267,21 +266,21 @@ public class FileStorageUtils { /** * Sorts all filenames, regarding last user decision */ - public static Vector<OCFile> sortOcFolder(Vector<OCFile> files){ - switch (mSortOrder){ - case 0: - files = FileStorageUtils.sortOCFilesByName(files); - break; - case 1: - files = FileStorageUtils.sortOCFilesByDate(files); - break; - case 2: - files = FileStorageUtils.sortOCFilesBySize(files); - break; + public static Vector<OCFile> sortOcFolder(Vector<OCFile> files) { + switch (mSortOrder) { + case 0: + files = FileStorageUtils.sortOCFilesByName(files); + break; + case 1: + files = FileStorageUtils.sortOCFilesByDate(files); + break; + case 2: + files = FileStorageUtils.sortOCFilesBySize(files); + break; } files = FileStorageUtils.sortOCFilesByFavourite(files); - + return files; } @@ -290,8 +289,8 @@ public class FileStorageUtils { * * @param files of files to sort */ - public static File[] sortLocalFolder(File[] files){ - switch (mSortOrder){ + public static File[] sortLocalFolder(File[] files) { + switch (mSortOrder) { case 0: files = FileStorageUtils.sortLocalFilesByName(files); break; @@ -305,23 +304,23 @@ public class FileStorageUtils { return files; } - + /** * Sorts list by Date. * * @param files list of files to sort */ - public static Vector<OCFile> sortOCFilesByDate(Vector<OCFile> files){ + public static Vector<OCFile> sortOCFilesByDate(Vector<OCFile> files) { final int multiplier = mSortAscending ? 1 : -1; - + Collections.sort(files, new Comparator<OCFile>() { @SuppressFBWarnings(value = "Bx", justification = "Would require stepping up API level") public int compare(OCFile o1, OCFile o2) { - Long obj1 = o1.getModificationTimestamp(); - return multiplier * obj1.compareTo(o2.getModificationTimestamp()); + Long obj1 = o1.getModificationTimestamp(); + return multiplier * obj1.compareTo(o2.getModificationTimestamp()); } }); - + return files; } @@ -330,7 +329,7 @@ public class FileStorageUtils { * * @param filesArray list of files to sort */ - public static File[] sortLocalFilesByDate(File[] filesArray){ + public static File[] sortLocalFilesByDate(File[] filesArray) { final int multiplier = mSortAscending ? 1 : -1; List<File> files = new ArrayList<File>(Arrays.asList(filesArray)); @@ -338,8 +337,8 @@ public class FileStorageUtils { Collections.sort(files, new Comparator<File>() { @SuppressFBWarnings(value = "Bx") public int compare(File o1, File o2) { - Long obj1 = o1.lastModified(); - return multiplier * obj1.compareTo(o2.lastModified()); + Long obj1 = o1.lastModified(); + return multiplier * obj1.compareTo(o2.lastModified()); } }); @@ -352,7 +351,7 @@ public class FileStorageUtils { * * @param files list of files to sort */ - public static Vector<OCFile> sortOCFilesBySize(Vector<OCFile> files){ + public static Vector<OCFile> sortOCFilesBySize(Vector<OCFile> files) { final int multiplier = mSortAscending ? 1 : -1; Collections.sort(files, new Comparator<OCFile>() { @@ -414,7 +413,7 @@ public class FileStorageUtils { * @param files files to sort */ @SuppressFBWarnings(value = "Bx") - public static Vector<OCFile> sortOCFilesByName(Vector<OCFile> files){ + public static Vector<OCFile> sortOCFilesByName(Vector<OCFile> files) { final int multiplier = mSortAscending ? 1 : -1; Collections.sort(files, new Comparator<OCFile>() { @@ -429,7 +428,7 @@ public class FileStorageUtils { return multiplier * new AlphanumComparator().compare(o1, o2); } }); - + return files; } @@ -453,7 +452,7 @@ public class FileStorageUtils { return 1; } return multiplier * new AlphanumComparator().compare(o1.getPath().toLowerCase(), - o2.getPath().toLowerCase()); + o2.getPath().toLowerCase()); } }); @@ -466,7 +465,7 @@ public class FileStorageUtils { * * @param files files to sort */ - public static Vector<OCFile> sortOCFilesByFavourite(Vector<OCFile> files){ + public static Vector<OCFile> sortOCFilesByFavourite(Vector<OCFile> files) { Collections.sort(files, new Comparator<OCFile>() { public int compare(OCFile o1, OCFile o2) { if (o1.getIsFavorite() && o2.getIsFavorite()) { diff --git a/src/main/java/com/owncloud/android/utils/GetShareWithUsersAsyncTask.java b/src/main/java/com/owncloud/android/utils/GetShareWithUsersAsyncTask.java index 76bfb7d5b0..6513a6c119 100644 --- a/src/main/java/com/owncloud/android/utils/GetShareWithUsersAsyncTask.java +++ b/src/main/java/com/owncloud/android/utils/GetShareWithUsersAsyncTask.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author masensio - * Copyright (C) 2015 ownCloud Inc. + * @author masensio + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; @@ -86,11 +85,9 @@ public class GetShareWithUsersAsyncTask extends AsyncTask<Object, Void, Pair<Rem @Override protected void onPostExecute(Pair<RemoteOperation, RemoteOperationResult> result) { - if (result!= null) - { + if (result != null) { OnRemoteOperationListener listener = mListener.get(); - if (listener!= null) - { + if (listener != null) { listener.onRemoteOperationFinish(result.first, result.second); } } diff --git a/src/main/java/com/owncloud/android/utils/MimeType.java b/src/main/java/com/owncloud/android/utils/MimeType.java index 3fbe7bc9ad..e51cfc4190 100644 --- a/src/main/java/com/owncloud/android/utils/MimeType.java +++ b/src/main/java/com/owncloud/android/utils/MimeType.java @@ -1,20 +1,19 @@ /** - * Nextcloud Android client application + * Nextcloud Android client application * - * Copyright (C) 2016 Nextcloud + * Copyright (C) 2016 Nextcloud * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2+, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2+, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; diff --git a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java index 6b11b75f94..d52cf1debf 100644 --- a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java +++ b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java @@ -1,20 +1,19 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2016 ownCloud Inc. + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; @@ -110,7 +109,7 @@ public class MimeTypeUtil { * into account the MIME types known by ownCloud first. * * @param filename Name of file - * @return A single MIME type, "application/octet-stream" for unknown file extensions. + * @return A single MIME type, "application/octet-stream" for unknown file extensions. */ public static String getBestMimeTypeByFilename(String filename) { List<String> candidates = determineMimeTypesByFilename(filename); diff --git a/src/main/java/com/owncloud/android/utils/OwnCloudSession.java b/src/main/java/com/owncloud/android/utils/OwnCloudSession.java index 6292a2b2ce..f213d01405 100644 --- a/src/main/java/com/owncloud/android/utils/OwnCloudSession.java +++ b/src/main/java/com/owncloud/android/utils/OwnCloudSession.java @@ -1,22 +1,21 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author Bartek Przybylski - * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2015 ownCloud Inc. + * @author Bartek Przybylski + * Copyright (C) 2011 Bartek Przybylski + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; diff --git a/src/main/java/com/owncloud/android/utils/PermissionUtil.java b/src/main/java/com/owncloud/android/utils/PermissionUtil.java index c09d27c4d9..f0a326664b 100644 --- a/src/main/java/com/owncloud/android/utils/PermissionUtil.java +++ b/src/main/java/com/owncloud/android/utils/PermissionUtil.java @@ -20,7 +20,6 @@ public class PermissionUtil { * Determine whether <em>the app</em> has been granted a particular permission. * * @param permission The name of the permission being checked. - * * @return <code>true</code> if app has the permission, or <code>false</code> if not. */ public static boolean checkSelfPermission(Context context, String permission) { @@ -35,7 +34,7 @@ public class PermissionUtil { * which the permission is requested does not clearly communicate to the user * what would be the benefit from granting this permission. * - * @param activity The target activity. + * @param activity The target activity. * @param permission A permission to be requested. * @return Whether to show permission rationale UI. */ diff --git a/src/main/java/com/owncloud/android/utils/UploadUtils.java b/src/main/java/com/owncloud/android/utils/UploadUtils.java index ef640a0ce6..d62c3392ec 100755 --- a/src/main/java/com/owncloud/android/utils/UploadUtils.java +++ b/src/main/java/com/owncloud/android/utils/UploadUtils.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * @author LukeOwncloud - * Copyright (C) 2016 ownCloud Inc. + * @author LukeOwncloud + * Copyright (C) 2016 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; diff --git a/src/main/java/com/owncloud/android/utils/UriUtils.java b/src/main/java/com/owncloud/android/utils/UriUtils.java index 2269b9c522..ad0d6d9fd0 100644 --- a/src/main/java/com/owncloud/android/utils/UriUtils.java +++ b/src/main/java/com/owncloud/android/utils/UriUtils.java @@ -1,20 +1,19 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.utils; @@ -44,12 +43,12 @@ public class UriUtils { public static final String TAG = UriUtils.class.getSimpleName(); public static final String URI_CONTENT_SCHEME = "content://"; - - + + /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. - * + * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. @@ -60,7 +59,7 @@ public class UriUtils { Cursor cursor = null; final String column = "_data"; - final String[] projection = { column }; + final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); @@ -110,7 +109,7 @@ public class UriUtils { } /** - * + * * @param uri The Uri to check. * @return Whether the Uri is from a content provider as kind "content://..." */ @@ -123,7 +122,7 @@ public class UriUtils { * Translates a content:// URI referred to a local file file to a path on the local filesystem * * @param uri The URI to resolve - * @return The path in the file system to the content or null if it could not be found (not a file) + * @return The path in the file system to the content or null if it could not be found (not a file) */ @TargetApi(Build.VERSION_CODES.KITKAT) @SuppressFBWarnings("Bx") @@ -167,7 +166,7 @@ public class UriUtils { } final String selection = "_id=?"; - final String[] selectionArgs = new String[] { split[1] }; + final String[] selectionArgs = new String[]{split[1]}; return UriUtils.getDataColumn(context, contentUri, selection, selectionArgs); } @@ -194,7 +193,6 @@ public class UriUtils { } - public static String getDisplayNameForUri(Uri uri, Context context) { if (uri == null || context == null) { @@ -220,7 +218,7 @@ public class UriUtils { // Add best possible extension int index = displayName.lastIndexOf('.'); if (index == -1 || MimeTypeMap.getSingleton(). - getMimeTypeFromExtension(displayName.substring(index + 1)) == null) { + getMimeTypeFromExtension(displayName.substring(index + 1)) == null) { String mimeType = context.getContentResolver().getType(uri); String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); if (extension != null) { @@ -258,11 +256,11 @@ public class UriUtils { Cursor cursor = null; try { cursor = context.getContentResolver().query( - uri, - new String[]{displayNameColumn}, - null, - null, - null + uri, + new String[]{displayNameColumn}, + null, + null, + null ); if (cursor != null) { cursor.moveToFirst(); diff --git a/src/main/java/com/owncloud/android/widgets/ActionEditText.java b/src/main/java/com/owncloud/android/widgets/ActionEditText.java index 563221a516..1a143dcdf3 100644 --- a/src/main/java/com/owncloud/android/widgets/ActionEditText.java +++ b/src/main/java/com/owncloud/android/widgets/ActionEditText.java @@ -1,31 +1,24 @@ /** - * ownCloud Android client application + * ownCloud Android client application * - * Copyright (C) 2012 Bartek Przybylski - * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2012 Bartek Przybylski + * Copyright (C) 2015 ownCloud Inc. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.owncloud.android.widgets; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -import com.owncloud.android.R; -import com.owncloud.android.lib.common.utils.Log_OC; - import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -36,6 +29,12 @@ import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.EditText; +import com.owncloud.android.R; +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + public class ActionEditText extends EditText { private String s; private String optionOneString; diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index ebe812f7f0..c5f530a1ab 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -39,7 +39,7 @@ <bool name="show_whats_new">true</bool> <bool name="show_external_links">true</bool> - // Contacts backup + <!-- Contacts backup --> <bool name="contacts_backup">true</bool> <string name="contacts_backup_folder">/Contacts-Backup</string> <integer name="contacts_backup_expire">-1</integer> @@ -119,7 +119,7 @@ <string name="report_issue_link" translatable="false">https://github.com/nextcloud/android/issues</string> <!-- login data links --> - <string name="login_data_own_scheme" translatable="false">cloud</string> + <string name="login_data_own_scheme" translatable="false">nc</string> <!-- url for webview login, with the protocol prefix If set, will replace all other login methods available --> <string name="webview_login_url" translatable="false"></string> diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml index 3d828306e4..803224b145 100644 --- a/src/modified/AndroidManifest.xml +++ b/src/modified/AndroidManifest.xml @@ -23,12 +23,15 @@ android:versionName="1.4.2"> <application - android:name=".MainApp" + android:name=".ModifiedMainApp" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:fullBackupContent="@xml/backup_config" android:theme="@style/Theme.ownCloud.Toolbar" + tools:node="replace" android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity"> + + <activity android:name=".ui.activity.ModifiedFileDisplayActivity" android:label="@string/app_name" diff --git a/src/modified/java/com/owncloud/android/ModifiedMainApp.java b/src/modified/java/com/owncloud/android/ModifiedMainApp.java new file mode 100644 index 0000000000..af0400d759 --- /dev/null +++ b/src/modified/java/com/owncloud/android/ModifiedMainApp.java @@ -0,0 +1,40 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android; + +import com.google.firebase.analytics.FirebaseAnalytics; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + +public class ModifiedMainApp extends MainApp { + + + @SuppressFBWarnings("ST") + public void onCreate() { + super.onCreate(); + + + if (!getResources().getBoolean(R.bool.analytics_enabled)) { + FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(false); + } + } + +} diff --git a/src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java new file mode 100644 index 0000000000..344729c61e --- /dev/null +++ b/src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java @@ -0,0 +1,32 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.utils; + +import android.app.Activity; + +import com.google.firebase.analytics.FirebaseAnalytics; + +public class AnalyticsUtils { + + public static void setCurrentScreenName(Activity activity, String s, String s1) { + FirebaseAnalytics.getInstance(activity).setCurrentScreen(activity, s, s1); + } + +} diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 33ff337389..fd73d1ffbe 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -38,8 +38,8 @@ <bool name="show_whats_new">true</bool> <!-- To fill if you want to show webviews instead of regular welcome views --> <array name="whatsnew_urls"></array> - - // Contacts backup + + <!-- Contacts backup --> <bool name="contacts_backup">true</bool> <string name="contacts_backup_folder">/Contacts-Backup</string> <integer name="contacts_backup_expire">30</integer> diff --git a/src/zstore/AndroidManifest.xml b/src/zstore/AndroidManifest.xml new file mode 100644 index 0000000000..3d828306e4 --- /dev/null +++ b/src/zstore/AndroidManifest.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Mario Danic + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2, + as published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + package="com.owncloud.android" + android:versionCode="10040299" + android:versionName="1.4.2"> + + <application + android:name=".MainApp" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:fullBackupContent="@xml/backup_config" + android:theme="@style/Theme.ownCloud.Toolbar" + android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity"> + <activity + android:name=".ui.activity.ModifiedFileDisplayActivity" + android:label="@string/app_name" + android:theme="@style/Theme.ownCloud.Toolbar.Drawer"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <activity + android:name=".authentication.ModifiedAuthenticatorActivity" + android:exported="true" + android:launchMode="singleTask" + android:theme="@style/Theme.ownCloud.noActionBar.Login"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + + <data android:scheme="@string/oauth2_redirect_scheme" /> + </intent-filter> + <intent-filter> + <action android:name="com.owncloud.android.workaround.accounts.CREATE" /> + + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="@string/login_data_own_scheme" android:host="login"/> + </intent-filter> + </activity> + + <activity + android:name=".ui.activity.FileDisplayActivity" + tools:node="remove"/> + + <activity-alias + android:name=".ui.activity.FileDisplayActivity" + android:targetActivity=".ui.activity.ModifiedFileDisplayActivity" + tools:replace="android:targetActivity"/> + + <activity-alias + android:name=".authentication.AuthenticatorActivity" + android:targetActivity=".authentication.ModifiedAuthenticatorActivity" + tools:replace="android:targetActivity"/> + + + <service + android:name=".services.firebase.NCFirebaseMessagingService"> + <intent-filter> + <action android:name="com.google.firebase.MESSAGING_EVENT"/> + </intent-filter> + </service> + + <service + android:name=".services.firebase.NCFirebaseInstanceIDService"> + <intent-filter> + <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> + </intent-filter> + </service> + + </application> + +</manifest> diff --git a/src/zstore/google-services.json b/src/zstore/google-services.json new file mode 100644 index 0000000000..4916126561 --- /dev/null +++ b/src/zstore/google-services.json @@ -0,0 +1,35 @@ +{ + "project_info": { + "project_number": "", + "project_id": "" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "", + "android_client_info": { + "package_name": "com.nextcloud.client" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 1 + } + } + } + ], + "configuration_version": "1" +} diff --git a/src/zstore/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/zstore/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java new file mode 100644 index 0000000000..618578891a --- /dev/null +++ b/src/zstore/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java @@ -0,0 +1,41 @@ +package com.owncloud.android.authentication; + +import android.os.Bundle; + +import com.owncloud.android.utils.GooglePlayUtils; + +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +public class ModifiedAuthenticatorActivity extends AuthenticatorActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GooglePlayUtils.checkPlayServices(this); + } + + @Override + protected void onResume() { + super.onResume(); + GooglePlayUtils.checkPlayServices(this); + } + +} \ No newline at end of file diff --git a/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java new file mode 100644 index 0000000000..a5ab4d409a --- /dev/null +++ b/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -0,0 +1,45 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.services.firebase; + +import android.text.TextUtils; + +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.iid.FirebaseInstanceIdService; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.utils.PushUtils; + +public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { + private static final String TAG = "NCFirebaseInstanceID"; + + @Override + public void onTokenRefresh() { + //You can implement this method to store the token on your server + if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { + PreferenceManager.setPushToken(MainApp.getAppContext(), FirebaseInstanceId.getInstance().getToken()); + PreferenceManager.setPushTokenUpdateTime(MainApp.getAppContext(), System.currentTimeMillis()); + + PushUtils.pushRegistrationToServer(); + } + } +} + diff --git a/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java new file mode 100644 index 0000000000..0a641cd45c --- /dev/null +++ b/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -0,0 +1,66 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.services.firebase; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; + +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.ui.activity.NotificationsActivity; + +public class NCFirebaseMessagingService extends FirebaseMessagingService { + private static final String TAG = "NCFirebaseMessaging"; + + @Override + public void onMessageReceived(RemoteMessage remoteMessage) { + super.onMessageReceived(remoteMessage); + + sendNotification(MainApp.getAppContext().getString(R.string.new_notification_received)); + } + + private void sendNotification(String contentTitle) { + Intent intent = new Intent(this, NotificationsActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, + PendingIntent.FLAG_ONE_SHOT); + + Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle(contentTitle) + .setSound(defaultSoundUri) + .setAutoCancel(true) + .setContentIntent(pendingIntent); + + NotificationManager notificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + + notificationManager.notify(0, notificationBuilder.build()); + } + +} \ No newline at end of file diff --git a/src/zstore/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java b/src/zstore/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java new file mode 100644 index 0000000000..a2d17ca8ab --- /dev/null +++ b/src/zstore/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java @@ -0,0 +1,36 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.activity; + +import com.owncloud.android.ui.events.TokenPushEvent; +import com.owncloud.android.utils.PushUtils; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +public class ModifiedFileDisplayActivity extends FileDisplayActivity { + + @Subscribe(threadMode = ThreadMode.BACKGROUND) + public void onMessageEvent(TokenPushEvent event) { + PushUtils.pushRegistrationToServer(); + } + +} diff --git a/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java new file mode 100644 index 0000000000..bd6c89ed2e --- /dev/null +++ b/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java @@ -0,0 +1,29 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.utils; + +import android.app.Activity; + +public class AnalyticsUtils { + public static void setCurrentScreenName(Activity activity, String s, String s1) { + // do nothing + } + +} diff --git a/src/zstore/java/com/owncloud/android/utils/GooglePlayUtils.java b/src/zstore/java/com/owncloud/android/utils/GooglePlayUtils.java new file mode 100644 index 0000000000..9dd560a126 --- /dev/null +++ b/src/zstore/java/com/owncloud/android/utils/GooglePlayUtils.java @@ -0,0 +1,49 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.utils; + +import android.app.Activity; +import android.util.Log; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; + +public class GooglePlayUtils { + private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; + private static final String TAG = "GooglePlayUtils"; + + public static boolean checkPlayServices(Activity activity) { + GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); + int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity); + if (resultCode != ConnectionResult.SUCCESS) { + if (apiAvailability.isUserResolvableError(resultCode)) { + apiAvailability.getErrorDialog(activity, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) + .show(); + } else { + Log.i(TAG, "This device is not supported."); + activity.finish(); + } + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/src/zstore/java/com/owncloud/android/utils/PushUtils.java b/src/zstore/java/com/owncloud/android/utils/PushUtils.java new file mode 100644 index 0000000000..efa8305161 --- /dev/null +++ b/src/zstore/java/com/owncloud/android/utils/PushUtils.java @@ -0,0 +1,248 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.utils; + +import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; +import android.text.TextUtils; +import android.util.Base64; + +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; +import com.owncloud.android.lib.resources.notifications.models.PushResponse; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.Key; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +public class PushUtils { + + private static final String TAG = "PushUtils"; + private static final String KEYPAIR_FOLDER = "nc-keypair"; + private static final String KEYPAIR_FILE_NAME = "push_key"; + private static final String KEYPAIR_PRIV_EXTENSION = ".priv"; + private static final String KEYPAIR_PUB_EXTENSION = ".pub"; + + public static String generateSHA512Hash(String pushToken) { + MessageDigest messageDigest = null; + try { + messageDigest = MessageDigest.getInstance("SHA-512"); + messageDigest.update(pushToken.getBytes()); + return bytesToHex(messageDigest.digest()); + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "SHA-512 algorithm not supported"); + } + return ""; + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder result = new StringBuilder(); + for (byte individualByte : bytes) { + result.append(Integer.toString((individualByte & 0xff) + 0x100, 16) + .substring(1)); + } + return result.toString(); + } + + public static int generateRsa2048KeyPair() { + String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + + KEYPAIR_FOLDER; + + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; + String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; + File keyPathFile = new File(keyPath); + + if (!new File(privateKeyPath).exists() && !new File(publicKeyPath).exists()) { + try { + if (!keyPathFile.exists()) { + keyPathFile.mkdir(); + } + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + + KeyPair pair = keyGen.generateKeyPair(); + int statusPrivate = saveKeyToFile(pair.getPrivate(), privateKeyPath); + int statusPublic = saveKeyToFile(pair.getPublic(), publicKeyPath); + + if (statusPrivate == 0 && statusPublic == 0) { + // all went well + return 0; + } else { + return -2; + } + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "RSA algorithm not supported"); + } + } else { + // we already have the key + return -1; + } + + // we failed to generate the key + return -2; + } + + public static void pushRegistrationToServer() { + String token = PreferenceManager.getPushToken(MainApp.getAppContext()); + if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && + !TextUtils.isEmpty(token)) { + PushUtils.generateRsa2048KeyPair(); + String pushTokenHash = PushUtils.generateSHA512Hash(token).toLowerCase(); + PublicKey devicePublicKey = (PublicKey) PushUtils.readKeyFromFile(true); + if (devicePublicKey != null) { + byte[] publicKeyBytes = Base64.encode(devicePublicKey.getEncoded(), Base64.NO_WRAP); + String publicKey = new String(publicKeyBytes); + publicKey = publicKey.replaceAll("(.{64})", "$1\n"); + + publicKey = "-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-----END PUBLIC KEY-----\n"; + + Context context = MainApp.getAppContext(); + for (Account account : AccountUtils.getAccounts(context)) { + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); + + RemoteOperation registerAccountDeviceForNotificationsOperation = + new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, + publicKey, + context.getResources().getString(R.string.push_server_url)); + + RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. + execute(mClient); + + if (remoteOperationResult.isSuccess()) { + PushResponse pushResponse = remoteOperationResult.getPushResponseData(); + + RemoteOperation registerAccountDeviceForProxyOperation = new + RegisterAccountDeviceForProxyOperation( + context.getResources().getString(R.string.push_server_url), + token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey()); + + remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); + PreferenceManager.setPushTokenLastSentTime(MainApp.getAppContext(), + System.currentTimeMillis()); + + } + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + } + } + } + } + + public static Key readKeyFromFile(boolean readPublicKey) { + String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + + KEYPAIR_FOLDER; + ; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; + String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; + + String path; + + if (readPublicKey) { + path = publicKeyPath; + } else { + path = privateKeyPath; + } + + FileInputStream fileInputStream = null; + try { + fileInputStream = new FileInputStream(path); + byte[] bytes = new byte[fileInputStream.available()]; + fileInputStream.read(bytes); + fileInputStream.close(); + + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + + if (readPublicKey) { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); + return keyFactory.generatePublic(keySpec); + } else { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); + return keyFactory.generatePrivate(keySpec); + } + + } catch (FileNotFoundException e) { + Log_OC.d(TAG, "Failed to find path while reading the Key"); + } catch (IOException e) { + Log_OC.d(TAG, "IOException while reading the key"); + } catch (InvalidKeySpecException e) { + Log_OC.d(TAG, "InvalidKeySpecException while reading the key"); + } catch (NoSuchAlgorithmException e) { + Log_OC.d(TAG, "RSA algorithm not supported"); + } + + return null; + } + + private static int saveKeyToFile(Key key, String path) { + byte[] encoded = key.getEncoded(); + FileOutputStream keyFileOutputStream = null; + try { + if (!new File(path).exists()) { + new File(path).createNewFile(); + } + keyFileOutputStream = new FileOutputStream(path); + keyFileOutputStream.write(encoded); + keyFileOutputStream.close(); + return 0; + } catch (FileNotFoundException e) { + Log_OC.d(TAG, "Failed to save key to file"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed to save key to file via IOException"); + } + + return -1; + } +} diff --git a/src/zstore/res/values/setup.xml b/src/zstore/res/values/setup.xml new file mode 100644 index 0000000000..5f3582a9d6 --- /dev/null +++ b/src/zstore/res/values/setup.xml @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Beta indicator --> + <bool name="is_beta">false</bool> + + <!-- App name and other strings--> + <string name="app_name">Nextcloud</string> + <string name="account_type">nextcloud</string> <!-- better if was a domain name; but changing it now would require migrate accounts when the app is updated --> + <string name="authority">org.nextcloud</string> <!-- better if was the app package with ".provider" appended ; it identifies the provider --> + <string name="users_and_groups_search_authority">com.nextcloud.android.providers.UsersAndGroupsSearchProvider</string> + <string name="users_and_groups_share_with">com.nextcloud.android.providers.UsersAndGroupsSearchProvider.action.SHARE_WITH</string> + <string name="document_provider_authority">org.nextcloud.documents</string> + <string name="file_provider_authority">org.nextcloud.files</string> + <string name ="db_file">nextcloud.db</string> + <string name ="db_name">nextcloud</string> + <string name ="data_folder">nextcloud</string> + <string name ="log_name">nextcloud</string> + <string name ="default_display_name_for_root_folder">Nextcloud</string> + <string name ="user_agent">Mozilla/5.0 (Android) ownCloud-android/%1$s</string> + + <!-- URLs and flags related --> + <string name="server_url"></string> + <bool name="show_server_url_input">true</bool> + <!-- Can be regular (full input), prefix (subdomain input) and suffix (directory input) --> + <!-- Requires server url to be set --> + <string name="server_input_type">regular</string> + <bool name="show_welcome_link">true</bool> + <string name="welcome_link_url">"https://nextcloud.com/providers"</string> + <string name="share_api_link"></string> + + <!-- Flags to setup the authentication methods available in the app --> + <string name="auth_method_oauth2">off</string> + <string name="auth_method_saml_web_sso">off</string> + + <!-- Flags to enable/disable some features --> + <string name = "send_files_to_other_apps">on</string> + <bool name = "share_via_link_feature">true</bool> + <bool name = "share_with_users_feature">true</bool> + <bool name="show_whats_new">true</bool> + <bool name="show_external_links">true</bool> + + <!-- Contacts backup --> + <bool name="contacts_backup">true</bool> + <string name="contacts_backup_folder">/Contacts-Backup</string> + <integer name="contacts_backup_expire">-1</integer> + + <!-- To fill if you want to show webviews instead of regular welcome views --> + <array name="whatsnew_urls"></array> + + <!-- Colors --> + <color name="primary">@color/nc_blue</color> + <color name="primary_dark">#006AA3</color> + <color name="color_accent">@color/nc_blue_accent</color> + <color name="login_text_color">@color/white</color> + <color name="login_text_hint_color">#7fC0E3</color> + <color name="login_background_color">#FFFFFF</color> <!-- Not used at the moment --> + <color name="login_logo_background_color">#FFFFFF</color> <!-- Not used at the moment --> + <color name="background_color">#FFFFFF</color> + <color name="navigation_bar_start_color">#0082c9</color> + <color name="navigation_bar_end_color">#0082c9</color> + <color name="primary_button_background_color">@color/nc_blue_accent</color> + <color name="primary_button_text_color">@color/white</color> + <color name="secondary_button_background_color">#D6D7D7</color> + <color name="secondary_button_text_color">@color/black</color> + + <!-- special transparent action bar colors for image preview --> + <color name="color_transparent">#201D2D44</color> + <color name="color_dark_transparent">#40162233</color> + + <!-- Button --> + <color name="button_text_color">#000000</color> + + <!-- Multiselect backgrounds --> + <color name="action_mode_background">#757575</color> + <color name="action_mode_status_bar_background">#616161</color> + <color name="selected_item_background">#ECECEC</color> + + <!-- Multiaccount support --> + <bool name="multiaccount_support">true</bool> + + <!-- Drawer options --> + <bool name="recently_added_enabled">false</bool> + <bool name="recently_modified_enabled">false</bool> + <bool name="shared_enabled">true</bool> + <bool name="videos_enabled">false</bool> + + <!-- Bottom toolbar --> + <bool name="bottom_toolbar_enabled">false</bool> + + <!-- Help, imprint and feedback, and other things --> + <bool name="fingerprint_enabled">true</bool> + <bool name="davdroid_integration_enabled">true</bool> + <bool name="help_enabled">true</bool> + <bool name="imprint_enabled">false</bool> + <bool name="recommend_enabled">true</bool> + <bool name="feedback_enabled">true</bool> + <bool name="logger_enabled">false</bool> + <string name="url_help">https://help.nextcloud.com/c/feature</string> + <string name="url_imprint"></string> + <string name="mail_recommend">"mailto:"</string> + <string name="mail_feedback">"mailto:android@nextcloud.com"</string> + <string name="url_app_download">"https://play.google.com/store/apps/details?id=com.nextcloud.client"</string> + <string name="url_server_install">https://nextcloud.com/install</string> + + <!--Destination mail for sending log files --> + <string name="mail_logger"></string> + + <!-- Determine is participate enabled --> + <bool name="participate_enabled">true</bool> + <!-- Participate links --> + <string name="fdroid_beta_link" translatable="false">https://f-droid.org/repository/browse/?fdid=com.nextcloud.android.beta</string> + <string name="beta_apk_link" translatable="false">https://download.nextcloud.com/android/dev/latest.apk</string> + <string name="play_store_register_beta" translatable="false">https://play.google.com/apps/testing/com.nextcloud.client</string> + <string name="fdroid_link" translatable="false">https://f-droid.org/repository/browse/?fdid=com.nextcloud.client</string> + <string name="irc_weblink" translatable="false">http://webchat.freenode.net?channels=nextcloud-mobile</string> + <string name="help_link" translatable="false">https://help.nextcloud.com/c/clients/android</string> + <string name="translation_link" translatable="false">https://www.transifex.com/nextcloud/nextcloud/android/</string> + <string name="contributing_link" translatable="false">https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md</string> + <string name="report_issue_link" translatable="false">https://github.com/nextcloud/android/issues</string> + + <!-- login data links --> + <string name="login_data_own_scheme" translatable="false">nc</string> + <!-- url for webview login, with the protocol prefix + If set, will replace all other login methods available --> + <string name="webview_login_url" translatable="false"></string> + + <!-- analytics enabled --> + <bool name="analytics_enabled">false</bool> + + <!-- Files becomes Home --> + <bool name="use_home">false</bool> + + <!-- Push server url --> + <string name="push_server_url" translatable="false">https://push-notifications.nextcloud.com</string> +</resources> + + From 7d1af571bc7234d4c9175d1dabd48289cf9c143c Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 26 Apr 2017 21:20:14 +0200 Subject: [PATCH 780/881] Set screen name for a few more screens --- .../android/ui/activity/ActivitiesListActivity.java | 8 ++++++++ .../android/ui/activity/FingerprintActivity.java | 3 +++ .../android/ui/activity/NotificationsActivity.java | 9 +++++++++ 3 files changed, 20 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java b/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java index 661e956c65..0b22e2e40f 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java @@ -52,6 +52,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.activities.GetRemoteActivitiesOperation; import com.owncloud.android.ui.adapter.ActivityListAdapter; import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.AnalyticsUtils; import java.io.IOException; import java.util.ArrayList; @@ -68,6 +69,7 @@ import butterknife.Unbinder; public class ActivitiesListActivity extends FileActivity { private static final String TAG = ActivitiesListActivity.class.getSimpleName(); + private static final String SCREEN_NAME = "Activities"; @BindView(R.id.empty_list_view) public LinearLayout emptyContentContainer; @@ -299,4 +301,10 @@ public class ActivitiesListActivity extends FileActivity { } } + @Override + protected void onResume() { + super.onResume(); + + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); + } } diff --git a/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java index a28ce4bcbc..815fb476aa 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -47,6 +47,7 @@ import android.widget.Toast; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.utils.AnalyticsUtils; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; @@ -69,6 +70,7 @@ import javax.crypto.SecretKey; public class FingerprintActivity extends AppCompatActivity { private static final String TAG = FingerprintActivity.class.getSimpleName(); + private static final String SCREEN_NAME = "Fingerprint"; public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT"; @@ -151,6 +153,7 @@ public class FingerprintActivity extends AppCompatActivity { @Override public void onResume(){ super.onResume(); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); startFingerprint(); ImageView imageView = (ImageView)findViewById(R.id.fingerprinticon); imageView.setImageDrawable(getDrawable(R.drawable.ic_fingerprint)); diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 0461ae5456..e46d52bcb5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -53,6 +53,7 @@ import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOp import com.owncloud.android.lib.resources.notifications.models.Notification; import com.owncloud.android.ui.adapter.NotificationListAdapter; import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.AnalyticsUtils; import java.io.IOException; import java.util.List; @@ -68,6 +69,7 @@ import butterknife.Unbinder; public class NotificationsActivity extends FileActivity { private static final String TAG = NotificationsActivity.class.getSimpleName(); + private static final String SCREEN_NAME = "Notifications"; @BindView(R.id.empty_list_view) public LinearLayout emptyContentContainer; @@ -292,4 +294,11 @@ public class NotificationsActivity extends FileActivity { emptyContentIcon.setVisibility(View.VISIBLE); } } + + @Override + public void onResume(){ + super.onResume(); + AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); + } + } From 5ecf2ea54185540ba89afd97e17b10e87c869ef6 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 26 Apr 2017 21:52:57 +0200 Subject: [PATCH 781/881] Fix up analytics --- .../android/utils/AnalyticsUtils.java | 4 ++ .../java/com/owncloud/android/MainApp.java | 6 +++ .../ErrorsWhileCopyingHandlerActivity.java | 1 + .../ui/activity/FolderPickerActivity.java | 1 + .../ui/activity/FolderSyncActivity.java | 1 + .../activity/GenericExplanationActivity.java | 1 + .../ui/activity/LogHistoryActivity.java | 1 + .../ui/activity/ManageAccountsActivity.java | 1 + .../ui/activity/ManageSpaceActivity.java | 1 + .../ui/activity/ParticipateActivity.java | 1 + .../android/ui/activity/PassCodeActivity.java | 1 + .../android/ui/activity/Preferences.java | 1 + .../ui/activity/UploadFilesActivity.java | 1 + .../ui/activity/UploadListActivity.java | 1 + .../ui/activity/UploadPathActivity.java | 1 + .../android/ui/activity/WhatsNewActivity.java | 1 + .../ui/fragment/EditShareFragment.java | 1 + .../ui/fragment/FileDetailFragment.java | 1 + .../ui/fragment/LocalFileListFragment.java | 1 + .../ui/fragment/OCFileListFragment.java | 1 + .../ui/fragment/SearchShareesFragment.java | 1 + .../ui/fragment/ShareFileFragment.java | 1 + .../ui/fragment/UploadListFragment.java | 1 + .../ui/preview/PreviewImageFragment.java | 1 + .../ui/preview/PreviewMediaFragment.java | 1 + .../ui/preview/PreviewTextFragment.java | 1 + .../ui/preview/PreviewVideoActivity.java | 1 + src/modified/AndroidManifest.xml | 8 ++-- .../com/owncloud/android/ModifiedMainApp.java | 40 ------------------- .../android/utils/AnalyticsUtils.java | 5 +++ src/zstore/AndroidManifest.xml | 4 ++ .../android/utils/AnalyticsUtils.java | 3 ++ 32 files changed, 52 insertions(+), 43 deletions(-) delete mode 100644 src/modified/java/com/owncloud/android/ModifiedMainApp.java diff --git a/src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java index bd6c89ed2e..0616752071 100644 --- a/src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java +++ b/src/generic/java/com/owncloud/android/utils/AnalyticsUtils.java @@ -26,4 +26,8 @@ public class AnalyticsUtils { // do nothing } + public static void disableAnalytics() { + // do nothing + } + } diff --git a/src/main/java/com/owncloud/android/MainApp.java b/src/main/java/com/owncloud/android/MainApp.java index ba0d8bff52..6aec46118f 100644 --- a/src/main/java/com/owncloud/android/MainApp.java +++ b/src/main/java/com/owncloud/android/MainApp.java @@ -46,6 +46,7 @@ import com.owncloud.android.services.NCJobCreator; import com.owncloud.android.services.observer.SyncedFolderObserverService; import com.owncloud.android.ui.activity.Preferences; import com.owncloud.android.ui.activity.WhatsNewActivity; +import com.owncloud.android.utils.AnalyticsUtils; import java.util.ArrayList; import java.util.HashMap; @@ -88,6 +89,11 @@ public class MainApp extends MultiDexApplication { super.onCreate(); JobManager.create(this).addJobCreator(new NCJobCreator()); MainApp.mContext = getApplicationContext(); + + if (!getResources().getBoolean(R.bool.analytics_enabled)) { + AnalyticsUtils.disableAnalytics(); + } + SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); MainApp.storagePath = appPrefs.getString(Preferences.PreferenceKeys.STORAGE_PATH, Environment. diff --git a/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java b/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java index 9d81a231e2..d5d1822858 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ErrorsWhileCopyingHandlerActivity.java @@ -44,6 +44,7 @@ import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.dialog.IndeterminateProgressDialog; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.FileStorageUtils; import java.io.File; diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java index 8515767e43..bde15e7e96 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java @@ -52,6 +52,7 @@ import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.ErrorMessageAdapter; diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java index 189d7cae78..cf829c6095 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java @@ -50,6 +50,7 @@ import com.owncloud.android.ui.decoration.MediaGridItemDecoration; import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment; import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable; import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.AnalyticsUtils; import java.io.File; import java.util.ArrayList; diff --git a/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java b/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java index 0814a60d81..8ae98ecc64 100644 --- a/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/GenericExplanationActivity.java @@ -33,6 +33,7 @@ import android.widget.ListView; import android.widget.TextView; import com.owncloud.android.R; +import com.owncloud.android.utils.AnalyticsUtils; import java.util.ArrayList; diff --git a/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java b/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java index e0585afd73..f22a55e292 100644 --- a/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/LogHistoryActivity.java @@ -39,6 +39,7 @@ import android.widget.Toast; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.dialog.LoadingDialog; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.FileStorageUtils; import java.io.BufferedReader; diff --git a/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java index af902631bd..25e663630b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java @@ -51,6 +51,7 @@ import com.owncloud.android.services.OperationsService; import com.owncloud.android.ui.adapter.AccountListAdapter; import com.owncloud.android.ui.adapter.AccountListItem; import com.owncloud.android.ui.helpers.FileOperationsHelper; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.DisplayUtils; import org.parceler.Parcels; diff --git a/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java index 017ce8dcf5..841010e6ad 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java @@ -34,6 +34,7 @@ import android.widget.Toast; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.utils.AnalyticsUtils; import java.io.File; diff --git a/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java b/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java index 0453f6091a..2dc9232527 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ParticipateActivity.java @@ -31,6 +31,7 @@ import android.view.View; import android.widget.TextView; import com.owncloud.android.R; +import com.owncloud.android.utils.AnalyticsUtils; /** * Activity providing information about ways to participate in the app's development. diff --git a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java index b4be20b7f6..53b246e45c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java @@ -40,6 +40,7 @@ import android.widget.Toast; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.utils.AnalyticsUtils; import java.util.Arrays; diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index ba5d4e76a1..c730c7c1f1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -67,6 +67,7 @@ import com.owncloud.android.lib.common.ExternalLinkType; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.DisplayUtils; import java.io.IOException; diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 170871dd98..25450fc31f 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -50,6 +50,7 @@ import com.owncloud.android.ui.dialog.IndeterminateProgressDialog; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.LocalFileListFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.FileStorageUtils; import java.io.File; diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index c832fa823e..cec0cfca1d 100755 --- a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -55,6 +55,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.CheckCurrentCredentialsOperation; import com.owncloud.android.ui.fragment.UploadListFragment; import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.MimeTypeUtil; import java.io.File; diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java index 2bf30bee9d..8ad0a46ec9 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadPathActivity.java @@ -26,6 +26,7 @@ import android.view.View.OnClickListener; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; +import com.owncloud.android.utils.AnalyticsUtils; public class UploadPathActivity extends FolderPickerActivity implements FileFragment.ContainerActivity, OnClickListener, OnEnforceableRefreshListener { diff --git a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java index 721194e30b..616d4400ea 100644 --- a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java @@ -51,6 +51,7 @@ import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.features.FeatureList; import com.owncloud.android.features.FeatureList.FeatureItem; import com.owncloud.android.ui.whatsnew.ProgressIndicator; +import com.owncloud.android.utils.AnalyticsUtils; /** * Activity displaying general feature after a fresh install and new features after an update. diff --git a/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java b/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java index 429391da63..ec7a946b97 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java @@ -41,6 +41,7 @@ import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.SharePermissionsBuilder; import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.ui.activity.FileActivity; +import com.owncloud.android.utils.AnalyticsUtils; public class EditShareFragment extends Fragment { diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 1173e1c619..fbfd62f4ac 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -50,6 +50,7 @@ import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.dialog.RenameFileDialogFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeTypeUtil; diff --git a/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java index 83c6ebf1b1..a5f89a4764 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -35,6 +35,7 @@ import android.widget.ListView; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.adapter.LocalFileListAdapter; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.FileStorageUtils; import java.io.File; diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index daadb03bd0..f5bee75bfa 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -89,6 +89,7 @@ import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.ui.preview.PreviewMediaFragment; import com.owncloud.android.ui.preview.PreviewTextFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.MimeTypeUtil; diff --git a/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java index d60400b621..3db1f71799 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/SearchShareesFragment.java @@ -41,6 +41,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.adapter.ShareUserListAdapter; +import com.owncloud.android.utils.AnalyticsUtils; import java.util.ArrayList; diff --git a/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java index 90acebc2bc..8f4b47c645 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ShareFileFragment.java @@ -56,6 +56,7 @@ import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.adapter.ShareUserListAdapter; import com.owncloud.android.ui.dialog.ExpirationDatePickerDialogFragment; import com.owncloud.android.ui.dialog.SharePasswordDialogFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeTypeUtil; diff --git a/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java index b4fc307115..e5b559386d 100755 --- a/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/UploadListFragment.java @@ -32,6 +32,7 @@ import com.owncloud.android.db.OCUpload; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.adapter.ExpandableUploadListAdapter; +import com.owncloud.android.utils.AnalyticsUtils; /** * A Fragment that lists all files and folders in a given LOCAL path. diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index 78cb4893ce..59617f349e 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -58,6 +58,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeTypeUtil; diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index bcd123a732..7022a34c66 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -65,6 +65,7 @@ import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.MimeTypeUtil; diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index b7fee9286c..cc92cf453c 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -42,6 +42,7 @@ import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.MimeTypeUtil; import java.io.BufferedWriter; diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java index c01f3d244f..566120d736 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@ -40,6 +40,7 @@ import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundExce import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.media.MediaService; import com.owncloud.android.ui.activity.FileActivity; +import com.owncloud.android.utils.AnalyticsUtils; import com.owncloud.android.utils.MimeTypeUtil; /** diff --git a/src/modified/AndroidManifest.xml b/src/modified/AndroidManifest.xml index 803224b145..6b278b9d79 100644 --- a/src/modified/AndroidManifest.xml +++ b/src/modified/AndroidManifest.xml @@ -23,14 +23,16 @@ android:versionName="1.4.2"> <application - android:name=".ModifiedMainApp" + android:name=".MainApp" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:fullBackupContent="@xml/backup_config" android:theme="@style/Theme.ownCloud.Toolbar" - tools:node="replace" - android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity"> + android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity" + > + <meta-data android:name="com.google.android.gms.version" + android:value="@integer/google_play_services_version" /> <activity android:name=".ui.activity.ModifiedFileDisplayActivity" diff --git a/src/modified/java/com/owncloud/android/ModifiedMainApp.java b/src/modified/java/com/owncloud/android/ModifiedMainApp.java deleted file mode 100644 index af0400d759..0000000000 --- a/src/modified/java/com/owncloud/android/ModifiedMainApp.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Nextcloud Android client application - * - * @author Mario Danic - * Copyright (C) 2017 Mario Danic - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package com.owncloud.android; - -import com.google.firebase.analytics.FirebaseAnalytics; - -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; - -public class ModifiedMainApp extends MainApp { - - - @SuppressFBWarnings("ST") - public void onCreate() { - super.onCreate(); - - - if (!getResources().getBoolean(R.bool.analytics_enabled)) { - FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(false); - } - } - -} diff --git a/src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java index 344729c61e..855cb4ec47 100644 --- a/src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java +++ b/src/modified/java/com/owncloud/android/utils/AnalyticsUtils.java @@ -22,6 +22,7 @@ package com.owncloud.android.utils; import android.app.Activity; import com.google.firebase.analytics.FirebaseAnalytics; +import com.owncloud.android.MainApp; public class AnalyticsUtils { @@ -29,4 +30,8 @@ public class AnalyticsUtils { FirebaseAnalytics.getInstance(activity).setCurrentScreen(activity, s, s1); } + public static void disableAnalytics() { + FirebaseAnalytics.getInstance(MainApp.getAppContext()).setAnalyticsCollectionEnabled(false); + } + } diff --git a/src/zstore/AndroidManifest.xml b/src/zstore/AndroidManifest.xml index 3d828306e4..b2d6ead52e 100644 --- a/src/zstore/AndroidManifest.xml +++ b/src/zstore/AndroidManifest.xml @@ -29,6 +29,10 @@ android:fullBackupContent="@xml/backup_config" android:theme="@style/Theme.ownCloud.Toolbar" android:manageSpaceActivity="com.owncloud.android.ui.activity.ManageSpaceActivity"> + + <meta-data android:name="com.google.android.gms.version" + android:value="@integer/google_play_services_version" /> + <activity android:name=".ui.activity.ModifiedFileDisplayActivity" android:label="@string/app_name" diff --git a/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java index bd6c89ed2e..a099add2eb 100644 --- a/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java +++ b/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java @@ -26,4 +26,7 @@ public class AnalyticsUtils { // do nothing } + public static void disableAnalytics() { + // do nothing + } } From 52e2c42df504fc51e0f4374a21c2903dec9d8db1 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 26 Apr 2017 21:56:11 +0200 Subject: [PATCH 782/881] Disable analytics in gplay edition too --- .../java/com/owncloud/android/utils/AnalyticsUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java index a099add2eb..1ebd3b4470 100644 --- a/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java +++ b/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java @@ -21,12 +21,15 @@ package com.owncloud.android.utils; import android.app.Activity; +import com.google.firebase.analytics.FirebaseAnalytics; +import com.owncloud.android.MainApp; + public class AnalyticsUtils { public static void setCurrentScreenName(Activity activity, String s, String s1) { // do nothing } public static void disableAnalytics() { - // do nothing + FirebaseAnalytics.getInstance(MainApp.getAppContext()).setAnalyticsCollectionEnabled(false); } } From b0eb6039fb2b47f0b9bd012fff7361a64a73325e Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 26 Apr 2017 22:00:58 +0200 Subject: [PATCH 783/881] Codacy fix --- src/zstore/java/com/owncloud/android/utils/PushUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zstore/java/com/owncloud/android/utils/PushUtils.java b/src/zstore/java/com/owncloud/android/utils/PushUtils.java index efa8305161..dd689c1d2a 100644 --- a/src/zstore/java/com/owncloud/android/utils/PushUtils.java +++ b/src/zstore/java/com/owncloud/android/utils/PushUtils.java @@ -184,7 +184,7 @@ public class PushUtils { public static Key readKeyFromFile(boolean readPublicKey) { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER; - ; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; From 7e5d7f1f4e0e9b1537aea318a320ee393b0aeeca Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Thu, 27 Apr 2017 00:21:31 +0000 Subject: [PATCH 784/881] [tx-robot] updated from transifex --- src/main/res/values-es-rMX/strings.xml | 1 + src/main/res/values-fr/strings.xml | 1 + src/main/res/values-nb-rNO/strings.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index d6b9cac861..5fa58784b2 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -105,6 +105,7 @@ <string name="local_file_list_empty">No hay archivos en esta carpeta</string> <string name="file_list_empty_headline_search">No hay resultados en esta carpeta</string> <string name="file_list_empty_headline_server_search">No hay resultados</string> + <string name="file_list_empty_favorite_headline">Aún no hay favoritos</string> <string name="file_list_empty_shared_headline">Aún no hay nada compartido</string> <string name="file_list_empty_shared">Los archivos y carpetas que comparta se mostrarán aquí. </string> <string name="file_list_empty_headline_server_search_videos">No hay videos</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index cf950b3afe..643830614f 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -105,6 +105,7 @@ <string name="local_file_list_empty">Aucun fichier n\'est présent dans ce dossier.</string> <string name="file_list_empty_headline_search">Aucun résultat dans ce dossier</string> <string name="file_list_empty_headline_server_search">Aucun résultat</string> + <string name="file_list_empty_favorite_headline">Aucun favoris pour l\'instant</string> <string name="file_list_empty_shared_headline">Rien n\'est partagé pour l\'instant</string> <string name="file_list_empty_shared">Les fichiers et dossiers que vous partagez apparaîtront ici</string> <string name="file_list_empty_headline_server_search_videos">Aucune vidéo</string> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index e7676df8f9..109c16ed41 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -105,6 +105,7 @@ <string name="local_file_list_empty">Det er ingen filer i denne mappen.</string> <string name="file_list_empty_headline_search">Ingen resultater i denne mappen</string> <string name="file_list_empty_headline_server_search">Ingen resultater</string> + <string name="file_list_empty_favorite_headline">Ingen favoritter ennå</string> <string name="file_list_empty_shared_headline">Ingenting delt enda</string> <string name="file_list_empty_shared">Filer og mapper som du deler vil bli vist her</string> <string name="file_list_empty_headline_server_search_videos">Ingen videoer</string> From b5c7833895a897f68d0eb7fa72cb2e26e4e13c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= <epost@anotheragency.no> Date: Thu, 27 Apr 2017 06:44:41 +0200 Subject: [PATCH 785/881] Revamp of upstream strings --- src/main/res/values/strings.xml | 291 ++++++++++++++++---------------- 1 file changed, 145 insertions(+), 146 deletions(-) diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 6d24c7ee77..28a3dbabb1 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">Fingerprint lock</string> <string name="prefs_fingerprint_notsetup">No fingerprints have been set up.</string> <string name="prefs_show_hidden_files">Show hidden files</string> - <string name="prefs_instant_upload">Instant picture uploads</string> - <string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string> - <string name="prefs_instant_video_upload">Instant video uploads</string> - <string name="prefs_instant_video_upload_summary">Instantly upload videos recorded by camera</string> + <string name="prefs_instant_upload">Instant uploading of pictures</string> + <string name="prefs_instant_upload_summary">Upload pictures taken by camera instantly</string> + <string name="prefs_instant_video_upload">Instant uploading of video</string> + <string name="prefs_instant_video_upload_summary">Upload videos recorded by camera instantly</string> <string name="prefs_log_title">Enable logging</string> <string name="prefs_log_summary">This is used to log problems</string> <string name="prefs_log_title_history">Logging history</string> @@ -58,23 +58,23 @@ <string name="prefs_calendar_contacts">Sync calendar & contacts</string> <string name="prefs_calendar_contacts_summary">Set up DAVdroid (v1.3.0+) for current account</string> <string name="prefs_calendar_contacts_address_resolve_error">Server address for account could not be resolved for DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">No Google Play store or F-Droid app installed</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Calendar & contacts sync set up successfully</string> + <string name="prefs_calendar_contacts_no_store_error">Neither F-droid nor Google Play is installed</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Calendar & contacts sync set up</string> <string name="prefs_help">Help</string> - <string name="prefs_recommend">Recommend to a friend</string> + <string name="prefs_recommend">Recommend to friend</string> <string name="prefs_feedback">Feedback</string> <string name="prefs_imprint">Imprint</string> - <string name="prefs_remember_last_share_location">Remember share location</string> - <string name="prefs_remember_last_upload_location_summary">Remember last share upload location</string> + <string name="prefs_remember_last_share_location">Remember location of share</string> + <string name="prefs_remember_last_upload_location_summary">Remember location of share most recently used</string> <string name="recommend_subject">"Try %1$s on your smartphone!"</string> - <string name="recommend_text">"I want to invite you to use %1$s on your smartphone!\nDownload here: %2$s"</string> + <string name="recommend_text">"I want to invite you to use %1$s on your smartphone.\nDownload here: %2$s"</string> <string name="auth_check_server">Check server</string> <string name="auth_host_url">Server address https://…</string> <string name="auth_username">Username</string> <string name="auth_password">Password</string> - <string name="auth_register">Don’t have a server yet?\nClick here to get one from a provider</string> + <string name="auth_register">Do you not have a server yet?\nClick here to get one from a provider</string> <string name="sync_string_files">Files</string> <string name="setup_btn_connect">Connect</string> <string name="uploader_btn_upload_text">Upload</string> @@ -86,43 +86,43 @@ <string name="uploader_error_title_no_file_to_upload">No file to upload</string> <string name="uploader_error_message_received_piece_of_text">%1$s cannot upload a piece of text as a file.</string> <string name="uploader_error_message_no_file_to_upload">Received data did not include a valid file.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">File cannot be uploaded</string> + <string name="uploader_error_title_file_cannot_be_uploaded">This file can not be uploaded</string> <string name="uploader_error_message_read_permission_not_granted">%1$s is not allowed to read a received file</string> - <string name="uploader_error_message_source_file_not_found">File to upload was not found in its location. Please check whether the file exists.</string> - <string name="uploader_error_message_source_file_not_copied">An error occurred while copying the file to a temporary folder. Please try to send again.</string> + <string name="uploader_error_message_source_file_not_found">File selected for upload not found. Please check whether the file exists.</string> + <string name="uploader_error_message_source_file_not_copied">Could not copy file to a temporary folder. Try to resend it.</string> <string name="uploader_upload_files_behaviour">Upload option:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Move file to Nextcloud folder</string> <string name="uploader_upload_files_behaviour_only_upload">Keep file in source folder</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Delete file from source folder</string> <string name="file_list_seconds_ago">seconds ago</string> - <string name="file_list_empty_headline">No files in here</string> - <string name="file_list_empty">Upload some content or sync with your devices!</string> - <string name="file_list_empty_favorites">Favorite some files or sync with your devices!</string> - <string name="file_list_empty_favorites_filter_list">Files and folders you mark as favorite will show up here</string> - <string name="file_list_empty_favorites_filter">No favorited files found for your query!</string> + <string name="file_list_empty_headline">No files here</string> + <string name="file_list_empty">Upload some content or sync with your devices.</string> + <string name="file_list_empty_favorites">Favorite some files or sync with your devices.</string> + <string name="file_list_empty_favorites_filter_list">Files and folders you mark as favorites will show up here</string> + <string name="file_list_empty_favorites_filter">Your search returned no favorited files.</string> <string name="file_list_loading">Loading…</string> - <string name="file_list_no_app_for_file_type">No app found for file type!</string> + <string name="file_list_no_app_for_file_type">No app set up to handle this file type.</string> <string name="local_file_list_empty">There are no files in this folder.</string> <string name="file_list_empty_headline_search">No results in this folder</string> <string name="file_list_empty_headline_server_search">No results</string> - <string name="file_list_empty_favorite_headline">No favorites yet</string> + <string name="file_list_empty_favorite_headline">Nothing favorited yet</string> <string name="file_list_empty_shared_headline">Nothing shared yet</string> <string name="file_list_empty_shared">Files and folders you share will show up here</string> <string name="file_list_empty_headline_server_search_videos">No videos</string> <string name="file_list_empty_headline_server_search_photos">No photos</string> - <string name="file_list_empty_search">Try looking in another folder?</string> - <string name="file_list_empty_recently_modified">No files modified in the last 7 days found</string> - <string name="file_list_empty_recently_modified_filter">No files for your query that were modified - in the last 7 days found!</string> - <string name="file_list_empty_recently_added">No recently added files found</string> - <string name="file_list_empty_recently_added_filter">No recently added files for your query found!</string> - <string name="file_list_empty_text_photos">Upload some photos or activate auto upload!</string> - <string name="file_list_empty_text_photos_filter">No photos for your query found!</string> - <string name="file_list_empty_text_videos">Upload some videos or activate auto upload!</string> - <string name="file_list_empty_text_videos_filter">No videos for your query found!</string> + <string name="file_list_empty_search">Maybe it is in a different folder?</string> + <string name="file_list_empty_recently_modified">Found no files modified during the last 7 days</string> + <string name="file_list_empty_recently_modified_filter">Your search returned no files modified + in the last 7 days.</string> + <string name="file_list_empty_recently_added">Found no recently added files</string> + <string name="file_list_empty_recently_added_filter">Your search returned no recently added files.</string> + <string name="file_list_empty_text_photos">Upload some photos or activate auto upload.</string> + <string name="file_list_empty_text_photos_filter">Your search returned no photos.</string> + <string name="file_list_empty_text_videos">Upload some videos or activate auto upload.</string> + <string name="file_list_empty_text_videos_filter">Your search returned no videos.</string> <string name="upload_list_empty_headline">No uploads available</string> - <string name="upload_list_empty_text">Upload some content or activate instant upload!</string> - <string name="upload_list_empty_text_auto_upload">Upload some content or activate auto upload!</string> + <string name="upload_list_empty_text">Upload some content or activate instant uploading.</string> + <string name="upload_list_empty_text_auto_upload">Upload some content or activate auto upload.</string> <string name="file_list_folder">folder</string> <string name="file_list_folders">folders</string> <string name="file_list_file">file</string> @@ -134,14 +134,14 @@ <string name="filedetails_modified">Modified:</string> <string name="filedetails_download">Download</string> <string name="filedetails_sync_file">Synchronize</string> - <string name="filedetails_renamed_in_upload_msg">File was renamed to %1$s during upload</string> - <string name="list_layout">List layout</string> + <string name="filedetails_renamed_in_upload_msg">File renamed to %1$s during upload</string> + <string name="list_layout">Listed layout</string> <string name="action_share">Share</string> <string name="common_yes">Yes</string> <string name="common_no">No</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Remove upload</string> - <string name="common_retry_upload">Retry upload</string> + <string name="common_retry_upload">Retry uploading</string> <string name="common_cancel_sync">Cancel sync</string> <string name="common_cancel">Cancel</string> <string name="common_back">Back</string> @@ -161,10 +161,10 @@ <string name="uploader_info_dirname">Folder name</string> <string name="uploader_upload_in_progress_ticker">Uploading …</string> <string name="uploader_upload_in_progress_content">%1$d%% Uploading %2$s</string> - <string name="uploader_upload_succeeded_ticker">Upload succeeded</string> + <string name="uploader_upload_succeeded_ticker">Uploaded</string> <string name="uploader_upload_succeeded_content_single">%1$s uploaded</string> <string name="uploader_upload_failed_ticker">Upload failed</string> - <string name="uploader_upload_failed_content_single">Upload of %1$s could not be completed</string> + <string name="uploader_upload_failed_content_single">Could not upload %1$s</string> <string name="uploader_upload_failed_credentials_error">Upload failed, you need to log in again</string> <string name="uploads_view_title">Uploads</string> <string name="uploads_view_group_current_uploads">Current</string> @@ -181,38 +181,38 @@ <string name="uploads_view_upload_status_failed_localfile_error">Local file not found</string> <string name="uploads_view_upload_status_failed_permission_error">Permission error</string> <string name="uploads_view_upload_status_conflict">Conflict</string> - <string name="uploads_view_upload_status_service_interrupted">App was terminated</string> + <string name="uploads_view_upload_status_service_interrupted">App terminated</string> <string name="uploads_view_upload_status_unknown_fail">Unknown error</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Waiting for wifi connectivity</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Waiting for Wi-Fi connectivity</string> <string name="uploads_view_later_waiting_to_upload">Waiting to upload</string> <string name="uploads_view_group_header" translatable="false">%1$s (%2$d)</string> <string name="downloader_download_in_progress_ticker">Downloading …</string> <string name="downloader_download_in_progress_content">%1$d%% Downloading %2$s</string> - <string name="downloader_download_succeeded_ticker">Download succeeded</string> + <string name="downloader_download_succeeded_ticker">Downloaded</string> <string name="downloader_download_succeeded_content">%1$s downloaded</string> <string name="downloader_download_failed_ticker">Download failed</string> - <string name="downloader_download_failed_content">Download of %1$s could not be completed</string> + <string name="downloader_download_failed_content">Could not download %1$s</string> <string name="downloader_not_downloaded_yet">Not downloaded yet</string> <string name="downloader_download_failed_credentials_error">Download failed, you need to log in again</string> <string name="common_choose_account">Choose account</string> <string name="sync_fail_ticker">Sync failed</string> - <string name="sync_fail_ticker_unauthorized">Sync failed; you need to log in again</string> - <string name="sync_fail_content">Sync of %1$s could not be completed</string> - <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string> + <string name="sync_fail_ticker_unauthorized">Sync failed, you need to log in again</string> + <string name="sync_fail_content">Could not complete sync of %1$s</string> + <string name="sync_fail_content_unauthorized">Wrong password for %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Conflicts found</string> <string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync files could not be sync\'ed</string> <string name="sync_fail_in_favourites_ticker">Kept-in-sync files failed</string> <string name="sync_fail_in_favourites_content">Contents of %1$d files could not be sync\'ed (%2$d conflicts)</string> <string name="sync_foreign_files_forgotten_ticker">Some local files were forgotten</string> <string name="sync_foreign_files_forgotten_content">%1$d files out of the %2$s folder could not be copied into</string> - <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string> - <string name="sync_current_folder_was_removed">Folder %1$s does not exist anymore</string> + <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded with earlier versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string> + <string name="sync_current_folder_was_removed">The folder %1$s does not exist anymore</string> <string name="foreign_files_move">"Move all"</string> <string name="foreign_files_success">"All files were moved"</string> <string name="foreign_files_fail">"Some files could not be moved"</string> <string name="foreign_files_local_text">"Local: %1$s"</string> <string name="foreign_files_remote_text">"Remote: %1$s"</string> - <string name="upload_query_move_foreign_files">There is not enough space to copy the selected files into the %1$s folder. Would you like to move them instead?</string> + <string name="upload_query_move_foreign_files">Insufficient space prevents copying the selected files into the %1$s folder. Would you like to move them there instead?</string> <string name="pass_code_enter_pass_code">Please enter your passcode</string> <string name="pass_code_configure_your_pass_code">Enter your passcode</string> @@ -230,16 +230,16 @@ <string name="media_event_done">"%1$s playback finished"</string> <string name="media_err_nothing_to_play">No media file found</string> <string name="media_err_no_account">No account provided</string> - <string name="media_err_not_in_owncloud">File not in a valid account</string> + <string name="media_err_not_in_owncloud">The file is not in a valid account</string> <string name="media_err_unsupported">Unsupported media codec</string> - <string name="media_err_io">Media file could not be read</string> - <string name="media_err_malformed">Media file not correctly encoded</string> - <string name="media_err_timeout">Timed out while trying to play</string> - <string name="media_err_invalid_progressive_playback">Media file cannot be streamed</string> - <string name="media_err_unknown">Media file cannot be played with the stock media player</string> - <string name="media_err_security_ex">Security error trying to play %1$s</string> - <string name="media_err_io_ex">Input error trying to play %1$s</string> - <string name="media_err_unexpected">Unexpected error trying to play %1$s</string> + <string name="media_err_io">Could not read the media file</string> + <string name="media_err_malformed">The media file has incorrect encoding</string> + <string name="media_err_timeout">Attempt to play file timed out</string> + <string name="media_err_invalid_progressive_playback">The media file can not be streamed</string> + <string name="media_err_unknown">The stock media player is unable to play the media file</string> + <string name="media_err_security_ex">A security error was encountered trying to play %1$s</string> + <string name="media_err_io_ex">Input error while trying to play %1$s</string> + <string name="media_err_unexpected">Unexpected error while trying to play %1$s</string> <string name="media_rewind_description">Rewind button</string> <string name="media_play_pause_description">Play or pause button</string> <string name="media_forward_description">Fast forward button</string> @@ -251,31 +251,31 @@ <string name="auth_connection_established">Connection established</string> <string name="auth_testing_connection">Testing connection</string> <string name="auth_not_configured_title">Malformed server configuration</string> - <string name="auth_account_not_new">An account for the same user and server already exists in the device</string> + <string name="auth_account_not_new">An account for the same user and server already exists on the device</string> <string name="auth_account_not_the_same">The entered user does not match the user of this account</string> <string name="auth_unknown_error_title">Unknown error occurred!</string> - <string name="auth_unknown_host_title">Couldn\'t find host</string> - <string name="auth_incorrect_path_title">Server instance not found</string> + <string name="auth_unknown_host_title">Could not find host</string> + <string name="auth_incorrect_path_title">Server not found</string> <string name="auth_timeout_title">The server took too long to respond</string> - <string name="auth_incorrect_address_title">Wrong server address format</string> + <string name="auth_incorrect_address_title">Wrong address format for server</string> <string name="auth_ssl_general_error_title">SSL initialization failed</string> - <string name="auth_ssl_unverified_server_title">Couldn\'t verify SSL server\'s identity</string> + <string name="auth_ssl_unverified_server_title">Could not verify the identity of the SSL server</string> <string name="auth_bad_oc_version_title">Unrecognized server version</string> - <string name="auth_wrong_connection_title">Couldn\'t establish connection</string> + <string name="auth_wrong_connection_title">Could not establish connection</string> <string name="auth_secure_connection">Secure connection established</string> <string name="auth_unauthorized">Wrong username or password</string> <string name="auth_oauth_error">Unsuccessful authorization</string> <string name="auth_oauth_error_access_denied">Access denied by authorization server</string> - <string name="auth_wtf_reenter_URL">Unexpected state; please enter the server address again</string> + <string name="auth_wtf_reenter_URL">Unexpected state, please enter the server address again</string> <string name="auth_expired_oauth_token_toast">Your authorization expired. Please, authorize again</string> <string name="auth_expired_basic_auth_toast">Please enter the current password</string> <string name="auth_expired_saml_sso_token_toast">Your session expired. Please connect again</string> - <string name="auth_connecting_auth_server">Connecting to authentication server …</string> + <string name="auth_connecting_auth_server">Connecting to authentication server…</string> <string name="auth_unsupported_auth_method">The server does not support this authentication method</string> <string name="auth_unsupported_multiaccount">%1$s does not support multiple accounts</string> - <string name="auth_fail_get_user_name">Your server is not returning a correct user id, please contact an administrator</string> + <string name="auth_fail_get_user_name">Your server is not returning a correct user ID, please contact an administrator</string> <string name="auth_can_not_auth_against_server">Cannot authenticate to this server</string> - <string name="auth_account_does_not_exist">Account does not exist in the device yet</string> + <string name="auth_account_does_not_exist">Account does not exist on the device yet</string> <string name="favorite">Set as available offline</string> <string name="unfavorite">Unset as available offline</string> @@ -284,28 +284,28 @@ <string name="common_rename">Rename</string> <string name="common_remove">Remove</string> <string name="confirmation_remove_file_alert">"Do you really want to remove %1$s?"</string> - <string name="confirmation_remove_folder_alert">"Do you really want to remove %1$s and its contents?"</string> + <string name="confirmation_remove_folder_alert">"Do you really want to remove %1$s the contents thereof?"</string> <string name="confirmation_remove_local">Local only</string> - <string name="remove_success_msg">"Removal succeeded"</string> + <string name="remove_success_msg">"Removed"</string> <string name="remove_fail_msg">"Removal failed"</string> <string name="rename_dialog_title">Enter a new name</string> - <string name="rename_local_fail_msg">"Local copy could not be renamed; try a different name"</string> - <string name="rename_server_fail_msg">"Rename could not be completed"</string> - <string name="sync_file_fail_msg">Remote file could not be checked</string> + <string name="rename_local_fail_msg">"Local copy could not be renamed, try a different name"</string> + <string name="rename_server_fail_msg">"Could not give server new name"</string> + <string name="sync_file_fail_msg">Could not check remote file</string> <string name="sync_file_nothing_to_do_msg">File contents already synchronized</string> - <string name="create_dir_fail_msg">Folder could not be created</string> + <string name="create_dir_fail_msg">Could not create folder</string> <string name="filename_forbidden_characters">Forbidden characters: / \\ < > : " | ? *</string> <string name="filename_forbidden_charaters_from_server">File name contains at least one invalid character</string> <string name="filename_empty">File name cannot be empty</string> - <string name="wait_a_moment">Wait a moment</string> + <string name="wait_a_moment">Wait a moment…</string> <string name="wait_checking_credentials">Checking stored credentials</string> - <string name="filedisplay_unexpected_bad_get_content">"Unexpected problem; please select the file from a different app"</string> - <string name="filedisplay_no_file_selected">No file was selected</string> + <string name="filedisplay_unexpected_bad_get_content">"Unexpected problem, please select the file from a different app"</string> + <string name="filedisplay_no_file_selected">No file selected</string> <string name="activity_chooser_title">Send link to …</string> <string name="wait_for_tmp_copy_from_private_storage">Copying file from private storage</string> <string name="oauth_check_onoff">Login with oAuth2</string> - <string name="oauth_login_connection">Connecting to oAuth2 server…</string> + <string name="oauth_login_connection">Connecting to OAuth 2 server…</string> <string name="ssl_validator_header">The identity of the site could not be verified</string> <string name="ssl_validator_reason_cert_not_trusted">- The server certificate is not trusted</string> @@ -313,7 +313,7 @@ <string name="ssl_validator_reason_cert_not_yet_valid">- The server certificate valid dates are in the future</string> <string name="ssl_validator_reason_hostname_not_verified">- The URL does not match the hostname in the certificate</string> <string name="ssl_validator_question">Do you want to trust this certificate anyway?</string> - <string name="ssl_validator_not_saved">The certificate could not be saved</string> + <string name="ssl_validator_not_saved">Could not save certificate</string> <string name="ssl_validator_btn_details_see">Details</string> <string name="ssl_validator_btn_details_hide">Hide</string> <string name="ssl_validator_label_subject">Issued to:</string> @@ -337,26 +337,26 @@ <string name="placeholder_sentence">This is a placeholder</string> <string name="placeholder_filename">placeholder.txt</string> - <string name="placeholder_filetype">PNG Image</string> + <string name="placeholder_filetype">PNG image</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Upload via wifi only</string> - <string name="instant_upload_on_wifi">Upload pictures via wifi only</string> - <string name="instant_video_upload_on_wifi">Upload videos via wifi only</string> - <string name="instant_video_upload_on_charging">Upload when charging only</string> - <string name="instant_upload_on_charging">Upload when charging only</string> + <string name="auto_upload_on_wifi">Only upload on Wi-Fi</string> + <string name="instant_upload_on_wifi">Only upload pictures on Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Only upload videos on Wi-Fi</string> + <string name="instant_video_upload_on_charging">Only upload when charging</string> + <string name="instant_upload_on_charging">Only upload when charging</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">File conflict</string> - <string name="conflict_message">Which files do you want to keep? If you select both versions, the local file will have a number added to its name.</string> + <string name="conflict_message">Which files do you want to keep? If you select both versions, the local file will have a number appended to its name.</string> <string name="conflict_keep_both">Keep both</string> <string name="conflict_use_local_version">local version</string> <string name="conflict_use_server_version">server version</string> - <string name="preview_sorry">Sorry about that!</string> + <string name="preview_sorry">Sorry.</string> <string name="preview_image_description">Image preview</string> - <string name="preview_image_error_unknown_format">Image can\'t be shown</string> + <string name="preview_image_error_unknown_format">Unable to show image</string> <string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local folder</string> <string name="prefs_instant_upload_path_title">Instant upload folder</string> @@ -365,7 +365,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Use subfolders</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Store in subfolders based on year and month</string> - <string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your administrator.</string> + <string name="share_link_no_support_share_api">Sharing is not enabled on your server. Please contact your administrator.</string> <string name="share_link_file_no_exist">Unable to share. Please check whether the file exists</string> <string name="share_link_file_error">An error occurred while trying to share this file or folder</string> <string name="unshare_link_file_no_exist">Unable to unshare. Please check whether the file exists</string> @@ -379,58 +379,57 @@ <string name="copy_link">Copy link</string> <string name="clipboard_text_copied">Copied to clipboard</string> - <string name="clipboard_no_text_to_copy">No text received to copy to clipboard</string> + <string name="clipboard_no_text_to_copy">Received no text to copy to clipboard</string> <string name="clipboard_uxexpected_error">Unexpected error while copying to clipboard</string> <string name="clipboard_label">Text copied from %1$s</string> - <string name="error_cant_bind_to_operations_service">Critical error: cannot perform operations</string> + <string name="error_cant_bind_to_operations_service">Critical error: Unable to perform operations</string> - <string name="network_error_socket_exception">An error occurred while connecting with the server.</string> - <string name="network_error_socket_timeout_exception">An error occurred while waiting for the server; the operation couldn\'t be completed</string> - <string name="network_error_connect_timeout_exception">An error occurred while waiting for the server; the operation couldn\'t be completed</string> - <string name="network_host_not_available">The operation couldn\'t be completed; server is unavailable</string> - <string name="empty" translatable="false" /> + <string name="network_error_socket_exception">An error occurred during connection to the server.</string> + <string name="network_error_socket_timeout_exception">An error occurred while waiting for the server. Could not complete operation.</string> + <string name="network_error_connect_timeout_exception">An error occurred while waiting for the server. Could not complete operation.</string> + <string name="network_host_not_available">Could not complete operation. Server unavailable</string> - <string name="forbidden_permissions">You do not have permission %s</string> + <string name="forbidden_permissions">You are not permitted %s</string> <string name="forbidden_permissions_rename">to rename this file</string> <string name="forbidden_permissions_delete">to delete this file</string> <string name="share_link_forbidden_permissions">to share this file</string> <string name="unshare_link_forbidden_permissions">to unshare this file</string> <string name="update_link_forbidden_permissions">to update this share</string> - <string name="forbidden_permissions_create">to create the file</string> - <string name="uploader_upload_forbidden_permissions">to upload in this folder</string> + <string name="forbidden_permissions_create">to create this file</string> + <string name="uploader_upload_forbidden_permissions">to upload to this folder</string> <string name="downloader_download_file_not_found">The file is no longer available on the server</string> <string name="file_migration_dialog_title">Updating storage path</string> <string name="file_migration_finish_button">Finish</string> - <string name="file_migration_preparing">Preparing for migration…</string> + <string name="file_migration_preparing">Preparing migration…</string> <string name="file_migration_checking_destination">Checking destination…</string> - <string name="file_migration_saving_accounts_configuration">Saving accounts configuration…</string> - <string name="file_migration_waiting_for_unfinished_sync">Waiting for unfinished synchronizations…</string> + <string name="file_migration_saving_accounts_configuration">Saving configuration of accounts…</string> + <string name="file_migration_waiting_for_unfinished_sync">Waiting for all synchronizations to finish…</string> <string name="file_migration_migrating">Moving data…</string> <string name="file_migration_updating_index">Updating index…</string> <string name="file_migration_cleaning">Cleaning…</string> - <string name="file_migration_restoring_accounts_configuration">Restoring accounts configuration…</string> + <string name="file_migration_restoring_accounts_configuration">Restoring configuration of accounts…</string> <string name="file_migration_ok_finished">Finished</string> - <string name="file_migration_failed_not_enough_space">ERROR: Not enough space</string> - <string name="file_migration_failed_not_writable">ERROR: File is not writable</string> - <string name="file_migration_failed_not_readable">ERROR: File is not readable</string> + <string name="file_migration_failed_not_enough_space">ERROR: Insufficient space</string> + <string name="file_migration_failed_not_writable">ERROR: File not writable</string> + <string name="file_migration_failed_not_readable">ERROR: File not readable</string> <string name="file_migration_failed_dir_already_exists">ERROR: Nextcloud directory already exists</string> - <string name="file_migration_failed_while_coping">ERROR: While migrating</string> - <string name="file_migration_failed_while_updating_index">ERROR: While updating index</string> + <string name="file_migration_failed_while_coping">ERROR: Failed during migration</string> + <string name="file_migration_failed_while_updating_index">ERROR: Failed to updating index</string> - <string name="file_migration_directory_already_exists">Data folder already exists, what to do?</string> - <string name="file_migration_override_data_folder">Override</string> - <string name="file_migration_use_data_folder">Use existing</string> + <string name="file_migration_directory_already_exists">Data folder exists already. Choose one of the folowing:</string> + <string name="file_migration_override_data_folder">Replace</string> + <string name="file_migration_use_data_folder">Use</string> <string name="prefs_category_accounts">Accounts</string> <string name="prefs_add_account">Add account</string> <string name="drawer_manage_accounts">Manage accounts</string> - <string name="auth_redirect_non_secure_connection_title">Secure connection is redirected through an unsecured route.</string> + <string name="auth_redirect_non_secure_connection_title">Secure connection redirected through an unsecured route.</string> <string name="actionbar_logger">Logs</string> <string name="log_send_history_button">Send history</string> - <string name="log_send_no_mail_app">No app for sending logs found. Please install a mail app.</string> + <string name="log_send_no_mail_app">No app for sending logs found. Please install an e-mail client.</string> <string name="log_send_mail_subject">%1$s Android app logs</string> <string name="log_progress_dialog_text">Loading data …</string> @@ -438,26 +437,26 @@ <string name="saml_authentication_wrong_pass">Wrong password</string> <string name="actionbar_move">Move</string> <string name="actionbar_copy">Copy</string> - <string name="file_list_empty_moving">Nothing in here. You can add a folder!</string> + <string name="file_list_empty_moving">Nothing in here. You can add a folder.</string> <string name="folder_picker_choose_button_text">Choose</string> - <string name="move_file_not_found">Unable to move. Please check whether the file exists</string> - <string name="move_file_invalid_into_descendent">It is not possible to move a folder into a descendant</string> - <string name="move_file_invalid_overwrite">The file exists already in the destination folder</string> + <string name="move_file_not_found">Unable to move file. Please check whether it exists</string> + <string name="move_file_invalid_into_descendent">It is not possible to move a folder into one of its own underlying folders</string> + <string name="move_file_invalid_overwrite">The file is already present in the destination folder</string> <string name="move_file_error">An error occurred while trying to move this file or folder</string> <string name="forbidden_permissions_move">to move this file</string> <string name="copy_file_not_found">Unable to copy. Please check whether the file exists</string> - <string name="copy_file_invalid_into_descendent">It is not possible to copy a folder into a descendant</string> - <string name="copy_file_invalid_overwrite">The file exists already in the destination folder</string> + <string name="copy_file_invalid_into_descendent">It is not possible to copy a folder into one of its own underlying folders</string> + <string name="copy_file_invalid_overwrite">The file is already present in the destination folder</string> <string name="copy_file_error">An error occurred while trying to copy this file or folder</string> <string name="forbidden_permissions_copy">to copy this file</string> <string name="prefs_category_instant_uploading">Instant uploads</string> <string name="prefs_category_details">Details</string> - <string name="prefs_instant_video_upload_path_title">Instant upload video folder</string> + <string name="prefs_instant_video_upload_path_title">Video folder for instant uploads</string> <string name="sync_folder_failed_content">Synchronization of %1$s folder could not be completed</string> <string name="shared_subject_header">shared</string> @@ -499,7 +498,7 @@ <string name="share_add_user_or_group">Add user or group</string> <string name="share_via_link_section_title">Share link</string> <string name="share_via_link_expiration_date_label">Set expiration date</string> - <string name="share_via_link_password_label">Password protect</string> + <string name="share_via_link_password_label">Protect with password</string> <string name="share_via_link_password_title">Secured</string> <string name="share_via_link_edit_permission_label">Allow editing</string> <string name="share_via_link_hide_file_listing_permission_label">Hide file listing</string> @@ -515,7 +514,7 @@ <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( at %2$s )</string> - <string name="share_sharee_unavailable">Sorry, your server version does not allow share with users within clients.\nPlease contact your administrator</string> + <string name="share_sharee_unavailable">Upgrade the server version to allow sharing between users from within their clients.\nPlease contact your administrator</string> <string name="share_privilege_can_share">can share</string> <string name="share_privilege_can_edit">can edit</string> <string name="share_privilege_can_edit_create">create</string> @@ -524,50 +523,50 @@ <string name="edit_share_unshare">Stop sharing</string> <string name="edit_share_done">done</string> - <string name="action_retry_uploads">Retry failed</string> + <string name="action_retry_uploads">New attempt failed</string> <string name="action_clear_failed_uploads">Clear failed</string> - <string name="action_clear_successful_uploads">Clear successful</string> - <string name="action_clear_finished_uploads">Clear all finished</string> + <string name="action_clear_successful_uploads">Cleared</string> + <string name="action_clear_finished_uploads">Clear finished uploads</string> <string name="action_switch_grid_view">Grid view</string> <string name="action_switch_list_view">List view</string> <string name="manage_space_title">Manage space</string> - <string name="manage_space_description">Settings, database and server certificates from %1$s\'s data will be deleted permanently. \n\nDownloaded files will be kept untouched.\n\nThis process can take some time.</string> + <string name="manage_space_description">Settings, database and server certificates from %1$s\'s data will be deleted permanently. \n\nDownloaded files will be kept untouched.\n\nThis process can take a while.</string> <string name="manage_space_clear_data">Clear data</string> <string name="manage_space_error">Some files could not be deleted.</string> - <string name="permission_storage_access">Additional permissions required to upload & download files.</string> - <string name="local_file_not_found_toast">The file was not found in the local file system</string> + <string name="permission_storage_access">Additional permissions required to upload and download files.</string> + <string name="local_file_not_found_toast">File not found in local file system</string> <string name="confirmation_remove_files_alert">Do you really want to remove the selected items?</string> <string name="confirmation_remove_folders_alert">Do you really want to remove the selected items and their contents?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Waiting for device charging</string> + <string name="uploads_view_upload_status_waiting_for_charging">Awaiting charge</string> <string name="actionbar_search">Search</string> <string name="files_drop_not_supported">This is a Nextcloud feature, please update.</string> <string name="learn_more">Learn more</string> <string name="drawer_folder_sync">Auto upload</string> <string name="drawer_participate">Participate</string> - <string name="participate_testing_headline">Help us testing</string> - <string name="participate_testing_bug_text">Found a bug? Something is odd?</string> + <string name="participate_testing_headline">Help by testing</string> + <string name="participate_testing_bug_text">Found a bug? Oddments?</string> <string name="participate_testing_report_text">Report an issue on Github</string> - <string name="participate_testing_version_text">Interested in helping us testing the next Version?</string> + <string name="participate_testing_version_text">Interested in helping out by testing the next version?</string> <string name="participate_beta_headline">Test the dev version</string> - <string name="participate_beta_text">This includes all upcoming features and is very bleeding edge. Bugs/errors can occur and if they do, please report them to us.</string> + <string name="participate_beta_text">This includes all upcoming features and it is on the very bleeding edge. Bugs/errors can occur, if and when they do, please report of your findings.</string> <string name="participate_release_candidate_headline">Release candidate</string> - <string name="participate_release_candidate_text">The release candidate (RC) is a snapshot of the upcoming release and it is expected to be stable. Testing your individual setup could help to ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid.</string> + <string name="participate_release_candidate_text">The release candidate (RC) is a snapshot of the upcoming release and is expected to be stable. Testing your individual setup could help ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid.</string> <string name="participate_contribute_headline">Actively Contribute</string> <string name="participate_contribute_irc_text">Join the chat on IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Help others on the <a href="%1$s">forum</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Translate</a> the app</string> - <string name="participate_contribute_github_text">Contribute as a developer, see <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for details</string> + <string name="participate_contribute_github_text">Review, amend and write code, see <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for details</string> <string name="move_to">Move to…</string> <string name="copy_to">Copy to…</string> <string name="choose_remote_folder">Choose folder…</string> <string name="folder_sync_loading_folders">Loading folders…</string> <string name="folder_sync_no_results">No media folders found.</string> - <string name="folder_sync_preferences">Auto upload preferences</string> + <string name="folder_sync_preferences">Preferences for auto uploading</string> <string name="folder_sync_settings">Settings</string> - <string name="folder_sync_new_info">Instant upload has been revamped completely. Please see the main menu and re-configure your auto upload. Sorry for the inconvenience.\n\nEnjoy the new and extended auto upload capabilities!</string> + <string name="folder_sync_new_info">Instant uploading has been revamped completely. Re-configure your auto upload from within the main menu.\n\nEnjoy the new and extended auto uploading.</string> <string name="folder_sync_preferences_folder_path">For %1$s</string> <plurals name="items_selected_count"> <!-- @@ -588,7 +587,7 @@ <string name="notifications_no_results_headline">No notifications</string> <string name="notifications_no_results_message">Please check back later.</string> - <string name="upload_file_dialog_title">Input upload filename and filetype</string> + <string name="upload_file_dialog_title">Input filename and filetype to upload</string> <string name="upload_file_dialog_filename">Filename</string> <string name="upload_file_dialog_filetype">Filetype</string> <string name="upload_file_dialog_filetype_snippet_text">Snippet text file(.txt)</string> @@ -604,7 +603,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">A safe home for all your data</string> - <string name="welcome_feature_1_text">Access, share & protect your files at home and in your enterprise</string> + <string name="welcome_feature_1_text">Access, share and protect your files at home and at work</string> <string name="welcome_feature_2_title">Multi account</string> <string name="welcome_feature_2_text">Connect to all your clouds</string> @@ -619,7 +618,7 @@ <!-- User information --> <string name="user_info_full_name">Full name</string> - <string name="user_info_email">Email</string> + <string name="user_info_email">E-mail</string> <string name="user_info_phone">Phone number</string> <string name="user_info_address">Address</string> <string name="user_info_website">Website</string> @@ -629,23 +628,23 @@ <!-- Activities --> <string name="activities_no_results_headline">No activity yet</string> - <string name="activities_no_results_message">This stream will show events like\nadditions, changes & shares</string> + <string name="activities_no_results_message">This stream will show events like\nadditions, changes and shares</string> <string name="webview_error">Error occurred</string> <string name="prefs_category_about">About</string> - <string name="actionbar_contacts">Contacts backup</string> - <string name="contacts_backup_button">Backup now</string> + <string name="actionbar_contacts">Backup contacts</string> + <string name="contacts_backup_button">Now</string> <string name="contacts_restore_button">Restore last backup</string> <string name="contacts_header_restore">Restore</string> <string name="contacts_header_backup">Backup</string> <string name="contacts_automatic_backup">Contacts backup</string> <string name="contacts_last_backup">Last backup</string> - <string name="contacts_read_permission">Read permission of contacts is needed</string> - <string name="contacts_write_permission">Write permission for contacts is needed</string> + <string name="contacts_read_permission">Permission to read contact list needed</string> + <string name="contacts_write_permission">Permission to change contact list needed</string> <string name="contactlist_title">Restore contacts</string> <string name="contaclist_restore_selected">Restore selected contacts</string> - <string name="contactlist_account_chooser_title">Choose account for import</string> - <string name="contactlist_no_permission">No permission, nothing imported!</string> + <string name="contactlist_account_chooser_title">Choose account to import</string> + <string name="contactlist_no_permission">No permission given, nothing imported!</string> <string name="contacts_preference_choose_date">Choose date</string> <string name="contacts_preference_backup_never">never</string> <string name="contacts_preferences_no_file_found">No file found</string> From de9aa39c87c92f95ce6bbe02e4006e0cad9e4b01 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 26 Apr 2017 16:57:03 +0200 Subject: [PATCH 786/881] logout button in drawer --- drawable_resources/logout.svg | 60 ++++++++++++++++++ .../android/ui/activity/DrawerActivity.java | 9 +++ .../android/ui/activity/UserInfoActivity.java | 29 +++++++-- src/main/res/drawable-hdpi/logout.png | Bin 0 -> 701 bytes src/main/res/drawable-mdpi/logout.png | Bin 0 -> 437 bytes src/main/res/drawable-xhdpi/logout.png | Bin 0 -> 674 bytes src/main/res/drawable-xxhdpi/logout.png | Bin 0 -> 922 bytes src/main/res/drawable-xxxhdpi/logout.png | Bin 0 -> 1103 bytes src/main/res/menu/drawer_menu.xml | 5 ++ src/main/res/values/setup.xml | 1 + src/main/res/values/strings.xml | 1 + src/modified/res/values/setup.xml | 1 + 12 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 drawable_resources/logout.svg create mode 100644 src/main/res/drawable-hdpi/logout.png create mode 100644 src/main/res/drawable-mdpi/logout.png create mode 100644 src/main/res/drawable-xhdpi/logout.png create mode 100644 src/main/res/drawable-xxhdpi/logout.png create mode 100644 src/main/res/drawable-xxxhdpi/logout.png diff --git a/drawable_resources/logout.svg b/drawable_resources/logout.svg new file mode 100644 index 0000000000..4b6695257d --- /dev/null +++ b/drawable_resources/logout.svg @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + fill="#000000" + height="24" + viewBox="0 0 24 24" + width="24" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="ic_exit_to_app_black_24px.svg" + inkscape:export-xdpi="360" + inkscape:export-ydpi="360"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1600" + inkscape:window-height="871" + id="namedview8" + showgrid="false" + inkscape:zoom="13.906433" + inkscape:cx="16.55722" + inkscape:cy="14.502003" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" /> + <path + d="M0 0h24v24H0z" + fill="none" + id="path4" /> + <path + d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z" + id="path6" + style="fill:#4b4b4b;fill-opacity:1" /> +</svg> diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index ecb90998dc..ee0a8e646b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -353,6 +353,10 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU navigationView.getMenu().removeItem(R.id.nav_contacts); } + if (!getResources().getBoolean(R.bool.logout)) { + navigationView.getMenu().removeItem(R.id.nav_logout); + } + if (AccountUtils.hasSearchSupport(account)) { if (!getResources().getBoolean(R.bool.recently_added_enabled)) { navigationView.getMenu().removeItem(R.id.nav_recently_added); @@ -455,6 +459,11 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU ParticipateActivity.class); startActivity(participateIntent); break; + case R.id.nav_logout: + mCheckedMenuItem = -1; + menuItem.setChecked(false); + UserInfoActivity.openAccountRemovalConfirmationDialog(getAccount(), getFragmentManager(), true); + break; case R.id.drawer_menu_account_add: createAccount(false); break; diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index d6fe3dc334..6d4954a7d9 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -24,9 +24,11 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; +import android.accounts.AccountManager; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; +import android.app.FragmentManager; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -70,6 +72,7 @@ public class UserInfoActivity extends FileActivity { private static final String KEY_USER_DATA = "USER_DATA"; private static final String KEY_ACCOUNT = "ACCOUNT"; + private static final String KEY_DIRECT_REMOVE = "DIRECT_REMOVE"; private static final int KEY_DELETE_CODE = 101; @@ -208,7 +211,7 @@ public class UserInfoActivity extends FileActivity { changeAccountPassword(account); break; case R.id.delete_account: - openAccountRemovalConfirmationDialog(account); + openAccountRemovalConfirmationDialog(account, getFragmentManager(), false); break; default: retval = super.onOptionsItemSelected(item); @@ -292,19 +295,22 @@ public class UserInfoActivity extends FileActivity { startActivity(updateAccountCredentials); } - private void openAccountRemovalConfirmationDialog(Account account) { + public static void openAccountRemovalConfirmationDialog(Account account, FragmentManager fragmentManager, + boolean removeDirectly) { UserInfoActivity.AccountRemovalConfirmationDialog dialog = - UserInfoActivity.AccountRemovalConfirmationDialog.newInstance(account); - dialog.show(getFragmentManager(), "dialog"); + UserInfoActivity.AccountRemovalConfirmationDialog.newInstance(account, removeDirectly); + dialog.show(fragmentManager, "dialog"); } public static class AccountRemovalConfirmationDialog extends DialogFragment { private Account account; - public static UserInfoActivity.AccountRemovalConfirmationDialog newInstance(Account account) { + public static UserInfoActivity.AccountRemovalConfirmationDialog newInstance(Account account, + boolean removeDirectly) { Bundle bundle = new Bundle(); bundle.putParcelable(KEY_ACCOUNT, account); + bundle.putBoolean(KEY_DIRECT_REMOVE, removeDirectly); UserInfoActivity.AccountRemovalConfirmationDialog dialog = new UserInfoActivity.AccountRemovalConfirmationDialog(); @@ -322,6 +328,7 @@ public class UserInfoActivity extends FileActivity { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { + final boolean removeDirectly = getArguments().getBoolean(KEY_DIRECT_REMOVE); return new AlertDialog.Builder(getActivity(), R.style.Theme_ownCloud_Dialog) .setTitle(R.string.delete_account) .setMessage(getResources().getString(R.string.delete_account_warning, account.name)) @@ -334,9 +341,19 @@ public class UserInfoActivity extends FileActivity { bundle.putParcelable(KEY_ACCOUNT, Parcels.wrap(account)); Intent intent = new Intent(); intent.putExtras(bundle); - if (getActivity() != null) { + if (getActivity() != null && !removeDirectly) { getActivity().setResult(KEY_DELETE_CODE, intent); getActivity().finish(); + } else { + AccountManager am = (AccountManager) getActivity() + .getSystemService(ACCOUNT_SERVICE); + + am.removeAccount(account, null, null); + + Intent start = new Intent(getActivity(), FileDisplayActivity.class); + start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(start); + } } diff --git a/src/main/res/drawable-hdpi/logout.png b/src/main/res/drawable-hdpi/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..1f60c9268f98a07a2ed92b5440207961aeacb96c GIT binary patch literal 701 zcmV;u0z&<XP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004b3#c}2nYxW zd<bNS00009a7bBm000!j000!j0TpmfLI3~&8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10y;@VK~z|U?UzrB(?A%9e{T(Ssr?Ef=-rEmLKmsf70FHrq6HEB z03JMh5!{1^-LoG-_p%iv<PWY^w#Y81;K488Wxqlx>oVr&CDE8Bt4XHlp$`ORCeyqR z@65bRfh9|tA!RQd$GH*5@kIcq49EOV@=Fv&Z~t0IDYZ@Vo?($ZFTyaq|3{%DGrJ3x zNm&cSaGV{m@-s+Y%5)C^>>HL?1<(Tk5xETDWFY{j(}swQgCN*2X`__dAlb{uN@<x4 zW`f2-{eFMNw(Tn>WPpZ3!{M;q?RG~Z@?I(B{Bxn%Z1#+#0?;P8W83yk<3c3&0c-)- zO4_AZmh}|C*QC25BCncC&7HEOE{qH2&f$69q3gPRt@R#&3yGAcl)4iHfnP_c@uv1X z@6fWW>-d$aHp!QD_tad59LHIW<G5EexeTo}0PF&IkdfN4ZTnUfMXwtPksJVcQspBh z)LOoU7sfb_S!I4vhSF13m2&{@X8K1Yn=e_FQ<mbo?pdw%Br|kOa#&RcFtB8a%pQRA z8JXKr6a{s@cj75)wOR+h@0S+GOlDG<TFaEBs8SCAYy#L!+NEf%ADfgZ6skg}(|IT& z0UGQXqe7$6=y*Dv4oP0CyJzwg-54t|nM{rVd^F$!;6J=E7G>yL+926mUtfP@GGOLD z{adV3ArbjZ{;c+c<XIG-@&j{A=KKB|0NV?c004-{^B@S`&5f7+z_#r*5xENBj7bra jQxW-)|AV+>i79>nSK$JtC3W~}00000NkvXXu0mjf6F@aX literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/logout.png b/src/main/res/drawable-mdpi/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..6c41a66e5e2a6e299341424f68b6baa0d785019c GIT binary patch literal 437 zcmV;m0ZRUfP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10WwKMK~zYI?NmWd!!Qt>P2y8ufGAbPLnysi5l;Sq5Xv8T0#9hg zi9eV`kr3)fPzC)0r^H?^spM89byCy|%+2fF8IN~u;2#G-?jlK&8)jYtI3LKjvDRjJ zp6A;@;O;W>;s|m87!%RL4Mh710HC!d41iLKiRi+O1#QW{g?$IDNYiv;jCm%aJFWG* zZ=JUTYwaTu%>cZ{aXcL)ptYv9`>(3%o|#twrePSalv0<y1-ej{<yT$Tsu7t0c=Hk2 z>48#;eFYtnc~?(PJ4J`)UrIR=Lc9RD0`LK#^YlOu2U5yW6h*oZIndIBpPUFGo&d}M ztc@}AqA1or2lIYt#+Zj72+pjvx4z`P1RBz7-~263{ugZkjC;O^9We8!yWVkNt<4&d fW5~0i^?wxKs3v(B{c9^B00000NkvXXu0mjf;zqE0 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/logout.png b/src/main/res/drawable-xhdpi/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..d43e54b52a8221137ccc5eb0236b4a9ca2071acc GIT binary patch literal 674 zcmV;T0$u%yP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm000}W000}W0bUxB8~^|S8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10v}04K~!jg?U=ES(?Af0|FMw}1t6|HQAVOdy5kWLoSa=NEpL)g zov-4qfk#0~b{(O>D}bm&OGyw%K@)pu&M0SCE9dNFg|uH4XYAeo_jo+J1|pG2BqY=o z%=7$FRaLKu=qZ4^d(zbK6TpIqCdQbh>m;Xv(P;E=y<UF?@IXS{4OkJ;V`I$Me+3iQ zRaI5JL3r^1aKOy3T|uV-W_~WCrxz!#z^#spu08YC+Rl3MjZ%s?4)43pb7tUwAsPsc zm;tSIp_Dq88oxorfY!QT=2HM;X%pTJ42Q$XmH39S*1GULPlI;@%=`|(s`cNgR3=2; z?OB!`B}wugz(Ff?VXd8PGe)ZqIQx)D4b12BPf3zILn{*ys0p#R&}=sQxDOMeePF}H z_g2W83Flg<{S5Y{u4`9ltdzpGHQ^$3C*C;|p$&kUf9-O8Py@_dlx2Cg%NWiY@U{L| zN<9IvKx=pBLp&gyfjrNTAt)XYG?3@{ab4G<;sGH88{)4mC47qqZqNs|t%)qlj`k%U z5Xb-#ouDP2h|VO$0|ExhvOEXyr@Jz9VT>t!&(qNLS*17D+6%4qovYs>cfLWy002nd z^-Y2=C3Ynm2u)WFTmrb)9QfKF^yG&t(3OD?0z&$-a0R+PuTSvzRxkvsG)-T+f~hO8 zTrR&227|XmbO_)Oz-<Y29b5vKrD^(NI-P#m^W2e0B(f#H0r;BDR589K-2eap07*qo IM6N<$f<D6|lmGw# literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/logout.png b/src/main/res/drawable-xxhdpi/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..a920e6ccb71509a652733818f74214f5669f74fe GIT binary patch literal 922 zcmV;L17-Y)P)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004b3#c}2nYxW zd<bNS00009a7bBm001e5001e50V3?*i~s-t8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10~bj|K~#90?V3Gr(@+$K-(w?C3j<<CQN;)dRcuV9>eBe*4*(Mq zqGF}(Zva|$R0bqOr*2K1bU{_s4G};>EFDml0Yz*;GXQZe0||<#YoFA__oSR>wBB4D zKRWjDwF4-Mq9}@@C`tk}NVr@spCY2WM069tB><;~Q`SGHMMUobtd5P1t*ouB{owwP zEvQ^BpC_V-h^`!|L?IB-TgP#N_4V~ntUM>w?VMMmE~k$-<KyGkIGyBhR&!l<?ik4d zfUB)m>kcQ#5@d|Ik*^+kIF56Rm1C}VF-I*TF~(fx<W4ZxJCk%UilTw0pe=mgHwlLm z&*^Wt9rWL#f-+D+8K|HPR8R)oDK=EXFf7G!{G5nxM^W_Ac0K)A@1QUYOPx+<i-@KG zZ27)_!FEmkSQXTh1E43R1Ywe_2}+RDLzE<If{Za94$A3K0`PKnc6Oq;ijuJ=Xk%mJ z34r;O$b{><+qOH&`d-TS{rdoxQz8uj(|M-bA$u{_Uefv$i=yZ;(mToOJ;}Nt;E$w* zl!!G+A_M_I6h+GrC`pVU;I|}W%wkHUa7m&B0YJ4{U6Le;wHG^V3Rt8kDc5x4Ag+T3 zppZ@)WkEmzl15$7&>3|>xu3GL7-d02mjf`TSkd3Vf*@El#ym`k6e0%@*g>A>El80A z2ovOa-U1OlN{JLI2N3eo9sqpbp9dgH4j`n1x^k9MB39%80t88x1LWL`<(+Qbw~1oq z02c2-K@iLtW71x=?!|FDy}7x$S5!?&Si8iCs0!e)&S(Ibu`LI%D5z4YG#tm7#z9He zFROm6-lP*GiIM{dm|~Smr4h&Rj4@_Aj^imwasVL@irst7b<1TWV!eZ;qk=L}K^dr^ z3{+4C+$pw?gny<B{9ZN)UpXOe2Ytv<h*VhT#1*ufqY$aQ;DlI$I-Sl6fOomdkwv}P zY(C`#S%PY{+IJ!fa6BZ{+wFE(uh)Na!Y+5!-QC@9larIr+U@pdB02})EP#_ot+HVD w0lWtApxJER+u7OqV!I$kQ4~c{6lKKu1yDvFM(xi*#Q*>R07*qoM6N<$f-{YeLI3~& literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/logout.png b/src/main/res/drawable-xxxhdpi/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..767ca767de0698fd8b7c0ebaad76d81fda8693a4 GIT binary patch literal 1103 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf<Z~8yL>4nJ zn8$)Jqhx~{kij5X;u=vBoS#-wo>-L1P+nfHmzkGcoSayYs+V7sKKq@G6axeE8BZ6- zkcv5P=i2AXxJtCok38pO+1_+Y^pv<q!9n&1{f9jF-SwU>rRn9;+mf;?#!83Fp@T_N z^Th;>>&fcktUs8h1-bC4F8a9B)l=i#J<o?SGEDQ!pVge%v-^E;<gUMO*VXl>=YRhu zuhF##fpQP(ST)z}uU9?2Y4*9Ds}HCqlzzPGHS76-`~xdit=bI)zq`-qL>xGF?AYtb zX|<d+JSp94S`zwt4e!gz$kgoGzTKR2rsIT$@Tc#Y-nT!IK5_VC#hi8zj$h|ZkJYqJ zvp?OQot+)u!m`)hVgLR8Nj;T5)#ldA3t9H$uC09~{7LVkM6tHYbtbEGJ7@1(I6-MW zTS`=;;j-tmIR!t2IV{tS`NUhoBvw>-ul?Gs)_&a}we!X1&mWuDJYRnM(}@)g=%_;^ zK;)>w`OoK**B`G`@N)<haejU$H(@iUkPGJw&HAni&LoyU?mvTFyaf~!{C)->@$!gs znD<<MZs5NuXBTO-osOITS*?;Wa@t=Gn^neZi{EYAGI7G5hD|#0DUoGoB|ZnA?O1Vk z;*9(6*qa@%TZUUbw_723bJMlDvU{%!kNsqL|5@>5e}iUf<UWIAJhRM%j&L;WS7orj z-lL-LIECTIYwLvz6orm(Hl%q9Xfpg$d^mm9L>1KzQ3iD(waJ|soQqf)dfXO2pQKt5 zFJ5x3Zi9f?XPb1%<DC0C<Qcgq9P!B5%;4eRbeq*7g;R^6;M`xy?3-)FAIy<{_vX!= z&aHpKxI1F)wnR8^J#{`%=+Jfj|M#lBSN)bJ_Zq&xHq&nEC&f2xy-Qwvty-<Et$n*; z$0x@hY8lJ^e1GLLKkBDK1q%;bb6#lZqSNdPl^19}ZFXQZetLaZu>I3djx!pTP33Q5 z@zM8Q==k)o&^dOU#})^_&r$%YY7o5e<db7V!>U#5uIt{HD0UC}so>DC^;`9WGr{fW zc0T;}?OVam?2>&d`V0r6b|01Dykus*xkG?qx%Y$^I}Ra+|I-xq)(HHFp0KrSwMG~B z`hQ}vb{rxM3Lj5@GjYjnn$^M8(SwS7P81$6er996Me#d-%cu5yg%p-QauYJS@7=B7 zE;wiV<?NP@-}@RTEMI<~wXe2V_kqUgP1XAp^BJ$*Qa@0>Z>QJ?-^gkEf3-DzYua`9 zox0rloD7?DJ1<t)+~Ya9PfY06{rmQD@$vr?jb`rQ+~Ztbp5EWEo}ZsT|Id2;k26)z ze?EPHcfs+KpFcmhySI<g=J6BLF#d+>ed~1sMO+c+)@koaCJUZ~tuvkn%=`?Vu6{1- HoD!M<wV3-t literal 0 HcmV?d00001 diff --git a/src/main/res/menu/drawer_menu.xml b/src/main/res/menu/drawer_menu.xml index c12bb93417..4cacf63dd8 100644 --- a/src/main/res/menu/drawer_menu.xml +++ b/src/main/res/menu/drawer_menu.xml @@ -137,6 +137,11 @@ android:icon="@drawable/ic_participate" android:orderInCategory="4" android:title="@string/drawer_participate"/> + <item + android:id="@+id/nav_logout" + android:icon="@drawable/logout" + android:orderInCategory="4" + android:title="@string/drawer_logout"/> </group> <!-- diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index ebe812f7f0..0ca8f0f22f 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -38,6 +38,7 @@ <bool name = "share_with_users_feature">true</bool> <bool name="show_whats_new">true</bool> <bool name="show_external_links">true</bool> + <bool name="logout">false</bool> // Contacts backup <bool name="contacts_backup">true</bool> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 6d24c7ee77..eeb69ccd43 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -654,6 +654,7 @@ <!-- Notifications --> <string name="new_notification_received">New notification received</string> + <string name="drawer_logout">Logout</string> </resources> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 33ff337389..9336fbbec6 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -34,6 +34,7 @@ <bool name = "share_via_link_feature">true</bool> <bool name = "share_with_users_feature">true</bool> <bool name="show_external_links">true</bool> + <bool name="logout">true</bool> <bool name="show_whats_new">true</bool> <!-- To fill if you want to show webviews instead of regular welcome views --> From 7a4c75aebbc7d9bb6f38a962401a17ac151f6c2d Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 27 Apr 2017 09:18:31 +0200 Subject: [PATCH 787/881] fix logout button coloring --- drawable_resources/logout.svg | 56 ++++++++++++----------- src/main/res/drawable-hdpi/logout.png | Bin 701 -> 714 bytes src/main/res/drawable-mdpi/logout.png | Bin 437 -> 427 bytes src/main/res/drawable-xhdpi/logout.png | Bin 674 -> 669 bytes src/main/res/drawable-xxhdpi/logout.png | Bin 922 -> 936 bytes src/main/res/drawable-xxxhdpi/logout.png | Bin 1103 -> 1090 bytes 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/drawable_resources/logout.svg b/drawable_resources/logout.svg index 4b6695257d..2e15912ff6 100644 --- a/drawable_resources/logout.svg +++ b/drawable_resources/logout.svg @@ -1,21 +1,23 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - fill="#000000" - height="24" - viewBox="0 0 24 24" - width="24" - id="svg2" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="ic_exit_to_app_black_24px.svg" - inkscape:export-xdpi="360" - inkscape:export-ydpi="360"> + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="25.6" + viewBox="0 0 24 24" + width="25.6" + id="svg2" + version="1.1" + inkscape:version="0.92.1 r15371" + sodipodi:docname="logout.svg" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + style="fill:#000000" + inkscape:export-filename="C:\DEV\src\Android\Nextcloud\logoutButton\src\main\res\drawable-mdpi\logout.png"> <metadata id="metadata12"> <rdf:RDF> @@ -38,23 +40,25 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1600" - inkscape:window-height="871" + inkscape:window-width="1920" + inkscape:window-height="1005" id="namedview8" showgrid="false" inkscape:zoom="13.906433" - inkscape:cx="16.55722" + inkscape:cx="-2.7503911" inkscape:cy="14.502003" - inkscape:window-x="0" - inkscape:window-y="0" + inkscape:window-x="-9" + inkscape:window-y="-9" inkscape:window-maximized="1" inkscape:current-layer="svg2" /> <path - d="M0 0h24v24H0z" - fill="none" - id="path4" /> + d="M 0,0 H 24 V 24 H 0 Z" + id="path4" + inkscape:connector-curvature="0" + style="fill:none" /> <path - d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z" + d="m 10.09,15.59 1.41,1.41 5,-5 -5,-5 -1.41,1.41 2.58,2.59 H 3 v 2 h 9.67 z M 19,3 H 5 C 3.89,3 3,3.9 3,5 V 9 H 5 V 5 H 19 V 19 H 5 V 15 H 3 v 4 c 0,1.1 0.89,2 2,2 h 14 c 1.1,0 2,-0.9 2,-2 V 5 C 21,3.9 20.1,3 19,3 Z" id="path6" - style="fill:#4b4b4b;fill-opacity:1" /> + style="fill:#757575;fill-opacity:1" + inkscape:connector-curvature="0" /> </svg> diff --git a/src/main/res/drawable-hdpi/logout.png b/src/main/res/drawable-hdpi/logout.png index 1f60c9268f98a07a2ed92b5440207961aeacb96c..97cee9da67a9696028b2064410fcce83aeaa3927 100644 GIT binary patch delta 615 zcmV-t0+{{11<D1GZhuEfL_t(oh3%Kmiqt?5#=lBr9LO^)g5JG|D9j=Vv*JMyq6;GU z03N)Abmk)1f(Mfx=HeshURFWGJ-9mJBD<i12VcO8uV7$zAo;vx*pNx)UwYBQd=N-i zccy++byfEOE3MQ_Qa7QLx(499h`2T#l1xS9XB@{L=LS+rZGQo{XA`7CFO4zxX9DGs z**#$x007C2e!o8~+D?@hiO2<#<KY3xeVY&>vJRjF0FL8a1TY;4!0E!rLt~7#2^5B* zCfO<b8q2Zi%!V2RX|3Bq5L~hW12hEETDOuUc_kuWf*`p0&w-L8c@E$PfR>1CE2XYm z2g<T+pJYTb%73zKYK5g~`V_#geAou?rYTfyr=C~7@2|P8`x(Hw+%zJ2r{C|tt6HB| z*<%0@ktcB+>*9RlO+6S4ey3@A6~~ckiOB0^_tZom>h*f-g+4L2NbUl7P=MN2O5HNX zyl(_VvO5lGL$v|C4T7LHeN{T~#wa43z3NyK5y~qoT7T5B<2YwX-Yu980W?ope)<k8 z*4E1R{WTHUE0{(AHW!5fETpVZ_Gb$)w~aA7%lzKdDie`|D2i&EV-B-dfLSU{MNLE~ zud-+P)1CIQ>$;C@!c+n+BG2<40@y)=J!2I}Yd!KjZ<FMeW%o>3RX4^(p$-9jv%mu2 zKfEzkMPTS?{6ex5hGEa9!_ql<RGzOo%YGDw-C32^P~XdjiIf>*J^<J{K?nc<$ro`P ze=6H+FKA&HZe&?@8GvUKL`43O{968lxYA0t^cUUB^T`gjwbB3p002ovPDHLkV1hM= B9O(c6 delta 602 zcmV-g0;T=R1-%83ZhtySL_t(oh3%J5i_<_DhktJkb*cRdBIw<Vh(Z^s&=tu}2%-fM z`~V(2dlB4&huyOuLHDv1B;*gSR<_74sNlgb;AOu;DeE%k=OxjYCaX!N=%Eh;W+v0T z5AV#pOo1g!njvK`9LKp4$MHn~rwqsZPV!3>MQ{IFNGY{V@_(LTkvuQLFueaqp(HcA z3zkV)3&U`n9kB8<NM6cx4*={NmRJSQ0{{`Z4B%uT0H@Q2h>U|E*f43Ml-eNK%g0J- znG9xv#zOsmf5o=#D<))shC;*Pu-)x;M<ViGDdqfgq1kNqjHCk4Cb?tV_D$nLB=-Sq z0oY2~rC65r6o0_iq`M*_ubN8DowB4Zj0@(@;d$Pn>$-id^&Wr=iIk_5x)TI}Uq`6% zruIDV(6X%S_?4+P$(MEa)Le!f$61ZzxK}i}46QW)>;ia@k=n6s`&JZ1uNw)G8~}Jy z<s&83TE2xB#yE~yWqwhH(o<HIa{%sU`bQ+2FIkmSmVe^9?pdw%Br|kOa#&RcFtB8a z%pQRA8JXKr6a{s@cj75)wOR+h@0S+GOlDG<TFaEBs8SCAYy#L!+NEf%ADfgZ6skg} z(|IT&0UGQXqe7$6=y*Dv4oP0CyJzwg-54t|nM{rVd^F$!;6J=E7G>yL+926mUtfP@ zGGOLD{Zm`4QXvufO#ZC)gXCEhpYj89OXmCj8vxr2lmGyT$nziw-p!4d{lK>EH4(WA o;EYKTl2Z}+kpF|YWQi$$09WAxrX_XwY5)KL07*qoM6N<$f(^nTh5!Hn diff --git a/src/main/res/drawable-mdpi/logout.png b/src/main/res/drawable-mdpi/logout.png index 6c41a66e5e2a6e299341424f68b6baa0d785019c..5b721eed27d33307b18def2cc47b757140557686 100644 GIT binary patch delta 326 zcmV-M0lEIQ1FHj&Zht6AL_t(YiS1KCPQx$|9Iv_c36!ehAq1}Q3xx6lTQNTfa`J#8 zPW%BlA(W4x3i<_(UUNxNYLwJY5Eq!6SGzMi-d*4ydmy?Gt@Sy8TL6b6`8Ld)*LD50 z4N#D<nm`T!b0S)G0|#LO09b1UMnG%r0UUK>p@Sbs=%5!xQGYC$`CdwSS(fE%Y+bYi z@BIyc%sKaLj9HEnu-1yc|7Yea01bepbFMMQ948A5p{lA6@BKw9vT)A5#E9(7pxuI4 zY(>t7X7amRv~T~FQZpiY^xmHUc#~2Nb`K;tP)f~&5DzKj-vqSQzHbghbO#^<u$EG0 zv9}QIfQYUEG(T<U>)5*JOKwR|WAncnOD#x6=wJh2o_G%--n)+-2h5zeB2&oo3H5&w YpPi?0P<!f?(f|Me07*qoM6N<$g7rU;`2YX_ delta 336 zcmV-W0k8h61GNK?ZhtaKL_t(YiS1NDPQx$|oK50WUw|l8#X~5)SP@SCfDp<bcmhvo z#fd+dM3E5cM^FX*0;j}YE~(^JBz02M3(U>y-5HN}ZQvgVK<*+*k{f1T0yrPYx3Sh{ zd7kInK;Z5&^Wq3{02mX|!VN_G2>_tACJca5iizmLjRkGVzkh{&2dzlcbYhHoCZap7 z^}BDKw*zbKBN5F2yvA`n9VDQ&rndX9s_LGZR{*AA7_O93m%RnLP?qIaUDv7+nE-h6 z5!va1Qi^>A9g%rgPfj~Uhvr{OITAv=0JsA10ig5rKo18}%25<Wx(_+f(u1Fz2qB&T z%mA#7G4rA*)=54G^L}W?n1>(;&aAb!zT~|G8q#au{4GxY7i|EHd%lMqF!QIo-f>{9 i%^Hzo$g`pKe-z)SCV3eBYbzlD0000<MNUMnLSTY3%9*AB diff --git a/src/main/res/drawable-xhdpi/logout.png b/src/main/res/drawable-xhdpi/logout.png index d43e54b52a8221137ccc5eb0236b4a9ca2071acc..a22758556ef39b5adfd7399aa68a5306e3c9c765 100644 GIT binary patch delta 570 zcmV-A0>%BJ1)T+uZhsm{L_t(&f$f*Qj?^#|h0l#Mq5{OWD|#xVg=TsL`wBdVGtLgx zWGb?8H1jAFRA``{4nz$tC4*RsZ6>-jWECPD!j5mUNd7we#`Za}uYZ6*AP^W6>Ix=F z@*s+$mjIpsxIK)dD}FHZhKT0Y+E1>JoCdVk_mxr~0o)Uj*MFbge!qXXUa!CWDHyq0 zDW%pJUpxRDO(v6-E9f);;F*A!Yr)K?u2|gB?zc5>t?kSg-xy=KQM~K=u4@MV3xa{M z5i^jcX*Qe9a;g4nL=2>9nlbZ&h|Z)<csF2-nKSdEE)&sNnx>iWacaC9sH*A>fL*hW znHN$sA+on?t$$CHQf~nqHS3xAye!LkpFUdWfb$#@$$`~s^#Q<Bv}QsgC&YFkYwdds zU_$g9XqfoctoLccc^7K0LEro`fxbE6V$_q^$4uOWtHk9YjYl=W%vo8M%R~Bb=76vJ zf087RqbS;-^}6#R9_W719E>sM5dbmqfZ!4uLOdX3pnoC0eU<Pk9{7iIpl?oStxqtJ zctBtVlv1Z?i6^3^gm^%}fVDO!qN~%DnX{rOGT-CWh~z*~6z4>=l>GBGV%w<XUvF{~ zt`Y|k42(@z4qO1ZQx~M)2Y=zaE6_Cq?*xQg3ufN9Von29Rn5_Q3Xa4sj^h`upmGJa z+wIrsbTj&jh>nTq7{DzNd2TM4`E?w}&+|P0Jn-0oKp@bQpB?tX5o?ojPyhe`07*qo IM6N<$g7tC}{r~^~ delta 575 zcmV-F0>J&91)>FzZhs$1L_t(&f$f;Fj?+L8hX1jV5CtHvJyAxYLb~G-5S*M{D=lx5 zP@S*hu7O8EN_HKgz$<{LLrX~zM?n*NXwE2SSS#o3WQDX}6=&?-|Mz%2y9OeWNF*fG z70mPeQB_s1i0CPRyL-~q@Dsp-h$hCErRyZ8fzfF6aJ^oC27mBCLfs8m5z%8~%-4Sf z6W3K$RlPxY@c?kZ%&%QRrvYYuE~BRxC$7M)j*G56^VZtVdhv}?iZ>4LyUufF;C~?+ z2#uHlt#zT4I+q&1LBxR8x?tv00Apzr-VF?g!^xHShOySV@I6n1cLU7)4#2AQ->Fn4 zMBeRLmK`NY@_!z{K`V4&t(|N$Myn4v`;bTt%;)n@Ns>H6D-#f?39+}(Y&QG24-=w& zV8g`sR>+$P=US-!4ECk2YgcHjl)|<(;UaV=-Z>MY4S<<{?Q(rk1I%2MWqG#C7|t5- zwf<L1Jpr&lYj@{EJRqEbJkO6IC>{_rkmvbvUDu-G0e>L_8{)4mC47qqZqNs|t%)ql zj`k%U5Xb-#ouDP2h|VO$0|ExhvOEXyr@Jz9VT>t!&(qNLS*17D+6%4qovYs>cfLWy z002nd^-Y2=C3Ynm2u)WFTmrb)9QfKF^yG&t(3OD?0z&$-a0R+PuTSvzRxkvsG)-T+ zf~hO8TsSVj4F-d^M05z?5WsB-bsby+n5Aj@Vmh6E+4J0yNF=f)zXAA~%~UbICEWl3 N002ovPDHLkV1g&G4xIo1 diff --git a/src/main/res/drawable-xxhdpi/logout.png b/src/main/res/drawable-xxhdpi/logout.png index a920e6ccb71509a652733818f74214f5669f74fe..bfcbe920846c881062f19e989825a784cce1c248 100644 GIT binary patch delta 839 zcmV-N1GxN}2dD>-Zhs|7L_t(|ob8)UYZFlvhTk(+OsOu!wUpvgMbJM`OQ8#?e?VOc zViB^k_cqHc=cBGlLE=IX`wOJ*q;%JXMM2z3$-;%Js14MZ>2c8pLOaczI?ddhdY@%@ zlbm@tb5HKf1n_t~9*@W4@pv+zlZ30)YNb-CJRzb70ImbLFn^q~PMtP@&qTC3K0e;4 z*XteW8^wZ*F;|#*4ZzKRsn8XO=p%r+IF7$b@_{5&tyU{%K@I>g^DSn6Td&v8OY$N? zV`F3UI0JI}xZQ5IA4`HFK>+R-D8^MDN<tz*%zUj_E$+e0Hzc`pk`NJH%z8aZk`qlq zTWGEM@N35%(|=*4r`Ugs7nFk+l!F(PgBO&8Xo?M+#l^*my}iBHN~uR-7=E=~Pe0Z> z=s?aofT=W1*K4)fRogZ7V^vU}oSu{k*CbgJlp&{wQ<AI+V&=OzDyPRpnx^k-wc2Ef zC1qkwP#niEh-hIzWHL?D4cnb$eJ^E<dB)6310qeO)PHo5>6Wz@17v$i>r*U_<L5b@ zWOYrlE(q9{1V9gnSd-+0AOJ{`WC;#Raz+raFNuiEfJo_*oDu{8aU3TuNfPbFj++9* zf;so=dXfrFHwn&l&<QA|lSWw(P=cgU7c_K6T~Og)*?EkzprOkFgj1~S`(IjX10Wg@ zDMb$8V1EZ0V>BF*12`tg7^9gv9uO&24&aa=t@VOyasWpJX{{FkBm*K=<Nyu`a#;>g za4%MLx*c3ibXE>vv4e~;^EsDVx0O;;wr?a_6GTMs033JlO{LUK7>3&=mXwJ#K~WSn zgCLm3QAyTMtA4C5(ixJRk^?v}#iA%`Dy3!sY=5}0<{ZX}r#lYTnmd-u$i#XFxsDf< zgBO&87nFk+l!IuBG4oE=lj&vOFFR#^N<yLzBBC$FYH<?LF-cFc)dGb$2@$=K<V1pY zcXt~AJ{79SA&6+J)oQ(zWJQ9OmzRHcyWKgQ0ZBx()#-HZH5!dSlDv|B@aE>`ui4qz zS3uov_d9^g%zTN6M1O0v4Kwcm_z(m^*lM+&uB@#5uw9eK<MDVr9*<|l`3tabQEzR@ R9<l%c002ovPDHLkV1hH{eK7z4 delta 825 zcmV-91IGNQ2bu?vZhsd^L_t(|ob8%DZ_`i|hTmf&PzwWMMp4BG2vuxMrRvi7;|~B6 z5~5<I?QZ~Dc2ou=M5k^|opeD})eR9qLM$Cnl>tR;Kr;YwE&~aQsB53p#P_6}XSCj2 z9X~qu@wEdeilQirq9{rNG)TByE}tTzyF_#oz$E~uhf~%+r+-C6?*Xiijg76Wt*!mw z{*W!GTrQs{qKJsD9H~Sh5Yb!5af0>r^-rukC)DknSEDYck2mAv<JUNy<ZxDVU3cyn z$pL_?tyb#}C&&_HjJc7o9(g#9bBmQ@u6Hp<Eg~_-T;}9XFxNYibTEpdfu^7>eBU<- zhZE1~Z@3-w-+!WlGEhMosGtl~PzKy7HdMkeEX8sBoQQ5mQS{MvJ^fhkpfC(eola+q zh^7E+`M!U_c1`_Q71WahpeLmSVUnx~N|4h-lq73{j4>V#%IQ%8@N#x`cA~h7lCdUe zV`Jk9fcccjgzLK7wmZrCUds3V`v8_xA`Jl3d8XSTdw((3Uefv$i=yZ;(mToOJ;}Nt z;E$w*l!!G+A_M_I6h+GrC`pVU;I|}W%wkHUa7m&B0YJ4{U6Le;wHG^V3Rt8kDc5x4 zAg+T3ppZ@)WkEmzl15$7&>3|>xu3GL7-d02mjf`TSkd3Vf*@El#ym`k6e0%@*g>A> zEl80A2!9jgdENpMJxYlbDhCkq(jEYO-=7B{N)8~TgSv8-QX*F500IO_mILJ6i{+he z-M5Ki<p37%K|v7A8Dr93weH1nJiWQOxmQ$8Nm#qYh^PwSu+C@zn6WJfuqdcfsWcqN znZ`j$)-S7mtlp#(B#Dv(2$*7(N~ICU@r*HMJAaPjDM@kwArFe(d(CyrWh7#~gQTN^ zGEhMosGtl~PzKy7wvU8=rVIRDHV9uiA#MkK$We$?Sm(qQw3?$3sl4EXSb{p8&I*8c zxyq46z1eI&<pf!RYPH&TA_{OkB-PvPc37|1e{#Yuch%k9-EWhVlh4}i_GcnG2jDD# zlQKuGvS9WByaw=~*=*k1+1dGGyC6kT6h%=KWyJXfP(~g`?ax8Q00000NkvXXu0mjf DJVAMw diff --git a/src/main/res/drawable-xxxhdpi/logout.png b/src/main/res/drawable-xxxhdpi/logout.png index 767ca767de0698fd8b7c0ebaad76d81fda8693a4..11d0762a0220df3129d4d0b9cc4e3b241abe1bd3 100644 GIT binary patch delta 994 zcmX@lafo9=Uj2Sg7srr_IdA9g&AS{Ra{NELmY}MuD1XB*rYWuL51duG<)w{-LXTWw zJh}DetGp|vEF6XbTbZSWlob|;UT{xvI1urX#Z<{vYb`&s=Ts)&+WcE_^7lXAUUcVi z%-?#;zWg^94U06o;OG&z$qTkc8dAy6Jk#XZ4Y=wT82;Ge<tu$as^O{4dGYAA*Pc6? zrRgSQWxaA)8@8MOfmuUxvyYR(ZI>?<wY9bp5fML9H#2H8&ixS2ydxtx-Z5;G&h8}T zgRkaBuf8hhaQOYxPbW^C*yFpfkliKFWZLte?mu?lzS*s-WHnpmr1)f|#{!>i_NN9v zXLM#z^X<-Qs+ZZm;v-X9-mGg9+zHPvFEf=h%!)EdiE?l`{CD2``Sax~as$(rEnmL# z{AG3D?aO}`9bdtKjygmH+7e}04%%M-Y{7AaljE>K+A~R|u2l+-QyTJq+&vyTLBZ|7 z{fFff^&DFo_8xk#6zTMmwI#7)bNr9k`VI}Q!v=Ounz9;8#RJw~pU+$oo}y!X-s5%4 zCGL*L6^k!s#IS$ZccLP5x3b~=yT=P-^0(jCXNb`<nm6<LC6m3?7e3#3UeoaL=Y&h; z4%7YAW1Np#IrcClOmE?LJ?1?@!HZ#o@<S~xCC51o3!;QvxERVjBXo`Str0rH#qiG~ zA+7$RkPA0MgNg6$Nvaa@;#=+)ZeXzzDv)^15`3h*K{xd!OFk>Z(+Ll@G91{;@}9Ni z$IDl(d&Li&DV()z^SZeE*^KKBv)hOTw0&UgE_IMx|DV5UfuqZMhB^91`*a>Mi@s>^ z`=PIBP~)(pVcrLQ5y|*%9~ciZJ+fHm%`Y#YwV=4JKBDGFg9D@OL-Air>t-HiZ{b`K z^`k+7(RTXM5Ve{I0_WIej#(XiG)qD7Av2TJf>S_}B_}86j>EwZof%<4KN=VqJtx_y zE~@pHH7cH?;#tEIY!%?8&%iKAW#(&j$6I;J#RZuf_NsdD$qT43{0MLQ@_{jtsX>-= zvygqk|MrjdRttDM{%p9*T__u18q$!AhI+0up82!*{$A(RAAUD7{>Y0;xWnl3<?NPY z$~~Jm-eg@HaplJ$>B~&BtKIdPZkVn8+_2W>{B)o09@Zt9zdC2mpK-17z~ZpgU$1UC z@k%43qT&Z1*S*aLg{N)S>CWNmzb&$MUG%y<^Vw(9XV0F!yyJz;AKN*1nLZet-qfl5 zS9pG0lY)h_i!j5iGd8>KzkR#(vL#PE^M`32(|rDKatRc1g`<zt@0<6mTyc!U@;3tz Nc)I$ztaD0e0sssG!4m)g delta 1007 zcmX@aah_vBUi}$Q7srr_IdA9M=gYWCw9k(`=VaO5bV~G;xJSW3_6PlkJonx8o-U>7 z<<i@dvMa_)hs&XZNmKL11dZ#->f)?Fn5G4}@To5PxYN~B<J>*ZhcYru^UI&roY}Mc zeQ@Nizi-#o^{3~5|0b`|wFrT759(Mo*X^%YJzc+P_PL#_52z-Te!S{6>-mBF11nao z+6@H1yU*xE95{CD*z3q?wVX9PDcx&Y68d@#@5{-^)a=^6-JEl#<AjFrr|+5Gw?C0S zark4!oOTb6U*}Da)wE8tKi!_4ogLr8ve(^V|NZ?*J(WJy=GMy#S@z_vt$ii@N$;XW zv9`)}CaZJxJ7@1(I6-MWTS`=;;j-tmIR!t2IV{tS`NUhoBvw>-ul?Gs)_&a}we!X1 z&mWuDJYRnM(}@)g=%_;^K;)>w`OoK**B`G`@N)<haejU$H(@iUkPGJw&HAni&LoyU z?mvTFyaf~!{C)->@$!gsnD<<MZeabtDQ6dHw4IKd|5>e)F>=~p4x3fRYm47)+cI&& zo`y|2@hOpIXC*!dpY2$2cH)ft@7S9iuUm#&J-1sSd2`dXy0Uw(3y=L|c>h`PWPgKZ zYUDnHV?49WgpP1D>{n&5zuu#w?>L3w$7}0_3lxQpa5kiQ3TQI?Q+zmm)<hN64p9bm zp?bB+of({qSQ&cU7C)b)S`jZ^a;<KIfZ1o8bjjnK`#R(qxhEX)$k@!_;ox+e)ggsb zi=p7$U&-v7YsDYTk$(5)&7IDzf5NysV(qp>IB-36K2Ye;b^ZVMs=ZhJmM8ZbzP~op zZt5q+H*CF2UVN=ut*xznyJ5#C#~*4L%l>?S<ugC3{-;6(3lCd!UTEl|)9eeC7id0h zc3?DqdVN>0{nJm5Ga8mn<!@r~(f3~H`1G*QId+}L76-r2QUI!I5WMi@lVd}}s#WW* z>)w|rb`Scg;Lx!3TlIr8!R_aEKK%CWTfxull6@-r3<siiAC=*}WM;j&Lx5qq_k<Wb z4k3pB(-ijB2-N?Gp0KrSwMG~B`hQ}vb{rxM3Lj5@GjYjnn$^M8(SwS7P81$6er996 zMe#d-%cu5yg%p-QauYJS@7=B7E;wiV<?NP@-}@RTEMI<~wXe2V_kqUgP1XAp^BJ$* zQa@0>Z>QJ?-^gkEf3-DzYua`9ox0rloD7?cb2~3q*xchexlc^!*8ThTaq;p06OCr> z;oRd~U7p_Gu%4fvKmX5q{f{$M&woCBfOo<1lb=67x4XBG(dO|J(=h&q>V4~V0!3UA b=+<fPNhS-Pgsn54#{dMLu6{1-oD!M<hv(<? From 003076eb14fd5b99edfcf6bf4b36a03f0836a290 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 27 Apr 2017 10:08:39 +0200 Subject: [PATCH 788/881] ability to show custom error message for webview --- .../ui/activity/ExternalSiteWebView.java | 17 ++++++++++++++++- src/modified/assets/customError.html | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/modified/assets/customError.html diff --git a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java index 17625df860..a05072142a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java +++ b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java @@ -38,6 +38,9 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +import java.io.IOException; +import java.io.InputStream; + /** * This activity shows an URL as a web view */ @@ -122,7 +125,19 @@ public class ExternalSiteWebView extends FileActivity { webview.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - Toast.makeText(activity, getString(R.string.webview_error) + ": " + description, Toast.LENGTH_SHORT).show(); + try { + InputStream errorPage = getAssets().open("customError.html"); + + if (errorPage != null) { + view.loadUrl("file:///android_asset/customError.html"); + } else { + Toast.makeText(activity, getString(R.string.webview_error) + ": " + description, + Toast.LENGTH_SHORT).show(); + } + } catch (IOException e) { + Toast.makeText(activity, getString(R.string.webview_error) + ": " + description, + Toast.LENGTH_SHORT).show(); + } } }); diff --git a/src/modified/assets/customError.html b/src/modified/assets/customError.html new file mode 100644 index 0000000000..187dc5febc --- /dev/null +++ b/src/modified/assets/customError.html @@ -0,0 +1,4 @@ +<html> +<h1>Sorry</h1> +Modified +</html> \ No newline at end of file From d0521c1c894b18738d56db63fcf390e3c4a170c4 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 27 Apr 2017 11:28:59 +0200 Subject: [PATCH 789/881] rename flag from logout to show_drawer_logout --- .../com/owncloud/android/ui/activity/DrawerActivity.java | 2 +- src/main/res/values/setup.xml | 8 ++++---- src/modified/res/values/setup.xml | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index ee0a8e646b..6c094f7191 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -353,7 +353,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU navigationView.getMenu().removeItem(R.id.nav_contacts); } - if (!getResources().getBoolean(R.bool.logout)) { + if (!getResources().getBoolean(R.bool.show_drawer_logout)) { navigationView.getMenu().removeItem(R.id.nav_logout); } diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index 0ca8f0f22f..e064bd3cbf 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -33,12 +33,12 @@ <string name="auth_method_saml_web_sso">off</string> <!-- Flags to enable/disable some features --> - <string name = "send_files_to_other_apps">on</string> - <bool name = "share_via_link_feature">true</bool> - <bool name = "share_with_users_feature">true</bool> + <string name="send_files_to_other_apps">on</string> + <bool name="share_via_link_feature">true</bool> + <bool name="share_with_users_feature">true</bool> <bool name="show_whats_new">true</bool> <bool name="show_external_links">true</bool> - <bool name="logout">false</bool> + <bool name="show_drawer_logout">false</bool> // Contacts backup <bool name="contacts_backup">true</bool> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 9336fbbec6..e88799635e 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -30,11 +30,11 @@ <string name="auth_method_saml_web_sso">off</string> <!-- Flags to enable/disable some features --> - <string name = "send_files_to_other_apps">on</string> - <bool name = "share_via_link_feature">true</bool> - <bool name = "share_with_users_feature">true</bool> + <string name="send_files_to_other_apps">on</string> + <bool name="share_via_link_feature">true</bool> + <bool name="share_with_users_feature">true</bool> <bool name="show_external_links">true</bool> - <bool name="logout">true</bool> + <bool name="show_drawer_logout">true</bool> <bool name="show_whats_new">true</bool> <!-- To fill if you want to show webviews instead of regular welcome views --> From a5d255afed26529ca1b51247f3f07a5860596275 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 27 Apr 2017 12:41:15 +0200 Subject: [PATCH 790/881] prevent NPE if quotaLink does not exist, e.g. in manageaccount activity --- .../android/ui/activity/DrawerActivity.java | 78 ++++++++++--------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 6c094f7191..e177488265 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -830,56 +830,58 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU } private void updateQuotaLink() { - if (getBaseContext().getResources().getBoolean(R.bool.show_external_links)) { - ArrayList<ExternalLink> quotas = externalLinksProvider.getExternalLink(ExternalLinkType.QUOTA); + if (mQuotaTextLink != null) { + if (getBaseContext().getResources().getBoolean(R.bool.show_external_links)) { + ArrayList<ExternalLink> quotas = externalLinksProvider.getExternalLink(ExternalLinkType.QUOTA); - float density = getResources().getDisplayMetrics().density; - final int size = Math.round(24 * density); + float density = getResources().getDisplayMetrics().density; + final int size = Math.round(24 * density); - if (quotas.size() > 0) { - final ExternalLink firstQuota = quotas.get(0); - mQuotaTextLink.setText(firstQuota.name); - mQuotaTextLink.setClickable(true); - mQuotaTextLink.setVisibility(View.VISIBLE); - mQuotaTextLink.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent externalWebViewIntent = new Intent(getApplicationContext(), ExternalSiteWebView.class); - externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, firstQuota.name); - externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, firstQuota.url); - externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, true); - externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_MENU_ITEM_ID, -1); - startActivity(externalWebViewIntent); - } - }); + if (quotas.size() > 0) { + final ExternalLink firstQuota = quotas.get(0); + mQuotaTextLink.setText(firstQuota.name); + mQuotaTextLink.setClickable(true); + mQuotaTextLink.setVisibility(View.VISIBLE); + mQuotaTextLink.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent externalWebViewIntent = new Intent(getApplicationContext(), ExternalSiteWebView.class); + externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, firstQuota.name); + externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, firstQuota.url); + externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, true); + externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_MENU_ITEM_ID, -1); + startActivity(externalWebViewIntent); + } + }); - SimpleTarget target = new SimpleTarget<Drawable>() { - @Override - public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) { - Drawable test = resource.getCurrent(); - test.setBounds(0, 0, size, size); - mQuotaTextLink.setCompoundDrawablesWithIntrinsicBounds(test, null, null, null); - } + SimpleTarget target = new SimpleTarget<Drawable>() { + @Override + public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) { + Drawable test = resource.getCurrent(); + test.setBounds(0, 0, size, size); + mQuotaTextLink.setCompoundDrawablesWithIntrinsicBounds(test, null, null, null); + } - @Override - public void onLoadFailed(Exception e, Drawable errorDrawable) { - super.onLoadFailed(e, errorDrawable); + @Override + public void onLoadFailed(Exception e, Drawable errorDrawable) { + super.onLoadFailed(e, errorDrawable); - Drawable test = errorDrawable.getCurrent(); - test.setBounds(0, 0, size, size); + Drawable test = errorDrawable.getCurrent(); + test.setBounds(0, 0, size, size); - mQuotaTextLink.setCompoundDrawablesWithIntrinsicBounds(test, null, null, null); - } - }; + mQuotaTextLink.setCompoundDrawablesWithIntrinsicBounds(test, null, null, null); + } + }; - DisplayUtils.downloadIcon(this, firstQuota.iconUrl, target, R.drawable.ic_link_grey, size, size); + DisplayUtils.downloadIcon(this, firstQuota.iconUrl, target, R.drawable.ic_link_grey, size, size); + } else { + mQuotaTextLink.setVisibility(View.INVISIBLE); + } } else { mQuotaTextLink.setVisibility(View.INVISIBLE); } - } else { - mQuotaTextLink.setVisibility(View.INVISIBLE); } } From c5e26733094e463f082ed29b3cd4166b7e46abc2 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 27 Apr 2017 13:05:19 +0200 Subject: [PATCH 791/881] add missing layout param --- src/main/res/layout/upload_list_layout.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/res/layout/upload_list_layout.xml b/src/main/res/layout/upload_list_layout.xml index b520bba8c9..487e794b69 100755 --- a/src/main/res/layout/upload_list_layout.xml +++ b/src/main/res/layout/upload_list_layout.xml @@ -37,7 +37,9 @@ android:id="@+id/upload_list_fragment" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background_color"/> + android:background="@color/background_color" + android:layout_above="@+id/bottom_navigation_view" + android:layout_below="@+id/appbar" /> <android.support.design.widget.BottomNavigationView android:id="@+id/bottom_navigation_view" From 57f0df279ae35ccf523806f803c85d370962cb75 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 27 Apr 2017 14:53:31 +0200 Subject: [PATCH 792/881] use themed color instead of white --- src/main/res/layout/whats_new_activity.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/layout/whats_new_activity.xml b/src/main/res/layout/whats_new_activity.xml index c00c3d4562..2136d3d336 100644 --- a/src/main/res/layout/whats_new_activity.xml +++ b/src/main/res/layout/whats_new_activity.xml @@ -37,7 +37,7 @@ android:gravity="center_vertical" android:text="@string/placeholder_sentence" android:textAppearance="?android:attr/textAppearanceLarge" - android:textColor="@color/white"/> + android:textColor="@color/primary_button_text_color"/> <android.support.v4.view.ViewPager android:id="@+id/contentPanel" From 58566337f6975e99d9356d64d065c7da6624da44 Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Thu, 27 Apr 2017 15:11:04 -0500 Subject: [PATCH 793/881] Fix to load error page from raw --- .../authentication/AuthenticatorActivity.java | 21 ++++++++++++ .../ui/activity/ExternalSiteWebView.java | 33 ++++++++++++------- .../res/raw/custom_error.html} | 0 3 files changed, 42 insertions(+), 12 deletions(-) rename src/{modified/assets/customError.html => main/res/raw/custom_error.html} (100%) diff --git a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index 3a72048608..bf0e466c89 100644 --- a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -74,6 +74,8 @@ import android.view.View.OnTouchListener; import android.view.inputmethod.EditorInfo; import android.webkit.HttpAuthHandler; import android.webkit.SslErrorHandler; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; @@ -115,6 +117,9 @@ import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; import com.owncloud.android.utils.DisplayUtils; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.security.cert.X509Certificate; import java.util.Map; @@ -336,6 +341,22 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity } return false; } + + public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { + BufferedReader buffreader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.custom_error))); + String line; + StringBuilder text = new StringBuilder(); + try { + while (( line = buffreader.readLine()) != null) { + text.append(line); + text.append('\n'); + } + } catch (IOException e) { + Log_OC.e(TAG,e.getMessage()); + return; + } + mLoginWebView.loadData(text.toString(),"text/html; charset=UTF-8", null); + } }); } diff --git a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java index a05072142a..586054756d 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java +++ b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java @@ -28,6 +28,9 @@ import android.support.v4.widget.DrawerLayout; import android.view.MenuItem; import android.view.Window; import android.webkit.WebChromeClient; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -38,8 +41,10 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; /** * This activity shows an URL as a web view @@ -55,6 +60,7 @@ public class ExternalSiteWebView extends FileActivity { private boolean showSidebar = false; private int menuItemId; + private WebView webview; @Override protected void onCreate(Bundle savedInstanceState) { @@ -62,7 +68,7 @@ public class ExternalSiteWebView extends FileActivity { Bundle extras = getIntent().getExtras(); String title = extras.getString(EXTRA_TITLE); - String url = extras.getString(EXTRA_URL); + final String url = extras.getString(EXTRA_URL); menuItemId = extras.getInt(EXTRA_MENU_ITEM_ID); showSidebar = extras.getBoolean(EXTRA_SHOW_SIDEBAR); @@ -72,8 +78,8 @@ public class ExternalSiteWebView extends FileActivity { super.onCreate(savedInstanceState); setContentView(R.layout.externalsite_webview); - WebView webview = (WebView) findViewById(R.id.webView); - WebSettings webSettings = webview.getSettings(); + webview = (WebView) findViewById(R.id.webView); + final WebSettings webSettings = webview.getSettings(); webview.setFocusable(true); webview.setFocusableInTouchMode(true); @@ -125,19 +131,22 @@ public class ExternalSiteWebView extends FileActivity { webview.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - try { - InputStream errorPage = getAssets().open("customError.html"); - if (errorPage != null) { - view.loadUrl("file:///android_asset/customError.html"); - } else { - Toast.makeText(activity, getString(R.string.webview_error) + ": " + description, - Toast.LENGTH_SHORT).show(); + BufferedReader buffreader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.custom_error))); + String line; + StringBuilder text = new StringBuilder(); + try { + while (( line = buffreader.readLine()) != null) { + text.append(line); + text.append('\n'); } } catch (IOException e) { - Toast.makeText(activity, getString(R.string.webview_error) + ": " + description, - Toast.LENGTH_SHORT).show(); + Log_OC.e(TAG,e.getMessage()); + return; } + + webview.loadData(text.toString(),"text/html; charset=UTF-8", null); + } }); diff --git a/src/modified/assets/customError.html b/src/main/res/raw/custom_error.html similarity index 100% rename from src/modified/assets/customError.html rename to src/main/res/raw/custom_error.html From 10b48a21ecf6385355fbb14c0d6546339a4a8025 Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Thu, 27 Apr 2017 15:23:36 -0500 Subject: [PATCH 794/881] Fixing imports --- .../android/authentication/AuthenticatorActivity.java | 2 -- .../owncloud/android/ui/activity/ExternalSiteWebView.java | 7 +------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index bf0e466c89..e6a9304697 100644 --- a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -74,8 +74,6 @@ import android.view.View.OnTouchListener; import android.view.inputmethod.EditorInfo; import android.webkit.HttpAuthHandler; import android.webkit.SslErrorHandler; -import android.webkit.WebResourceRequest; -import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; diff --git a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java index 586054756d..ecd066f738 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java +++ b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java @@ -28,14 +28,10 @@ import android.support.v4.widget.DrawerLayout; import android.view.MenuItem; import android.view.Window; import android.webkit.WebChromeClient; -import android.webkit.WebResourceError; -import android.webkit.WebResourceRequest; -import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; -import android.widget.Toast; import com.owncloud.android.MainApp; import com.owncloud.android.R; @@ -43,7 +39,6 @@ import com.owncloud.android.lib.common.utils.Log_OC; import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; /** @@ -68,7 +63,7 @@ public class ExternalSiteWebView extends FileActivity { Bundle extras = getIntent().getExtras(); String title = extras.getString(EXTRA_TITLE); - final String url = extras.getString(EXTRA_URL); + String url = extras.getString(EXTRA_URL); menuItemId = extras.getInt(EXTRA_MENU_ITEM_ID); showSidebar = extras.getBoolean(EXTRA_SHOW_SIDEBAR); From 7693705ef216d106617dcf6b60b72a0bf7787055 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 28 Apr 2017 09:25:24 +0200 Subject: [PATCH 795/881] adding build variants to doc --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6d3d0e18b6..299cb57dd8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -79,6 +79,12 @@ Our formatter setup is rather simple: * Auto optimize imports (Settings->Editor->Auto Import->Optimize imports on the fly) +### Build variants +There are three build variants +* generic: no Google Stuff, used for FDroid +* gplay: with Google Stuff (Push notification) and Analytics disabled, used for Google Play Store +* modified: custom, with Google Stuff and Analytics enabled, used for branded releases + ## Contribution process * Contribute your code in the branch 'master'. It will give us a better chance to test your code before merging it with stable code. * For your first contribution start a pull request on master. From 50ffaaa9939e1a94572c20b4af65fc919ffa3b15 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 28 Apr 2017 09:26:16 +0200 Subject: [PATCH 796/881] - rename zstore to gplay - only one build.gradle, but with commented lines for gplay/modified --- build.gradle | 18 +- build.gradle.modified | 245 ------------------ src/{zstore => gplay}/AndroidManifest.xml | 0 src/{zstore => gplay}/google-services.json | 0 .../ModifiedAuthenticatorActivity.java | 0 .../firebase/NCFirebaseInstanceIDService.java | 0 .../firebase/NCFirebaseMessagingService.java | 0 .../activity/ModifiedFileDisplayActivity.java | 0 .../android/utils/AnalyticsUtils.java | 0 .../android/utils/GooglePlayUtils.java | 0 .../com/owncloud/android/utils/PushUtils.java | 0 src/{zstore => gplay}/res/values/setup.xml | 0 12 files changed, 9 insertions(+), 254 deletions(-) delete mode 100644 build.gradle.modified rename src/{zstore => gplay}/AndroidManifest.xml (100%) rename src/{zstore => gplay}/google-services.json (100%) rename src/{zstore => gplay}/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java (100%) rename src/{zstore => gplay}/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java (100%) rename src/{zstore => gplay}/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java (100%) rename src/{zstore => gplay}/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java (100%) rename src/{zstore => gplay}/java/com/owncloud/android/utils/AnalyticsUtils.java (100%) rename src/{zstore => gplay}/java/com/owncloud/android/utils/GooglePlayUtils.java (100%) rename src/{zstore => gplay}/java/com/owncloud/android/utils/PushUtils.java (100%) rename src/{zstore => gplay}/res/values/setup.xml (100%) diff --git a/build.gradle b/build.gradle index 4abbb2500c..3490f070fb 100644 --- a/build.gradle +++ b/build.gradle @@ -83,7 +83,10 @@ android { applicationId 'com.nextcloud.client' } - // both need .modified gradle file in place of the regular one + gplay { + applicationId 'com.nextcloud.client' + } + modified { // structure is: // domain tld @@ -91,12 +94,6 @@ android { // .client applicationId 'com.custom.client' } - - zstore { - applicationId 'com.nextcloud.client' - } - - } configurations { @@ -200,13 +197,15 @@ dependencies { compile 'org.greenrobot:eventbus:3.0.0' compile 'com.googlecode.ez-vcard:ez-vcard:0.10.2' +// uncomment for gplay, modified +// compile 'com.google.android.gms:play-services:10.2.1' + compile 'org.parceler:parceler-api:1.1.6' annotationProcessor 'org.parceler:parceler:1.1.6' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.caverock:androidsvg:1.2.1' - modifiedCompile 'com.google.firebase:firebase-core:10.2.0' /// dependencies for local unit tests testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' @@ -242,4 +241,5 @@ tasks.withType(Test) { } } -apply plugin: 'com.google.gms.google-services' +// uncomment for gplay, modified (must be at the bottom) +//apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/build.gradle.modified b/build.gradle.modified deleted file mode 100644 index af9a993cdf..0000000000 --- a/build.gradle.modified +++ /dev/null @@ -1,245 +0,0 @@ -// Gradle build file -// -// This project was started in Eclipse and later moved to Android Studio. In the transition, both IDEs were supported. -// Due to this, the files layout is not the usual in new projects created with Android Studio / gradle. This file -// merges declarations usually split in two separates build.gradle file, one for global settings of the project in -// its root folder, another one for the app module in subfolder of root. - -buildscript { - repositories { - jcenter() - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots/' - } - } - dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' - classpath 'com.google.gms:google-services:3.0.0' - } -} - -apply plugin: 'com.android.application' -apply plugin: 'checkstyle' -apply plugin: 'pmd' -apply plugin: 'findbugs' - -configurations.all { - // check for updates every build - resolutionStrategy.cacheChangingModulesFor 0, 'seconds' -} - -ext { - supportLibraryVersion = '25.0.0' - - travisBuild = System.getenv("TRAVIS") == "true" - - // allows for -Dpre-dex=false to be set - preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) -} - -repositories { - jcenter() - maven { url "https://jitpack.io" } - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots/' - } - - flatDir { - dirs 'libs' - } -} - -android { - lintOptions { - abortOnError true - lintConfig file("${project.rootDir}/lint.xml") - htmlReport true - htmlOutput file("$project.buildDir/reports/lint/lint.html") - } - - dexOptions { - javaMaxHeapSize "4g" - } - - compileSdkVersion 25 - buildToolsVersion '25.0.0' - - defaultConfig { - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - - // arguments to be passed to functional tests - testInstrumentationRunnerArgument "TEST_USER", "\"$System.env.OCTEST_APP_USERNAME\"" - testInstrumentationRunnerArgument "TEST_PASSWORD", "\"$System.env.OCTEST_APP_PASSWORD\"" - testInstrumentationRunnerArgument "TEST_SERVER_URL", "\"$System.env.OCTEST_SERVER_BASE_URL\"" - - multiDexEnabled true - - // adapt structure from Eclipse to Gradle/Android Studio expectations; - // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure - - productFlavors { - // used for f-droid - generic { - applicationId 'com.nextcloud.client' - } - - // both need .modified gradle file in place of the regular one - modified { - // structure is: - // domain tld - // domain name - // .client - applicationId 'com.custom.client' - } - - zstore { - applicationId 'com.nextcloud.client' - } - - - } - - configurations { - modifiedCompile - } - } - - - // adapt structure from Eclipse to Gradle/Android Studio expectations; - // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure - - dexOptions { - // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. - preDexLibraries = preDexEnabled && !travisBuild - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - - lintOptions { - abortOnError false - } - - packagingOptions { - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/LICENSE' - } - - task checkstyle(type: Checkstyle) { - configFile = file("${rootProject.projectDir}/checkstyle.xml") - configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath - source 'src' - include '**/*.java' - exclude '**/gen/**' - classpath = files() - } - - task pmd(type: Pmd) { - ruleSetFiles = files("${project.rootDir}/pmd-ruleset.xml") - ignoreFailures = false - ruleSets = [] - - source 'src' - include '**/*.java' - exclude '**/gen/**' - - reports { - xml.enabled = false - html.enabled = true - xml { - destination "$project.buildDir/reports/pmd/pmd.xml" - } - html { - destination "$project.buildDir/reports/pmd/pmd.html" - } - } - } - - task findbugs(type: FindBugs) { - ignoreFailures = false - effort = "max" - reportLevel = "high" - classes = files("$project.buildDir/intermediates/classes") - excludeFilter = new File("${project.rootDir}/findbugs-filter.xml") - source 'src' - include '**/*.java' - exclude '**/gen/**' - - reports { - xml.enabled = false - html.enabled = true - html { - destination "$project.buildDir/reports/findbugs/findbugs.html" - } - } - classpath = files() - } - check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint' - -} - -dependencies { - /// dependencies for app building - compile name: 'touch-image-view' - compile 'com.android.support:multidex:1.0.1' - - compile 'com.github.nextcloud:android-library:1.0.15' - compile "com.android.support:support-v4:${supportLibraryVersion}" - compile "com.android.support:design:${supportLibraryVersion}" - compile 'com.jakewharton:disklrucache:2.0.2' - compile "com.android.support:appcompat-v7:${supportLibraryVersion}" - compile "com.android.support:cardview-v7:${supportLibraryVersion}" - compile 'com.getbase:floatingactionbutton:1.10.1' - compile 'com.google.code.findbugs:annotations:2.0.1' - compile group: 'commons-io', name: 'commons-io', version: '2.4' - compile 'com.github.evernote:android-job:v1.1.9' - compile 'com.jakewharton:butterknife:8.4.0' - annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' - compile 'org.greenrobot:eventbus:3.0.0' - compile 'com.googlecode.ez-vcard:ez-vcard:0.10.2' - - compile 'com.google.android.gms:play-services:10.2.1' - - compile 'org.parceler:parceler-api:1.1.6' - annotationProcessor 'org.parceler:parceler:1.1.6' - - compile 'com.github.bumptech.glide:glide:3.7.0' - compile 'com.caverock:androidsvg:1.2.1' - /// dependencies for local unit tests - testCompile 'junit:junit:4.12' - testCompile 'org.mockito:mockito-core:1.10.19' - - /// dependencies for instrumented tests - // JUnit4 Rules - androidTestCompile 'com.android.support.test:rules:0.5' - - // Android JUnit Runner - androidTestCompile 'com.android.support.test:runner:0.5' - - // Android Annotation Support - androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" - - // Espresso core - androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' - - // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests - //androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' - // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details - //androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}" - -} - -configurations.all { - resolutionStrategy.cacheChangingModulesFor 0, 'seconds' -} - -tasks.withType(Test) { - /// increased logging for tests - testLogging { - events "passed", "skipped", "failed" - } -} - -apply plugin: 'com.google.gms.google-services' diff --git a/src/zstore/AndroidManifest.xml b/src/gplay/AndroidManifest.xml similarity index 100% rename from src/zstore/AndroidManifest.xml rename to src/gplay/AndroidManifest.xml diff --git a/src/zstore/google-services.json b/src/gplay/google-services.json similarity index 100% rename from src/zstore/google-services.json rename to src/gplay/google-services.json diff --git a/src/zstore/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java b/src/gplay/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java similarity index 100% rename from src/zstore/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java rename to src/gplay/java/com/owncloud/android/authentication/ModifiedAuthenticatorActivity.java diff --git a/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java similarity index 100% rename from src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java rename to src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java diff --git a/src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java similarity index 100% rename from src/zstore/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java rename to src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java diff --git a/src/zstore/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java b/src/gplay/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java similarity index 100% rename from src/zstore/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java rename to src/gplay/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java diff --git a/src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java b/src/gplay/java/com/owncloud/android/utils/AnalyticsUtils.java similarity index 100% rename from src/zstore/java/com/owncloud/android/utils/AnalyticsUtils.java rename to src/gplay/java/com/owncloud/android/utils/AnalyticsUtils.java diff --git a/src/zstore/java/com/owncloud/android/utils/GooglePlayUtils.java b/src/gplay/java/com/owncloud/android/utils/GooglePlayUtils.java similarity index 100% rename from src/zstore/java/com/owncloud/android/utils/GooglePlayUtils.java rename to src/gplay/java/com/owncloud/android/utils/GooglePlayUtils.java diff --git a/src/zstore/java/com/owncloud/android/utils/PushUtils.java b/src/gplay/java/com/owncloud/android/utils/PushUtils.java similarity index 100% rename from src/zstore/java/com/owncloud/android/utils/PushUtils.java rename to src/gplay/java/com/owncloud/android/utils/PushUtils.java diff --git a/src/zstore/res/values/setup.xml b/src/gplay/res/values/setup.xml similarity index 100% rename from src/zstore/res/values/setup.xml rename to src/gplay/res/values/setup.xml From 0994140d55f8b858916547a1e4eea64a898c09ea Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 21 Apr 2017 20:09:59 +0200 Subject: [PATCH 797/881] Progress on magic --- .../activity/ContactsPreferenceActivity.java | 257 +------------- .../ui/activity/FileDisplayActivity.java | 1 + .../ContactsBackup}/ContactListFragment.java | 47 ++- .../ContactsBackupFragment.java | 336 ++++++++++++++++++ src/main/res/layout/contactlist_fragment.xml | 7 +- .../res/layout/contacts_backup_fragment.xml | 88 +++++ src/main/res/layout/contacts_preference.xml | 75 +--- src/main/res/values/strings.xml | 3 +- 8 files changed, 478 insertions(+), 336 deletions(-) rename src/main/java/com/owncloud/android/ui/{activity => fragment/ContactsBackup}/ContactListFragment.java (90%) create mode 100644 src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java create mode 100644 src/main/res/layout/contacts_backup_fragment.xml diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 5315e1c69d..a420d0c23d 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -21,43 +21,27 @@ package com.owncloud.android.ui.activity; -import android.Manifest; import android.accounts.Account; -import android.app.DatePickerDialog; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; -import android.support.v7.widget.SwitchCompat; -import android.view.MenuItem; -import android.view.View; -import android.widget.CompoundButton; -import android.widget.DatePicker; -import android.widget.TextView; -import android.widget.Toast; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsBackupJob; +import com.owncloud.android.ui.fragment.ContactsBackup.ContactsBackupFragment; import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.PermissionUtil; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; import java.util.Set; -import java.util.Vector; /** * This activity shows all settings for contact backup/restore @@ -69,9 +53,6 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag public static final String PREFERENCE_CONTACTS_AUTOMATIC_BACKUP = "PREFERENCE_CONTACTS_AUTOMATIC_BACKUP"; public static final String PREFERENCE_CONTACTS_LAST_BACKUP = "PREFERENCE_CONTACTS_LAST_BACKUP"; - private SwitchCompat backupSwitch; - private SharedPreferences sharedPreferences; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -84,41 +65,10 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag // setup drawer setupDrawer(R.id.nav_contacts); - getSupportActionBar().setTitle(R.string.actionbar_contacts); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); - - backupSwitch = (SwitchCompat) findViewById(R.id.contacts_automatic_backup); - backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); - - backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked && - checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { - // store value - setAutomaticBackup(backupSwitch, true); - - // enable daily job - startContactBackupJob(getAccount()); - } else { - setAutomaticBackup(backupSwitch, false); - - // cancel pending jobs - cancelContactBackupJob(getBaseContext()); - } - } - }); - - // display last backup - TextView lastBackup = (TextView) findViewById(R.id.contacts_last_backup_timestamp); - Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); - - if (lastBackupTimestamp == -1) { - lastBackup.setText(R.string.contacts_preference_backup_never); - } else { - lastBackup.setText(DisplayUtils.getRelativeTimestamp(getBaseContext(), lastBackupTimestamp)); + if (savedInstanceState == null) { + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.add(R.id.frame_container, new ContactsBackupFragment()); + transaction.commit(); } BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view); @@ -129,183 +79,6 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag } } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC) { - for (int index = 0; index < permissions.length; index++) { - if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { - if (grantResults[index] >= 0) { - setAutomaticBackup(backupSwitch, true); - } else { - setAutomaticBackup(backupSwitch, false); - } - - break; - } - } - } - - if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY) { - for (int index = 0; index < permissions.length; index++) { - if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { - if (grantResults[index] >= 0) { - startContactsBackupJob(); - } - - break; - } - } - } - } - - public void backupContacts(View v) { - if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY)) { - startContactsBackupJob(); - } - } - - private void startContactsBackupJob() { - PersistableBundleCompat bundle = new PersistableBundleCompat(); - bundle.putString(ContactsBackupJob.ACCOUNT, getAccount().name); - bundle.putBoolean(ContactsBackupJob.FORCE, true); - - new JobRequest.Builder(ContactsBackupJob.TAG) - .setExtras(bundle) - .setExecutionWindow(3_000L, 10_000L) - .setRequiresCharging(false) - .setPersisted(false) - .setUpdateCurrent(false) - .build() - .schedule(); - - Snackbar.make(findViewById(R.id.contacts_linear_layout), R.string.contacts_preferences_backup_scheduled, - Snackbar.LENGTH_LONG).show(); - } - - private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { - backupSwitch.setChecked(bool); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); - editor.apply(); - } - - private boolean checkAndAskForContactsReadPermission(final int permission) { - // check permissions - if ((PermissionUtil.checkSelfPermission(this, Manifest.permission.READ_CONTACTS))) { - return true; - } else { - // Check if we should show an explanation - if (PermissionUtil.shouldShowRequestPermissionRationale(ContactsPreferenceActivity.this, - android.Manifest.permission.READ_CONTACTS)) { - // Show explanation to the user and then request permission - Snackbar snackbar = Snackbar.make(findViewById(R.id.contacts_linear_layout), R.string.contacts_read_permission, - Snackbar.LENGTH_INDEFINITE) - .setAction(R.string.common_ok, new View.OnClickListener() { - @Override - public void onClick(View v) { - PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this, permission); - } - }); - - DisplayUtils.colorSnackbar(this, snackbar); - - snackbar.show(); - - return false; - } else { - // No explanation needed, request the permission. - PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this, permission); - - return false; - } - } - } - - public void openDate(View v) { - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); - - Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); - - Collections.sort(backupFiles, new Comparator<OCFile>() { - @Override - public int compare(OCFile o1, OCFile o2) { - if (o1.getModificationTimestamp() == o2.getModificationTimestamp()) { - return 0; - } - - if (o1.getModificationTimestamp() > o2.getModificationTimestamp()) { - return 1; - } else { - return -1; - } - } - }); - - Calendar cal = Calendar.getInstance(); - int year = cal.get(Calendar.YEAR); - int month = cal.get(Calendar.MONTH) + 1; - int day = cal.get(Calendar.DAY_OF_MONTH); - - DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = getStorageManager().getFileByPath(backupFolderString); - Vector<OCFile> backupFiles = getStorageManager().getFolderContent(backupFolder, false); - - // find file with modification with date and time between 00:00 and 23:59 - // if more than one file exists, take oldest - Calendar date = Calendar.getInstance(); - date.set(year, month, dayOfMonth); - - // start - date.set(Calendar.HOUR, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 1); - date.set(Calendar.MILLISECOND, 0); - date.set(Calendar.AM_PM, Calendar.AM); - Long start = date.getTimeInMillis(); - - // end - date.set(Calendar.HOUR, 23); - date.set(Calendar.MINUTE, 59); - date.set(Calendar.SECOND, 59); - Long end = date.getTimeInMillis(); - - OCFile backupToRestore = null; - - for (OCFile file : backupFiles) { - if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { - if (backupToRestore == null) { - backupToRestore = file; - } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { - backupToRestore = file; - } - } - } - - if (backupToRestore != null) { - Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, getAccount()); - - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.replace(R.id.contacts_linear_layout, contactListFragment); - transaction.commit(); - } else { - Toast.makeText(ContactsPreferenceActivity.this, R.string.contacts_preferences_no_file_found, - Toast.LENGTH_SHORT).show(); - } - } - }; - - DatePickerDialog datePickerDialog = new DatePickerDialog(this, dateSetListener, year, month, day); - datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); - datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); - - datePickerDialog.show(); - } public static void startContactBackupJob(Account account) { Log_OC.d(TAG, "start daily contacts backup job"); @@ -335,26 +108,6 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - boolean retval; - switch (item.getItemId()) { - case android.R.id.home: - if (isDrawerOpen()) { - closeDrawer(); - } else { - openDrawer(); - } - retval = true; - break; - - default: - retval = super.onOptionsItemSelected(item); - break; - } - return retval; - } - @Override public void showFiles(boolean onDeviceOnly) { super.showFiles(onDeviceOnly); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index fc240c4e5f..311aacb29e 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -83,6 +83,7 @@ import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; import com.owncloud.android.ui.events.TokenPushEvent; +import com.owncloud.android.ui.fragment.ContactsBackup.ContactListFragment; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java similarity index 90% rename from src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java rename to src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java index 074f2574eb..ae9bebee17 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java @@ -19,7 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package com.owncloud.android.ui.activity; +package com.owncloud.android.ui.fragment.ContactsBackup; import android.Manifest; import android.accounts.Account; @@ -38,7 +38,7 @@ import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; -import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -54,6 +54,7 @@ import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsImportJob; import com.owncloud.android.ui.TextDrawable; +import com.owncloud.android.ui.activity.ContactsPreferenceActivity; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.PermissionUtil; @@ -98,6 +99,11 @@ public class ContactListFragment extends FileFragment { View view = inflater.inflate(R.layout.contactlist_fragment, null); setHasOptionsMenu(true); + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + contactsPreferenceActivity.getSupportActionBar().setTitle(R.string.actionbar_contacts_restore); + contactsPreferenceActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + contactsPreferenceActivity.setDrawerIndicatorEnabled(false); + ArrayList<VCard> vCards = new ArrayList<>(); checkedVCards = new HashSet<>(); @@ -136,10 +142,10 @@ public class ContactListFragment extends FileFragment { ContactListAdapter.OnVCardClickListener vCardClickListener = new ContactListAdapter.OnVCardClickListener() { private void setRestoreButton() { if (checkedVCards.size() > 0) { - restoreContacts.setEnabled(true); + restoreContacts.setVisibility(View.VISIBLE); restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); } else { - restoreContacts.setEnabled(false); + restoreContacts.setVisibility(View.GONE); restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); } } @@ -169,13 +175,36 @@ public class ContactListFragment extends FileFragment { } @Override - public void onPrepareOptionsMenu(Menu menu) { - menu.findItem(R.id.action_search).setVisible(false); - menu.findItem(R.id.action_sync_account).setVisible(false); - menu.findItem(R.id.action_sort).setVisible(false); - menu.findItem(R.id.action_switch_view).setVisible(false); + public void onDestroy() { + super.onDestroy(); + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + contactsPreferenceActivity.setDrawerIndicatorEnabled(true); } + public void onResume() { + super.onResume(); + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + contactsPreferenceActivity.setDrawerIndicatorEnabled(false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval; + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + switch (item.getItemId()) { + case android.R.id.home: + contactsPreferenceActivity.onBackPressed(); + retval = true; + break; + default: + retval = super.onOptionsItemSelected(item); + break; + } + return retval; + } + + static class ContactItemViewHolder extends RecyclerView.ViewHolder { private ImageView badge; private CheckedTextView name; diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java new file mode 100644 index 0000000000..f13666f872 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java @@ -0,0 +1,336 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * Copyright (C) 2017 Nextcloud GmbH. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.ui.fragment.ContactsBackup; + +import android.Manifest; +import android.app.DatePickerDialog; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.SwitchCompat; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.DatePicker; +import android.widget.TextView; +import android.widget.Toast; + +import com.evernote.android.job.JobRequest; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.services.ContactsBackupJob; +import com.owncloud.android.ui.activity.ContactsPreferenceActivity; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.PermissionUtil; + +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Vector; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP; +import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP; + +public class ContactsBackupFragment extends FileFragment { + public static final String TAG = ContactsBackupFragment.class.getSimpleName(); + + private SharedPreferences sharedPreferences; + + @BindView(R.id.contacts_automatic_backup) + SwitchCompat backupSwitch; + + @Override + public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.contacts_backup_fragment, null); + ButterKnife.bind(this, view); + + setHasOptionsMenu(true); + + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + contactsPreferenceActivity.getSupportActionBar().setTitle(R.string.actionbar_contacts); + contactsPreferenceActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(contactsPreferenceActivity); + + backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); + + backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked && + checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { + // store value + setAutomaticBackup(backupSwitch, true); + + // enable daily job + contactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); + } else { + setAutomaticBackup(backupSwitch, false); + + // cancel pending jobs + contactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); + } + } + }); + + // display last backup + TextView lastBackup = (TextView) view.findViewById(R.id.contacts_last_backup_timestamp); + Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); + + if (lastBackupTimestamp == -1) { + lastBackup.setText(R.string.contacts_preference_backup_never); + } else { + lastBackup.setText(DisplayUtils.getRelativeTimestamp(contactsPreferenceActivity, lastBackupTimestamp)); + } + + return view; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + boolean retval; + switch (item.getItemId()) { + case android.R.id.home: + if (contactsPreferenceActivity.isDrawerOpen()) { + contactsPreferenceActivity.closeDrawer(); + } else { + contactsPreferenceActivity.openDrawer(); + } + retval = true; + break; + + default: + retval = super.onOptionsItemSelected(item); + break; + } + return retval; + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + setAutomaticBackup(backupSwitch, true); + } else { + setAutomaticBackup(backupSwitch, false); + } + + break; + } + } + } + + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + startContactsBackupJob(); + } + + break; + } + } + } + } + + @OnClick(R.id.contacts_backup_now) + public void backupContacts() { + if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY)) { + startContactsBackupJob(); + } + } + + private void startContactsBackupJob() { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsBackupJob.ACCOUNT, contactsPreferenceActivity.getAccount().name); + bundle.putBoolean(ContactsBackupJob.FORCE, true); + + new JobRequest.Builder(ContactsBackupJob.TAG) + .setExtras(bundle) + .setExecutionWindow(3_000L, 10_000L) + .setRequiresCharging(false) + .setPersisted(false) + .setUpdateCurrent(false) + .build() + .schedule(); + + Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), R.string.contacts_preferences_backup_scheduled, + Snackbar.LENGTH_LONG).show(); + } + + private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { + backupSwitch.setChecked(bool); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); + editor.apply(); + } + + private boolean checkAndAskForContactsReadPermission(final int permission) { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + // check permissions + if ((PermissionUtil.checkSelfPermission(contactsPreferenceActivity, Manifest.permission.READ_CONTACTS))) { + return true; + } else { + // Check if we should show an explanation + if (PermissionUtil.shouldShowRequestPermissionRationale(contactsPreferenceActivity, + android.Manifest.permission.READ_CONTACTS)) { + // Show explanation to the user and then request permission + Snackbar snackbar = Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), + R.string.contacts_read_permission, + Snackbar.LENGTH_INDEFINITE) + .setAction(R.string.common_ok, new View.OnClickListener() { + @Override + public void onClick(View v) { + PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); + } + }); + + DisplayUtils.colorSnackbar(contactsPreferenceActivity, snackbar); + + snackbar.show(); + + return false; + } else { + // No explanation needed, request the permission. + PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); + + return false; + } + } + } + + @OnClick(R.id.contacts_datepicker) + public void openDate() { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); + + Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent(backupFolder, + false); + + Collections.sort(backupFiles, new Comparator<OCFile>() { + @Override + public int compare(OCFile o1, OCFile o2) { + if (o1.getModificationTimestamp() == o2.getModificationTimestamp()) { + return 0; + } + + if (o1.getModificationTimestamp() > o2.getModificationTimestamp()) { + return 1; + } else { + return -1; + } + } + }); + + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH) + 1; + int day = cal.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); + Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent( + backupFolder, false); + + // find file with modification with date and time between 00:00 and 23:59 + // if more than one file exists, take oldest + Calendar date = Calendar.getInstance(); + date.set(year, month, dayOfMonth); + + // start + date.set(Calendar.HOUR, 0); + date.set(Calendar.MINUTE, 0); + date.set(Calendar.SECOND, 1); + date.set(Calendar.MILLISECOND, 0); + date.set(Calendar.AM_PM, Calendar.AM); + Long start = date.getTimeInMillis(); + + // end + date.set(Calendar.HOUR, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + Long end = date.getTimeInMillis(); + + OCFile backupToRestore = null; + + for (OCFile file : backupFiles) { + if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { + if (backupToRestore == null) { + backupToRestore = file; + } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { + backupToRestore = file; + } + } + } + + if (backupToRestore != null) { + Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, + contactsPreferenceActivity.getAccount()); + + FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.frame_container, contactListFragment); + transaction.addToBackStack(null); + transaction.commit(); + } else { + Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_no_file_found, + Toast.LENGTH_SHORT).show(); + } + } + }; + + DatePickerDialog datePickerDialog = new DatePickerDialog(contactsPreferenceActivity, + dateSetListener, year, month, day); + datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); + datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); + + datePickerDialog.show(); + } + +} diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml index f9543f808d..99f6e344d6 100644 --- a/src/main/res/layout/contactlist_fragment.xml +++ b/src/main/res/layout/contactlist_fragment.xml @@ -21,6 +21,7 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" + android:animateLayoutChanges="true" android:orientation="vertical"> <android.support.v7.widget.RecyclerView @@ -34,10 +35,8 @@ android:id="@+id/contactlist_restore_selected" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="@dimen/standard_margin" - android:enabled="false" android:text="@string/contaclist_restore_selected" - android:background="@color/standard_grey" - android:theme="@style/Button.Primary"/> + android:theme="@style/Button.Primary" + android:visibility="gone"/> </LinearLayout> \ No newline at end of file diff --git a/src/main/res/layout/contacts_backup_fragment.xml b/src/main/res/layout/contacts_backup_fragment.xml new file mode 100644 index 0000000000..df4ea000bc --- /dev/null +++ b/src/main/res/layout/contacts_backup_fragment.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/contacts_linear_layout" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <TextView + android:id="@+id/contacts_header_backup" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="@dimen/standard_margin" + android:layout_marginRight="@dimen/standard_margin" + android:layout_marginTop="@dimen/standard_margin" + android:text="@string/contacts_header_backup" + android:textColor="@color/primary" + android:textStyle="bold"/> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/contacts_automatic_backup" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="@dimen/standard_margin" + android:text="@string/contacts_automatic_backup" + android:textAppearance="?android:attr/textAppearanceMedium"/> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <TextView + android:id="@+id/contacts_last_backup" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="@dimen/standard_margin" + android:layout_weight="1" + android:text="@string/contacts_last_backup" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="@color/black"/> + + <TextView + android:id="@+id/contacts_last_backup_timestamp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="@dimen/standard_margin" + android:layout_weight="1" + android:gravity="right" + android:text="@string/contacts_preference_backup_never" + android:textAppearance="?android:attr/textAppearanceMedium"/> + </LinearLayout> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contacts_backup_now" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="@dimen/standard_margin" + android:onClick="backupContacts" + android:text="@string/contacts_backup_button" + android:theme="@style/Button.Primary"/> + + <TextView + android:id="@+id/contacts_header_restore" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="@dimen/standard_margin" + android:layout_marginRight="@dimen/standard_margin" + android:layout_marginTop="@dimen/standard_margin" + android:text="@string/contacts_header_restore" + android:textColor="@color/primary" + android:textStyle="bold"/> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contacts_datepicker" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="@dimen/standard_margin" + android:onClick="openDate" + android:text="@string/contacts_preference_choose_date" + android:theme="@style/Button.Primary"/> + + </LinearLayout> + +</ScrollView> \ No newline at end of file diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml index fb4a59172f..fa6198b444 100644 --- a/src/main/res/layout/contacts_preference.xml +++ b/src/main/res/layout/contacts_preference.xml @@ -28,7 +28,7 @@ <!-- The main content view --> <RelativeLayout - android:id="@+id/contacts_linear_layout" + android:id="@+id/contacts_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> @@ -45,77 +45,12 @@ <TextView android:id="@+id/contacts_header_backup" + <FrameLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/standard_margin" - android:layout_marginRight="@dimen/standard_margin" - android:layout_marginTop="@dimen/standard_margin" - android:text="@string/contacts_header_backup" - android:textColor="@color/primary" - android:textStyle="bold"/> + android:layout_height="match_parent" + android:id="@+id/frame_container"> - <android.support.v7.widget.SwitchCompat - android:id="@+id/contacts_automatic_backup" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="@dimen/standard_margin" - android:text="@string/contacts_automatic_backup" - android:textAppearance="?android:attr/textAppearanceMedium"/> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/contacts_last_backup" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="@dimen/standard_margin" - android:layout_weight="1" - android:text="@string/contacts_last_backup" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="@color/black"/> - - <TextView - android:id="@+id/contacts_last_backup_timestamp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="@dimen/standard_margin" - android:layout_weight="1" - android:gravity="right" - android:text="@string/contacts_preference_backup_never" - android:textAppearance="?android:attr/textAppearanceMedium"/> - </LinearLayout> - - <android.support.v7.widget.AppCompatButton - android:id="@+id/contacts_backup_now" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="@dimen/standard_margin" - android:onClick="backupContacts" - android:text="@string/contacts_backup_button" - android:theme="@style/Button.Primary"/> - - <TextView - android:id="@+id/contacts_header_restore" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/standard_margin" - android:layout_marginRight="@dimen/standard_margin" - android:layout_marginTop="@dimen/standard_margin" - android:text="@string/contacts_header_restore" - android:textColor="@color/primary" - android:textStyle="bold"/> - - <android.support.v7.widget.AppCompatButton - android:id="@+id/contacts_datepacker" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="@dimen/standard_margin" - android:onClick="openDate" - android:text="@string/contacts_preference_choose_date" - android:theme="@style/Button.Primary"/> + </FrameLayout> </LinearLayout> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index d621d8997f..cf435b869d 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -633,7 +633,8 @@ <string name="prefs_category_about">About</string> <string name="actionbar_contacts">Backup contacts</string> - <string name="contacts_backup_button">Now</string> + <string name="actionbar_contacts_restore">Restore contacts</string> + <string name="contacts_backup_button">Backup now</string> <string name="contacts_restore_button">Restore last backup</string> <string name="contacts_header_restore">Restore</string> <string name="contacts_header_backup">Backup</string> From 382ee5dc1c69c0de63af30529a578157b5251a92 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 21 Apr 2017 20:16:10 +0200 Subject: [PATCH 798/881] Small reformat --- .../com/owncloud/android/ui/activity/FileDisplayActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 311aacb29e..8378ab4aa5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -434,7 +434,7 @@ public class FileDisplayActivity extends HookActivity updateActionBarTitleAndHomeButton(file); } else { cleanSecondFragment(); - if (file.isDown() && MimeTypeUtil.isVCard(file.getMimetype())){ + if (file.isDown() && MimeTypeUtil.isVCard(file.getMimetype())) { startContactListFragment(file); } else if (file.isDown() && PreviewTextFragment.canBePreviewed(file)) { startTextPreview(file); @@ -603,7 +603,7 @@ public class FileDisplayActivity extends HookActivity if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) { startMediaPreview(mWaitingToPreview, 0, true); detailsFragmentChanged = true; - } else if (MimeTypeUtil.isVCard(mWaitingToPreview.getMimetype())){ + } else if (MimeTypeUtil.isVCard(mWaitingToPreview.getMimetype())) { startContactListFragment(mWaitingToPreview); detailsFragmentChanged = true; } else if (PreviewTextFragment.canBePreviewed(mWaitingToPreview)) { From 1f5e134fb9bc1ff741cf6b65dffd68ec064e52ee Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 21 Apr 2017 21:17:11 +0200 Subject: [PATCH 799/881] Fix codacy issues --- .../android/ui/activity/ContactsPreferenceActivity.java | 2 +- .../com/owncloud/android/ui/activity/FileDisplayActivity.java | 2 +- .../ui/fragment/ContactsBackup/ContactListFragment.java | 2 +- .../ui/fragment/ContactsBackup/ContactsBackupFragment.java | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index a420d0c23d..24b83cbce0 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -38,7 +38,7 @@ import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsBackupJob; -import com.owncloud.android.ui.fragment.ContactsBackup.ContactsBackupFragment; +import com.owncloud.android.ui.fragment.contactsBackup.ContactsBackupFragment; import com.owncloud.android.ui.fragment.FileFragment; import java.util.Set; diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 8378ab4aa5..a259a41624 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -83,7 +83,7 @@ import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; import com.owncloud.android.ui.events.TokenPushEvent; -import com.owncloud.android.ui.fragment.ContactsBackup.ContactListFragment; +import com.owncloud.android.ui.fragment.contactsBackup.ContactListFragment; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java index ae9bebee17..7de3a74420 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java @@ -19,7 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package com.owncloud.android.ui.fragment.ContactsBackup; +package com.owncloud.android.ui.fragment.contactsBackup; import android.Manifest; import android.accounts.Account; diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java index f13666f872..bbc0415eb3 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java @@ -18,7 +18,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package com.owncloud.android.ui.fragment.ContactsBackup; +package com.owncloud.android.ui.fragment.contactsBackup; import android.Manifest; import android.app.DatePickerDialog; @@ -67,7 +67,7 @@ public class ContactsBackupFragment extends FileFragment { private SharedPreferences sharedPreferences; @BindView(R.id.contacts_automatic_backup) - SwitchCompat backupSwitch; + private SwitchCompat backupSwitch; @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { From dac342cc254d4b6bb83c86e62b8699d601eccf3d Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 21 Apr 2017 21:21:24 +0200 Subject: [PATCH 800/881] Fix pkg name again --- .../android/ui/activity/ContactsPreferenceActivity.java | 2 +- .../com/owncloud/android/ui/activity/FileDisplayActivity.java | 2 +- .../android/ui/fragment/ContactsBackup/ContactListFragment.java | 2 +- .../ui/fragment/ContactsBackup/ContactsBackupFragment.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 24b83cbce0..40b3ce437d 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -38,7 +38,7 @@ import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsBackupJob; -import com.owncloud.android.ui.fragment.contactsBackup.ContactsBackupFragment; +import com.owncloud.android.ui.fragment.contactsbackup.ContactsBackupFragment; import com.owncloud.android.ui.fragment.FileFragment; import java.util.Set; diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index a259a41624..8653923ec7 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -83,7 +83,7 @@ import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; import com.owncloud.android.ui.events.TokenPushEvent; -import com.owncloud.android.ui.fragment.contactsBackup.ContactListFragment; +import com.owncloud.android.ui.fragment.contactsbackup.ContactListFragment; import com.owncloud.android.ui.fragment.ExtendedListFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java index 7de3a74420..c91d9e64dc 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java @@ -19,7 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package com.owncloud.android.ui.fragment.contactsBackup; +package com.owncloud.android.ui.fragment.contactsbackup; import android.Manifest; import android.accounts.Account; diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java index bbc0415eb3..370c156699 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java @@ -18,7 +18,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package com.owncloud.android.ui.fragment.contactsBackup; +package com.owncloud.android.ui.fragment.contactsbackup; import android.Manifest; import android.app.DatePickerDialog; From 16d79b4645ed78a479ce46a6f523b891c700bcae Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 21 Apr 2017 21:27:45 +0200 Subject: [PATCH 801/881] Fix build issue --- .../ui/fragment/ContactsBackup/ContactsBackupFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java index 370c156699..6b0e0bea4e 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java @@ -67,7 +67,7 @@ public class ContactsBackupFragment extends FileFragment { private SharedPreferences sharedPreferences; @BindView(R.id.contacts_automatic_backup) - private SwitchCompat backupSwitch; + public SwitchCompat backupSwitch; @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { From b38866ebc74dcb15ca9e7d817e48c9ef75be12d2 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Mon, 24 Apr 2017 11:51:14 +0200 Subject: [PATCH 802/881] Lots of magic --- src/main/AndroidManifest.xml | 3 +- .../ContactsBackupFragment.java | 152 ++++++++++++++++-- src/main/res/values/strings.xml | 1 + 3 files changed, 142 insertions(+), 14 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 25ab45a60e..6e9239f8e4 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -88,7 +88,8 @@ <activity android:name=".ui.activity.UploadFilesActivity" /> <activity android:name=".ui.activity.ExternalSiteWebView" android:configChanges="orientation|screenSize|keyboardHidden" /> - <activity android:name=".ui.activity.ContactsPreferenceActivity" /> + <activity android:name=".ui.activity.ContactsPreferenceActivity" + android:launchMode="singleInstance"/> <activity android:name=".ui.activity.ReceiveExternalFilesActivity" android:taskAffinity="" diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java index 6b0e0bea4e..666bded011 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java @@ -22,12 +22,15 @@ package com.owncloud.android.ui.fragment.contactsbackup; import android.Manifest; import android.app.DatePickerDialog; +import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.SwitchCompat; import android.view.LayoutInflater; import android.view.MenuItem; @@ -52,6 +55,7 @@ import com.owncloud.android.utils.PermissionUtil; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.Vector; import butterknife.BindView; @@ -69,6 +73,27 @@ public class ContactsBackupFragment extends FileFragment { @BindView(R.id.contacts_automatic_backup) public SwitchCompat backupSwitch; + @BindView(R.id.contacts_header_restore) + public TextView contactsRestoreHeader; + + @BindView(R.id.contacts_datepicker) + public AppCompatButton contactsDatePickerBtn; + + @BindView(R.id.contacts_last_backup_timestamp) + public TextView lastBackup; + + private Date selectedDate = null; + private boolean calendarPickerOpen; + + private DatePickerDialog datePickerDialog; + + + private static final String KEY_CALENDAR_PICKER_OPEN = "IS_CALENDAR_PICKER_OPEN"; + private static final String KEY_CALENDAR_DAY = "CALENDAR_DAY"; + private static final String KEY_CALENDAR_MONTH = "CALENDAR_MONTH"; + private static final String KEY_CALENDAR_YEAR = "CALENDAR_YEAR"; + + @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -95,18 +120,17 @@ public class ContactsBackupFragment extends FileFragment { setAutomaticBackup(backupSwitch, true); // enable daily job - contactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); + ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); } else { setAutomaticBackup(backupSwitch, false); // cancel pending jobs - contactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); + ContactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); } } }); // display last backup - TextView lastBackup = (TextView) view.findViewById(R.id.contacts_last_backup_timestamp); Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); if (lastBackupTimestamp == -1) { @@ -115,9 +139,58 @@ public class ContactsBackupFragment extends FileFragment { lastBackup.setText(DisplayUtils.getRelativeTimestamp(contactsPreferenceActivity, lastBackupTimestamp)); } + if (savedInstanceState != null && savedInstanceState.getBoolean(KEY_CALENDAR_PICKER_OPEN, false)) { + if (savedInstanceState.getInt(KEY_CALENDAR_YEAR, -1) != -1 && + savedInstanceState.getInt(KEY_CALENDAR_MONTH, -1) != -1 && + savedInstanceState.getInt(KEY_CALENDAR_DAY, -1) != -1) { + selectedDate = new Date(savedInstanceState.getInt(KEY_CALENDAR_YEAR), + savedInstanceState.getInt(KEY_CALENDAR_MONTH), savedInstanceState.getInt(KEY_CALENDAR_DAY)); + } + calendarPickerOpen = true; + } + + return view; } + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + + } + + @Override + public void onResume() { + super.onResume(); + + if (calendarPickerOpen) { + if (selectedDate != null) { + openDate(selectedDate); + } else { + openDate(null); + } + } + + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); + + Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent(backupFolder, + false); + + if (backupFiles == null || backupFiles.size() == 0 || + sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1) == -1) { + contactsRestoreHeader.setVisibility(View.GONE); + contactsDatePickerBtn.setVisibility(View.GONE); + } else { + contactsRestoreHeader.setVisibility(View.VISIBLE); + contactsDatePickerBtn.setVisibility(View.VISIBLE); + } + } + + @Override public boolean onOptionsItemSelected(MenuItem item) { final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); @@ -241,7 +314,11 @@ public class ContactsBackupFragment extends FileFragment { } @OnClick(R.id.contacts_datepicker) - public void openDate() { + public void openCleanDate() { + openDate(null); + } + + public void openDate(@Nullable Date savedDate) { final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); @@ -267,13 +344,26 @@ public class ContactsBackupFragment extends FileFragment { }); Calendar cal = Calendar.getInstance(); - int year = cal.get(Calendar.YEAR); - int month = cal.get(Calendar.MONTH) + 1; - int day = cal.get(Calendar.DAY_OF_MONTH); + int year; + int month; + int day; + + if (savedDate == null) { + year = cal.get(Calendar.YEAR); + month = cal.get(Calendar.MONTH) + 1; + day = cal.get(Calendar.DAY_OF_MONTH); + } else { + year = savedDate.getYear(); + month = savedDate.getMonth(); + day = savedDate.getDay(); + } + DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + selectedDate = new Date(year, month, dayOfMonth); + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent( @@ -314,7 +404,8 @@ public class ContactsBackupFragment extends FileFragment { Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, contactsPreferenceActivity.getAccount()); - FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager().beginTransaction(); + FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager(). + beginTransaction(); transaction.replace(R.id.frame_container, contactListFragment); transaction.addToBackStack(null); transaction.commit(); @@ -325,12 +416,47 @@ public class ContactsBackupFragment extends FileFragment { } }; - DatePickerDialog datePickerDialog = new DatePickerDialog(contactsPreferenceActivity, - dateSetListener, year, month, day); - datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); - datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); + if (backupFiles.size() > 0 && backupFiles.lastElement() != null) { + datePickerDialog = new DatePickerDialog(contactsPreferenceActivity, + dateSetListener, year, month, day); + datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); + datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); - datePickerDialog.show(); + datePickerDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + selectedDate = null; + } + }); + + datePickerDialog.show(); + } else { + Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_something_strange_happened, + Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onStop() { + super.onStop(); + if (datePickerDialog != null) { + datePickerDialog.dismiss(); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (datePickerDialog != null) { + outState.putBoolean(KEY_CALENDAR_PICKER_OPEN, datePickerDialog.isShowing()); + + if (datePickerDialog.isShowing()) { + outState.putInt(KEY_CALENDAR_DAY, datePickerDialog.getDatePicker().getDayOfMonth()); + outState.putInt(KEY_CALENDAR_MONTH, datePickerDialog.getDatePicker().getMonth()); + outState.putInt(KEY_CALENDAR_YEAR, datePickerDialog.getDatePicker().getYear()); + } + + } } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index cf435b869d..d31f30f2aa 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -649,6 +649,7 @@ <string name="contacts_preference_choose_date">Choose date</string> <string name="contacts_preference_backup_never">never</string> <string name="contacts_preferences_no_file_found">No file found</string> + <string name="contacts_preferences_something_strange_happened">We can\'t find your last backup!</string> <string name="contacts_preferences_backup_scheduled">Backup scheduled and will start shortly</string> <string name="contacts_preferences_import_scheduled">Import scheduled and will start shortly</string> From 573545d74001191ed1c6928eb5c353b18c97cb15 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Mon, 24 Apr 2017 13:51:55 +0200 Subject: [PATCH 803/881] Fix remembering state/selection/etc --- .../android/services/ContactsImportJob.java | 4 +- .../android/ui/events/VCardToggleEvent.java | 28 +++ .../ContactsBackup/ContactListFragment.java | 181 +++++++++++++----- 3 files changed, 159 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/owncloud/android/ui/events/VCardToggleEvent.java diff --git a/src/main/java/com/owncloud/android/services/ContactsImportJob.java b/src/main/java/com/owncloud/android/services/ContactsImportJob.java index a02b8281fe..39d9e03c81 100644 --- a/src/main/java/com/owncloud/android/services/ContactsImportJob.java +++ b/src/main/java/com/owncloud/android/services/ContactsImportJob.java @@ -64,9 +64,7 @@ public class ContactsImportJob extends Job { vCards.addAll(Ezvcard.parse(file).all()); for (int i = 0; i < intArray.length; i++ ){ - if (intArray[i] == 1){ - operations.insertContact(vCards.get(i)); - } + operations.insertContact(vCards.get(intArray[i])); } } catch (Exception e) { Log_OC.e(TAG, e.getMessage()); diff --git a/src/main/java/com/owncloud/android/ui/events/VCardToggleEvent.java b/src/main/java/com/owncloud/android/ui/events/VCardToggleEvent.java new file mode 100644 index 0000000000..6c06d40cb6 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/events/VCardToggleEvent.java @@ -0,0 +1,28 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.ui.events; + +public class VCardToggleEvent { + public boolean showRestoreButton; + + public VCardToggleEvent(boolean showRestore) { + this.showRestoreButton = showRestore; + } +} diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java index c91d9e64dc..8c57e8db41 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java @@ -30,6 +30,7 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; +import android.os.Handler; import android.provider.ContactsContract; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; @@ -55,10 +56,15 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsImportJob; import com.owncloud.android.ui.TextDrawable; import com.owncloud.android.ui.activity.ContactsPreferenceActivity; +import com.owncloud.android.ui.events.VCardToggleEvent; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.PermissionUtil; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -66,6 +72,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import butterknife.BindView; +import butterknife.ButterKnife; import ezvcard.Ezvcard; import ezvcard.VCard; import ezvcard.property.StructuredName; @@ -80,8 +88,16 @@ public class ContactListFragment extends FileFragment { public static final String FILE_NAME = "FILE_NAME"; public static final String ACCOUNT = "ACCOUNT"; - private RecyclerView recyclerView; - private Set<Integer> checkedVCards; + public static final String CHECKED_ITEMS_ARRAY_KEY = "CHECKED_ITEMS"; + + + @BindView(R.id.contactlist_recyclerview) + public RecyclerView recyclerView; + + @BindView(R.id.contactlist_restore_selected) + public Button restoreContacts; + + private ContactListAdapter contactListAdapter; public static ContactListFragment newInstance(OCFile file, Account account) { ContactListFragment frag = new ContactListFragment(); @@ -97,6 +113,8 @@ public class ContactListFragment extends FileFragment { public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.contactlist_fragment, null); + ButterKnife.bind(this, view); + setHasOptionsMenu(true); ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); @@ -105,7 +123,6 @@ public class ContactListFragment extends FileFragment { contactsPreferenceActivity.setDrawerIndicatorEnabled(false); ArrayList<VCard> vCards = new ArrayList<>(); - checkedVCards = new HashSet<>(); try { OCFile ocFile = getArguments().getParcelable(FILE_NAME); @@ -125,7 +142,6 @@ public class ContactListFragment extends FileFragment { e.printStackTrace(); } - final Button restoreContacts = (Button) view.findViewById(R.id.contactlist_restore_selected); restoreContacts.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -138,42 +154,44 @@ public class ContactListFragment extends FileFragment { recyclerView = (RecyclerView) view.findViewById(R.id.contactlist_recyclerview); - - ContactListAdapter.OnVCardClickListener vCardClickListener = new ContactListAdapter.OnVCardClickListener() { - private void setRestoreButton() { - if (checkedVCards.size() > 0) { - restoreContacts.setVisibility(View.VISIBLE); - restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); - } else { - restoreContacts.setVisibility(View.GONE); - restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); - } + if (savedInstanceState == null) { + contactListAdapter = new ContactListAdapter(getContext(), vCards); + } else { + Set<Integer> checkedItems = new HashSet<>(); + int[] itemsArray = savedInstanceState.getIntArray(CHECKED_ITEMS_ARRAY_KEY); + for (int i = 0; i < itemsArray.length; i++) { + checkedItems.add(itemsArray[i]); } - - @Override - public void onVCardCheck(int position) { - checkedVCards.add(position); - Log_OC.d(TAG, position + " checked"); - - setRestoreButton(); + if (checkedItems.size() > 0) { + onMessageEvent(new VCardToggleEvent(true)); } - - @Override - public void onVCardUncheck(int position) { - checkedVCards.remove(position); - Log_OC.d(TAG, position + " unchecked"); - - setRestoreButton(); - } - }; - - ContactListAdapter contactListAdapter = new ContactListAdapter(getContext(), vCards, vCardClickListener); + contactListAdapter = new ContactListAdapter(getContext(), vCards, checkedItems); + } recyclerView.setAdapter(contactListAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); return view; } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putIntArray(CHECKED_ITEMS_ARRAY_KEY, contactListAdapter.getCheckedIntArray()); + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(VCardToggleEvent event) { + if (event.showRestoreButton) { + restoreContacts.setVisibility(View.VISIBLE); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); + } else { + restoreContacts.setVisibility(View.GONE); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); + } + + } + @Override public void onDestroy() { super.onDestroy(); @@ -187,6 +205,19 @@ public class ContactListFragment extends FileFragment { contactsPreferenceActivity.setDrawerIndicatorEnabled(false); } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + } + + @Override + public void onStop() { + EventBus.getDefault().unregister(this); + super.onStop(); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { boolean retval; @@ -240,19 +271,13 @@ public class ContactListFragment extends FileFragment { } private void importContacts(ContactAccount account) { - int[] intArray = new int[checkedVCards.size()]; - int i = 0; - for (Integer checkedVCard : checkedVCards) { - intArray[i] = checkedVCard; - i++; - } PersistableBundleCompat bundle = new PersistableBundleCompat(); bundle.putString(ContactsImportJob.ACCOUNT_NAME, account.name); bundle.putString(ContactsImportJob.ACCOUNT_TYPE, account.type); bundle.putString(ContactsImportJob.VCARD_FILE_PATH, getFile().getStoragePath()); - bundle.putIntArray(ContactsImportJob.CHECKED_ITEMS_ARRAY, intArray); + bundle.putIntArray(ContactsImportJob.CHECKED_ITEMS_ARRAY, contactListAdapter.getCheckedIntArray()); new JobRequest.Builder(ContactsImportJob.TAG) .setExtras(bundle) @@ -265,6 +290,14 @@ public class ContactListFragment extends FileFragment { Snackbar.make(recyclerView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + getFragmentManager().popBackStack(); + } + }, 1000); } private void getAccountForImport() { @@ -375,15 +408,47 @@ public class ContactListFragment extends FileFragment { class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.ContactItemViewHolder> { private List<VCard> vCards; - private Context context; - private OnVCardClickListener vCardClickListener; + private Set<Integer> checkedVCards; - ContactListAdapter(Context context, List<VCard> vCards, OnVCardClickListener vCardClickListener) { + private Context context; + + ContactListAdapter(Context context, List<VCard> vCards) { this.vCards = vCards; this.context = context; - this.vCardClickListener = vCardClickListener; + this.checkedVCards = new HashSet<>(); } + ContactListAdapter(Context context, List<VCard> vCards, + Set<Integer> checkedVCards) { + this.vCards = vCards; + this.context = context; + this.checkedVCards = checkedVCards; + } + + + public int getCheckedCount() { + if (checkedVCards != null) { + return checkedVCards.size(); + } else { + return 0; + } + } + + public int[] getCheckedIntArray() { + int[] intArray; + if (checkedVCards != null && checkedVCards.size() > 0) { + intArray = new int[checkedVCards.size()]; + int i = 0; + for (int position: checkedVCards) { + intArray[i] = position; + i++; + } + return intArray; + } else { + intArray = new int[0]; + return intArray; + } + } @Override public ContactListFragment.ContactItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @@ -394,9 +459,15 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac @Override public void onBindViewHolder(final ContactListFragment.ContactItemViewHolder holder, final int position) { - final VCard vcard = vCards.get(holder.getAdapterPosition()); + final VCard vcard = vCards.get(position); if (vcard != null) { + + if (checkedVCards.contains(position)) { + holder.getName().setChecked(true); + } else { + holder.getName().setChecked(false); + } // name StructuredName name = vcard.getStructuredName(); if (name != null) { @@ -436,9 +507,22 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac holder.getName().setChecked(!holder.getName().isChecked()); if (holder.getName().isChecked()) { - vCardClickListener.onVCardCheck(holder.getAdapterPosition()); + if (!checkedVCards.contains(position)) { + checkedVCards.add(position); + } + if (checkedVCards.size() == 1) { + EventBus.getDefault().post(new VCardToggleEvent(true)); + } + + } else { - vCardClickListener.onVCardUncheck(holder.getAdapterPosition()); + if (checkedVCards.contains(position)) { + checkedVCards.remove(position); + } + + if (checkedVCards.size() == 0) { + EventBus.getDefault().post(new VCardToggleEvent(false)); + } } } }); @@ -450,9 +534,4 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac return vCards.size(); } - interface OnVCardClickListener { - void onVCardCheck(int position); - - void onVCardUncheck(int position); - } } From e89e290c876d0591a573cbb5e4940a53274174d5 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Mon, 24 Apr 2017 14:04:39 +0200 Subject: [PATCH 804/881] Take more time to pop --- .../android/ui/fragment/ContactsBackup/ContactListFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java index 8c57e8db41..72e166a5aa 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java @@ -297,7 +297,7 @@ public class ContactListFragment extends FileFragment { public void run() { getFragmentManager().popBackStack(); } - }, 1000); + }, 2500); } private void getAccountForImport() { From 7afe91914f3c2397b1d97da2b3ac6ac8b92d8da9 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 24 Apr 2017 17:19:42 +0200 Subject: [PATCH 805/881] remove/re-add for proper win support... --- .../ContactsBackup/ContactListFragment.java | 537 ------------------ .../ContactsBackupFragment.java | 462 --------------- 2 files changed, 999 deletions(-) delete mode 100644 src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java delete mode 100644 src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java deleted file mode 100644 index 72e166a5aa..0000000000 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactListFragment.java +++ /dev/null @@ -1,537 +0,0 @@ -/** - * Nextcloud Android client application - * - * @author Tobias Kaminsky - * Copyright (C) 2017 Tobias Kaminsky - * Copyright (C) 2017 Nextcloud GmbH. - * <p> - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * at your option) any later version. - * <p> - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * <p> - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package com.owncloud.android.ui.fragment.contactsbackup; - -import android.Manifest; -import android.accounts.Account; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Bundle; -import android.os.Handler; -import android.provider.ContactsContract; -import android.support.annotation.NonNull; -import android.support.design.widget.Snackbar; -import android.support.v4.graphics.drawable.RoundedBitmapDrawable; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.CheckedTextView; -import android.widget.ImageView; - -import com.evernote.android.job.JobRequest; -import com.evernote.android.job.util.support.PersistableBundleCompat; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.files.services.FileDownloader; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.services.ContactsImportJob; -import com.owncloud.android.ui.TextDrawable; -import com.owncloud.android.ui.activity.ContactsPreferenceActivity; -import com.owncloud.android.ui.events.VCardToggleEvent; -import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.utils.BitmapUtils; -import com.owncloud.android.utils.PermissionUtil; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import butterknife.BindView; -import butterknife.ButterKnife; -import ezvcard.Ezvcard; -import ezvcard.VCard; -import ezvcard.property.StructuredName; - -/** - * This fragment shows all contacts from a file and allows to import them. - */ - -public class ContactListFragment extends FileFragment { - public static final String TAG = ContactListFragment.class.getSimpleName(); - - public static final String FILE_NAME = "FILE_NAME"; - public static final String ACCOUNT = "ACCOUNT"; - - public static final String CHECKED_ITEMS_ARRAY_KEY = "CHECKED_ITEMS"; - - - @BindView(R.id.contactlist_recyclerview) - public RecyclerView recyclerView; - - @BindView(R.id.contactlist_restore_selected) - public Button restoreContacts; - - private ContactListAdapter contactListAdapter; - - public static ContactListFragment newInstance(OCFile file, Account account) { - ContactListFragment frag = new ContactListFragment(); - Bundle arguments = new Bundle(); - arguments.putParcelable(FILE_NAME, file); - arguments.putParcelable(ACCOUNT, account); - frag.setArguments(arguments); - - return frag; - } - - @Override - public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.contactlist_fragment, null); - ButterKnife.bind(this, view); - - setHasOptionsMenu(true); - - ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - contactsPreferenceActivity.getSupportActionBar().setTitle(R.string.actionbar_contacts_restore); - contactsPreferenceActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); - contactsPreferenceActivity.setDrawerIndicatorEnabled(false); - - ArrayList<VCard> vCards = new ArrayList<>(); - - try { - OCFile ocFile = getArguments().getParcelable(FILE_NAME); - setFile(ocFile); - Account account = getArguments().getParcelable(ACCOUNT); - - if (!ocFile.isDown()) { - Intent i = new Intent(getContext(), FileDownloader.class); - i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); - i.putExtra(FileDownloader.EXTRA_FILE, ocFile); - getContext().startService(i); - } else { - File file = new File(ocFile.getStoragePath()); - vCards.addAll(Ezvcard.parse(file).all()); - } - } catch (IOException e) { - e.printStackTrace(); - } - - restoreContacts.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - if (checkAndAskForContactsWritePermission()) { - getAccountForImport(); - } - } - }); - - recyclerView = (RecyclerView) view.findViewById(R.id.contactlist_recyclerview); - - if (savedInstanceState == null) { - contactListAdapter = new ContactListAdapter(getContext(), vCards); - } else { - Set<Integer> checkedItems = new HashSet<>(); - int[] itemsArray = savedInstanceState.getIntArray(CHECKED_ITEMS_ARRAY_KEY); - for (int i = 0; i < itemsArray.length; i++) { - checkedItems.add(itemsArray[i]); - } - if (checkedItems.size() > 0) { - onMessageEvent(new VCardToggleEvent(true)); - } - contactListAdapter = new ContactListAdapter(getContext(), vCards, checkedItems); - } - recyclerView.setAdapter(contactListAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - - return view; - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putIntArray(CHECKED_ITEMS_ARRAY_KEY, contactListAdapter.getCheckedIntArray()); - } - - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onMessageEvent(VCardToggleEvent event) { - if (event.showRestoreButton) { - restoreContacts.setVisibility(View.VISIBLE); - restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); - } else { - restoreContacts.setVisibility(View.GONE); - restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); - } - - } - - @Override - public void onDestroy() { - super.onDestroy(); - ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - contactsPreferenceActivity.setDrawerIndicatorEnabled(true); - } - - public void onResume() { - super.onResume(); - ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - contactsPreferenceActivity.setDrawerIndicatorEnabled(false); - } - - - @Override - public void onStart() { - super.onStart(); - EventBus.getDefault().register(this); - } - - @Override - public void onStop() { - EventBus.getDefault().unregister(this); - super.onStop(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - boolean retval; - ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - - switch (item.getItemId()) { - case android.R.id.home: - contactsPreferenceActivity.onBackPressed(); - retval = true; - break; - default: - retval = super.onOptionsItemSelected(item); - break; - } - return retval; - } - - - static class ContactItemViewHolder extends RecyclerView.ViewHolder { - private ImageView badge; - private CheckedTextView name; - - ContactItemViewHolder(View itemView) { - super(itemView); - - badge = (ImageView) itemView.findViewById(R.id.contactlist_item_icon); - name = (CheckedTextView) itemView.findViewById(R.id.contactlist_item_name); - - itemView.setTag(this); - } - - public void setVCardListener(View.OnClickListener onClickListener) { - itemView.setOnClickListener(onClickListener); - } - - public ImageView getBadge() { - return badge; - } - - public void setBadge(ImageView badge) { - this.badge = badge; - } - - public CheckedTextView getName() { - return name; - } - - public void setName(CheckedTextView name) { - this.name = name; - } - } - - private void importContacts(ContactAccount account) { - - - PersistableBundleCompat bundle = new PersistableBundleCompat(); - bundle.putString(ContactsImportJob.ACCOUNT_NAME, account.name); - bundle.putString(ContactsImportJob.ACCOUNT_TYPE, account.type); - bundle.putString(ContactsImportJob.VCARD_FILE_PATH, getFile().getStoragePath()); - bundle.putIntArray(ContactsImportJob.CHECKED_ITEMS_ARRAY, contactListAdapter.getCheckedIntArray()); - - new JobRequest.Builder(ContactsImportJob.TAG) - .setExtras(bundle) - .setExecutionWindow(3_000L, 10_000L) - .setRequiresCharging(false) - .setPersisted(false) - .setUpdateCurrent(false) - .build() - .schedule(); - - - Snackbar.make(recyclerView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); - - Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - @Override - public void run() { - getFragmentManager().popBackStack(); - } - }, 2500); - } - - private void getAccountForImport() { - final ArrayList<ContactAccount> accounts = new ArrayList<>(); - - // add local one - accounts.add(new ContactAccount("Local contacts", null, null)); - - Cursor cursor = null; - try { - cursor = getContext().getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, - new String[]{ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE}, - null, - null, - null); - - if (cursor != null && cursor.getCount() > 0) { - while (cursor.moveToNext()) { - String name = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)); - String type = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); - - ContactAccount account = new ContactAccount(name, name, type); - - if (!accounts.contains(account)) { - accounts.add(account); - } - } - - cursor.close(); - } - } catch (Exception e) { - Log_OC.d(TAG, e.getMessage()); - } finally { - cursor.close(); - } - - if (accounts.size() == 1) { - importContacts(accounts.get(0)); - } else { - - ArrayAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, accounts); - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(R.string.contactlist_account_chooser_title) - .setAdapter(adapter, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - importContacts(accounts.get(which)); - } - }).show(); - } - } - - private boolean checkAndAskForContactsWritePermission() { - // check permissions - if (!PermissionUtil.checkSelfPermission(getContext(), Manifest.permission.WRITE_CONTACTS)) { - PermissionUtil.requestWriteContactPermission(this); - return false; - } else { - return true; - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - if (requestCode == PermissionUtil.PERMISSIONS_WRITE_CONTACTS) { - for (int index = 0; index < permissions.length; index++) { - if (Manifest.permission.WRITE_CONTACTS.equalsIgnoreCase(permissions[index])) { - if (grantResults[index] >= 0) { - getAccountForImport(); - } else { - Snackbar.make(getView(), R.string.contactlist_no_permission, Snackbar.LENGTH_LONG).show(); - } - break; - } - } - } - } - - private class ContactAccount { - private String displayName; - private String name; - private String type; - - ContactAccount(String displayName, String name, String type) { - this.displayName = displayName; - this.name = name; - this.type = type; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof ContactAccount) { - ContactAccount other = (ContactAccount) obj; - return this.name.equalsIgnoreCase(other.name) && this.type.equalsIgnoreCase(other.type); - } else { - return false; - } - } - - @Override - public String toString() { - return displayName; - } - } -} - -class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.ContactItemViewHolder> { - private List<VCard> vCards; - private Set<Integer> checkedVCards; - - private Context context; - - ContactListAdapter(Context context, List<VCard> vCards) { - this.vCards = vCards; - this.context = context; - this.checkedVCards = new HashSet<>(); - } - - ContactListAdapter(Context context, List<VCard> vCards, - Set<Integer> checkedVCards) { - this.vCards = vCards; - this.context = context; - this.checkedVCards = checkedVCards; - } - - - public int getCheckedCount() { - if (checkedVCards != null) { - return checkedVCards.size(); - } else { - return 0; - } - } - - public int[] getCheckedIntArray() { - int[] intArray; - if (checkedVCards != null && checkedVCards.size() > 0) { - intArray = new int[checkedVCards.size()]; - int i = 0; - for (int position: checkedVCards) { - intArray[i] = position; - i++; - } - return intArray; - } else { - intArray = new int[0]; - return intArray; - } - } - - @Override - public ContactListFragment.ContactItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(context).inflate(R.layout.contactlist_list_item, parent, false); - - return new ContactListFragment.ContactItemViewHolder(view); - } - - @Override - public void onBindViewHolder(final ContactListFragment.ContactItemViewHolder holder, final int position) { - final VCard vcard = vCards.get(position); - - if (vcard != null) { - - if (checkedVCards.contains(position)) { - holder.getName().setChecked(true); - } else { - holder.getName().setChecked(false); - } - // name - StructuredName name = vcard.getStructuredName(); - if (name != null) { - String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; - String last = (name.getFamily() == null) ? "" : name.getFamily(); - holder.getName().setText(first + last); - } else { - holder.getName().setText(""); - } - - // photo - if (vcard.getPhotos().size() > 0) { - byte[] data = vcard.getPhotos().get(0).getData(); - - Bitmap thumbnail = BitmapFactory.decodeByteArray(data, 0, data.length); - RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(context.getResources(), - thumbnail); - - holder.getBadge().setImageDrawable(drawable); - } else { - try { - holder.getBadge().setImageDrawable( - TextDrawable.createNamedAvatar( - holder.getName().getText().toString(), - context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius) - ) - ); - } catch (Exception e) { - holder.getBadge().setImageResource(R.drawable.ic_user); - } - } - - // Checkbox - holder.setVCardListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - holder.getName().setChecked(!holder.getName().isChecked()); - - if (holder.getName().isChecked()) { - if (!checkedVCards.contains(position)) { - checkedVCards.add(position); - } - if (checkedVCards.size() == 1) { - EventBus.getDefault().post(new VCardToggleEvent(true)); - } - - - } else { - if (checkedVCards.contains(position)) { - checkedVCards.remove(position); - } - - if (checkedVCards.size() == 0) { - EventBus.getDefault().post(new VCardToggleEvent(false)); - } - } - } - }); - } - } - - @Override - public int getItemCount() { - return vCards.size(); - } - -} diff --git a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java deleted file mode 100644 index 666bded011..0000000000 --- a/src/main/java/com/owncloud/android/ui/fragment/ContactsBackup/ContactsBackupFragment.java +++ /dev/null @@ -1,462 +0,0 @@ -/** - * Nextcloud Android client application - * - * @author Mario Danic - * Copyright (C) 2017 Mario Danic - * Copyright (C) 2017 Nextcloud GmbH. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package com.owncloud.android.ui.fragment.contactsbackup; - -import android.Manifest; -import android.app.DatePickerDialog; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.widget.AppCompatButton; -import android.support.v7.widget.SwitchCompat; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CompoundButton; -import android.widget.DatePicker; -import android.widget.TextView; -import android.widget.Toast; - -import com.evernote.android.job.JobRequest; -import com.evernote.android.job.util.support.PersistableBundleCompat; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.PreferenceManager; -import com.owncloud.android.services.ContactsBackupJob; -import com.owncloud.android.ui.activity.ContactsPreferenceActivity; -import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.PermissionUtil; - -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.Vector; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; - -import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP; -import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP; - -public class ContactsBackupFragment extends FileFragment { - public static final String TAG = ContactsBackupFragment.class.getSimpleName(); - - private SharedPreferences sharedPreferences; - - @BindView(R.id.contacts_automatic_backup) - public SwitchCompat backupSwitch; - - @BindView(R.id.contacts_header_restore) - public TextView contactsRestoreHeader; - - @BindView(R.id.contacts_datepicker) - public AppCompatButton contactsDatePickerBtn; - - @BindView(R.id.contacts_last_backup_timestamp) - public TextView lastBackup; - - private Date selectedDate = null; - private boolean calendarPickerOpen; - - private DatePickerDialog datePickerDialog; - - - private static final String KEY_CALENDAR_PICKER_OPEN = "IS_CALENDAR_PICKER_OPEN"; - private static final String KEY_CALENDAR_DAY = "CALENDAR_DAY"; - private static final String KEY_CALENDAR_MONTH = "CALENDAR_MONTH"; - private static final String KEY_CALENDAR_YEAR = "CALENDAR_YEAR"; - - - @Override - public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.contacts_backup_fragment, null); - ButterKnife.bind(this, view); - - setHasOptionsMenu(true); - - final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - - contactsPreferenceActivity.getSupportActionBar().setTitle(R.string.actionbar_contacts); - contactsPreferenceActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(contactsPreferenceActivity); - - backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); - - backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked && - checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { - // store value - setAutomaticBackup(backupSwitch, true); - - // enable daily job - ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); - } else { - setAutomaticBackup(backupSwitch, false); - - // cancel pending jobs - ContactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); - } - } - }); - - // display last backup - Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); - - if (lastBackupTimestamp == -1) { - lastBackup.setText(R.string.contacts_preference_backup_never); - } else { - lastBackup.setText(DisplayUtils.getRelativeTimestamp(contactsPreferenceActivity, lastBackupTimestamp)); - } - - if (savedInstanceState != null && savedInstanceState.getBoolean(KEY_CALENDAR_PICKER_OPEN, false)) { - if (savedInstanceState.getInt(KEY_CALENDAR_YEAR, -1) != -1 && - savedInstanceState.getInt(KEY_CALENDAR_MONTH, -1) != -1 && - savedInstanceState.getInt(KEY_CALENDAR_DAY, -1) != -1) { - selectedDate = new Date(savedInstanceState.getInt(KEY_CALENDAR_YEAR), - savedInstanceState.getInt(KEY_CALENDAR_MONTH), savedInstanceState.getInt(KEY_CALENDAR_DAY)); - } - calendarPickerOpen = true; - } - - - return view; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - - } - - @Override - public void onResume() { - super.onResume(); - - if (calendarPickerOpen) { - if (selectedDate != null) { - openDate(selectedDate); - } else { - openDate(null); - } - } - - final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); - - Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent(backupFolder, - false); - - if (backupFiles == null || backupFiles.size() == 0 || - sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1) == -1) { - contactsRestoreHeader.setVisibility(View.GONE); - contactsDatePickerBtn.setVisibility(View.GONE); - } else { - contactsRestoreHeader.setVisibility(View.VISIBLE); - contactsDatePickerBtn.setVisibility(View.VISIBLE); - } - } - - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - - boolean retval; - switch (item.getItemId()) { - case android.R.id.home: - if (contactsPreferenceActivity.isDrawerOpen()) { - contactsPreferenceActivity.closeDrawer(); - } else { - contactsPreferenceActivity.openDrawer(); - } - retval = true; - break; - - default: - retval = super.onOptionsItemSelected(item); - break; - } - return retval; - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC) { - for (int index = 0; index < permissions.length; index++) { - if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { - if (grantResults[index] >= 0) { - setAutomaticBackup(backupSwitch, true); - } else { - setAutomaticBackup(backupSwitch, false); - } - - break; - } - } - } - - if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY) { - for (int index = 0; index < permissions.length; index++) { - if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { - if (grantResults[index] >= 0) { - startContactsBackupJob(); - } - - break; - } - } - } - } - - @OnClick(R.id.contacts_backup_now) - public void backupContacts() { - if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY)) { - startContactsBackupJob(); - } - } - - private void startContactsBackupJob() { - final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - - PersistableBundleCompat bundle = new PersistableBundleCompat(); - bundle.putString(ContactsBackupJob.ACCOUNT, contactsPreferenceActivity.getAccount().name); - bundle.putBoolean(ContactsBackupJob.FORCE, true); - - new JobRequest.Builder(ContactsBackupJob.TAG) - .setExtras(bundle) - .setExecutionWindow(3_000L, 10_000L) - .setRequiresCharging(false) - .setPersisted(false) - .setUpdateCurrent(false) - .build() - .schedule(); - - Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), R.string.contacts_preferences_backup_scheduled, - Snackbar.LENGTH_LONG).show(); - } - - private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { - backupSwitch.setChecked(bool); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); - editor.apply(); - } - - private boolean checkAndAskForContactsReadPermission(final int permission) { - final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - - // check permissions - if ((PermissionUtil.checkSelfPermission(contactsPreferenceActivity, Manifest.permission.READ_CONTACTS))) { - return true; - } else { - // Check if we should show an explanation - if (PermissionUtil.shouldShowRequestPermissionRationale(contactsPreferenceActivity, - android.Manifest.permission.READ_CONTACTS)) { - // Show explanation to the user and then request permission - Snackbar snackbar = Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), - R.string.contacts_read_permission, - Snackbar.LENGTH_INDEFINITE) - .setAction(R.string.common_ok, new View.OnClickListener() { - @Override - public void onClick(View v) { - PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); - } - }); - - DisplayUtils.colorSnackbar(contactsPreferenceActivity, snackbar); - - snackbar.show(); - - return false; - } else { - // No explanation needed, request the permission. - PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); - - return false; - } - } - } - - @OnClick(R.id.contacts_datepicker) - public void openCleanDate() { - openDate(null); - } - - public void openDate(@Nullable Date savedDate) { - final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - - - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); - - Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent(backupFolder, - false); - - Collections.sort(backupFiles, new Comparator<OCFile>() { - @Override - public int compare(OCFile o1, OCFile o2) { - if (o1.getModificationTimestamp() == o2.getModificationTimestamp()) { - return 0; - } - - if (o1.getModificationTimestamp() > o2.getModificationTimestamp()) { - return 1; - } else { - return -1; - } - } - }); - - Calendar cal = Calendar.getInstance(); - int year; - int month; - int day; - - if (savedDate == null) { - year = cal.get(Calendar.YEAR); - month = cal.get(Calendar.MONTH) + 1; - day = cal.get(Calendar.DAY_OF_MONTH); - } else { - year = savedDate.getYear(); - month = savedDate.getMonth(); - day = savedDate.getDay(); - } - - - DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { - selectedDate = new Date(year, month, dayOfMonth); - - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); - Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent( - backupFolder, false); - - // find file with modification with date and time between 00:00 and 23:59 - // if more than one file exists, take oldest - Calendar date = Calendar.getInstance(); - date.set(year, month, dayOfMonth); - - // start - date.set(Calendar.HOUR, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 1); - date.set(Calendar.MILLISECOND, 0); - date.set(Calendar.AM_PM, Calendar.AM); - Long start = date.getTimeInMillis(); - - // end - date.set(Calendar.HOUR, 23); - date.set(Calendar.MINUTE, 59); - date.set(Calendar.SECOND, 59); - Long end = date.getTimeInMillis(); - - OCFile backupToRestore = null; - - for (OCFile file : backupFiles) { - if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { - if (backupToRestore == null) { - backupToRestore = file; - } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { - backupToRestore = file; - } - } - } - - if (backupToRestore != null) { - Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, - contactsPreferenceActivity.getAccount()); - - FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager(). - beginTransaction(); - transaction.replace(R.id.frame_container, contactListFragment); - transaction.addToBackStack(null); - transaction.commit(); - } else { - Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_no_file_found, - Toast.LENGTH_SHORT).show(); - } - } - }; - - if (backupFiles.size() > 0 && backupFiles.lastElement() != null) { - datePickerDialog = new DatePickerDialog(contactsPreferenceActivity, - dateSetListener, year, month, day); - datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); - datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); - - datePickerDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - selectedDate = null; - } - }); - - datePickerDialog.show(); - } else { - Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_something_strange_happened, - Toast.LENGTH_SHORT).show(); - } - } - - @Override - public void onStop() { - super.onStop(); - if (datePickerDialog != null) { - datePickerDialog.dismiss(); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (datePickerDialog != null) { - outState.putBoolean(KEY_CALENDAR_PICKER_OPEN, datePickerDialog.isShowing()); - - if (datePickerDialog.isShowing()) { - outState.putInt(KEY_CALENDAR_DAY, datePickerDialog.getDatePicker().getDayOfMonth()); - outState.putInt(KEY_CALENDAR_MONTH, datePickerDialog.getDatePicker().getMonth()); - outState.putInt(KEY_CALENDAR_YEAR, datePickerDialog.getDatePicker().getYear()); - } - - } - } - -} From 8d46e8b9d21800a833a0d58d1971963508065791 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 24 Apr 2017 17:20:03 +0200 Subject: [PATCH 806/881] remove/re-add for proper win support... --- .../contactsbackup/ContactListFragment.java | 537 ++++++++++++++++++ .../ContactsBackupFragment.java | 462 +++++++++++++++ 2 files changed, 999 insertions(+) create mode 100644 src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java create mode 100644 src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java new file mode 100644 index 0000000000..72e166a5aa --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java @@ -0,0 +1,537 @@ +/** + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud GmbH. + * <p> + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * <p> + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * <p> + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.ui.fragment.contactsbackup; + +import android.Manifest; +import android.accounts.Account; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.os.Handler; +import android.provider.ContactsContract; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckedTextView; +import android.widget.ImageView; + +import com.evernote.android.job.JobRequest; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.files.services.FileDownloader; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.services.ContactsImportJob; +import com.owncloud.android.ui.TextDrawable; +import com.owncloud.android.ui.activity.ContactsPreferenceActivity; +import com.owncloud.android.ui.events.VCardToggleEvent; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.BitmapUtils; +import com.owncloud.android.utils.PermissionUtil; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import butterknife.BindView; +import butterknife.ButterKnife; +import ezvcard.Ezvcard; +import ezvcard.VCard; +import ezvcard.property.StructuredName; + +/** + * This fragment shows all contacts from a file and allows to import them. + */ + +public class ContactListFragment extends FileFragment { + public static final String TAG = ContactListFragment.class.getSimpleName(); + + public static final String FILE_NAME = "FILE_NAME"; + public static final String ACCOUNT = "ACCOUNT"; + + public static final String CHECKED_ITEMS_ARRAY_KEY = "CHECKED_ITEMS"; + + + @BindView(R.id.contactlist_recyclerview) + public RecyclerView recyclerView; + + @BindView(R.id.contactlist_restore_selected) + public Button restoreContacts; + + private ContactListAdapter contactListAdapter; + + public static ContactListFragment newInstance(OCFile file, Account account) { + ContactListFragment frag = new ContactListFragment(); + Bundle arguments = new Bundle(); + arguments.putParcelable(FILE_NAME, file); + arguments.putParcelable(ACCOUNT, account); + frag.setArguments(arguments); + + return frag; + } + + @Override + public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.contactlist_fragment, null); + ButterKnife.bind(this, view); + + setHasOptionsMenu(true); + + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + contactsPreferenceActivity.getSupportActionBar().setTitle(R.string.actionbar_contacts_restore); + contactsPreferenceActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + contactsPreferenceActivity.setDrawerIndicatorEnabled(false); + + ArrayList<VCard> vCards = new ArrayList<>(); + + try { + OCFile ocFile = getArguments().getParcelable(FILE_NAME); + setFile(ocFile); + Account account = getArguments().getParcelable(ACCOUNT); + + if (!ocFile.isDown()) { + Intent i = new Intent(getContext(), FileDownloader.class); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); + i.putExtra(FileDownloader.EXTRA_FILE, ocFile); + getContext().startService(i); + } else { + File file = new File(ocFile.getStoragePath()); + vCards.addAll(Ezvcard.parse(file).all()); + } + } catch (IOException e) { + e.printStackTrace(); + } + + restoreContacts.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (checkAndAskForContactsWritePermission()) { + getAccountForImport(); + } + } + }); + + recyclerView = (RecyclerView) view.findViewById(R.id.contactlist_recyclerview); + + if (savedInstanceState == null) { + contactListAdapter = new ContactListAdapter(getContext(), vCards); + } else { + Set<Integer> checkedItems = new HashSet<>(); + int[] itemsArray = savedInstanceState.getIntArray(CHECKED_ITEMS_ARRAY_KEY); + for (int i = 0; i < itemsArray.length; i++) { + checkedItems.add(itemsArray[i]); + } + if (checkedItems.size() > 0) { + onMessageEvent(new VCardToggleEvent(true)); + } + contactListAdapter = new ContactListAdapter(getContext(), vCards, checkedItems); + } + recyclerView.setAdapter(contactListAdapter); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + + return view; + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putIntArray(CHECKED_ITEMS_ARRAY_KEY, contactListAdapter.getCheckedIntArray()); + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(VCardToggleEvent event) { + if (event.showRestoreButton) { + restoreContacts.setVisibility(View.VISIBLE); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); + } else { + restoreContacts.setVisibility(View.GONE); + restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); + } + + } + + @Override + public void onDestroy() { + super.onDestroy(); + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + contactsPreferenceActivity.setDrawerIndicatorEnabled(true); + } + + public void onResume() { + super.onResume(); + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + contactsPreferenceActivity.setDrawerIndicatorEnabled(false); + } + + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + } + + @Override + public void onStop() { + EventBus.getDefault().unregister(this); + super.onStop(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval; + ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + switch (item.getItemId()) { + case android.R.id.home: + contactsPreferenceActivity.onBackPressed(); + retval = true; + break; + default: + retval = super.onOptionsItemSelected(item); + break; + } + return retval; + } + + + static class ContactItemViewHolder extends RecyclerView.ViewHolder { + private ImageView badge; + private CheckedTextView name; + + ContactItemViewHolder(View itemView) { + super(itemView); + + badge = (ImageView) itemView.findViewById(R.id.contactlist_item_icon); + name = (CheckedTextView) itemView.findViewById(R.id.contactlist_item_name); + + itemView.setTag(this); + } + + public void setVCardListener(View.OnClickListener onClickListener) { + itemView.setOnClickListener(onClickListener); + } + + public ImageView getBadge() { + return badge; + } + + public void setBadge(ImageView badge) { + this.badge = badge; + } + + public CheckedTextView getName() { + return name; + } + + public void setName(CheckedTextView name) { + this.name = name; + } + } + + private void importContacts(ContactAccount account) { + + + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsImportJob.ACCOUNT_NAME, account.name); + bundle.putString(ContactsImportJob.ACCOUNT_TYPE, account.type); + bundle.putString(ContactsImportJob.VCARD_FILE_PATH, getFile().getStoragePath()); + bundle.putIntArray(ContactsImportJob.CHECKED_ITEMS_ARRAY, contactListAdapter.getCheckedIntArray()); + + new JobRequest.Builder(ContactsImportJob.TAG) + .setExtras(bundle) + .setExecutionWindow(3_000L, 10_000L) + .setRequiresCharging(false) + .setPersisted(false) + .setUpdateCurrent(false) + .build() + .schedule(); + + + Snackbar.make(recyclerView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + getFragmentManager().popBackStack(); + } + }, 2500); + } + + private void getAccountForImport() { + final ArrayList<ContactAccount> accounts = new ArrayList<>(); + + // add local one + accounts.add(new ContactAccount("Local contacts", null, null)); + + Cursor cursor = null; + try { + cursor = getContext().getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, + new String[]{ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE}, + null, + null, + null); + + if (cursor != null && cursor.getCount() > 0) { + while (cursor.moveToNext()) { + String name = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)); + String type = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); + + ContactAccount account = new ContactAccount(name, name, type); + + if (!accounts.contains(account)) { + accounts.add(account); + } + } + + cursor.close(); + } + } catch (Exception e) { + Log_OC.d(TAG, e.getMessage()); + } finally { + cursor.close(); + } + + if (accounts.size() == 1) { + importContacts(accounts.get(0)); + } else { + + ArrayAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, accounts); + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(R.string.contactlist_account_chooser_title) + .setAdapter(adapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + importContacts(accounts.get(which)); + } + }).show(); + } + } + + private boolean checkAndAskForContactsWritePermission() { + // check permissions + if (!PermissionUtil.checkSelfPermission(getContext(), Manifest.permission.WRITE_CONTACTS)) { + PermissionUtil.requestWriteContactPermission(this); + return false; + } else { + return true; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == PermissionUtil.PERMISSIONS_WRITE_CONTACTS) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.WRITE_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + getAccountForImport(); + } else { + Snackbar.make(getView(), R.string.contactlist_no_permission, Snackbar.LENGTH_LONG).show(); + } + break; + } + } + } + } + + private class ContactAccount { + private String displayName; + private String name; + private String type; + + ContactAccount(String displayName, String name, String type) { + this.displayName = displayName; + this.name = name; + this.type = type; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ContactAccount) { + ContactAccount other = (ContactAccount) obj; + return this.name.equalsIgnoreCase(other.name) && this.type.equalsIgnoreCase(other.type); + } else { + return false; + } + } + + @Override + public String toString() { + return displayName; + } + } +} + +class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.ContactItemViewHolder> { + private List<VCard> vCards; + private Set<Integer> checkedVCards; + + private Context context; + + ContactListAdapter(Context context, List<VCard> vCards) { + this.vCards = vCards; + this.context = context; + this.checkedVCards = new HashSet<>(); + } + + ContactListAdapter(Context context, List<VCard> vCards, + Set<Integer> checkedVCards) { + this.vCards = vCards; + this.context = context; + this.checkedVCards = checkedVCards; + } + + + public int getCheckedCount() { + if (checkedVCards != null) { + return checkedVCards.size(); + } else { + return 0; + } + } + + public int[] getCheckedIntArray() { + int[] intArray; + if (checkedVCards != null && checkedVCards.size() > 0) { + intArray = new int[checkedVCards.size()]; + int i = 0; + for (int position: checkedVCards) { + intArray[i] = position; + i++; + } + return intArray; + } else { + intArray = new int[0]; + return intArray; + } + } + + @Override + public ContactListFragment.ContactItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.contactlist_list_item, parent, false); + + return new ContactListFragment.ContactItemViewHolder(view); + } + + @Override + public void onBindViewHolder(final ContactListFragment.ContactItemViewHolder holder, final int position) { + final VCard vcard = vCards.get(position); + + if (vcard != null) { + + if (checkedVCards.contains(position)) { + holder.getName().setChecked(true); + } else { + holder.getName().setChecked(false); + } + // name + StructuredName name = vcard.getStructuredName(); + if (name != null) { + String first = (name.getGiven() == null) ? "" : name.getGiven() + " "; + String last = (name.getFamily() == null) ? "" : name.getFamily(); + holder.getName().setText(first + last); + } else { + holder.getName().setText(""); + } + + // photo + if (vcard.getPhotos().size() > 0) { + byte[] data = vcard.getPhotos().get(0).getData(); + + Bitmap thumbnail = BitmapFactory.decodeByteArray(data, 0, data.length); + RoundedBitmapDrawable drawable = BitmapUtils.bitmapToCircularBitmapDrawable(context.getResources(), + thumbnail); + + holder.getBadge().setImageDrawable(drawable); + } else { + try { + holder.getBadge().setImageDrawable( + TextDrawable.createNamedAvatar( + holder.getName().getText().toString(), + context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius) + ) + ); + } catch (Exception e) { + holder.getBadge().setImageResource(R.drawable.ic_user); + } + } + + // Checkbox + holder.setVCardListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + holder.getName().setChecked(!holder.getName().isChecked()); + + if (holder.getName().isChecked()) { + if (!checkedVCards.contains(position)) { + checkedVCards.add(position); + } + if (checkedVCards.size() == 1) { + EventBus.getDefault().post(new VCardToggleEvent(true)); + } + + + } else { + if (checkedVCards.contains(position)) { + checkedVCards.remove(position); + } + + if (checkedVCards.size() == 0) { + EventBus.getDefault().post(new VCardToggleEvent(false)); + } + } + } + }); + } + } + + @Override + public int getItemCount() { + return vCards.size(); + } + +} diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java new file mode 100644 index 0000000000..666bded011 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -0,0 +1,462 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * Copyright (C) 2017 Nextcloud GmbH. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.ui.fragment.contactsbackup; + +import android.Manifest; +import android.app.DatePickerDialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.AppCompatButton; +import android.support.v7.widget.SwitchCompat; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.DatePicker; +import android.widget.TextView; +import android.widget.Toast; + +import com.evernote.android.job.JobRequest; +import com.evernote.android.job.util.support.PersistableBundleCompat; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.services.ContactsBackupJob; +import com.owncloud.android.ui.activity.ContactsPreferenceActivity; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.PermissionUtil; + +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.Vector; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP; +import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP; + +public class ContactsBackupFragment extends FileFragment { + public static final String TAG = ContactsBackupFragment.class.getSimpleName(); + + private SharedPreferences sharedPreferences; + + @BindView(R.id.contacts_automatic_backup) + public SwitchCompat backupSwitch; + + @BindView(R.id.contacts_header_restore) + public TextView contactsRestoreHeader; + + @BindView(R.id.contacts_datepicker) + public AppCompatButton contactsDatePickerBtn; + + @BindView(R.id.contacts_last_backup_timestamp) + public TextView lastBackup; + + private Date selectedDate = null; + private boolean calendarPickerOpen; + + private DatePickerDialog datePickerDialog; + + + private static final String KEY_CALENDAR_PICKER_OPEN = "IS_CALENDAR_PICKER_OPEN"; + private static final String KEY_CALENDAR_DAY = "CALENDAR_DAY"; + private static final String KEY_CALENDAR_MONTH = "CALENDAR_MONTH"; + private static final String KEY_CALENDAR_YEAR = "CALENDAR_YEAR"; + + + @Override + public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.contacts_backup_fragment, null); + ButterKnife.bind(this, view); + + setHasOptionsMenu(true); + + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + contactsPreferenceActivity.getSupportActionBar().setTitle(R.string.actionbar_contacts); + contactsPreferenceActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(contactsPreferenceActivity); + + backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); + + backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked && + checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { + // store value + setAutomaticBackup(backupSwitch, true); + + // enable daily job + ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); + } else { + setAutomaticBackup(backupSwitch, false); + + // cancel pending jobs + ContactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); + } + } + }); + + // display last backup + Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); + + if (lastBackupTimestamp == -1) { + lastBackup.setText(R.string.contacts_preference_backup_never); + } else { + lastBackup.setText(DisplayUtils.getRelativeTimestamp(contactsPreferenceActivity, lastBackupTimestamp)); + } + + if (savedInstanceState != null && savedInstanceState.getBoolean(KEY_CALENDAR_PICKER_OPEN, false)) { + if (savedInstanceState.getInt(KEY_CALENDAR_YEAR, -1) != -1 && + savedInstanceState.getInt(KEY_CALENDAR_MONTH, -1) != -1 && + savedInstanceState.getInt(KEY_CALENDAR_DAY, -1) != -1) { + selectedDate = new Date(savedInstanceState.getInt(KEY_CALENDAR_YEAR), + savedInstanceState.getInt(KEY_CALENDAR_MONTH), savedInstanceState.getInt(KEY_CALENDAR_DAY)); + } + calendarPickerOpen = true; + } + + + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + + } + + @Override + public void onResume() { + super.onResume(); + + if (calendarPickerOpen) { + if (selectedDate != null) { + openDate(selectedDate); + } else { + openDate(null); + } + } + + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); + + Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent(backupFolder, + false); + + if (backupFiles == null || backupFiles.size() == 0 || + sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1) == -1) { + contactsRestoreHeader.setVisibility(View.GONE); + contactsDatePickerBtn.setVisibility(View.GONE); + } else { + contactsRestoreHeader.setVisibility(View.VISIBLE); + contactsDatePickerBtn.setVisibility(View.VISIBLE); + } + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + boolean retval; + switch (item.getItemId()) { + case android.R.id.home: + if (contactsPreferenceActivity.isDrawerOpen()) { + contactsPreferenceActivity.closeDrawer(); + } else { + contactsPreferenceActivity.openDrawer(); + } + retval = true; + break; + + default: + retval = super.onOptionsItemSelected(item); + break; + } + return retval; + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + setAutomaticBackup(backupSwitch, true); + } else { + setAutomaticBackup(backupSwitch, false); + } + + break; + } + } + } + + if (requestCode == PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY) { + for (int index = 0; index < permissions.length; index++) { + if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { + if (grantResults[index] >= 0) { + startContactsBackupJob(); + } + + break; + } + } + } + } + + @OnClick(R.id.contacts_backup_now) + public void backupContacts() { + if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY)) { + startContactsBackupJob(); + } + } + + private void startContactsBackupJob() { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + PersistableBundleCompat bundle = new PersistableBundleCompat(); + bundle.putString(ContactsBackupJob.ACCOUNT, contactsPreferenceActivity.getAccount().name); + bundle.putBoolean(ContactsBackupJob.FORCE, true); + + new JobRequest.Builder(ContactsBackupJob.TAG) + .setExtras(bundle) + .setExecutionWindow(3_000L, 10_000L) + .setRequiresCharging(false) + .setPersisted(false) + .setUpdateCurrent(false) + .build() + .schedule(); + + Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), R.string.contacts_preferences_backup_scheduled, + Snackbar.LENGTH_LONG).show(); + } + + private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { + backupSwitch.setChecked(bool); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); + editor.apply(); + } + + private boolean checkAndAskForContactsReadPermission(final int permission) { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + // check permissions + if ((PermissionUtil.checkSelfPermission(contactsPreferenceActivity, Manifest.permission.READ_CONTACTS))) { + return true; + } else { + // Check if we should show an explanation + if (PermissionUtil.shouldShowRequestPermissionRationale(contactsPreferenceActivity, + android.Manifest.permission.READ_CONTACTS)) { + // Show explanation to the user and then request permission + Snackbar snackbar = Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), + R.string.contacts_read_permission, + Snackbar.LENGTH_INDEFINITE) + .setAction(R.string.common_ok, new View.OnClickListener() { + @Override + public void onClick(View v) { + PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); + } + }); + + DisplayUtils.colorSnackbar(contactsPreferenceActivity, snackbar); + + snackbar.show(); + + return false; + } else { + // No explanation needed, request the permission. + PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); + + return false; + } + } + } + + @OnClick(R.id.contacts_datepicker) + public void openCleanDate() { + openDate(null); + } + + public void openDate(@Nullable Date savedDate) { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); + + Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent(backupFolder, + false); + + Collections.sort(backupFiles, new Comparator<OCFile>() { + @Override + public int compare(OCFile o1, OCFile o2) { + if (o1.getModificationTimestamp() == o2.getModificationTimestamp()) { + return 0; + } + + if (o1.getModificationTimestamp() > o2.getModificationTimestamp()) { + return 1; + } else { + return -1; + } + } + }); + + Calendar cal = Calendar.getInstance(); + int year; + int month; + int day; + + if (savedDate == null) { + year = cal.get(Calendar.YEAR); + month = cal.get(Calendar.MONTH) + 1; + day = cal.get(Calendar.DAY_OF_MONTH); + } else { + year = savedDate.getYear(); + month = savedDate.getMonth(); + day = savedDate.getDay(); + } + + + DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + selectedDate = new Date(year, month, dayOfMonth); + + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); + Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent( + backupFolder, false); + + // find file with modification with date and time between 00:00 and 23:59 + // if more than one file exists, take oldest + Calendar date = Calendar.getInstance(); + date.set(year, month, dayOfMonth); + + // start + date.set(Calendar.HOUR, 0); + date.set(Calendar.MINUTE, 0); + date.set(Calendar.SECOND, 1); + date.set(Calendar.MILLISECOND, 0); + date.set(Calendar.AM_PM, Calendar.AM); + Long start = date.getTimeInMillis(); + + // end + date.set(Calendar.HOUR, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + Long end = date.getTimeInMillis(); + + OCFile backupToRestore = null; + + for (OCFile file : backupFiles) { + if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { + if (backupToRestore == null) { + backupToRestore = file; + } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { + backupToRestore = file; + } + } + } + + if (backupToRestore != null) { + Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, + contactsPreferenceActivity.getAccount()); + + FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager(). + beginTransaction(); + transaction.replace(R.id.frame_container, contactListFragment); + transaction.addToBackStack(null); + transaction.commit(); + } else { + Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_no_file_found, + Toast.LENGTH_SHORT).show(); + } + } + }; + + if (backupFiles.size() > 0 && backupFiles.lastElement() != null) { + datePickerDialog = new DatePickerDialog(contactsPreferenceActivity, + dateSetListener, year, month, day); + datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); + datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); + + datePickerDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + selectedDate = null; + } + }); + + datePickerDialog.show(); + } else { + Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_something_strange_happened, + Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onStop() { + super.onStop(); + if (datePickerDialog != null) { + datePickerDialog.dismiss(); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (datePickerDialog != null) { + outState.putBoolean(KEY_CALENDAR_PICKER_OPEN, datePickerDialog.isShowing()); + + if (datePickerDialog.isShowing()) { + outState.putInt(KEY_CALENDAR_DAY, datePickerDialog.getDatePicker().getDayOfMonth()); + outState.putInt(KEY_CALENDAR_MONTH, datePickerDialog.getDatePicker().getMonth()); + outState.putInt(KEY_CALENDAR_YEAR, datePickerDialog.getDatePicker().getYear()); + } + + } + } + +} From 7a5409f0e8323a6ef902d89a36dcc27522c8dc20 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Mon, 24 Apr 2017 17:33:20 +0200 Subject: [PATCH 807/881] extract listener to class --- .../ContactsBackupFragment.java | 126 ++++++++---------- 1 file changed, 59 insertions(+), 67 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index 666bded011..6be226f64f 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -65,7 +65,7 @@ import butterknife.OnClick; import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP; import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP; -public class ContactsBackupFragment extends FileFragment { +public class ContactsBackupFragment extends FileFragment implements DatePickerDialog.OnDateSetListener{ public static final String TAG = ContactsBackupFragment.class.getSimpleName(); private SharedPreferences sharedPreferences; @@ -149,15 +149,12 @@ public class ContactsBackupFragment extends FileFragment { calendarPickerOpen = true; } - return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - - } @Override @@ -267,7 +264,8 @@ public class ContactsBackupFragment extends FileFragment { .build() .schedule(); - Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), R.string.contacts_preferences_backup_scheduled, + Snackbar.make(getView().findViewById(R.id.contacts_linear_layout), + R.string.contacts_preferences_backup_scheduled, Snackbar.LENGTH_LONG).show(); } @@ -321,7 +319,6 @@ public class ContactsBackupFragment extends FileFragment { public void openDate(@Nullable Date savedDate) { final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); @@ -358,67 +355,8 @@ public class ContactsBackupFragment extends FileFragment { day = savedDate.getDay(); } - - DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { - selectedDate = new Date(year, month, dayOfMonth); - - String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; - OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); - Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent( - backupFolder, false); - - // find file with modification with date and time between 00:00 and 23:59 - // if more than one file exists, take oldest - Calendar date = Calendar.getInstance(); - date.set(year, month, dayOfMonth); - - // start - date.set(Calendar.HOUR, 0); - date.set(Calendar.MINUTE, 0); - date.set(Calendar.SECOND, 1); - date.set(Calendar.MILLISECOND, 0); - date.set(Calendar.AM_PM, Calendar.AM); - Long start = date.getTimeInMillis(); - - // end - date.set(Calendar.HOUR, 23); - date.set(Calendar.MINUTE, 59); - date.set(Calendar.SECOND, 59); - Long end = date.getTimeInMillis(); - - OCFile backupToRestore = null; - - for (OCFile file : backupFiles) { - if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { - if (backupToRestore == null) { - backupToRestore = file; - } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { - backupToRestore = file; - } - } - } - - if (backupToRestore != null) { - Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, - contactsPreferenceActivity.getAccount()); - - FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager(). - beginTransaction(); - transaction.replace(R.id.frame_container, contactListFragment); - transaction.addToBackStack(null); - transaction.commit(); - } else { - Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_no_file_found, - Toast.LENGTH_SHORT).show(); - } - } - }; - if (backupFiles.size() > 0 && backupFiles.lastElement() != null) { - datePickerDialog = new DatePickerDialog(contactsPreferenceActivity, - dateSetListener, year, month, day); + datePickerDialog = new DatePickerDialog(contactsPreferenceActivity, this, year, month, day); datePickerDialog.getDatePicker().setMaxDate(backupFiles.lastElement().getModificationTimestamp()); datePickerDialog.getDatePicker().setMinDate(backupFiles.firstElement().getModificationTimestamp()); @@ -455,8 +393,62 @@ public class ContactsBackupFragment extends FileFragment { outState.putInt(KEY_CALENDAR_MONTH, datePickerDialog.getDatePicker().getMonth()); outState.putInt(KEY_CALENDAR_YEAR, datePickerDialog.getDatePicker().getYear()); } - } } + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + selectedDate = new Date(year, month, dayOfMonth); + + String backupFolderString = getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; + OCFile backupFolder = contactsPreferenceActivity.getStorageManager().getFileByPath(backupFolderString); + Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent( + backupFolder, false); + + // find file with modification with date and time between 00:00 and 23:59 + // if more than one file exists, take oldest + Calendar date = Calendar.getInstance(); + date.set(year, month, dayOfMonth); + + // start + date.set(Calendar.HOUR, 0); + date.set(Calendar.MINUTE, 0); + date.set(Calendar.SECOND, 1); + date.set(Calendar.MILLISECOND, 0); + date.set(Calendar.AM_PM, Calendar.AM); + Long start = date.getTimeInMillis(); + + // end + date.set(Calendar.HOUR, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + Long end = date.getTimeInMillis(); + + OCFile backupToRestore = null; + + for (OCFile file : backupFiles) { + if (start < file.getModificationTimestamp() && end > file.getModificationTimestamp()) { + if (backupToRestore == null) { + backupToRestore = file; + } else if (backupToRestore.getModificationTimestamp() < file.getModificationTimestamp()) { + backupToRestore = file; + } + } + } + + if (backupToRestore != null) { + Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, + contactsPreferenceActivity.getAccount()); + + FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager(). + beginTransaction(); + transaction.replace(R.id.frame_container, contactListFragment); + transaction.addToBackStack(null); + transaction.commit(); + } else { + Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_no_file_found, + Toast.LENGTH_SHORT).show(); + } + } } From 097b05d59a3fc2b82500951ea1bca1fbf6ac1cee Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 27 Apr 2017 09:46:50 +0200 Subject: [PATCH 808/881] fixes after rebase --- .../ui/activity/ContactsPreferenceActivity.java | 8 +++----- src/main/res/layout/contacts_preference.xml | 11 +---------- src/main/res/values/setup.xml | 2 +- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 40b3ce437d..89232bb5c4 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -25,11 +25,9 @@ import android.accounts.Account; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; -import android.support.design.widget.Snackbar; -import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.view.View; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; @@ -38,8 +36,9 @@ import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsBackupJob; -import com.owncloud.android.ui.fragment.contactsbackup.ContactsBackupFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.ui.fragment.contactsbackup.ContactsBackupFragment; +import com.owncloud.android.utils.DisplayUtils; import java.util.Set; @@ -79,7 +78,6 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag } } - public static void startContactBackupJob(Account account) { Log_OC.d(TAG, "start daily contacts backup job"); diff --git a/src/main/res/layout/contacts_preference.xml b/src/main/res/layout/contacts_preference.xml index fa6198b444..217ceb8b1b 100644 --- a/src/main/res/layout/contacts_preference.xml +++ b/src/main/res/layout/contacts_preference.xml @@ -36,24 +36,15 @@ <include layout="@layout/toolbar_standard"/> - <LinearLayout + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/bottom_navigation_view" android:layout_below="@+id/appbar" - android:orientation="vertical"> - - <TextView - android:id="@+id/contacts_header_backup" - <FrameLayout - android:layout_width="match_parent" - android:layout_height="match_parent" android:id="@+id/frame_container"> </FrameLayout> - </LinearLayout> - <android.support.design.widget.BottomNavigationView android:id="@+id/bottom_navigation_view" android:layout_width="match_parent" diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index e62dc23d57..cdfa9651a1 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -86,7 +86,7 @@ <bool name="videos_enabled">false</bool> <!-- Bottom toolbar --> - <bool name="bottom_toolbar_enabled">false</bool> + <bool name="bottom_toolbar_enabled">true</bool> <!-- Help, imprint and feedback, and other things --> <bool name="fingerprint_enabled">true</bool> From 841ad6c348a13bb82961dde5b05e63da0e17635e Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 27 Apr 2017 09:55:01 +0200 Subject: [PATCH 809/881] minor code review fixes --- .../contactsbackup/ContactListFragment.java | 20 ++++--------------- src/main/res/layout/contactlist_list_item.xml | 1 - .../res/layout/contacts_backup_fragment.xml | 19 ++++++++++++++++++ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java index 72e166a5aa..3339db9e9b 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java @@ -81,7 +81,6 @@ import ezvcard.property.StructuredName; /** * This fragment shows all contacts from a file and allows to import them. */ - public class ContactListFragment extends FileFragment { public static final String TAG = ContactListFragment.class.getSimpleName(); @@ -90,7 +89,6 @@ public class ContactListFragment extends FileFragment { public static final String CHECKED_ITEMS_ARRAY_KEY = "CHECKED_ITEMS"; - @BindView(R.id.contactlist_recyclerview) public RecyclerView recyclerView; @@ -139,7 +137,7 @@ public class ContactListFragment extends FileFragment { vCards.addAll(Ezvcard.parse(file).all()); } } catch (IOException e) { - e.printStackTrace(); + Log_OC.e(TAG, "Error processing contacts file!", e); } restoreContacts.setOnClickListener(new View.OnClickListener() { @@ -179,7 +177,6 @@ public class ContactListFragment extends FileFragment { outState.putIntArray(CHECKED_ITEMS_ARRAY_KEY, contactListAdapter.getCheckedIntArray()); } - @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(VCardToggleEvent event) { if (event.showRestoreButton) { @@ -189,7 +186,6 @@ public class ContactListFragment extends FileFragment { restoreContacts.setVisibility(View.GONE); restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); } - } @Override @@ -205,7 +201,6 @@ public class ContactListFragment extends FileFragment { contactsPreferenceActivity.setDrawerIndicatorEnabled(false); } - @Override public void onStart() { super.onStart(); @@ -235,7 +230,6 @@ public class ContactListFragment extends FileFragment { return retval; } - static class ContactItemViewHolder extends RecyclerView.ViewHolder { private ImageView badge; private CheckedTextView name; @@ -271,8 +265,6 @@ public class ContactListFragment extends FileFragment { } private void importContacts(ContactAccount account) { - - PersistableBundleCompat bundle = new PersistableBundleCompat(); bundle.putString(ContactsImportJob.ACCOUNT_NAME, account.name); bundle.putString(ContactsImportJob.ACCOUNT_TYPE, account.type); @@ -288,7 +280,6 @@ public class ContactListFragment extends FileFragment { .build() .schedule(); - Snackbar.make(recyclerView, R.string.contacts_preferences_import_scheduled, Snackbar.LENGTH_LONG).show(); Handler handler = new Handler(); @@ -331,13 +322,14 @@ public class ContactListFragment extends FileFragment { } catch (Exception e) { Log_OC.d(TAG, e.getMessage()); } finally { - cursor.close(); + if (cursor != null) { + cursor.close(); + } } if (accounts.size() == 1) { importContacts(accounts.get(0)); } else { - ArrayAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, accounts); AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(R.string.contactlist_account_chooser_title) @@ -425,7 +417,6 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac this.checkedVCards = checkedVCards; } - public int getCheckedCount() { if (checkedVCards != null) { return checkedVCards.size(); @@ -513,8 +504,6 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac if (checkedVCards.size() == 1) { EventBus.getDefault().post(new VCardToggleEvent(true)); } - - } else { if (checkedVCards.contains(position)) { checkedVCards.remove(position); @@ -533,5 +522,4 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac public int getItemCount() { return vCards.size(); } - } diff --git a/src/main/res/layout/contactlist_list_item.xml b/src/main/res/layout/contactlist_list_item.xml index 96f5c620fa..6d5ad5ed38 100644 --- a/src/main/res/layout/contactlist_list_item.xml +++ b/src/main/res/layout/contactlist_list_item.xml @@ -18,7 +18,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. --> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="@dimen/standard_list_item_size"> diff --git a/src/main/res/layout/contacts_backup_fragment.xml b/src/main/res/layout/contacts_backup_fragment.xml index df4ea000bc..6f2518cb16 100644 --- a/src/main/res/layout/contacts_backup_fragment.xml +++ b/src/main/res/layout/contacts_backup_fragment.xml @@ -1,4 +1,23 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + License as published by the Free Software Foundation; either + version 3 of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU AFFERO GENERAL PUBLIC LICENSE for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see <http://www.gnu.org/licenses/>. +--> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/contacts_linear_layout" android:layout_width="match_parent" From 85846e154ff3f13796ad5e5a3fc6ed10e4728f00 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 27 Apr 2017 09:56:53 +0200 Subject: [PATCH 810/881] revert bottom_toolbar_enabled to false --- src/main/res/values/setup.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index cdfa9651a1..e62dc23d57 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -86,7 +86,7 @@ <bool name="videos_enabled">false</bool> <!-- Bottom toolbar --> - <bool name="bottom_toolbar_enabled">true</bool> + <bool name="bottom_toolbar_enabled">false</bool> <!-- Help, imprint and feedback, and other things --> <bool name="fingerprint_enabled">true</bool> From fc2f762bb264bb50db148bf72e1b1b52d624e1ec Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 27 Apr 2017 10:27:28 +0200 Subject: [PATCH 811/881] Fix restore appearance --- .../ui/fragment/contactsbackup/ContactsBackupFragment.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index 6be226f64f..2d6c319a62 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -177,8 +177,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi Vector<OCFile> backupFiles = contactsPreferenceActivity.getStorageManager().getFolderContent(backupFolder, false); - if (backupFiles == null || backupFiles.size() == 0 || - sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1) == -1) { + if (backupFiles == null || backupFiles.size() == 0) { contactsRestoreHeader.setVisibility(View.GONE); contactsDatePickerBtn.setVisibility(View.GONE); } else { From cb00d3f4227830d5fd02ddd14a11b2a74561694b Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 27 Apr 2017 10:50:50 +0200 Subject: [PATCH 812/881] Fix enable automatic job --- .../ContactsBackupFragment.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index 2d6c319a62..65bbcf0e0f 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -65,7 +65,7 @@ import butterknife.OnClick; import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP; import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP; -public class ContactsBackupFragment extends FileFragment implements DatePickerDialog.OnDateSetListener{ +public class ContactsBackupFragment extends FileFragment implements DatePickerDialog.OnDateSetListener { public static final String TAG = ContactsBackupFragment.class.getSimpleName(); private SharedPreferences sharedPreferences; @@ -117,15 +117,9 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi if (isChecked && checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { // store value - setAutomaticBackup(backupSwitch, true); - - // enable daily job - ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); + setAutomaticBackup(true); } else { - setAutomaticBackup(backupSwitch, false); - - // cancel pending jobs - ContactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); + setAutomaticBackup(false); } } }); @@ -217,9 +211,9 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi for (int index = 0; index < permissions.length; index++) { if (Manifest.permission.READ_CONTACTS.equalsIgnoreCase(permissions[index])) { if (grantResults[index] >= 0) { - setAutomaticBackup(backupSwitch, true); + setAutomaticBackup(true); } else { - setAutomaticBackup(backupSwitch, false); + setAutomaticBackup(false); } break; @@ -268,8 +262,16 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi Snackbar.LENGTH_LONG).show(); } - private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { - backupSwitch.setChecked(bool); + private void setAutomaticBackup(final boolean bool) { + + final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + + if (bool) { + ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); + } else { + ContactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); + } + SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); editor.apply(); From 3522d28fbfa53bd5c3c20e27699abe44b98094d7 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 27 Apr 2017 11:10:11 +0200 Subject: [PATCH 813/881] Fix all issues --- .../ui/activity/ContactsPreferenceActivity.java | 14 +++++++++++++- .../android/ui/activity/FileDisplayActivity.java | 11 +++++------ .../contactsbackup/ContactListFragment.java | 8 ++++++-- .../contactsbackup/ContactsBackupFragment.java | 2 -- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 89232bb5c4..e9ae39aac9 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -37,9 +37,12 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsBackupJob; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.ui.fragment.contactsbackup.ContactListFragment; import com.owncloud.android.ui.fragment.contactsbackup.ContactsBackupFragment; import com.owncloud.android.utils.DisplayUtils; +import org.parceler.Parcels; + import java.util.Set; /** @@ -64,9 +67,18 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag // setup drawer setupDrawer(R.id.nav_contacts); + Intent intent = getIntent(); if (savedInstanceState == null) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.add(R.id.frame_container, new ContactsBackupFragment()); + if (intent == null || intent.getParcelableExtra(ContactListFragment.FILE_NAME) == null || + intent.getParcelableExtra(ContactListFragment.ACCOUNT) == null) { + transaction.add(R.id.frame_container, new ContactsBackupFragment()); + } else { + OCFile file = Parcels.unwrap(intent.getParcelableExtra(ContactListFragment.FILE_NAME)); + Account account = Parcels.unwrap(intent.getParcelableExtra(ContactListFragment.ACCOUNT)); + ContactListFragment contactListFragment = ContactListFragment.newInstance(file, account); + transaction.add(R.id.frame_container, contactListFragment); + } transaction.commit(); } diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 8653923ec7..ab56e8fa2b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -102,6 +102,7 @@ import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.PermissionUtil; import org.greenrobot.eventbus.EventBus; +import org.parceler.Parcels; import java.io.File; import java.util.ArrayList; @@ -1952,12 +1953,10 @@ public class FileDisplayActivity extends HookActivity } public void startContactListFragment(OCFile file) { - Fragment contactListFragment = ContactListFragment.newInstance(file, getAccount()); - - setSecondFragment(contactListFragment); - updateFragmentsVisibility(true); - updateActionBarTitleAndHomeButton(file); - setFile(file); + Intent intent = new Intent(this, ContactsPreferenceActivity.class); + intent.putExtra(ContactListFragment.FILE_NAME, Parcels.wrap(file)); + intent.putExtra(ContactListFragment.ACCOUNT, Parcels.wrap(getAccount())); + startActivity(intent); } /** diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java index 3339db9e9b..f630ba34c2 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java @@ -286,9 +286,13 @@ public class ContactListFragment extends FileFragment { handler.postDelayed(new Runnable() { @Override public void run() { - getFragmentManager().popBackStack(); + if (getFragmentManager().getBackStackEntryCount() > 0) { + getFragmentManager().popBackStack(); + } else { + getActivity().finish(); + } } - }, 2500); + }, 1750); } private void getAccountForImport() { diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index 65bbcf0e0f..db16bbe671 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -87,13 +87,11 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi private DatePickerDialog datePickerDialog; - private static final String KEY_CALENDAR_PICKER_OPEN = "IS_CALENDAR_PICKER_OPEN"; private static final String KEY_CALENDAR_DAY = "CALENDAR_DAY"; private static final String KEY_CALENDAR_MONTH = "CALENDAR_MONTH"; private static final String KEY_CALENDAR_YEAR = "CALENDAR_YEAR"; - @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { From 06d87d7a11d52cd1f34230e56c60540b9e167761 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 27 Apr 2017 12:22:56 +0200 Subject: [PATCH 814/881] add select/deselect all button --- .../contactsbackup/ContactListFragment.java | 43 +++++++++++++++++++ src/main/res/menu/contactlist_menu.xml | 35 +++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/main/res/menu/contactlist_menu.xml diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java index f630ba34c2..c9b5d03aaa 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java @@ -39,6 +39,8 @@ import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -107,6 +109,15 @@ public class ContactListFragment extends FileFragment { return frag; } + /** + * {@inheritDoc} + */ + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.contactlist_menu, menu); + } + @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -223,6 +234,12 @@ public class ContactListFragment extends FileFragment { contactsPreferenceActivity.onBackPressed(); retval = true; break; + case R.id.action_select_all: + item.setChecked(!item.isChecked()); + setSelectAllMenuItem(item, item.isChecked()); + contactListAdapter.selectAllFiles(item.isChecked()); + retval = true; + break; default: retval = super.onOptionsItemSelected(item); break; @@ -230,6 +247,15 @@ public class ContactListFragment extends FileFragment { return retval; } + private void setSelectAllMenuItem(MenuItem selectAll, boolean checked) { + selectAll.setChecked(checked); + if(checked) { + selectAll.setIcon(R.drawable.ic_select_none); + } else { + selectAll.setIcon(R.drawable.ic_select_all); + } + } + static class ContactItemViewHolder extends RecyclerView.ViewHolder { private ImageView badge; private CheckedTextView name; @@ -526,4 +552,21 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac public int getItemCount() { return vCards.size(); } + + public void selectAllFiles(boolean select) { + checkedVCards = new HashSet<>(); + if (select) { + for (int i = 0; i < vCards.size(); i++) { + checkedVCards.add(i); + } + } + + if (checkedVCards.size() > 0) { + EventBus.getDefault().post(new VCardToggleEvent(true)); + } else { + EventBus.getDefault().post(new VCardToggleEvent(false)); + } + + notifyDataSetChanged(); + } } diff --git a/src/main/res/menu/contactlist_menu.xml b/src/main/res/menu/contactlist_menu.xml new file mode 100644 index 0000000000..b924fb3c2f --- /dev/null +++ b/src/main/res/menu/contactlist_menu.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Nextcloud Android client application + + @author Tobias Kaminsky + Copyright (C) 2017 Tobias Kaminsky + Copyright (C) 2017 Nextcloud GmbH. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + --> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:ignore="AppCompatResource"> + + <item + android:id="@+id/action_select_all" + android:checkable="true" + android:contentDescription="@string/select_all" + android:title="@string/select_all" + android:icon="@drawable/ic_select_all" + app:showAsAction="always"/> + +</menu> From 4dae921763fb63acc4892d40c3106fe7ed568328 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 27 Apr 2017 16:02:36 +0200 Subject: [PATCH 815/881] change style of import button --- .../contactsbackup/ContactListFragment.java | 10 ++++---- src/main/res/layout/contactlist_fragment.xml | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java index c9b5d03aaa..7244e45a16 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java @@ -48,6 +48,7 @@ import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; import android.widget.ImageView; +import android.widget.LinearLayout; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; @@ -94,6 +95,9 @@ public class ContactListFragment extends FileFragment { @BindView(R.id.contactlist_recyclerview) public RecyclerView recyclerView; + @BindView(R.id.contactlist_restore_selected_container) + public LinearLayout restoreContactsContainer; + @BindView(R.id.contactlist_restore_selected) public Button restoreContacts; @@ -191,11 +195,9 @@ public class ContactListFragment extends FileFragment { @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(VCardToggleEvent event) { if (event.showRestoreButton) { - restoreContacts.setVisibility(View.VISIBLE); - restoreContacts.setBackgroundColor(getResources().getColor(R.color.primary_button_background_color)); + restoreContactsContainer.setVisibility(View.VISIBLE); } else { - restoreContacts.setVisibility(View.GONE); - restoreContacts.setBackgroundColor(getResources().getColor(R.color.standard_grey)); + restoreContactsContainer.setVisibility(View.GONE); } } diff --git a/src/main/res/layout/contactlist_fragment.xml b/src/main/res/layout/contactlist_fragment.xml index 99f6e344d6..ae0f7eda1d 100644 --- a/src/main/res/layout/contactlist_fragment.xml +++ b/src/main/res/layout/contactlist_fragment.xml @@ -31,12 +31,26 @@ android:layout_weight="1" android:choiceMode="multipleChoice"/> - <android.support.v7.widget.AppCompatButton - android:id="@+id/contactlist_restore_selected" + <LinearLayout + android:id="@+id/contactlist_restore_selected_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/contaclist_restore_selected" - android:theme="@style/Button.Primary" - android:visibility="gone"/> + android:background="@color/white" + android:orientation="vertical" + android:visibility="gone"> + + <ImageView + android:layout_width="match_parent" + android:layout_height="1dp" + android:src="@drawable/uploader_list_separator"/> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/contactlist_restore_selected" + style="@style/Button.Borderless" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/contaclist_restore_selected"/> + + </LinearLayout> </LinearLayout> \ No newline at end of file From 7fc6d5fb6dbeb14233aba68a5ee888ae953452b9 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 27 Apr 2017 15:06:02 +0200 Subject: [PATCH 816/881] deleted not needed xml stuff --- src/main/res/menu/contactlist_menu.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/res/menu/contactlist_menu.xml b/src/main/res/menu/contactlist_menu.xml index b924fb3c2f..bdf6342097 100644 --- a/src/main/res/menu/contactlist_menu.xml +++ b/src/main/res/menu/contactlist_menu.xml @@ -20,9 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. --> <menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - tools:ignore="AppCompatResource"> + xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_select_all" From 02411467b828c5483b3d2b619ae37c1d80fd3ce7 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 27 Apr 2017 16:09:30 +0200 Subject: [PATCH 817/881] cancel specific backup job disable daily backup on remove --- .../activity/ContactsPreferenceActivity.java | 18 ++++++++++++++-- .../android/ui/activity/DrawerActivity.java | 3 ++- .../android/ui/activity/FileActivity.java | 2 +- .../android/ui/activity/UserInfoActivity.java | 21 +++++++++++++++---- .../ContactsBackupFragment.java | 2 +- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index e9ae39aac9..4224fa1dc3 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -106,8 +106,8 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag .schedule(); } - public static void cancelContactBackupJob(Context context) { - Log_OC.d(TAG, "disabling contacts backup job"); + public static void cancelAllContactBackupJobs(Context context) { + Log_OC.d(TAG, "disabling all contacts backup job"); JobManager jobManager = JobManager.create(context); Set<JobRequest> jobs = jobManager.getAllJobRequestsForTag(ContactsBackupJob.TAG); @@ -117,6 +117,20 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag } } + public static void cancelContactBackupJobForAccount(Context context, Account account) { + Log_OC.d(TAG, "disabling contacts backup job for account: " + account.name); + + JobManager jobManager = JobManager.create(context); + Set<JobRequest> jobs = jobManager.getAllJobRequestsForTag(ContactsBackupJob.TAG); + + for (JobRequest jobRequest : jobs) { + PersistableBundleCompat extras = jobRequest.getExtras(); + if (extras.getString(ContactsBackupJob.ACCOUNT, "").equalsIgnoreCase(account.name)) { + jobManager.cancel(jobRequest.getJobId()); + } + } + } + @Override public void showFiles(boolean onDeviceOnly) { diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 6c094f7191..36d43c05f5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -1197,7 +1197,8 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU Account account = AccountUtils.getCurrentOwnCloudAccount(DrawerActivity.this); - if (account != null && getStorageManager().getCapability(account.name) != null && + if (account != null && getStorageManager() != null && + getStorageManager().getCapability(account.name) != null && getStorageManager().getCapability(account.name).getExternalLinks().isTrue()) { int count = sharedPreferences.getInt(EXTERNAL_LINKS_COUNT, -1); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index dbd3b23a1b..41bcab4b9c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -250,7 +250,7 @@ public abstract class FileActivity extends DrawerActivity if (sharedPreferences.getBoolean(ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)) { ContactsPreferenceActivity.startContactBackupJob(getAccount()); } else { - ContactsPreferenceActivity.cancelContactBackupJob(getBaseContext()); + ContactsPreferenceActivity.cancelAllContactBackupJobs(getBaseContext()); } } diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 6d4954a7d9..e8f7f9272a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -31,6 +31,7 @@ import android.app.DialogFragment; import android.app.FragmentManager; import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; @@ -50,6 +51,7 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -337,11 +339,22 @@ public class UserInfoActivity extends FileActivity { new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - Bundle bundle = new Bundle(); - bundle.putParcelable(KEY_ACCOUNT, Parcels.wrap(account)); - Intent intent = new Intent(); - intent.putExtras(bundle); + // remove contact backup job + ContactsPreferenceActivity.cancelContactBackupJobForAccount(getActivity(), account); + + // disable daily backup + SharedPreferences sharedPreferences = PreferenceManager + .getDefaultSharedPreferences(getActivity()); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, + false); + editor.apply(); + if (getActivity() != null && !removeDirectly) { + Bundle bundle = new Bundle(); + bundle.putParcelable(KEY_ACCOUNT, Parcels.wrap(account)); + Intent intent = new Intent(); + intent.putExtras(bundle); getActivity().setResult(KEY_DELETE_CODE, intent); getActivity().finish(); } else { diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index db16bbe671..db0dccbb11 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -267,7 +267,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi if (bool) { ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); } else { - ContactsPreferenceActivity.cancelContactBackupJob(contactsPreferenceActivity); + ContactsPreferenceActivity.cancelAllContactBackupJobs(contactsPreferenceActivity); } SharedPreferences.Editor editor = sharedPreferences.edit(); From 1cd175a1e5a2172e1c0818f343487d55d729dab6 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 28 Apr 2017 07:42:34 +0200 Subject: [PATCH 818/881] Fix bugs --- .../contactsbackup/ContactListFragment.java | 3 +- .../ContactsBackupFragment.java | 33 +++++++++++-------- .../android/utils/PermissionUtil.java | 32 ------------------ 3 files changed, 22 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java index 7244e45a16..67d839baf3 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java @@ -377,7 +377,8 @@ public class ContactListFragment extends FileFragment { private boolean checkAndAskForContactsWritePermission() { // check permissions if (!PermissionUtil.checkSelfPermission(getContext(), Manifest.permission.WRITE_CONTACTS)) { - PermissionUtil.requestWriteContactPermission(this); + requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS}, + PermissionUtil.PERMISSIONS_WRITE_CONTACTS); return false; } else { return true; diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index db0dccbb11..70834c8045 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -87,6 +87,8 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi private DatePickerDialog datePickerDialog; + private CompoundButton.OnCheckedChangeListener onCheckedChangeListener; + private static final String KEY_CALENDAR_PICKER_OPEN = "IS_CALENDAR_PICKER_OPEN"; private static final String KEY_CALENDAR_DAY = "CALENDAR_DAY"; private static final String KEY_CALENDAR_MONTH = "CALENDAR_MONTH"; @@ -109,18 +111,20 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); - backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked && - checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { - // store value - setAutomaticBackup(true); - } else { - setAutomaticBackup(false); + if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { + if (isChecked) { + setAutomaticBackup(true); + } else { + setAutomaticBackup(false); + } } } - }); + }; + + backupSwitch.setOnCheckedChangeListener(onCheckedChangeListener); // display last backup Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); @@ -211,7 +215,9 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi if (grantResults[index] >= 0) { setAutomaticBackup(true); } else { - setAutomaticBackup(false); + backupSwitch.setOnCheckedChangeListener(null); + backupSwitch.setChecked(false); + backupSwitch.setOnCheckedChangeListener(onCheckedChangeListener); } break; @@ -265,7 +271,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); if (bool) { - ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); + ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); } else { ContactsPreferenceActivity.cancelAllContactBackupJobs(contactsPreferenceActivity); } @@ -292,7 +298,8 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi .setAction(R.string.common_ok, new View.OnClickListener() { @Override public void onClick(View v) { - PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); + requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, + PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC); } }); @@ -303,8 +310,8 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi return false; } else { // No explanation needed, request the permission. - PermissionUtil.requestReadContactPermission(contactsPreferenceActivity, permission); - + requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, + PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC); return false; } } diff --git a/src/main/java/com/owncloud/android/utils/PermissionUtil.java b/src/main/java/com/owncloud/android/utils/PermissionUtil.java index f0a326664b..8e39d0dc53 100644 --- a/src/main/java/com/owncloud/android/utils/PermissionUtil.java +++ b/src/main/java/com/owncloud/android/utils/PermissionUtil.java @@ -52,36 +52,4 @@ public class PermissionUtil { new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSIONS_WRITE_EXTERNAL_STORAGE); } - - /** - * request the read permission for contacts - * - * @param activity The target activity. - */ - public static void requestReadContactPermission(Activity activity, int permission) { - ActivityCompat.requestPermissions(activity, - new String[]{Manifest.permission.READ_CONTACTS}, - permission); - } - - /** - * request the write permission for contacts - * - * @param activity The target activity. - */ - public static void requestWriteContactPermission(Activity activity) { - ActivityCompat.requestPermissions(activity, - new String[]{Manifest.permission.WRITE_CONTACTS}, - PERMISSIONS_WRITE_CONTACTS); - } - - /** - * request the write permission for contacts - * - * @param fragment The target fragment. - */ - public static void requestWriteContactPermission(android.support.v4.app.Fragment fragment) { - fragment.requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS}, - PERMISSIONS_WRITE_CONTACTS); - } } From aca5040a8041a4eafa8ce4305ce50adef44da44f Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 28 Apr 2017 14:09:23 +0200 Subject: [PATCH 819/881] add Arbitrary Data table --- .../datamodel/ArbitraryDataProvider.java | 223 ++++++++++++++++++ .../com/owncloud/android/db/ProviderMeta.java | 10 +- .../providers/FileContentProvider.java | 73 +++++- .../activity/ContactsPreferenceActivity.java | 24 +- 4 files changed, 305 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java diff --git a/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java new file mode 100644 index 0000000000..1e6e3bc9aa --- /dev/null +++ b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java @@ -0,0 +1,223 @@ +/** + * Nextcloud Android client application + * <p> + * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Nextcloud. + * <p> + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * <p> + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * <p> + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.owncloud.android.datamodel; + +import android.accounts.Account; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +import com.owncloud.android.db.ProviderMeta; +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.util.ArrayList; + +/** + * Database provider for handling the persistence aspects of arbitrary data table. + */ + +public class ArbitraryDataProvider { + static private final String TAG = ArbitraryDataProvider.class.getSimpleName(); + + private ContentResolver contentResolver; + + public ArbitraryDataProvider(ContentResolver contentResolver) { + if (contentResolver == null) { + throw new IllegalArgumentException("Cannot create an instance with a NULL contentResolver"); + } + this.contentResolver = contentResolver; + } + + public void storeOrUpdateKeyValue(Account account, String key, String newValue) { + Log_OC.v(TAG, "Adding arbitrary data with cloud id: " + account.name + " key: " + key + " value: " + newValue); + + ArbitraryDataSet data = getArbitraryDataSet(account, key); + if (data == null) { + ContentValues cv = new ContentValues(); + cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID, account.name); + cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY, key); + cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_VALUE, newValue); + + Uri result = contentResolver.insert(ProviderMeta.ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, cv); + + if (result == null) { + Log_OC.v(TAG, "Failed to store arbitrary data with cloud id: " + account.name + " key: " + key + + " value: " + newValue); + } + } else { + ContentValues cv = new ContentValues(); + cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID, data.getCloudId()); + cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY, data.getKey()); + cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_VALUE, newValue); + + int result = contentResolver.update( + ProviderMeta.ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, + cv, + ProviderMeta.ProviderTableMeta._ID + "=?", + new String[]{String.valueOf(data.getId())} + ); + + if (result == 0) { + Log_OC.v(TAG, "Failed to update arbitrary data with cloud id: " + account.name + " key: " + key + + " value: " + newValue); + } + } + } + + + public Long getLongValue(Account account, String key) { + String value = getValue(account, key); + + if (value.isEmpty()) { + return -1l; + } else { + return Long.valueOf(value); + } + } + + private ArrayList<String> getValues(Account account, String key) { + Cursor cursor = contentResolver.query( + ProviderMeta.ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, + null, + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID + " = ? and " + + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY + " = ?", + new String[]{account.name, key}, + null + ); + + if (cursor != null) { + ArrayList<String> list = new ArrayList<>(); + if (cursor.moveToFirst()) { + do { + String value = cursor.getString(cursor.getColumnIndex( + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_VALUE)); + if (value == null) { + Log_OC.e(TAG, "Arbitrary value could not be created from cursor"); + } else { + list.add(value); + } + } while (cursor.moveToNext()); + } + cursor.close(); + return list; + } else { + Log_OC.e(TAG, "DB error restoring arbitrary values."); + } + + return new ArrayList<>(); + } + + public String getValue(Account account, String key) { + Cursor cursor = contentResolver.query( + ProviderMeta.ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, + null, + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID + " = ? and " + + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY + " = ?", + new String[]{account.name, key}, + null + ); + + if (cursor != null) { + if (cursor.moveToFirst()) { + String value = cursor.getString(cursor.getColumnIndex( + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_VALUE)); + if (value == null) { + Log_OC.e(TAG, "Arbitrary value could not be created from cursor"); + } else { + return value; + } + } + cursor.close(); + return ""; + } else { + Log_OC.e(TAG, "DB error restoring arbitrary values."); + } + + return ""; + } + + private ArbitraryDataSet getArbitraryDataSet(Account account, String key) { + Cursor cursor = contentResolver.query( + ProviderMeta.ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, + null, + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID + " = ? and " + + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY + " = ?", + new String[]{account.name, key}, + null + ); + + ArbitraryDataSet dataSet = null; + if (cursor != null) { + if (cursor.moveToFirst()) { + int id = cursor.getInt(cursor.getColumnIndex(ProviderMeta.ProviderTableMeta._ID)); + String dbAccount = cursor.getString(cursor.getColumnIndex( + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID)); + String dbKey = cursor.getString(cursor.getColumnIndex( + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY)); + String dbValue = cursor.getString(cursor.getColumnIndex( + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_VALUE)); + + if (id == -1) { + Log_OC.e(TAG, "Arbitrary value could not be created from cursor"); + } else { + dataSet = new ArbitraryDataSet(id, dbAccount, dbKey, dbValue); + } + } + cursor.close(); + } else { + Log_OC.e(TAG, "DB error restoring arbitrary values."); + } + + return dataSet; + } + + + public class ArbitraryDataSet { + private int id; + private String cloudId; + private String key; + private String value; + + public ArbitraryDataSet(int id, String cloudId, String key, String value) { + this.id = id; + this.cloudId = cloudId; + this.key = key; + this.value = value; + } + + public int getId() { + return id; + } + + public String getCloudId() { + return cloudId; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + } + +} diff --git a/src/main/java/com/owncloud/android/db/ProviderMeta.java b/src/main/java/com/owncloud/android/db/ProviderMeta.java index 5329db315e..bed543cb15 100644 --- a/src/main/java/com/owncloud/android/db/ProviderMeta.java +++ b/src/main/java/com/owncloud/android/db/ProviderMeta.java @@ -33,7 +33,7 @@ import com.owncloud.android.MainApp; public class ProviderMeta { public static final String DB_NAME = "filelist"; - public static final int DB_VERSION = 19; + public static final int DB_VERSION = 20; private ProviderMeta() { } @@ -45,6 +45,7 @@ public class ProviderMeta { public static final String UPLOADS_TABLE_NAME = "list_of_uploads"; public static final String SYNCED_FOLDERS_TABLE_NAME = "synced_folders"; public static final String EXTERNAL_LINKS_TABLE_NAME = "external_links"; + public static final String ARBITRARY_DATA_TABLE_NAME = "arbitrary_data"; private static final String CONTENT_PREFIX = "content://"; @@ -64,6 +65,8 @@ public class ProviderMeta { + MainApp.getAuthority() + "/synced_folders"); public static final Uri CONTENT_URI_EXTERNAL_LINKS = Uri.parse(CONTENT_PREFIX + MainApp.getAuthority() + "/external_links"); + public static final Uri CONTENT_URI_ARBITRARY_DATA = Uri.parse(CONTENT_PREFIX + + MainApp.getAuthority() + "/arbitrary_data"); public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.owncloud.file"; public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.owncloud.file"; @@ -178,5 +181,10 @@ public class ProviderMeta { public static final String EXTERNAL_LINKS_TYPE = "type"; public static final String EXTERNAL_LINKS_NAME = "name"; public static final String EXTERNAL_LINKS_URL = "url"; + + // Columns of arbitrary data table + public static final String ARBITRARY_DATA_CLOUD_ID = "cloud_id"; + public static final String ARBITRARY_DATA_KEY = "key"; + public static final String ARBITRARY_DATA_VALUE = "value"; } } \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/providers/FileContentProvider.java b/src/main/java/com/owncloud/android/providers/FileContentProvider.java index 83578dfe96..c11eefd9e2 100644 --- a/src/main/java/com/owncloud/android/providers/FileContentProvider.java +++ b/src/main/java/com/owncloud/android/providers/FileContentProvider.java @@ -72,6 +72,7 @@ public class FileContentProvider extends ContentProvider { private static final int UPLOADS = 6; private static final int SYNCED_FOLDERS = 7; private static final int EXTERNAL_LINKS = 8; + private static final int ARBITRARY_DATA = 9; private static final String TAG = FileContentProvider.class.getSimpleName(); @@ -201,6 +202,9 @@ public class FileContentProvider extends ContentProvider { case EXTERNAL_LINKS: count = db.delete(ProviderTableMeta.EXTERNAL_LINKS_TABLE_NAME, where, whereArgs); break; + case ARBITRARY_DATA: + count = db.delete(ProviderTableMeta.ARBITRARY_DATA_TABLE_NAME, where, whereArgs); + break; default: //Log_OC.e(TAG, "Unknown uri " + uri); throw new IllegalArgumentException("Unknown uri: " + uri.toString()); @@ -335,6 +339,18 @@ public class FileContentProvider extends ContentProvider { } return insertedExternalLinkUri; + case ARBITRARY_DATA: + Uri insertedArbitraryDataUri = null; + long arbitraryDataId = db.insert(ProviderTableMeta.ARBITRARY_DATA_TABLE_NAME, null, values); + if (arbitraryDataId > 0) { + insertedArbitraryDataUri = + ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, arbitraryDataId); + } else { + throw new SQLException("ERROR " + uri); + + } + return insertedArbitraryDataUri; + default: throw new IllegalArgumentException("Unknown uri id: " + uri); } @@ -385,6 +401,7 @@ public class FileContentProvider extends ContentProvider { mUriMatcher.addURI(authority, "uploads/#", UPLOADS); mUriMatcher.addURI(authority, "synced_folders", SYNCED_FOLDERS); mUriMatcher.addURI(authority, "external_links", EXTERNAL_LINKS); + mUriMatcher.addURI(authority, "arbitrary_data", ARBITRARY_DATA); return true; } @@ -473,6 +490,13 @@ public class FileContentProvider extends ContentProvider { + uri.getPathSegments().get(1)); } break; + case ARBITRARY_DATA: + sqlQuery.setTables(ProviderTableMeta.ARBITRARY_DATA_TABLE_NAME); + if (uri.getPathSegments().size() > 1) { + sqlQuery.appendWhere(ProviderTableMeta._ID + "=" + + uri.getPathSegments().get(1)); + } + break; default: throw new IllegalArgumentException("Unknown uri id: " + uri); } @@ -495,6 +519,9 @@ public class FileContentProvider extends ContentProvider { case EXTERNAL_LINKS: order = ProviderTableMeta.EXTERNAL_LINKS_NAME; break; + case ARBITRARY_DATA: + order = ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID; + break; default: // Files order = ProviderTableMeta.FILE_DEFAULT_SORT_ORDER; break; @@ -538,25 +565,19 @@ public class FileContentProvider extends ContentProvider { case DIRECTORY: return 0; //updateFolderSize(db, selectionArgs[0]); case SHARES: - return db.update( - ProviderTableMeta.OCSHARES_TABLE_NAME, values, selection, selectionArgs - ); + return db.update(ProviderTableMeta.OCSHARES_TABLE_NAME, values, selection, selectionArgs); case CAPABILITIES: - return db.update( - ProviderTableMeta.CAPABILITIES_TABLE_NAME, values, selection, selectionArgs - ); + return db.update(ProviderTableMeta.CAPABILITIES_TABLE_NAME, values, selection, selectionArgs); case UPLOADS: - int ret = db.update( - ProviderTableMeta.UPLOADS_TABLE_NAME, values, selection, selectionArgs - ); + int ret = db.update(ProviderTableMeta.UPLOADS_TABLE_NAME, values, selection, selectionArgs); trimSuccessfulUploads(db); return ret; case SYNCED_FOLDERS: return db.update(ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME, values, selection, selectionArgs); + case ARBITRARY_DATA: + return db.update(ProviderTableMeta.ARBITRARY_DATA_TABLE_NAME, values, selection, selectionArgs); default: - return db.update( - ProviderTableMeta.FILE_TABLE_NAME, values, selection, selectionArgs - ); + return db.update(ProviderTableMeta.FILE_TABLE_NAME, values, selection, selectionArgs); } } @@ -611,6 +632,9 @@ public class FileContentProvider extends ContentProvider { // Create external links table createExternalLinksTable(db); + + // Create arbitrary data table + createArbitraryData(db); } @Override @@ -927,6 +951,22 @@ public class FileContentProvider extends ContentProvider { if (!upgraded) { Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion)); } + + if (oldVersion < 20 && newVersion >= 20) { + Log_OC.i(SQL, "Adding arbitrary data table"); + db.beginTransaction(); + try { + createArbitraryData(db); + upgraded = true; + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + + if (!upgraded) { + Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion)); + } } } @@ -1064,6 +1104,15 @@ public class FileContentProvider extends ContentProvider { ); } + private void createArbitraryData(SQLiteDatabase db) { + db.execSQL("CREATE TABLE " + ProviderTableMeta.ARBITRARY_DATA_TABLE_NAME + "(" + + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, " // id + + ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID + " TEXT, " // cloud id (account name + FQDN) + + ProviderTableMeta.ARBITRARY_DATA_KEY + " TEXT, " // key + + ProviderTableMeta.ARBITRARY_DATA_VALUE + " TEXT) " // value + ); + } + /** * Version 10 of database does not modify its scheme. It coincides with the upgrade of the ownCloud account names * structure to include in it the path to the server instance. Updating the account names and path to local files diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 5315e1c69d..49cab69bec 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -26,7 +26,6 @@ import android.accounts.Account; import android.app.DatePickerDialog; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; @@ -45,8 +44,8 @@ import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; import com.owncloud.android.R; +import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsBackupJob; import com.owncloud.android.ui.fragment.FileFragment; @@ -70,7 +69,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag public static final String PREFERENCE_CONTACTS_LAST_BACKUP = "PREFERENCE_CONTACTS_LAST_BACKUP"; private SwitchCompat backupSwitch; - private SharedPreferences sharedPreferences; + private ArbitraryDataProvider arbitraryDataProvider; @Override protected void onCreate(Bundle savedInstanceState) { @@ -87,10 +86,11 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag getSupportActionBar().setTitle(R.string.actionbar_contacts); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + arbitraryDataProvider = new ArbitraryDataProvider(getContentResolver()); backupSwitch = (SwitchCompat) findViewById(R.id.contacts_automatic_backup); - backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); + backupSwitch.setChecked(arbitraryDataProvider.getValue(getAccount(), PREFERENCE_CONTACTS_AUTOMATIC_BACKUP) + .equals("true")); backupSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -113,7 +113,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag // display last backup TextView lastBackup = (TextView) findViewById(R.id.contacts_last_backup_timestamp); - Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); + Long lastBackupTimestamp = arbitraryDataProvider.getLongValue(getAccount(), PREFERENCE_CONTACTS_LAST_BACKUP); if (lastBackupTimestamp == -1) { lastBackup.setText(R.string.contacts_preference_backup_never); @@ -186,9 +186,8 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag private void setAutomaticBackup(SwitchCompat backupSwitch, boolean bool) { backupSwitch.setChecked(bool); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); - editor.apply(); + arbitraryDataProvider.storeOrUpdateKeyValue(getAccount(), + PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, String.valueOf(bool)); } private boolean checkAndAskForContactsReadPermission(final int permission) { @@ -200,12 +199,13 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag if (PermissionUtil.shouldShowRequestPermissionRationale(ContactsPreferenceActivity.this, android.Manifest.permission.READ_CONTACTS)) { // Show explanation to the user and then request permission - Snackbar snackbar = Snackbar.make(findViewById(R.id.contacts_linear_layout), R.string.contacts_read_permission, - Snackbar.LENGTH_INDEFINITE) + Snackbar snackbar = Snackbar.make(findViewById(R.id.contacts_linear_layout), + R.string.contacts_read_permission, Snackbar.LENGTH_INDEFINITE) .setAction(R.string.common_ok, new View.OnClickListener() { @Override public void onClick(View v) { - PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this, permission); + PermissionUtil.requestReadContactPermission(ContactsPreferenceActivity.this, + permission); } }); From c9c2cdbb4e4eaced947710512d134047ad672f8b Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 28 Apr 2017 14:52:30 +0200 Subject: [PATCH 820/881] add Arbitrary Data table use it for multiple account contact backup --- .../datamodel/ArbitraryDataProvider.java | 12 ++++++++++- .../android/services/ContactsBackupJob.java | 17 ++++++++------- .../activity/ContactsPreferenceActivity.java | 6 +++++- .../android/ui/activity/FileActivity.java | 10 ++++----- .../android/ui/activity/UserInfoActivity.java | 15 +++++++------ .../ContactsBackupFragment.java | 21 ++++++++++--------- 6 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java index 1e6e3bc9aa..4dc4111959 100644 --- a/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java +++ b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java @@ -47,10 +47,12 @@ public class ArbitraryDataProvider { } public void storeOrUpdateKeyValue(Account account, String key, String newValue) { - Log_OC.v(TAG, "Adding arbitrary data with cloud id: " + account.name + " key: " + key + " value: " + newValue); + ArbitraryDataSet data = getArbitraryDataSet(account, key); if (data == null) { + Log_OC.v(TAG, "Adding arbitrary data with cloud id: " + account.name + " key: " + key + + " value: " + newValue); ContentValues cv = new ContentValues(); cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID, account.name); cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY, key); @@ -63,6 +65,8 @@ public class ArbitraryDataProvider { + " value: " + newValue); } } else { + Log_OC.v(TAG, "Updating arbitrary data with cloud id: " + account.name + " key: " + key + + " value: " + newValue); ContentValues cv = new ContentValues(); cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID, data.getCloudId()); cv.put(ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY, data.getKey()); @@ -93,6 +97,12 @@ public class ArbitraryDataProvider { } } + public boolean getBooleanValue(Account account, String key) { + String value = getValue(account, key); + + return !value.isEmpty() && value.equalsIgnoreCase("true"); + } + private ArrayList<String> getValues(Account account, String key) { Cursor cursor = contentResolver.query( ProviderMeta.ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, diff --git a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java index 86e4de1377..036e700709 100644 --- a/src/main/java/com/owncloud/android/services/ContactsBackupJob.java +++ b/src/main/java/com/owncloud/android/services/ContactsBackupJob.java @@ -26,7 +26,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.IBinder; @@ -39,9 +38,9 @@ import com.evernote.android.job.util.support.PersistableBundleCompat; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.UploadFileOperation; @@ -76,13 +75,15 @@ public class ContactsBackupJob extends Job { boolean force = bundle.getBoolean(FORCE, false); - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); - Long lastExecution = sharedPreferences.getLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, -1); + final Account account = AccountUtils.getOwnCloudAccountByName(context, bundle.getString(ACCOUNT, "")); + + ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(getContext().getContentResolver()); + Long lastExecution = arbitraryDataProvider.getLongValue(account, + ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP); if (force || (lastExecution + 24 * 60 * 60 * 1000) < Calendar.getInstance().getTimeInMillis()) { Log_OC.d(TAG, "start contacts backup job"); - final Account account = AccountUtils.getOwnCloudAccountByName(context, bundle.getString(ACCOUNT, "")); String backupFolder = getContext().getResources().getString(R.string.contacts_backup_folder) + OCFile.PATH_SEPARATOR; Integer daysToExpire = getContext().getResources().getInteger(R.integer.contacts_backup_expire); @@ -96,9 +97,9 @@ public class ContactsBackupJob extends Job { OperationsService.BIND_AUTO_CREATE); // store execution date - sharedPreferences.edit().putLong(ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, - Calendar.getInstance().getTimeInMillis()).apply(); - + arbitraryDataProvider.storeOrUpdateKeyValue(account, + ContactsPreferenceActivity.PREFERENCE_CONTACTS_LAST_BACKUP, + String.valueOf(Calendar.getInstance().getTimeInMillis())); } else { Log_OC.d(TAG, "last execution less than 24h ago"); } diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 46ff4a0cea..b69304a154 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -75,7 +75,11 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); if (intent == null || intent.getParcelableExtra(ContactListFragment.FILE_NAME) == null || intent.getParcelableExtra(ContactListFragment.ACCOUNT) == null) { - transaction.add(R.id.frame_container, new ContactsBackupFragment()); + ContactsBackupFragment fragment = new ContactsBackupFragment(); + Bundle bundle = new Bundle(); + bundle.putParcelable(ContactListFragment.ACCOUNT, getAccount()); + fragment.setArguments(bundle); + transaction.add(R.id.frame_container, fragment); } else { OCFile file = Parcels.unwrap(intent.getParcelableExtra(ContactListFragment.FILE_NAME)); Account account = Parcels.unwrap(intent.getParcelableExtra(ContactListFragment.ACCOUNT)); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 41bcab4b9c..14d77fe7db 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -28,7 +28,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -41,8 +40,8 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader; @@ -245,12 +244,11 @@ public abstract class FileActivity extends DrawerActivity } private void checkContactsBackupJob() { - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(getContentResolver()); - if (sharedPreferences.getBoolean(ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)) { + if (getAccount() != null && arbitraryDataProvider.getBooleanValue(getAccount(), + ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP)) { ContactsPreferenceActivity.startContactBackupJob(getAccount()); - } else { - ContactsPreferenceActivity.cancelAllContactBackupJobs(getBaseContext()); } } diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index e8f7f9272a..a00c56007a 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -31,7 +31,6 @@ import android.app.DialogFragment; import android.app.FragmentManager; import android.content.DialogInterface; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; @@ -51,7 +50,7 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.db.PreferenceManager; +import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -343,12 +342,12 @@ public class UserInfoActivity extends FileActivity { ContactsPreferenceActivity.cancelContactBackupJobForAccount(getActivity(), account); // disable daily backup - SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(getActivity()); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, - false); - editor.apply(); + ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider( + getActivity().getContentResolver()); + + arbitraryDataProvider.storeOrUpdateKeyValue(account, + ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, + "false"); if (getActivity() != null && !removeDirectly) { Bundle bundle = new Bundle(); diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index 70834c8045..8893cbc4e6 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -21,9 +21,9 @@ package com.owncloud.android.ui.fragment.contactsbackup; import android.Manifest; +import android.accounts.Account; import android.app.DatePickerDialog; import android.content.DialogInterface; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -44,8 +44,8 @@ import android.widget.Toast; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; import com.owncloud.android.R; +import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.services.ContactsBackupJob; import com.owncloud.android.ui.activity.ContactsPreferenceActivity; import com.owncloud.android.ui.fragment.FileFragment; @@ -68,8 +68,6 @@ import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFER public class ContactsBackupFragment extends FileFragment implements DatePickerDialog.OnDateSetListener { public static final String TAG = ContactsBackupFragment.class.getSimpleName(); - private SharedPreferences sharedPreferences; - @BindView(R.id.contacts_automatic_backup) public SwitchCompat backupSwitch; @@ -93,6 +91,9 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi private static final String KEY_CALENDAR_DAY = "CALENDAR_DAY"; private static final String KEY_CALENDAR_MONTH = "CALENDAR_MONTH"; private static final String KEY_CALENDAR_YEAR = "CALENDAR_YEAR"; + private ArbitraryDataProvider arbitraryDataProvider; + private Account account; + @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -104,12 +105,14 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); + account = (Account) getArguments().get(ContactListFragment.ACCOUNT); + contactsPreferenceActivity.getSupportActionBar().setTitle(R.string.actionbar_contacts); contactsPreferenceActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(contactsPreferenceActivity); + arbitraryDataProvider = new ArbitraryDataProvider(getContext().getContentResolver()); - backupSwitch.setChecked(sharedPreferences.getBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, false)); + backupSwitch.setChecked(arbitraryDataProvider.getBooleanValue(account, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP)); onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override @@ -127,7 +130,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi backupSwitch.setOnCheckedChangeListener(onCheckedChangeListener); // display last backup - Long lastBackupTimestamp = sharedPreferences.getLong(PREFERENCE_CONTACTS_LAST_BACKUP, -1); + Long lastBackupTimestamp = arbitraryDataProvider.getLongValue(account, PREFERENCE_CONTACTS_LAST_BACKUP); if (lastBackupTimestamp == -1) { lastBackup.setText(R.string.contacts_preference_backup_never); @@ -276,9 +279,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi ContactsPreferenceActivity.cancelAllContactBackupJobs(contactsPreferenceActivity); } - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, bool); - editor.apply(); + arbitraryDataProvider.storeOrUpdateKeyValue(account, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, String.valueOf(bool)); } private boolean checkAndAskForContactsReadPermission(final int permission) { From fa84532da71096bb9d88e655e2ce578a0ed566fe Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 28 Apr 2017 15:05:50 +0200 Subject: [PATCH 821/881] make custom build 100% independent --- src/modified/res/values/setup.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 5c7cb36d8d..77bdbed7c5 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -4,8 +4,8 @@ <bool name="is_beta">false</bool> <!-- App name and other strings--> - <string name="app_name">Nextcloud</string> - <string name="account_type">nextcloud</string> <!-- better if was a domain name; but changing it now would require migrate accounts when the app is updated --> + <string name="app_name">Custom</string> + <string name="account_type">custom</string> <!-- better if was a domain name; but changing it now would require migrate accounts when the app is updated --> <string name="authority">com.custom.client.provider</string> <!-- better if was the app package with ".provider" appended ; it identifies the provider --> <string name="users_and_groups_search_authority">com.custom.client.provider.UsersAndGroupsSearch</string> <string name="users_and_groups_share_with">com.custom.client.provider.UsersAndGroupsSearch.action.SHARE_WITH</string> @@ -13,9 +13,9 @@ <string name="file_provider_authority">com.custom.client.provider.Files</string> <string name ="db_file">nextcloud.db</string> <string name ="db_name">nextcloud</string> - <string name ="data_folder">nextcloud</string> + <string name="data_folder">custom</string> <string name ="log_name">nextcloud</string> - <string name ="default_display_name_for_root_folder">Nextcloud</string> + <string name="default_display_name_for_root_folder">Custom</string> <string name ="user_agent">Mozilla/5.0 (Android) ownCloud-android/%1$s</string> <!-- URLs and flags related --> From 887645921fb14873b09cec36fd7acd8844eb4281 Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Fri, 28 Apr 2017 10:22:47 -0500 Subject: [PATCH 822/881] Fixing duplicated code --- .../authentication/AuthenticatorActivity.java | 18 ++----------- .../ui/activity/ExternalSiteWebView.java | 22 ++-------------- .../owncloud/android/utils/DisplayUtils.java | 26 +++++++++++++++++++ 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index e6a9304697..7211cc7587 100644 --- a/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -115,9 +115,6 @@ import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; import com.owncloud.android.utils.DisplayUtils; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; import java.security.cert.X509Certificate; import java.util.Map; @@ -341,19 +338,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - BufferedReader buffreader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.custom_error))); - String line; - StringBuilder text = new StringBuilder(); - try { - while (( line = buffreader.readLine()) != null) { - text.append(line); - text.append('\n'); - } - } catch (IOException e) { - Log_OC.e(TAG,e.getMessage()); - return; - } - mLoginWebView.loadData(text.toString(),"text/html; charset=UTF-8", null); + + mLoginWebView.loadData(DisplayUtils.getData(getResources().openRawResource(R.raw.custom_error)),"text/html; charset=UTF-8", null); } }); } diff --git a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java index ecd066f738..bde1c32784 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java +++ b/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java @@ -36,10 +36,7 @@ import android.widget.ProgressBar; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; +import com.owncloud.android.utils.DisplayUtils; /** * This activity shows an URL as a web view @@ -126,22 +123,7 @@ public class ExternalSiteWebView extends FileActivity { webview.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - - BufferedReader buffreader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.custom_error))); - String line; - StringBuilder text = new StringBuilder(); - try { - while (( line = buffreader.readLine()) != null) { - text.append(line); - text.append('\n'); - } - } catch (IOException e) { - Log_OC.e(TAG,e.getMessage()); - return; - } - - webview.loadData(text.toString(),"text/html; charset=UTF-8", null); - + webview.loadData(DisplayUtils.getData(getResources().openRawResource(R.raw.custom_error)),"text/html; charset=UTF-8", null); } }); diff --git a/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/src/main/java/com/owncloud/android/utils/DisplayUtils.java index c5d1a76057..b57711f5eb 100644 --- a/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -81,7 +81,10 @@ import com.owncloud.android.utils.svg.SvgDrawableTranscoder; import org.greenrobot.eventbus.EventBus; import org.parceler.Parcels; +import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.math.BigDecimal; import java.net.IDN; import java.text.DateFormat; @@ -646,4 +649,27 @@ public class DisplayUtils { activity.startActivity(recentlyAddedIntent); } } + + + /** + * Get String data from a InputStream + * + * @param inputStream The File InputStream + */ + public static String getData(InputStream inputStream){ + + BufferedReader buffreader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + StringBuilder text = new StringBuilder(); + try { + while (( line = buffreader.readLine()) != null) { + text.append(line); + text.append('\n'); + } + } catch (IOException e) { + Log_OC.e(TAG,e.getMessage()); + } + return text.toString(); + } + } From 87cb2890ad5a2ad32988909b21315b6519426a1e Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 28 Apr 2017 20:51:47 +0200 Subject: [PATCH 823/881] Cancel job only for an account --- .../ui/fragment/contactsbackup/ContactsBackupFragment.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index 8893cbc4e6..ce709d54ea 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -276,10 +276,12 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi if (bool) { ContactsPreferenceActivity.startContactBackupJob(contactsPreferenceActivity.getAccount()); } else { - ContactsPreferenceActivity.cancelAllContactBackupJobs(contactsPreferenceActivity); + ContactsPreferenceActivity.cancelContactBackupJobForAccount(contactsPreferenceActivity, + contactsPreferenceActivity.getAccount()); } - arbitraryDataProvider.storeOrUpdateKeyValue(account, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, String.valueOf(bool)); + arbitraryDataProvider.storeOrUpdateKeyValue(account, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, + String.valueOf(bool)); } private boolean checkAndAskForContactsReadPermission(final int permission) { From 299a71e03f9a5a3071804e89f2960344e33c7641 Mon Sep 17 00:00:00 2001 From: Bernhard Blieninger <bblieninger@web.de> Date: Fri, 28 Apr 2017 22:38:31 +0200 Subject: [PATCH 824/881] I think the "and" is missing. --- src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index d621d8997f..d9358c282c 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -284,7 +284,7 @@ <string name="common_rename">Rename</string> <string name="common_remove">Remove</string> <string name="confirmation_remove_file_alert">"Do you really want to remove %1$s?"</string> - <string name="confirmation_remove_folder_alert">"Do you really want to remove %1$s the contents thereof?"</string> + <string name="confirmation_remove_folder_alert">"Do you really want to remove %1$s and the contents thereof?"</string> <string name="confirmation_remove_local">Local only</string> <string name="remove_success_msg">"Removed"</string> <string name="remove_fail_msg">"Removal failed"</string> From 7b1f251a0d88f7d22c8934e811281b6da7f40e9a Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Sat, 29 Apr 2017 00:21:08 +0000 Subject: [PATCH 825/881] [tx-robot] updated from transifex --- src/main/res/values-de-rDE/strings.xml | 248 +++++++++-------------- src/main/res/values-de/strings.xml | 145 +++++++------- src/main/res/values-es-rMX/strings.xml | 220 +++++++++++---------- src/main/res/values-fr/strings.xml | 171 +--------------- src/main/res/values-nb-rNO/strings.xml | 191 ++++-------------- src/main/res/values-pt-rBR/strings.xml | 262 +++++++++++++------------ 6 files changed, 450 insertions(+), 787 deletions(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index b2deac4823..b3063a5471 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">Fingerabdruck-Sperre</string> <string name="prefs_fingerprint_notsetup">Keine Fingerabdrücke eingerichtet.</string> <string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string> - <string name="prefs_instant_upload">Sofortiger Bilderupload</string> - <string name="prefs_instant_upload_summary">Fotos von der Kamera sofort hochladen</string> - <string name="prefs_instant_video_upload">Sofortiger Videoupload</string> - <string name="prefs_instant_video_upload_summary">Videos von der Kamera sofort hochladen</string> + <string name="prefs_instant_upload">Sofortiges Hochladen von Bildern</string> + <string name="prefs_instant_upload_summary">Sofortiges Hochladen von Bildern, die mit der Kamera gemacht wurden</string> + <string name="prefs_instant_video_upload">Sofortiges Hochladen von Videos</string> + <string name="prefs_instant_video_upload_summary">Sofortiges Hochladen von Videos, die mit der Kamera gemacht wurden</string> <string name="prefs_log_title">Protokollierung aktivieren</string> <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen benutzt</string> <string name="prefs_log_title_history">Protokollverlauf</string> @@ -58,23 +58,17 @@ <string name="prefs_calendar_contacts">Kalender & Kontakte synchronisieren</string> <string name="prefs_calendar_contacts_summary">DAVdroid (v1.3.0+) für aktuelles Konto einrichten</string> <string name="prefs_calendar_contacts_address_resolve_error">Serveradresse des Kontos für die DAVdroid-Nutzung konnte nicht ermittelt werden</string> - <string name="prefs_calendar_contacts_no_store_error">Weder Google Play Store noch F-Droid App installiert</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Kalender- & Kontakte-Synchronisierung erfolgreich konfiguriert</string> + <string name="prefs_calendar_contacts_no_store_error">Weder F-Droid noch Google-Play sind installiert</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Kalender- & Adress-Synchronisation konfigurieren</string> <string name="prefs_help">Hilfe</string> - <string name="prefs_recommend">Dies einem Freund empfehlen</string> + <string name="prefs_recommend">Einem Freund empfehlen</string> <string name="prefs_feedback">Rückmeldungen</string> <string name="prefs_imprint">Impressum</string> - <string name="prefs_remember_last_share_location">Geteilten Speicherort merken</string> - <string name="prefs_remember_last_upload_location_summary">Geteilten Upload-Speicherort merken</string> - - <string name="recommend_subject">%1$s auf Ihrem Smartphone ausprobieren!</string> - <string name="recommend_text">Ich empfehle Ihnen die Nutzung von %1$s auf Ihrem Smartphone!\nSie können die App hier herunterladen: %2$s</string> - - <string name="auth_check_server">Server überprüfen</string> + <string name="recommend_subject">%1$s auf Ihrem Smartphone ausprobieren!</string> + <string name="auth_check_server">Server überprüfen</string> <string name="auth_host_url">Server-Adresse https://…</string> <string name="auth_username">Benutzername</string> <string name="auth_password">Passwort</string> - <string name="auth_register">Sie haben bislang keinen Server?\nHier klicken um Server-Anbieter zu finden</string> <string name="sync_string_files">Dateien</string> <string name="setup_btn_connect">Verbinden</string> <string name="uploader_btn_upload_text">Hochladen</string> @@ -86,43 +80,43 @@ <string name="uploader_error_title_no_file_to_upload">Keine Datei zum Hochladen</string> <string name="uploader_error_message_received_piece_of_text">%1$s kann einen Textteil als Datei hochladen</string> <string name="uploader_error_message_no_file_to_upload">Empfangene Daten enthalten keine gültige Datei.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Datei kann nicht hochgeladen werden</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Diese Datei kan nicht hochgeladen werden</string> <string name="uploader_error_message_read_permission_not_granted">%1$s darf eine empfangene Datei nicht lesen</string> - <string name="uploader_error_message_source_file_not_found">Hochzuladende Datei wurde an seinem Ort nicht gefunden. Prüfen Sie, dass die Datei existiert.</string> - <string name="uploader_error_message_source_file_not_copied">Es ist ein Fehler beim Kopieren dieser Datei in einen temporären Ordner aufgetreten. Bitte versuchen Sie erneut die Datei zu senden.</string> + <string name="uploader_error_message_source_file_not_found">Die zum Hochladen ausgewählte Datei kann nicht gefunden werden. Bitte prüfen Sie ob die Datei existiert.</string> + <string name="uploader_error_message_source_file_not_copied">Konnte Datei nicht in temporärem Ordner speichern. Bitte versuche es erneut.</string> <string name="uploader_upload_files_behaviour">Upload Option:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">In Nextcloud Ordner verschieben</string> <string name="uploader_upload_files_behaviour_only_upload">Hochladen und Datei im ursprünglichen Ordner behalten</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Lösche Datei aus dem ursprünglichen Ordner</string> <string name="file_list_seconds_ago">Gerade eben</string> - <string name="file_list_empty_headline">Keine Dateien vorhanden</string> - <string name="file_list_empty">Laden Sie Inhalte hoch oder synchronisieren Sie sie mit Ihren Geräten!</string> - <string name="file_list_empty_favorites">Favorisieren Sie einige Dateien oder synchronisieren Sie Ihre Geräte!</string> - <string name="file_list_empty_favorites_filter_list">Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen</string> - <string name="file_list_empty_favorites_filter">Keine favorisierten Dateien in Ihrem Verlauf gefunden!</string> + <string name="file_list_empty_headline"> Keine Dateien vorhanden </string> + <string name="file_list_empty">Lade Dateien hoch oder synchronisiere mit deine Geräte.</string> + <string name="file_list_empty_favorites">Favoritisiere Dateien oder synchronisiere deine Geräte.</string> + <string name="file_list_empty_favorites_filter_list">Dateien und Ordner, die du favoritisierst, werden hier angezeigt</string> + <string name="file_list_empty_favorites_filter">Deine Suche ergab keine favoritisierten Dateien.</string> <string name="file_list_loading">Lade…</string> - <string name="file_list_no_app_for_file_type">Es wurde keine App für diesen Dateityp gefunden!</string> + <string name="file_list_no_app_for_file_type">Keine App verfügbar um diesen Dateityp zu verarbeiten.</string> <string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</string> <string name="file_list_empty_headline_search">Keine Ergebnisse in diesem Ordner</string> <string name="file_list_empty_headline_server_search">Keine Ergebnisse</string> - <string name="file_list_empty_favorite_headline">Noch keine Favoriten vorhanden</string> + <string name="file_list_empty_favorite_headline">Noch nichts favoritisiert.</string> <string name="file_list_empty_shared_headline">Noch nichts geteilt</string> <string name="file_list_empty_shared">Dateien und Ordner, die Sie teilen, werden hier erscheinen</string> <string name="file_list_empty_headline_server_search_videos">Keine Videos</string> <string name="file_list_empty_headline_server_search_photos">Keine Fotos</string> - <string name="file_list_empty_search">In einem anderen Ordner suchen?</string> - <string name="file_list_empty_recently_modified">Keine, innerhalb der letzten 7 Tage, geänderten Dateien gefunden</string> - <string name="file_list_empty_recently_modified_filter">Keine Dateien in Ihrem Verlauf gefunden, -  die in den letzten 7 Tagen geändert wurden!</string> - <string name="file_list_empty_recently_added">Keine kürzlich hinzu gefügten Dateien gefunden</string> - <string name="file_list_empty_recently_added_filter">Keine kürzlich hinzu gefügten Dateien in Ihrem Verlauf gefunden!</string> - <string name="file_list_empty_text_photos">Laden Sie Fotos hoch oder aktivieren Sie den Sofort-Upload!</string> - <string name="file_list_empty_text_photos_filter">Keine Fotos in Ihrem Verlauf gefunden!</string> - <string name="file_list_empty_text_videos">Laden Sie einige Videos hoch oder aktivieren Sie den Sofort-Upload!</string> - <string name="file_list_empty_text_videos_filter">Keine Videos in Ihrem Verlauf gefunden!</string> + <string name="file_list_empty_search">Vielleicht liegt es in einem anderen Ordner?</string> + <string name="file_list_empty_recently_modified">Keine Dateien gefunden, die in den letzten 7 Tagen modifiziert wurden</string> + <string name="file_list_empty_recently_modified_filter">Deine Such ergab keine Dateien, +die in den letzten 7 Tagen modifiziert wurden.</string> + <string name="file_list_empty_recently_added">Keine kürzlich hinzugefügten Dateien gefunden</string> + <string name="file_list_empty_recently_added_filter">Deine Suche ergab keine kürzlich hinzugefügten Dateien</string> + <string name="file_list_empty_text_photos">Lade ein paar Fotos hoch oder aktiviere automatisches Hochladen</string> + <string name="file_list_empty_text_photos_filter">Deine Suche hat keine Fotos gefunden.</string> + <string name="file_list_empty_text_videos">Lade ein paar Videos hoch oder aktiviere automatisches Hochladen</string> + <string name="file_list_empty_text_videos_filter">Deine Suche hat keine Videos gefunden.</string> <string name="upload_list_empty_headline">Keine Uploads verfügbar</string> - <string name="upload_list_empty_text">Laden Sie Inhalte hoch oder aktivieren Sie den Sofort-Upload!</string> - <string name="upload_list_empty_text_auto_upload">Laden Sie Inhalte hoch oder aktivieren Sie den Sofort-Upload!</string> + <string name="upload_list_empty_text">Lade ein paar Dateien hoch oder aktiviere automatisches Hochladen.</string> + <string name="upload_list_empty_text_auto_upload">Lade ein paar Dateien hoch oder aktiviere automatisches Hochladen.</string> <string name="file_list_folder">Ordner</string> <string name="file_list_folders">Ordner</string> <string name="file_list_file">Datei</string> @@ -134,14 +128,13 @@ <string name="filedetails_modified">Geändert:</string> <string name="filedetails_download">Herunterladen</string> <string name="filedetails_sync_file">Synchronisieren</string> - <string name="filedetails_renamed_in_upload_msg">Datei wurde während des Uploads zu %1$s umbenannt</string> - <string name="list_layout">Listenlayout</string> + <string name="filedetails_renamed_in_upload_msg">Datei während des Hochladens in %1$s umbenannt</string> <string name="action_share">Teilen</string> <string name="common_yes">Ja</string> <string name="common_no">Nein</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Upload entfernen</string> - <string name="common_retry_upload">Hochladen wiederholen</string> + <string name="common_retry_upload">Versuche erneut hochzuladen</string> <string name="common_cancel_sync">Synchronisation abbrechen</string> <string name="common_cancel">Abbrechen</string> <string name="common_back">Zurück</string> @@ -161,10 +154,10 @@ <string name="uploader_info_dirname">Ordnername</string> <string name="uploader_upload_in_progress_ticker">Hochladen …</string> <string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string> - <string name="uploader_upload_succeeded_ticker">Hochladen erfolgreich</string> + <string name="uploader_upload_succeeded_ticker">Hochgeladen</string> <string name="uploader_upload_succeeded_content_single">%1$s hochgeladen</string> <string name="uploader_upload_failed_ticker">Hochladen fehlgeschlagen</string> - <string name="uploader_upload_failed_content_single">Hochladen von %1$s konnte nicht abgeschlossen werden</string> + <string name="uploader_upload_failed_content_single">Konnte %1$s nicht hochladen</string> <string name="uploader_upload_failed_credentials_error">Hochladen fehlgeschlagen, Sie müssen sich erneut anmelden.</string> <string name="uploads_view_title">Uploads</string> <string name="uploads_view_group_current_uploads">Aktuell</string> @@ -181,37 +174,36 @@ <string name="uploads_view_upload_status_failed_localfile_error">Lokale Datei nicht gefunden</string> <string name="uploads_view_upload_status_failed_permission_error">Berechtigungsfehler</string> <string name="uploads_view_upload_status_conflict">Konflikt</string> - <string name="uploads_view_upload_status_service_interrupted">Die Anwendung wurde beendet</string> + <string name="uploads_view_upload_status_service_interrupted">App beendet</string> <string name="uploads_view_upload_status_unknown_fail">Unbekannter Fehler</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Warte auf WLAN-Verbindung</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Warte auf W-Lan-Verbindung</string> <string name="uploads_view_later_waiting_to_upload">Warten auf das Hochladen</string> <string name="downloader_download_in_progress_ticker">Herunterladen …</string> <string name="downloader_download_in_progress_content">%1$d%% beim Laden von %2$s</string> - <string name="downloader_download_succeeded_ticker">Herunterladen erfolgreich</string> + <string name="downloader_download_succeeded_ticker">Heruntergeladen</string> <string name="downloader_download_succeeded_content">%1$s wurde erfolgreich heruntergeladen</string> <string name="downloader_download_failed_ticker">Herunterladen fehlgeschlagen</string> - <string name="downloader_download_failed_content">Herunterladen von %1$s konnte nicht abgeschlossen werden</string> + <string name="downloader_download_failed_content">Konnte %1$s nicht herunterladen</string> <string name="downloader_not_downloaded_yet">Noch nicht heruntergeladen</string> <string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, Sie müssen sich erneut anmelden.</string> <string name="common_choose_account">Konto auswählen</string> <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string> - <string name="sync_fail_ticker_unauthorized">Synchronisation fehlgeschlagen, Sie müssen sich erneut anmelden.</string> + <string name="sync_fail_ticker_unauthorized">Synchronisation fehlgeschlagen. Sie müssen sich erneut anmelden</string> <string name="sync_fail_content">Synchronisation von %1$s konnte nicht abgeschlossen werden</string> - <string name="sync_fail_content_unauthorized">Ungültiges Passwort für %1$s</string> + <string name="sync_fail_content_unauthorized">Falsches Passwort für %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string> <string name="sync_conflicts_in_favourites_content">%1$d Synchronisationsdateien konnten nicht synchronisiert werden.</string> <string name="sync_fail_in_favourites_ticker">Synchronisationsdateien konnten nicht synchronisiert werden.</string> <string name="sync_fail_in_favourites_content">Inhalte von %1$d Dateien konnten nicht synchronisiert werden (%2$d Konflikte)</string> <string name="sync_foreign_files_forgotten_ticker">Einige lokale Dateien wurden vergessen</string> <string name="sync_foreign_files_forgotten_content">%1$d Dateien aus dem %2$s Ordner konnten nicht kopiert werden nach</string> - <string name="sync_foreign_files_forgotten_explanation">Seit Version 1.3.16 werden Dateien die von diesem Gerät aus hochgeladen werden in den lokalen Ordner %1$s kopiert um Datenverlust zu vermeiden, wenn eine einzelne Datei mit mehreren Accounts synchronisiert wird.\n\nInfolge dieser Änderung wurden alle Dateien, die mit vorherigen Versionen dieser App hochgeladen wurden, in den Ordner %2$s verschoben. Jedoch ist während der Account-Synchronisation ein Fehler aufgetreten, der das Abschließen dieses Vorgangs verhindert. Sie können die Datei(en) entweder wie sie sind belassen und den Link zu %3$s entfernen oder die Datei(en) in den %1$s Ordner verschieben und den Link zu %4$s beibehalten.\n\nUnten befindet sich eine Liste der lokalen Datei(en) und der mit ihnen verbundenen Remote-Datei(en) in %5$s.</string> - <string name="sync_current_folder_was_removed">Das Verzeichnis %1$s existiert nicht mehr</string> + <string name="sync_current_folder_was_removed">Der Ordner %1$s existiert nicht mehr</string> <string name="foreign_files_move">Verschiebe alle</string> <string name="foreign_files_success">Alle Dateien wurden verschoben</string> <string name="foreign_files_fail">Einige Dateien konnten nicht verschoben werden</string> <string name="foreign_files_local_text">Lokal: %1$s</string> <string name="foreign_files_remote_text">Entfernte Freigabe: %1$s</string> - <string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung, um die ausgewählten Dateien in das Verzeichnis %1$s zu kopieren. Sollen diese stattdessen verschoben werden?</string> + <string name="upload_query_move_foreign_files">Unzureichender Speicherplatz verhindert das Kopieren der ausgewählten Dateien in den Ordner %1$s . Möchstest du sie stattdessen verschieben?</string> <string name="pass_code_enter_pass_code">Bitte geben Sie ihre PIN ein</string> <string name="pass_code_configure_your_pass_code">Bitte PIN eingeben</string> @@ -229,16 +221,19 @@ <string name="media_event_done">%1$s Wiedergabe beendet</string> <string name="media_err_nothing_to_play">Keine Mediendatei gefunden</string> <string name="media_err_no_account">Kein Konto angegeben</string> - <string name="media_err_not_in_owncloud">Datei ist nicht in einem gültigen Account</string> + <string name="media_err_not_in_owncloud">Die Datei befindet sich nicht in einem gültigen Konto</string> <string name="media_err_unsupported">Nicht unterstützter Media-codec</string> - <string name="media_err_io">Mediendatei konnte nicht gelesen werden</string> - <string name="media_err_malformed">Mediendatei nicht korrekt kodiert</string> - <string name="media_err_timeout">Wartezeit für Wiedergabe abgelaufen</string> - <string name="media_err_invalid_progressive_playback">Mediendatei kann nicht gestreamt werden</string> - <string name="media_err_unknown">Die Mediendatei kann nicht mit dem vorinstallierten Media Player abgespielt werden</string> - <string name="media_err_security_ex">Sicherheitsfehler bei der Wiedergabe von %1$s</string> - <string name="media_err_io_ex">Eingabefehler beim Versuch %1$s abzuspielen</string> - <string name="media_err_unexpected">Unerwarteter Fehler beim Versuch %1$s wiederzugeben</string> + <string name="media_err_io">Konnte die Mediendatei nicht lesen</string> + <string name="media_err_malformed"> +Die Mediendatei ist falsch encodiert.</string> + <string name="media_err_timeout"> +Zeitüberschreitung beim Versuch die Datei abzuspielen</string> + <string name="media_err_invalid_progressive_playback">Die Mediendatei kann nicht gestreamt werden</string> + <string name="media_err_unknown">Die Standard-Applikation für Musik kann die Mediendatei nicht abspielen. </string> + <string name="media_err_security_ex">Ein Sicherheitsfehler trat beim Abspielen von %1$s auf</string> + <string name="media_err_io_ex">Eingabefehler beim Abspielen von %1$s</string> + <string name="media_err_unexpected"> +Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="media_rewind_description">Zurückspulknopf</string> <string name="media_play_pause_description">Wiedergabe- oder Pause-Knopf</string> <string name="media_forward_description">Vorspul-Knopf</string> @@ -250,31 +245,31 @@ <string name="auth_connection_established">Verbindung hergestellt</string> <string name="auth_testing_connection">Teste Verbindung</string> <string name="auth_not_configured_title">Fehlerhafte Server Konfiguration</string> - <string name="auth_account_not_new">Ein Benutzerkonto für den gleichen Benutzer und Server existiert auf diesem Gerät bereits</string> + <string name="auth_account_not_new">Ein Account für den gleichen Benutzer und Server existiert bereits auf diesem Gerät</string> <string name="auth_account_not_the_same">Der eingegebene Benutzer passt nicht zu dem Benutzer dieses Benutzerkontos</string> <string name="auth_unknown_error_title">Ein unbekannter Fehler ist aufgetreten!</string> - <string name="auth_unknown_host_title">Konnte den Host nicht finden.</string> - <string name="auth_incorrect_path_title">Server-Installation nicht gefunden</string> + <string name="auth_unknown_host_title">Konnte den Server nicht finden</string> + <string name="auth_incorrect_path_title">Server nicht gefunden</string> <string name="auth_timeout_title">Der Server braucht zu lange für eine Antwort.</string> - <string name="auth_incorrect_address_title">Fehlerhaftes Format Ihrer Serveradresse</string> + <string name="auth_incorrect_address_title">Falsches Adress-Format für den Server</string> <string name="auth_ssl_general_error_title">SSL-Initialisierung fehlgeschlagen.</string> - <string name="auth_ssl_unverified_server_title">SSL-Server-Identität konnte nicht überprüft werden</string> + <string name="auth_ssl_unverified_server_title">Konnte die Identität des SSL Servers nicht verifizieren</string> <string name="auth_bad_oc_version_title">Unbekannte Server-Version</string> - <string name="auth_wrong_connection_title">Konnte keine Verbindung aufbauen.</string> + <string name="auth_wrong_connection_title">Verbindung konnte nicht hergestellt werden</string> <string name="auth_secure_connection">Sichere Verbindung hergestellt</string> <string name="auth_unauthorized">Falscher Benutzername oder Passwort</string> <string name="auth_oauth_error">Legitimierung nicht erfolgreich</string> <string name="auth_oauth_error_access_denied">Zugriff durch den Legitimierungsserver abgelehnt</string> - <string name="auth_wtf_reenter_URL">Unerwarteter Zustand; bitte geben Sie die Adresse des Servers nochmals ein</string> + <string name="auth_wtf_reenter_URL">Unerwarteter Status, bitte gib die Serveradresse erneut ein</string> <string name="auth_expired_oauth_token_toast">Ihre Legitimierung ist abgelaufen. Bitte Legitimierung nochmals durchführen</string> <string name="auth_expired_basic_auth_toast">Bitte geben Sie Ihr aktuelles Passwort ein</string> <string name="auth_expired_saml_sso_token_toast">Ihre Sitzung ist abgelaufen. Bitte erneut verbinden</string> - <string name="auth_connecting_auth_server">Verbinde mit dem Authentifizierungs-Server…</string> + <string name="auth_connecting_auth_server">Verbinde zum Authentifizierungsserver...</string> <string name="auth_unsupported_auth_method">Der Server unterstützt diese Legitimierungsmethode nicht</string> <string name="auth_unsupported_multiaccount">%1$s unterstützt nicht mehrere Benutzerkonten</string> - <string name="auth_fail_get_user_name">Ihr Server gibt keine korrekte Benutzer-ID zurück, bitte kontaktiere einen Administrator</string> + <string name="auth_fail_get_user_name">Dein Server sendet keine korrekte Benutzer ID, bitte kontaktiere den Serveradministrator</string> <string name="auth_can_not_auth_against_server">Die Authentifizierung gegenüber dem Server konnte nicht durchgeführt werden</string> - <string name="auth_account_does_not_exist">Das Benutzerkonto ist bislang auf dem Gerät nicht vorhanden</string> + <string name="auth_account_does_not_exist">Account existiert auf diesem Gerät noch nicht</string> <string name="favorite">Als Offline verfügbar markieren</string> <string name="unfavorite">Markierung Offline verfügbar entfernen</string> @@ -283,36 +278,31 @@ <string name="common_rename">Umbenennen</string> <string name="common_remove">Entfernen</string> <string name="confirmation_remove_file_alert">Möchten Sie %1$s wirklich löschen?</string> - <string name="confirmation_remove_folder_alert">Möchten Sie wirklich %1$s und dessen Inhalte entfernen?</string> <string name="confirmation_remove_local">Nur lokal</string> - <string name="remove_success_msg">Erfolgreich entfernt</string> + <string name="remove_success_msg">Entfernt</string> <string name="remove_fail_msg">Entfernen fehlgeschlagen</string> <string name="rename_dialog_title">Geben Sie einen neuen Namen ein</string> - <string name="rename_local_fail_msg">Die lokale Kopie konnte nicht umbenannt werden. Versuchen Sie es mit einem anderen Namen.</string> - <string name="rename_server_fail_msg">Die Umbenennung konnte nicht abgeschlossen werden.</string> - <string name="sync_file_fail_msg">Die entfernte Datei konnte nicht überprüft werden</string> + <string name="rename_local_fail_msg">Lokale Kopie konnte nicht umbenannt werden, versuche einen anderen Namen</string> + <string name="rename_server_fail_msg">Konnte dem Server keinen neuen Namen geben</string> + <string name="sync_file_fail_msg">Konnte die entfernte Datei nicht überprüfen</string> <string name="sync_file_nothing_to_do_msg">Dateiinhalte bereits synchronisiert</string> - <string name="create_dir_fail_msg">Ordner konnte nicht erstellt werden</string> + <string name="create_dir_fail_msg">Konnte den Ordner nicht erstellen</string> <string name="filename_forbidden_characters">Verbotene Zeichen: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Der Dateiname enthält mindestens ein ungültiges Zeichen</string> <string name="filename_empty">Dateiname darf nicht leer sein</string> - <string name="wait_a_moment">Einen Moment warten</string> + <string name="wait_a_moment">Bitte warten...</string> <string name="wait_checking_credentials">Prüfe gespeicherte Anmeldeinformationen</string> - <string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuchen Sie, die Datei in einer anderen App zu öffnen.</string> - <string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string> + <string name="filedisplay_no_file_selected">Keine Datei gewählt</string> <string name="activity_chooser_title">Link senden an …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string> <string name="oauth_check_onoff">Anmelden mit oAuth2</string> - <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server…</string> - <string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string> <string name="ssl_validator_reason_cert_not_trusted">- Das Zertifikat des Servers ist nicht vertrauenswürdig</string> <string name="ssl_validator_reason_cert_expired">- Das Zertifikat des Servers ist abgelaufen</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Das Gültigkeitsdatum des Serverzertifikats liegt in der Zukunft</string> <string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string> <string name="ssl_validator_question">Möchten Sie diesem Zertifikat trotzdem vertrauen?</string> - <string name="ssl_validator_not_saved">Das Zertifikat konnte nicht gespeichert werden</string> <string name="ssl_validator_btn_details_see">Details</string> <string name="ssl_validator_btn_details_hide">Ausblenden</string> <string name="ssl_validator_label_subject">Ausgestellt für:</string> @@ -336,24 +326,22 @@ <string name="placeholder_sentence">Dies ist ein Platzhalter</string> <string name="placeholder_filename">platzhalter.txt</string> - <string name="placeholder_filetype">PNG Bild</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">18.05.2012 12:23</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Nur über WLAN hochladen</string> - <string name="instant_upload_on_wifi">Fotos nur über WLAN hochladen</string> - <string name="instant_video_upload_on_wifi">Videos nur über WLAN hochladen</string> - <string name="instant_video_upload_on_charging">Hochladen nur während des Ladens</string> - <string name="instant_upload_on_charging">Hochladen nur während des Ladens</string> + <string name="auto_upload_on_wifi">Nur über W-Lan hochladen</string> + <string name="instant_upload_on_wifi">Bilder nur über W-Lan hochladen</string> + <string name="instant_video_upload_on_wifi">Videos nur über W-Lan hochladen</string> + <string name="instant_video_upload_on_charging">Nur während des Ladens hochladen</string> + <string name="instant_upload_on_charging">Nur während des Ladens hochladen</string> <string name="instant_upload_path">/SofortUpload</string> <string name="conflict_title">Dateikonflikt</string> - <string name="conflict_message">Welche Datei möchten Sie behalten? Wenn Sie beide Versionen auswählen, wird der lokalen Datei eine Zahl ans Ende ihres Dateinamens angehängt.</string> <string name="conflict_keep_both">Beide behalten</string> <string name="conflict_use_local_version">lokale Version</string> <string name="conflict_use_server_version">Server-Version</string> - <string name="preview_sorry">Das tut mir leid!</string> + <string name="preview_sorry">Entschuldigung.</string> <string name="preview_image_description">Bildvorschau</string> <string name="preview_image_error_unknown_format">Bild kann nicht angezeigt werden</string> @@ -364,7 +352,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Verwende Unterordner</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Speichere in Unterordnern basierend auf Jahr und Monat</string> - <string name="share_link_no_support_share_api">Entschuldigung, das Teilen ist auf Ihrem Server nicht aktiviert. Bitte kontaktiere Sie Ihren Administrator.</string> + <string name="share_link_no_support_share_api">Teilen ist auf Ihrem Server nicht aktiviert. Bitte kontaktieren Sie den Administrator.</string> <string name="share_link_file_no_exist">Teilen nicht möglich. Prüfen Sie, ob die Datei existiert</string> <string name="share_link_file_error">Es ist ein Fehler beim Freigeben der Datei oder des Ordners aufgetreten.</string> <string name="unshare_link_file_no_exist">Entfernen der Freigabe nicht möglich. Prüfen Sie, ob die Datei existiert</string> @@ -378,56 +366,40 @@ <string name="copy_link">Link kopieren</string> <string name="clipboard_text_copied">In die Zwischenablage kopiert</string> - <string name="clipboard_no_text_to_copy">Kein Text zum Kopieren in die Zwischenablage empfangen</string> <string name="clipboard_uxexpected_error">Unerwarteter Fehler beim Kopieren in die Zwischenablage</string> <string name="clipboard_label">Text von %1$s kopiert</string> - <string name="error_cant_bind_to_operations_service">Kritischer Fehler: Operationen können nicht ausgeführt werden</string> - - <string name="network_error_socket_exception">Es ist ein Fehler bei der Verbindung mit dem Server aufgetreten.</string> - <string name="network_error_socket_timeout_exception">Es ist ein Fehler während des Wartens auf den Server aufgetreten, die Operation kann nicht ausgeführt werden</string> - <string name="network_error_connect_timeout_exception">Es ist ein Fehler während des Wartens auf den Server aufgetreten, die Operation kann nicht ausgeführt werden</string> - <string name="network_host_not_available">Die Operation kann nicht abgeschlossen werden, der Server ist nicht erreichbar</string> - <string name="forbidden_permissions">Sie haben keine Berechtigung %s</string> + <string name="forbidden_permissions">Ihnen fehlt die Erlaubnis %s</string> <string name="forbidden_permissions_rename">diese Datei umzubenennen</string> <string name="forbidden_permissions_delete">diese Datei zu löschen</string> <string name="share_link_forbidden_permissions">diese Datei zu teilen</string> <string name="unshare_link_forbidden_permissions">diese Datei nicht mehr zu teilen</string> <string name="update_link_forbidden_permissions">zum Aktualisieren dieser Freigabe</string> - <string name="forbidden_permissions_create">eine Datei zu erstellen</string> - <string name="uploader_upload_forbidden_permissions">in diesem Order etwas hochzuladen</string> + <string name="forbidden_permissions_create">diese Datei zu erstellen</string> + <string name="uploader_upload_forbidden_permissions">diesen Ordner hochzuladen</string> <string name="downloader_download_file_not_found">Diese Datei steht auf dem Server nicht mehr zur Verfügung</string> <string name="file_migration_dialog_title">Aktualisiere Speicherort</string> <string name="file_migration_finish_button">Beenden</string> <string name="file_migration_preparing">Bereite Migration vor…</string> <string name="file_migration_checking_destination">Prüfe Zielort…</string> - <string name="file_migration_saving_accounts_configuration">Speichere Konteneinstellung…</string> - <string name="file_migration_waiting_for_unfinished_sync">Warte auf Abschluss der Synchronisierungen…</string> + <string name="file_migration_saving_accounts_configuration">Sichere Konfiguration der Konten…</string> + <string name="file_migration_waiting_for_unfinished_sync">Warte auf die Fertigstellung der Synchronisationen…</string> <string name="file_migration_migrating">Verschiebe Dateien…</string> <string name="file_migration_updating_index">Aktualisiere Index…</string> <string name="file_migration_cleaning">Aufräumen…</string> - <string name="file_migration_restoring_accounts_configuration">Konteneinstellung wiederherstellen…</string> + <string name="file_migration_restoring_accounts_configuration">Konfiguration der Konten wiederherstellen…</string> <string name="file_migration_ok_finished">Abgeschlossen</string> - <string name="file_migration_failed_not_enough_space">FEHLER: Nicht genügend Speicherplatz</string> + <string name="file_migration_failed_not_enough_space">FEHLER: zu wenig Platz</string> <string name="file_migration_failed_not_writable">FEHLER: Datei kann nicht geschrieben werden</string> - <string name="file_migration_failed_not_readable">FEHLER: Datei nicht lesbar</string> + <string name="file_migration_failed_not_readable">FEHLER: Datei kann nicht gelesen werden</string> <string name="file_migration_failed_dir_already_exists">FEHLER: Nextcloud Ordner existiert bereits</string> - <string name="file_migration_failed_while_coping">FEHLER: Während der Migration</string> - <string name="file_migration_failed_while_updating_index">FEHLER: Während der Aktualisierung des Indixes</string> - - <string name="file_migration_directory_already_exists">Datenordner existiert bereits, was soll getan werden?</string> - <string name="file_migration_override_data_folder">Überschreiben</string> - <string name="file_migration_use_data_folder">Verwende Bestehenden</string> - + <string name="file_migration_failed_while_coping">FEHLER: Migration fehlgeschlagen</string> <string name="prefs_category_accounts">Konten</string> <string name="prefs_add_account">Konto hinzufügen</string> <string name="drawer_manage_accounts">Konten verwalten</string> - <string name="auth_redirect_non_secure_connection_title">Die gesicherte Verbindung wird auf eine unsichere Route weitergeleitet.</string> - - <string name="actionbar_logger">Protokolle</string> + <string name="actionbar_logger">Protokolle</string> <string name="log_send_history_button">Verlauf senden</string> - <string name="log_send_no_mail_app">Keine App zum Versenden der Meldungen gefunden. Bitte installieren Sie eine Mail-App!</string> <string name="log_send_mail_subject">%1$s Android-App Meldungen</string> <string name="log_progress_dialog_text">Lade Daten …</string> @@ -435,27 +407,20 @@ <string name="saml_authentication_wrong_pass">Falsches Passwort</string> <string name="actionbar_move">Verschieben</string> <string name="actionbar_copy">Kopieren</string> - <string name="file_list_empty_moving">Nichts vorhanden. Sie können einen Ordner hinzufügen!</string> <string name="folder_picker_choose_button_text">Auswählen</string> - <string name="move_file_not_found">Verschieben nicht möglich. Bitte überprüfen Sie, ob die Datei existiert</string> - <string name="move_file_invalid_into_descendent">Es ist nicht möglich einen Ordner eine Ebene tiefer zu verschieben</string> - <string name="move_file_invalid_overwrite">Die Datei ist bereits im Zielordner vorhanden</string> <string name="move_file_error">Es ist ein Fehler beim Verschieben dieser Datei oder dieses Ordners aufgetreten.</string> <string name="forbidden_permissions_move">um diese Datei zu verschieben</string> <string name="copy_file_not_found">Kopieren nicht möglich. Bitte überprüfen Sie, ob die Datei existiert</string> - <string name="copy_file_invalid_into_descendent">Es ist nicht möglich, einen Ordner in einen seiner Unterordner zu kopieren</string> - <string name="copy_file_invalid_overwrite">Die Datei ist bereits im Zielordner vorhanden</string> <string name="copy_file_error">Es ist ein Fehler beim Kopieren dieser Datei oder dieses Ordners aufgetreten</string> <string name="forbidden_permissions_copy">um diese Datei zu kopieren</string> <string name="prefs_category_instant_uploading">Sofortiges Hochladen</string> <string name="prefs_category_details">Details</string> - <string name="prefs_instant_video_upload_path_title">Pfad zum sofortigen Video-Upload</string> - <string name="sync_folder_failed_content">Bei der Synchronisation konnte %1$s Ordner nicht fertig gestellt werden</string> + <string name="sync_folder_failed_content">Bei der Synchronisation konnte %1$s Ordner nicht fertig gestellt werden</string> <string name="shared_subject_header">geteilt</string> <string name="with_you_subject_header">Mit Ihnen</string> @@ -496,7 +461,6 @@ <string name="share_add_user_or_group">Benutzer oder Gruppe hinzufügen</string> <string name="share_via_link_section_title">Link teilen</string> <string name="share_via_link_expiration_date_label">Ein Ablaufdatum setzen</string> - <string name="share_via_link_password_label">Passwortschutz</string> <string name="share_via_link_password_title">Gesichert</string> <string name="share_via_link_edit_permission_label">Bearbeitung erlauben</string> <string name="share_via_link_hide_file_listing_permission_label">Dateiliste verbergen</string> @@ -512,7 +476,6 @@ <string name="share_email_clarification">%1$s (E-Mail)</string> <string name="share_known_remote_clarification">%1$s ( auf %2$s )</string> - <string name="share_sharee_unavailable">Entschuldigung, Ihre Serverversion erlaubt das Teilen mit Nutzern innerhalb der Clients nicht. \nBitte kontaktieren Sie Ihren Administrator</string> <string name="share_privilege_can_share">kann teilen</string> <string name="share_privilege_can_edit">kann bearbeiten</string> <string name="share_privilege_can_edit_create">erstellen</string> @@ -521,50 +484,34 @@ <string name="edit_share_unshare">Freigabe löschen</string> <string name="edit_share_done">Erledigt</string> - <string name="action_retry_uploads">Wiederholung fehlgeschlagen</string> <string name="action_clear_failed_uploads">Entferne Fehlversuche</string> - <string name="action_clear_successful_uploads">Entferne erfolgreiche Uploads</string> - <string name="action_clear_finished_uploads">Alles aufräumen</string> - <string name="action_switch_grid_view">Zur Rasteransicht wechseln</string> <string name="action_switch_list_view">Zur Listenansicht wechseln</string> <string name="manage_space_title">Speicher verwalten</string> - <string name="manage_space_description">Einstellungen, Datenbank und Server-Zertifikate von %1$s\'s Daten werden dauerhaft gelöscht.\n\nHerunter geladene Dateien bleiben unangetastet.\n\nDieser Vorgang kann eine Zeit dauern.</string> <string name="manage_space_clear_data">Lösche Daten</string> <string name="manage_space_error">Einige Dateien konnten nicht gelöscht werden.</string> - <string name="permission_storage_access">Weitere Berechtigungen erforderlich für das Hoch- und Herunterladen von Dateien</string> - <string name="local_file_not_found_toast">Die Datei wurde im lokalen Dateisystem nicht gefunden</string> <string name="confirmation_remove_files_alert">Wollen Sie die ausgewählten Einträge wirklich löschen?</string> <string name="confirmation_remove_folders_alert">Wollen Sie die ausgewählten Einträge und deren Inhalte wirklich löschen?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Warte auf das Aufladen des Gerätes</string> <string name="actionbar_search">Suche</string> <string name="files_drop_not_supported">Dies ist eine Nextcloud Funktion, bitte updaten.</string> <string name="learn_more">Mehr</string> <string name="drawer_folder_sync">Auto-Upload</string> <string name="drawer_participate">Mitmachen</string> - <string name="participate_testing_headline">Helfen Sie uns beim Testen</string> - <string name="participate_testing_bug_text">Fehler gefunden? Merkwürdiges Verhalten?</string> <string name="participate_testing_report_text">Fehler melden auf Github</string> - <string name="participate_testing_version_text">Möchten Sie uns beim Testen der nächsten Version unterstützen?</string> <string name="participate_beta_headline">Testen Sie die Beta-Version</string> - <string name="participate_beta_text">Dies beinhaltet neue Funktionalitäten und ist nicht vollumfänglich qualitätsgesichert. Es können daher Fehler/Bugs auftreten, melden Sie uns diese bitte.</string> <string name="participate_release_candidate_headline">Vorabversionen</string> - <string name="participate_release_candidate_text">Eine Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test in der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version bei F-Droid unter „Versionen“.</string> <string name="participate_contribute_headline">Aktiv etwas beitragen</string> <string name="participate_contribute_irc_text">An Diskussionen im IRC teilnehmen: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Helfen Sie anderen im <a href="%1$s">Forum</a></string> <string name="participate_contribute_translate_text">Die App <a href=\"%1$s\">übersetzen</a></string> - <string name="participate_contribute_github_text">Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a></string> <string name="move_to">Verschieben nach…</string> <string name="copy_to">Kopieren nach…</string> <string name="choose_remote_folder">Ordner auswählen…</string> <string name="folder_sync_loading_folders">Ordner laden…</string> <string name="folder_sync_no_results">Keine Medienordner gefunden.</string> - <string name="folder_sync_preferences">Auto Upload Einstellungen</string> <string name="folder_sync_settings">Einstellungen</string> - <string name="folder_sync_new_info">Der Auto-Upload wurde vollständig überarbeitet. Bitte über das Hauptmenü zum Auto-Upload gehen und neu konfigurieren. Bitte entschuldigen Sie die Unannehmlichkeiten.\n\nViel Vergnügen mit den neuen und erweiterten Möglichkeiten des Auto-Uploads!</string> <string name="folder_sync_preferences_folder_path">Für %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d ausgewählt</item> @@ -578,7 +525,6 @@ <string name="notifications_no_results_headline">Keine Benachrichtigungen</string> <string name="notifications_no_results_message">Bitte sehen Sie später noch einmal nach.</string> - <string name="upload_file_dialog_title">Dateinamen und -typ zum Hochladen eingeben</string> <string name="upload_file_dialog_filename">Dateiname</string> <string name="upload_file_dialog_filetype">Dateityp</string> <string name="upload_file_dialog_filetype_snippet_text">Schnipsel-Textdatei (.txt)</string> @@ -594,8 +540,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Ein sicheres Zuhause für alle Ihre Daten</string> - <string name="welcome_feature_1_text">Zugriff, Freigabe & Schutz Ihrer Dateien zu Hause und in Ihrem Unternehmen.</string> - <string name="welcome_feature_2_title">Mehrfachkonto</string> <string name="welcome_feature_2_text">Verbinden Sie sich mit all Ihren Clouds</string> @@ -609,7 +553,6 @@ <!-- User information --> <string name="user_info_full_name">Vollständiger Name</string> - <string name="user_info_email">E-Mail</string> <string name="user_info_phone">Telefonnummer</string> <string name="user_info_address">Adresse</string> <string name="user_info_website">Webseite</string> @@ -619,23 +562,16 @@ <!-- Activities --> <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> - <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> <string name="webview_error">Fehler aufgetreten</string> <string name="prefs_category_about">Über</string> - <string name="actionbar_contacts">Adressen-Sicherung</string> - <string name="contacts_backup_button">Sicherung jetzt erstellen</string> <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> <string name="contacts_header_restore">Wiederherstellen</string> <string name="contacts_header_backup">Sicherung</string> <string name="contacts_automatic_backup">Adressen-Sicherung</string> <string name="contacts_last_backup">Letzte Sicherung</string> - <string name="contacts_read_permission">Lese-Zugriffs-Erlaubnis für Adressen ist erforderlich</string> - <string name="contacts_write_permission">Schreib-Erlaubnis für Adressen ist erforderlich</string> <string name="contactlist_title">Adressen wiederherstellen</string> <string name="contaclist_restore_selected">Ausgewählte Adressen wiederherstellen</string> - <string name="contactlist_account_chooser_title">Konto für den Import auswählen</string> - <string name="contactlist_no_permission">Keine Berechtigung, es wurde nichts importiert!</string> <string name="contacts_preference_choose_date">Datum auswählen</string> <string name="contacts_preference_backup_never">nie</string> <string name="contacts_preferences_no_file_found">Keine Datei gefunden</string> @@ -644,6 +580,4 @@ <!-- Notifications --> <string name="new_notification_received">Neue Benachrichtigung erhalten</string> - - -</resources> + </resources> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 92b5c5c514..81cad2d864 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">Fingerabdruck-Sperre</string> <string name="prefs_fingerprint_notsetup">Keine Fingerabdrücke eingerichtet.</string> <string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string> - <string name="prefs_instant_upload">Sofortiger Bilder-Upload</string> - <string name="prefs_instant_upload_summary">Lade Fotos von der Kamera sofort hoch</string> - <string name="prefs_instant_video_upload">Sofortiger Video-Upload</string> - <string name="prefs_instant_video_upload_summary">Lade Videos von der Kamera sofort hoch</string> + <string name="prefs_instant_upload">Sofortiges Hochladen von Bildern</string> + <string name="prefs_instant_upload_summary">Lade mit der Kamera gemachte Fotos sofort hoch</string> + <string name="prefs_instant_video_upload">Sofortiges Hochladen von Videos</string> + <string name="prefs_instant_video_upload_summary">Lade mit der Kamera gemachte Videos sofort hoch</string> <string name="prefs_log_title">Protokollierung aktivieren</string> <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen genutzt</string> <string name="prefs_log_title_history">Protokollierungs-Historie</string> @@ -58,17 +58,17 @@ <string name="prefs_calendar_contacts">Kalender & Kontakte synchronisieren</string> <string name="prefs_calendar_contacts_summary">DAVdroid (v1.3.0+) für aktuelles Konto einrichten</string> <string name="prefs_calendar_contacts_address_resolve_error">Serveradresse des Kontos für die DAVdroid-Nutzung konnte nicht ermittelt werden</string> - <string name="prefs_calendar_contacts_no_store_error">Weder Google Play Store noch F-Droid App installiert</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Kalender- & Kontakte-Synchronisierung erfolgreich konfiguriert</string> + <string name="prefs_calendar_contacts_no_store_error">Weder F-Droid noch Google-Play sind installiert</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Kalender- & Adress-Synchronisation konfigurieren</string> <string name="prefs_help">Hilfe</string> - <string name="prefs_recommend">Empfehle dies einem Freund</string> + <string name="prefs_recommend">Einem Freund empfehlen</string> <string name="prefs_feedback">Rückmeldungen</string> <string name="prefs_imprint">Impressum</string> <string name="prefs_remember_last_share_location">Geteilten Speicherort merken</string> - <string name="prefs_remember_last_upload_location_summary">Geteilten Upload-Speicherort merken</string> + <string name="prefs_remember_last_upload_location_summary">Zuletzt verwendeten, geteilten Upload-Speicherort merken</string> <string name="recommend_subject">Probiere %1$s auf Deinem Smartphone!</string> - <string name="recommend_text">Ich empfehle Dir die Nutzung von %1$s auf Deinem Smartphone!\nLade es hier herunter: %2$s</string> + <string name="recommend_text">"Ich empfehle Dir die Nutzung von %1$s auf Deinem Smartphone!\nLade es hier herunter: %2$s"</string> <string name="auth_check_server">Server überprüfen</string> <string name="auth_host_url">Server-Adresse https://…</string> @@ -86,20 +86,21 @@ <string name="uploader_error_title_no_file_to_upload">Keine Datei zum Hochladen</string> <string name="uploader_error_message_received_piece_of_text">%1$s kann einen Textteil als Datei hochladen</string> <string name="uploader_error_message_no_file_to_upload">Empfangene Daten enthalten keine gültige Datei.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Datei kann nicht hochgeladen werden</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Diese Datei kan nicht hochgeladen werden</string> <string name="uploader_error_message_read_permission_not_granted">%1$s darf eine empfangene Datei nicht lesen</string> - <string name="uploader_error_message_source_file_not_found">Hochzuladende Datei wurde an ihrem Ort nicht gefunden. Prüfe, ob die Datei existiert.</string> + <string name="uploader_error_message_source_file_not_found">Die zum Hochladen ausgewählte Datei kann nicht gefunden werden. Bitte prüfe ob die Datei existiert. +</string> <string name="uploader_error_message_source_file_not_copied">Es ist ein Fehler beim Kopieren dieser Datei in einen temporären Ordner aufgetreten. Bitte erneut versuchen die Datei zu senden.</string> <string name="uploader_upload_files_behaviour">Upload Option:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Datei in Nextcloud Ordner verschieben</string> <string name="uploader_upload_files_behaviour_only_upload">Hochladen und im Quellordner behalten</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Hochladen und Datei im Quellordner löschen</string> <string name="file_list_seconds_ago">Gerade eben</string> - <string name="file_list_empty_headline">Keine Dateien vorhanden</string> - <string name="file_list_empty">Lade Inhalt hoch oder synchronisiere mit Deinen Geräten!</string> - <string name="file_list_empty_favorites">Favorisiere einige Dateien oder synchronisiere deine Geräte!</string> + <string name="file_list_empty_headline"> Keine Dateien vorhanden </string> + <string name="file_list_empty">Lade Inhalt hoch oder synchronisiere mit Deinen Geräten.</string> + <string name="file_list_empty_favorites">Favorisiere einige Dateien oder synchronisiere deine Geräte.</string> <string name="file_list_empty_favorites_filter_list">Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier</string> - <string name="file_list_empty_favorites_filter">Keine favorisierten Dateien in deinem Verlauf gefunden!</string> + <string name="file_list_empty_favorites_filter">Keine favorisierten Dateien in deinem Verlauf gefunden.</string> <string name="file_list_loading">Lade…</string> <string name="file_list_no_app_for_file_type">Es wurde keine App für diesen Dateityp gefunden!</string> <string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</string> @@ -110,19 +111,18 @@ <string name="file_list_empty_shared">Von dir geteilte Dateien und Ordner werden hier erscheinen</string> <string name="file_list_empty_headline_server_search_videos">Keine Videos</string> <string name="file_list_empty_headline_server_search_photos">Keine Fotos</string> - <string name="file_list_empty_search">Soll in einem anderen Ordner nachgesehen werden?</string> + <string name="file_list_empty_search">Vielleicht befindet es sich in einem anderen Ordner?</string> <string name="file_list_empty_recently_modified">Keine, innerhalb der letzten 7 Tage, geänderten Dateien gefunden</string> - <string name="file_list_empty_recently_modified_filter">Keine Dateien in deinem Verlauf gefunden, - die in den letzten 7 Tagen geändert wurden!</string> - <string name="file_list_empty_recently_added">Keine kürzlich hinzu gefügten Dateien gefunden</string> - <string name="file_list_empty_recently_added_filter">Keine kürzlich hinzu gefügten Dateien in deinem Verlauf gefunden!</string> + <string name="file_list_empty_recently_modified_filter">Keine Dateien gefunden, die in den letzten 7 Tagen geändert wurden.</string> + <string name="file_list_empty_recently_added">Keine kürzlich hinzugefügten Dateien gefunden</string> + <string name="file_list_empty_recently_added_filter">Keine kürzlich hinzu gefügten Dateien gefunden!</string> <string name="file_list_empty_text_photos">Lade Fotos hoch oder aktiviere den Sofortupload!</string> - <string name="file_list_empty_text_photos_filter">Keine Fotos in deinem Verlauf gefunden!</string> - <string name="file_list_empty_text_videos">Lade einige Videos hoch oder aktiviere den Sofortupload!</string> - <string name="file_list_empty_text_videos_filter">Keine Videos in deinem Verlauf gefunden!</string> + <string name="file_list_empty_text_photos_filter">Keine Fotos gefunden.</string> + <string name="file_list_empty_text_videos">Lade einige Videos hoch oder aktiviere den Sofortupload.</string> + <string name="file_list_empty_text_videos_filter">Keine Videos gefunden.</string> <string name="upload_list_empty_headline">Keine Uploads verfügbar</string> - <string name="upload_list_empty_text">Lade Inhalt hoch oder aktiviere den Sofortupload!</string> - <string name="upload_list_empty_text_auto_upload">Lade Inhalt hoch oder aktiviere den Sofortupload!</string> + <string name="upload_list_empty_text">Lade Inhalte hoch oder aktiviere den Sofortupload.</string> + <string name="upload_list_empty_text_auto_upload">Lade Inhalte hoch oder aktiviere den Auto Upload!</string> <string name="file_list_folder">Ordner</string> <string name="file_list_folders">Ordner</string> <string name="file_list_file">Datei</string> @@ -134,14 +134,14 @@ <string name="filedetails_modified">Geändert:</string> <string name="filedetails_download">Herunterladen</string> <string name="filedetails_sync_file">Synchronisation</string> - <string name="filedetails_renamed_in_upload_msg">Datei wurde wärend des Uploads in %1$s umbenannt</string> + <string name="filedetails_renamed_in_upload_msg">Datei während des Hochladens in %1$s umbenannt</string> <string name="list_layout">Layout der Liste</string> <string name="action_share">Teilen</string> <string name="common_yes">Ja</string> <string name="common_no">Nein</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Upload entfernen</string> - <string name="common_retry_upload">Hochladen erneut versuchen</string> + <string name="common_retry_upload">Versuche erneut hochzuladen</string> <string name="common_cancel_sync">Synchronisation abbrechen</string> <string name="common_cancel">Abbrechen</string> <string name="common_back">Zurück</string> @@ -161,10 +161,10 @@ <string name="uploader_info_dirname">Ordnername</string> <string name="uploader_upload_in_progress_ticker">Hochladen …</string> <string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string> - <string name="uploader_upload_succeeded_ticker">Hochladen erfolgreich</string> + <string name="uploader_upload_succeeded_ticker">Hochgeladen</string> <string name="uploader_upload_succeeded_content_single">%1$s hochgeladen</string> <string name="uploader_upload_failed_ticker">Hochladen fehlgeschlagen</string> - <string name="uploader_upload_failed_content_single">Hochladen von %1$s konnte nicht abgeschlossen werden</string> + <string name="uploader_upload_failed_content_single">Konnte %1$s nicht hochladen</string> <string name="uploader_upload_failed_credentials_error">Hochladen fehlgeschlagen, erneute Anmeldung erforderlich</string> <string name="uploads_view_title">Uploads</string> <string name="uploads_view_group_current_uploads">Aktuell</string> @@ -181,21 +181,21 @@ <string name="uploads_view_upload_status_failed_localfile_error">Lokale Datei nicht gefunden</string> <string name="uploads_view_upload_status_failed_permission_error">Berechtigungsfehler</string> <string name="uploads_view_upload_status_conflict">Konflikt</string> - <string name="uploads_view_upload_status_service_interrupted">Die Anwendung wurde beendet</string> + <string name="uploads_view_upload_status_service_interrupted">App beendet</string> <string name="uploads_view_upload_status_unknown_fail">Unbekannter Fehler</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Warten auf Drahtlos-Verbindung</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Warte auf W-Lan-Verbindung</string> <string name="uploads_view_later_waiting_to_upload">Warte auf Hochladen</string> <string name="downloader_download_in_progress_ticker">Herunterladen …</string> <string name="downloader_download_in_progress_content">%1$d%% Herunterladen %2$s</string> - <string name="downloader_download_succeeded_ticker">Herunterladen erfolgreich</string> + <string name="downloader_download_succeeded_ticker">Heruntergeladen</string> <string name="downloader_download_succeeded_content">%1$s heruntergeladen</string> <string name="downloader_download_failed_ticker">Herunterladen fehlgeschlagen</string> - <string name="downloader_download_failed_content">Herunterladen von %1$s konnte nicht abgeschlossen werden</string> + <string name="downloader_download_failed_content">Konnte %1$s nicht herunterladen</string> <string name="downloader_not_downloaded_yet">Noch nicht Heruntergeladen</string> <string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, erneute Anmeldung erforderlich</string> <string name="common_choose_account">Konto auswählen</string> <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string> - <string name="sync_fail_ticker_unauthorized">Synchronisation fehlgeschlagen, erneute Anmeldung erforderlich.</string> + <string name="sync_fail_ticker_unauthorized">Synchronisation fehlgeschlagen. Du mußt Dich erneut anmelden</string> <string name="sync_fail_content">Synchronisation von %1$s konnte nicht abgeschlossen werden</string> <string name="sync_fail_content_unauthorized">Falsches Passwort für %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string> @@ -204,8 +204,8 @@ <string name="sync_fail_in_favourites_content">Inhalte von %1$d Dateien konnten nicht synchronisiert werden (%2$d Konflikte)</string> <string name="sync_foreign_files_forgotten_ticker">Einige lokale Dateien wurden vergessen</string> <string name="sync_foreign_files_forgotten_content">%1$d Dateien aus dem %2$s Verzeichnis konnten nicht kopiert werden nach</string> - <string name="sync_foreign_files_forgotten_explanation">Seit Version 1.3.16 werden Dateien die von diesem Gerät aus hochgeladen werden in den lokalen Ordner %1$s kopiert um Datenverlust zu vermeiden, wenn eine einzelne Datei mit mehreren Accounts synchronisiert wird.\n\nInfolge dieser Änderung wurden alle Dateien, die mit vorherigen Versionen dieser App hochgeladen wurden, in den Ordner %2$s verschoben. Jedoch ist während der Konto-Synchronisation ein Fehler aufgetreten, der das Abschließen dieses Vorgangs verhindert hat. Die Datei(en) können entweder wie sie sind belassen und den Link zu %3$s entfernt werden oder die Datei(en) in den Ordner %1$s verschoben und den Link zu %4$s beibehalten werden.\n\nUnten befindet sich eine Liste der lokalen Datei(en) und der mit ihnen verbundenen Remote-Datei(en) in %5$s.</string> - <string name="sync_current_folder_was_removed">Das Verzeichnis %1$s existiert nicht mehr</string> + <string name="sync_foreign_files_forgotten_explanation">Seit Version 1.3.16 werden Dateien die von diesem Gerät aus hochgeladen werden in den lokalen Ordner %1$s kopiert um Datenverlust zu vermeiden, wenn eine einzelne Datei mit mehreren Accounts synchronisiert wird.\n\nInfolge dieser Änderung wurden alle Dateien, die mit vorherigen Versionen dieser App hochgeladen wurden, in den Ordner %2$s verschoben. Jedoch ist während der Konto-Synchronisation ein Fehler aufgetreten, der das Abschließen dieses Vorgangs verhindert hat. Die Datei(en) können entweder wie sie sind belassen und den Link zu %3$s entfernt werden oder die Datei(en) in den Ordner %1$s verschoben und den Link zu %4$s beibehalten werden.\n\nUnten befindet sich eine Liste der lokalen Datei(en) und der mit ihnen verbundenen Remote-Datei(en) in %5$s.</string> + <string name="sync_current_folder_was_removed">Der Ordner %1$s existiert nicht mehr</string> <string name="foreign_files_move">Verschiebe alle</string> <string name="foreign_files_success">Alle Dateien wurden verschoben</string> <string name="foreign_files_fail">Einige Dateien konnten nicht verschoben werden</string> @@ -229,12 +229,12 @@ <string name="media_event_done">%1$s Wiedergabe Beendet</string> <string name="media_err_nothing_to_play">Keine Mediendatei gefunden</string> <string name="media_err_no_account">Kein Konto angegeben</string> - <string name="media_err_not_in_owncloud">Datei ist nicht in einem gültigen Konto</string> + <string name="media_err_not_in_owncloud">Die Datei befindet sich nicht in einem gültigen Konto</string> <string name="media_err_unsupported">Medien-Codec wird nicht unterstützt</string> - <string name="media_err_io">Mediendatei konnte nicht gelesen werden</string> - <string name="media_err_malformed">Mediendatei nicht korrekt encodiert</string> + <string name="media_err_io">Konnte die Mediendatei nicht lesen</string> + <string name="media_err_malformed">Mediendatei ist nicht korrekt encodiert</string> <string name="media_err_timeout">Wartezeit beim Abspielversuch abgelaufen</string> - <string name="media_err_invalid_progressive_playback">Mediendatei kann nicht gestreamt werden</string> + <string name="media_err_invalid_progressive_playback">Die Mediendatei kann nicht gestreamt werden</string> <string name="media_err_unknown">Diese Mediendatei konnte nicht mit dem Standardplayer geöffnet werden</string> <string name="media_err_security_ex">Sicherheitsfehler beim Versuch %1$s wiederzugeben</string> <string name="media_err_io_ex">Eingabefehler beim Versuch %1$s wiederzugeben</string> @@ -253,14 +253,14 @@ <string name="auth_account_not_new">Ein Benutzerkonto für den gleichen Benutzer und Server existiert auf diesem Gerät bereits</string> <string name="auth_account_not_the_same">Der eingegebene Benutzer passt nicht zu dem Benutzer dieses Benutzerkontos</string> <string name="auth_unknown_error_title">Ein unbekannter Fehler ist aufgetreten!</string> - <string name="auth_unknown_host_title">Konnte den Host nicht finden.</string> - <string name="auth_incorrect_path_title">Server-Installation nicht gefunden</string> + <string name="auth_unknown_host_title">Konnte den Host nicht finden</string> + <string name="auth_incorrect_path_title">Server nicht gefunden</string> <string name="auth_timeout_title">Der Server braucht zu lange für eine Antwort.</string> - <string name="auth_incorrect_address_title">falsches Server-Adress Format</string> + <string name="auth_incorrect_address_title">Falsches Adress-Format für den Server</string> <string name="auth_ssl_general_error_title">SSL-Initialisierung fehlgeschlagen.</string> <string name="auth_ssl_unverified_server_title">SSL-Server-Identität konnte nicht überprüft werden</string> <string name="auth_bad_oc_version_title">Unbekannte Server-Version</string> - <string name="auth_wrong_connection_title">Verbindung konnte nicht aufgebaut werden</string> + <string name="auth_wrong_connection_title">Verbindung konnte nicht hergestellt werden</string> <string name="auth_secure_connection">Sichere Verbindung hergestellt</string> <string name="auth_unauthorized">Falscher Benutzername oder Passwort</string> <string name="auth_oauth_error">Autorisierung nicht erfolgreich</string> @@ -285,7 +285,7 @@ <string name="confirmation_remove_file_alert">Möchtest Du %1$s wirklich entfernen?</string> <string name="confirmation_remove_folder_alert">Soll %1$s und dessen Inhalt wirklich entfernt werden?</string> <string name="confirmation_remove_local">Nur lokal</string> - <string name="remove_success_msg">Erfolgreich entfernt</string> + <string name="remove_success_msg">Entfernt</string> <string name="remove_fail_msg">Entfernen fehlgeschlagen</string> <string name="rename_dialog_title">Gib einen neuen Namen ein</string> <string name="rename_local_fail_msg">Die lokale Kopie konnte nicht umbenannt werden. Versuche es mit einem anderen Namen.</string> @@ -296,15 +296,15 @@ <string name="filename_forbidden_characters">Verbotene Zeichen: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Der Dateiname enthält mindestens ein ungültiges Zeichen</string> <string name="filename_empty">Dateiname darf nicht leer sein</string> - <string name="wait_a_moment">Bitte warte einen Moment.</string> + <string name="wait_a_moment">Bitte warten...</string> <string name="wait_checking_credentials">Überprüfe gespeicherte Anmeldeinformationen</string> <string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuche, die Datei in einer anderen App zu öffnen</string> - <string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string> + <string name="filedisplay_no_file_selected">Keine Datei gewählt</string> <string name="activity_chooser_title">Link senden an …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string> <string name="oauth_check_onoff">Anmelden mit oAuth2</string> - <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server.</string> + <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server...</string> <string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string> <string name="ssl_validator_reason_cert_not_trusted">- Das Zertifikat des Servers ist nicht vertrauenswürdig</string> @@ -341,11 +341,11 @@ <string name="placeholder_timestamp">18.5.2012 12:23</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Nur über WLAN hochladen</string> - <string name="instant_upload_on_wifi">Bilder nur über Wifi hochladen</string> - <string name="instant_video_upload_on_wifi">Videos nur über Wifi hochladen</string> - <string name="instant_video_upload_on_charging">Hochladen nur während des Ladens</string> - <string name="instant_upload_on_charging">Hochladen nur während des Ladens</string> + <string name="auto_upload_on_wifi">Nur über W-Lan hochladen</string> + <string name="instant_upload_on_wifi">Bilder nur über W-Lan hochladen</string> + <string name="instant_video_upload_on_wifi">Videos nur über W-Lan hochladen</string> + <string name="instant_video_upload_on_charging">Nur während des Ladens hochladen</string> + <string name="instant_upload_on_charging">Nur während des Ladens hochladen</string> <string name="instant_upload_path">/SofortUpload</string> <string name="conflict_title">Dateikonfilikt</string> <string name="conflict_message">Welche Datei soll behalten werden? Wenn du beide Versionen wählst, wird der lokalen Datei eine Zahl am Ende des Dateinamens angefügt.</string> @@ -353,7 +353,7 @@ <string name="conflict_use_local_version">Lokale Version</string> <string name="conflict_use_server_version">Serverversion</string> - <string name="preview_sorry">Das tut mir leid!</string> + <string name="preview_sorry">Entschuldigung.</string> <string name="preview_image_description">Bildvorschau</string> <string name="preview_image_error_unknown_format">Bild kann nicht angezeigt werden</string> @@ -364,7 +364,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Unterordner benutzen</string> <string name="prefs_instant_upload_path_use_subfolders_summary">In Unterordnern speichern, basierend auf Jahr und Monat</string> - <string name="share_link_no_support_share_api">Entschuldigung, das Teilen ist auf deinem Server nicht aktiviert. Bitte kontaktiere deinen Administrator.</string> + <string name="share_link_no_support_share_api">Teilen ist auf Deinem Server nicht aktiviert. Bitte kontaktiere den Administrator.</string> <string name="share_link_file_no_exist">Teilen nicht möglich. Prüfe, ob die Datei existiert</string> <string name="share_link_file_error">Es ist ein Fehler beim Freigeben der Datei oder des Ordners aufgetreten.</string> <string name="unshare_link_file_no_exist">Entfernen der Freigabe nicht möglich. Prüfe, dass die Datei existiert</string> @@ -388,32 +388,33 @@ <string name="network_error_socket_timeout_exception">Es ist ein Fehler beim Warten auf den Server aufgetreten, die Operation konnte nicht abgeschlossen werden</string> <string name="network_error_connect_timeout_exception">Es ist ein Fehler beim Warten auf den Server aufgetreten, die Operationkonnte nicht abgeschlossen werden</string> <string name="network_host_not_available">Die Operation kann nicht abgeschlossen werden, der Server ist nicht erreichbar</string> - <string name="forbidden_permissions">Sie haben keine Berechtigung %s</string> + + <string name="forbidden_permissions">Dir fehlt die Erlaubnis %s</string> <string name="forbidden_permissions_rename">diese Datei umzubenennen</string> <string name="forbidden_permissions_delete">diese Datei zu löschen</string> <string name="share_link_forbidden_permissions">diese Datei zu teilen</string> <string name="unshare_link_forbidden_permissions">diese Datei nicht mehr zu teilen</string> <string name="update_link_forbidden_permissions">zum Aktualisieren dieser Freigabe</string> - <string name="forbidden_permissions_create">eine Datei zu erstellen</string> - <string name="uploader_upload_forbidden_permissions">in diesen Order etwas hochzuladen</string> + <string name="forbidden_permissions_create">diese Datei zu erstellen</string> + <string name="uploader_upload_forbidden_permissions">diesen Ordner hochzuladen</string> <string name="downloader_download_file_not_found">Diese Datei steht auf dem Server nicht mehr zur Verfügung</string> <string name="file_migration_dialog_title">Aktualisiere Speicherort</string> <string name="file_migration_finish_button">Beenden</string> <string name="file_migration_preparing">Bereite Migration vor…</string> <string name="file_migration_checking_destination">Prüfe Zielort…</string> - <string name="file_migration_saving_accounts_configuration">Speichere Konteneinstellung…</string> - <string name="file_migration_waiting_for_unfinished_sync">Warte auf Abschluss der Synchronisierungen…</string> + <string name="file_migration_saving_accounts_configuration">Sichere Konfiguration der Konten…</string> + <string name="file_migration_waiting_for_unfinished_sync">Warte auf die Fertigstellung der Synchronisationen…</string> <string name="file_migration_migrating">Verschiebe Dateien…</string> <string name="file_migration_updating_index">Aktualisiere Index…</string> <string name="file_migration_cleaning">Aufräumen…</string> - <string name="file_migration_restoring_accounts_configuration">Konteneinstellung wiederherstellen…</string> + <string name="file_migration_restoring_accounts_configuration">Konfiguration der Konten wiederherstellen…</string> <string name="file_migration_ok_finished">Abgeschlossen</string> - <string name="file_migration_failed_not_enough_space">FEHLER: Nicht genügend Speicherplatz</string> + <string name="file_migration_failed_not_enough_space">FEHLER: zu wenig Platz</string> <string name="file_migration_failed_not_writable">FEHLER: Datei kann nicht geschrieben werden</string> - <string name="file_migration_failed_not_readable">FEHLER: Datei nicht lesbar</string> + <string name="file_migration_failed_not_readable">FEHLER: Datei kann nicht gelesen werden</string> <string name="file_migration_failed_dir_already_exists">FEHLER: Nextcloud Ordner existiert bereits</string> - <string name="file_migration_failed_while_coping">FEHLER: Während der Migration</string> + <string name="file_migration_failed_while_coping">FEHLER: Migration fehlgeschlagen</string> <string name="file_migration_failed_while_updating_index">FEHLER: Während der Aktualisierung des Indexes</string> <string name="file_migration_directory_already_exists">Datenordner existiert bereits, was soll geschehen?</string> @@ -435,7 +436,7 @@ <string name="saml_authentication_wrong_pass">Falsches Passwort</string> <string name="actionbar_move">Verschieben</string> <string name="actionbar_copy">Kopieren</string> - <string name="file_list_empty_moving">Noch nichts vorhanden. Sie können einen Ordner hinzufügen!</string> + <string name="file_list_empty_moving">Noch nichts vorhanden. Du kannst einen Ordner hinzufügen.</string> <string name="folder_picker_choose_button_text">Auswählen</string> <string name="move_file_not_found">Verschieben nicht möglich. Prüfe, ob die Datei existiert</string> @@ -454,7 +455,7 @@ <string name="prefs_category_instant_uploading">sofort hochladen</string> <string name="prefs_category_details">Details</string> - <string name="prefs_instant_video_upload_path_title">Sofortupload-Video-Ordner</string> + <string name="prefs_instant_video_upload_path_title">Video Speicherpfad wählen</string> <string name="sync_folder_failed_content">Bei der Synchronisation konnte %1$s Ordner nicht fertig gestellt werden</string> <string name="shared_subject_header">geteilt</string> @@ -556,7 +557,6 @@ <string name="participate_contribute_irc_text">An Chats teilnehmen auf IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Hilf anderen im <a href="%1$s">Forum</a></string> <string name="participate_contribute_translate_text">Die App <a href="%1$s">Übersetzen</a></string> - <string name="participate_contribute_github_text">Als Entwickler einen Beitrag leisten, Details unter <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a></string> <string name="move_to">Verschieben nach…</string> <string name="copy_to">Kopieren nach…</string> <string name="choose_remote_folder">Wähle Verzeichnis…</string> @@ -564,7 +564,7 @@ <string name="folder_sync_no_results">Keine Medienverzeichnisse gefunden.</string> <string name="folder_sync_preferences">Einstellungen Auto-Hochladen</string> <string name="folder_sync_settings">Einstellungen</string> - <string name="folder_sync_new_info">Sofortiger Upload wurde vollständig überarbeitet. Bitte über das Hauptmenü zum Auto Upload gehen und neu configurieren. Bitte entschuldige die Unannehmlichkeiten.\n\nViel Vergnügen mit den neuen und erweiterten Möglichkeiten des Auto Uploads!</string> + <string name="folder_sync_new_info">Sofortiger Upload wurde vollständig überarbeitet. Bitte über das Hauptmenü zum Auto Upload gehen und neu configurieren. Bitte entschuldige die Unannehmlichkeiten.\n\nViel Vergnügen mit den neuen und erweiterten Möglichkeiten des Auto Uploads.</string> <string name="folder_sync_preferences_folder_path">Für %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d ausgewählt</item> @@ -619,19 +619,19 @@ <!-- Activities --> <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> - <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen & und Freigaben an</string> + <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen und Freigaben an</string> <string name="webview_error">Fehler aufgetreten</string> <string name="prefs_category_about">Über</string> - <string name="actionbar_contacts">Adressen-Sicherung</string> + <string name="actionbar_contacts">Kontakte-Sicherung</string> <string name="contacts_backup_button">Sicherung jetzt erstellen</string> <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> <string name="contacts_header_restore">Wiederherstellen</string> <string name="contacts_header_backup">Sicherung</string> <string name="contacts_automatic_backup">Adressen-Sicherung</string> <string name="contacts_last_backup">Letzte Sicherung</string> - <string name="contacts_read_permission">Lese-Zugriffs-Erlaubnis für Adressen ist erforderlich</string> - <string name="contacts_write_permission">Schreib-Erlaubnis für Adressen ist erforderlich</string> + <string name="contacts_read_permission">Leseberechtigung auf Kontakte erforderlich</string> + <string name="contacts_write_permission">Schreibberechtigung auf Kontakte erforderlich</string> <string name="contactlist_title">Adressen wiederherstellen</string> <string name="contaclist_restore_selected">Ausgewählte Adressen wiederherstellen</string> <string name="contactlist_account_chooser_title">Konto für den Import auswählen</string> @@ -644,6 +644,7 @@ <!-- Notifications --> <string name="new_notification_received">Neue Benachrichtigung erhalten</string> + <string name="drawer_logout">Abmelden</string> </resources> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 5fa58784b2..f5a72dc0e6 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -47,7 +47,7 @@ <string name="prefs_fingerprint_notsetup">No se ha establecido ninguna huella digital. </string> <string name="prefs_show_hidden_files">Mostrar archivos escondidos</string> <string name="prefs_instant_upload">Carga instantánea de imágenes</string> - <string name="prefs_instant_upload_summary">Cargar instantáneamente las fotografías tomadas por la cámara</string> + <string name="prefs_instant_upload_summary">Cargar instantaneamente las fotografías tomadas por la cámara</string> <string name="prefs_instant_video_upload">Carga instantánea de video</string> <string name="prefs_instant_video_upload_summary">Cargar instantáneamente los videos grabados por la cámara</string> <string name="prefs_log_title">Habilitar registro</string> @@ -58,23 +58,23 @@ <string name="prefs_calendar_contacts">Sincronizar calendario & contactos</string> <string name="prefs_calendar_contacts_summary">Configurar DAVdroid (v1.3.0+) para la cuenta actual</string> <string name="prefs_calendar_contacts_address_resolve_error">La dirección del servidor para la cuenta no se pudo resolver para DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">No han instalado las aplicaciones Google Play store o F-Droid</string> - <string name="prefs_calendar_contacts_sync_setup_successful">El calendario & contactos se configuraron exitosamente</string> + <string name="prefs_calendar_contacts_no_store_error">No ha sido instalado F-Droid o Google Play </string> + <string name="prefs_calendar_contacts_sync_setup_successful">Configuración de la sincronizacion del calendario & contactos </string> <string name="prefs_help">Ayuda</string> <string name="prefs_recommend">Recomendar a un amigo</string> <string name="prefs_feedback">Retroalimentación</string> <string name="prefs_imprint">Exención de responsabilidad </string> <string name="prefs_remember_last_share_location">Recordar la ubicación del elemento compartido</string> - <string name="prefs_remember_last_upload_location_summary">Recordar la última ubicación del elemento compartido cargado.</string> + <string name="prefs_remember_last_upload_location_summary">Recordar la ubicación del elemento compartido más recientemente usado</string> <string name="recommend_subject">Prueba  %1$s en tu teléfono inteligente!</string> - <string name="recommend_text">¡Quisiera invitarlo a usar %1$s en su teléfono inteligente!\\nDescargue aquí: %2$s</string> + <string name="recommend_text">Quisiera invitarlo a usar %1$s en su teléfono inteligente\nDescargue aquí: %2$s</string> <string name="auth_check_server">Verficar el servidor</string> <string name="auth_host_url">Dirección del servidor https://…</string> <string name="auth_username">Nombre de usuario</string> <string name="auth_password">Contraseña</string> - <string name="auth_register">Aún no tiene un servidor? \nDa click aquí para obtener uno de un proveedor</string> + <string name="auth_register">Aún no tiene un servidor? \nHaga click aquí para obtener uno de un proveedor</string> <string name="sync_string_files">Archivos</string> <string name="setup_btn_connect">Conectar</string> <string name="uploader_btn_upload_text">Cargar</string> @@ -86,43 +86,43 @@ <string name="uploader_error_title_no_file_to_upload">No hay un archivo para cargar</string> <string name="uploader_error_message_received_piece_of_text">%1$s no puede cargar una fragmento de texto como un archivo.</string> <string name="uploader_error_message_no_file_to_upload">La información recibida no contiene un archivo válido.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">El archivo no se puede cargar</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Este archivo no puede ser cargado</string> <string name="uploader_error_message_read_permission_not_granted">%1$s no tiene permitido leer un archivo recibido</string> - <string name="uploader_error_message_source_file_not_found">El archivo a cargar no ha sido encontrado en su ubicación. Favor de verificar si el archivo existe. </string> - <string name="uploader_error_message_source_file_not_copied">Se presentó un error al copiar el archivo a una carpeta temporal. Favor de intentar enviarlo de nuevo.</string> + <string name="uploader_error_message_source_file_not_found">El archivo seleccionado para cargar no fue encontrado. Favor de verificar si el archivo existe.</string> + <string name="uploader_error_message_source_file_not_copied">No fue posible copiar el archivo a una carpeta temporal. Favor de intentar enviarlo de nuevo.</string> <string name="uploader_upload_files_behaviour">Opción de carga:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Mover el archivo a la carpeta de Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Mantener el archivo en la carpeta de origen</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Borrar el archivo de la carpeta de origen</string> <string name="file_list_seconds_ago">hace algunos segundos</string> <string name="file_list_empty_headline">No hay archivos aquí</string> - <string name="file_list_empty">¡Cargue algún contenido o sincronice con sus dispositivos!</string> - <string name="file_list_empty_favorites">¡Marque algunos archivos como favoritos o sincronice con sus dispositivos!</string> + <string name="file_list_empty">Cargue algún contenido o sincronice con sus dispositivos.</string> + <string name="file_list_empty_favorites">Marque algunos archivos como favoritos o sincronice con sus dispositivos.</string> <string name="file_list_empty_favorites_filter_list">Los archivos y carpetas que marque como favoritos se mostrarán aquí</string> - <string name="file_list_empty_favorites_filter">¡No se encontraron archivos marcados como favoritos en su consulta!</string> + <string name="file_list_empty_favorites_filter">Su búsqueda no regresó archivos marcados como favoritos. </string> <string name="file_list_loading">Cargando…</string> - <string name="file_list_no_app_for_file_type">¡No se encontró una aplicación para este tipo de archivo!</string> + <string name="file_list_no_app_for_file_type">No se cuenta con una aplicación que maneje este tipo de achivo. </string> <string name="local_file_list_empty">No hay archivos en esta carpeta</string> <string name="file_list_empty_headline_search">No hay resultados en esta carpeta</string> <string name="file_list_empty_headline_server_search">No hay resultados</string> - <string name="file_list_empty_favorite_headline">Aún no hay favoritos</string> + <string name="file_list_empty_favorite_headline">Aún no hay nada marcado como favorito</string> <string name="file_list_empty_shared_headline">Aún no hay nada compartido</string> <string name="file_list_empty_shared">Los archivos y carpetas que comparta se mostrarán aquí. </string> <string name="file_list_empty_headline_server_search_videos">No hay videos</string> <string name="file_list_empty_headline_server_search_photos">No hay fotos</string> - <string name="file_list_empty_search">¿Intentó buscar en otra carpeta?</string> + <string name="file_list_empty_search">¿Tal vez está dentro de una carpeta diferente?</string> <string name="file_list_empty_recently_modified">No se encontraron archivos que hayan sido modificado en los últimos 7 días</string> - <string name="file_list_empty_recently_modified_filter">¡No se encontraron archivos para su búsqueda que hayan sido modificados -en los últimos 7 días!</string> + <string name="file_list_empty_recently_modified_filter">Su búsqueda no encontró archivos que hayan sido modificados +en los últimos 7 días. </string> <string name="file_list_empty_recently_added">No se encontraron archivos agregados recientemente</string> - <string name="file_list_empty_recently_added_filter">¡No se encontraron archivos agregados recientemente para su consulta!</string> - <string name="file_list_empty_text_photos">¡Cargue algunas fotos o active la carga automática!</string> - <string name="file_list_empty_text_photos_filter">¡Ninguna foto fue encontrada para su búsqueda!</string> - <string name="file_list_empty_text_videos">¡Cargue algunos videos o active la carga automática!</string> - <string name="file_list_empty_text_videos_filter">¡No se encontraron videos para su búsqueda!</string> + <string name="file_list_empty_recently_added_filter">Su búsqueda no encontró archivos recientemente agregados. </string> + <string name="file_list_empty_text_photos">Cargue algunas fotos o active la carga automática.</string> + <string name="file_list_empty_text_photos_filter">Su búsqueda no encontró fotografías. </string> + <string name="file_list_empty_text_videos">Cargue algunos videos o active la carga automática.</string> + <string name="file_list_empty_text_videos_filter">Su búsqueda no encontró videos. </string> <string name="upload_list_empty_headline">No hay cargas disponibles</string> - <string name="upload_list_empty_text">¡Cargue nuevo contenido o active la carga instantánea!</string> - <string name="upload_list_empty_text_auto_upload">¡Cargue algún contenido o active la carga automática!</string> + <string name="upload_list_empty_text">Cargue algún contenido o active la carga instantánea</string> + <string name="upload_list_empty_text_auto_upload">Cargue algún contenido o active la carga automática</string> <string name="file_list_folder">carpeta</string> <string name="file_list_folders">carpetas</string> <string name="file_list_file">archivo</string> @@ -135,7 +135,7 @@ en los últimos 7 días!</string> <string name="filedetails_download">Descargar</string> <string name="filedetails_sync_file">Sincronizar</string> <string name="filedetails_renamed_in_upload_msg">El archivo se renombró como %1$s durante la carga</string> - <string name="list_layout">Vista de lista</string> + <string name="list_layout">Vista enlistada</string> <string name="action_share">Compartir</string> <string name="common_yes">Sí</string> <string name="common_no">No</string> @@ -161,10 +161,10 @@ en los últimos 7 días!</string> <string name="uploader_info_dirname">Nombre de la carpeta</string> <string name="uploader_upload_in_progress_ticker">Cargando …</string> <string name="uploader_upload_in_progress_content">%1$d%% Cargando %2$s</string> - <string name="uploader_upload_succeeded_ticker">Carga exitosa</string> + <string name="uploader_upload_succeeded_ticker">Cargado</string> <string name="uploader_upload_succeeded_content_single">%1$s cargado</string> <string name="uploader_upload_failed_ticker">Falla en la carga</string> - <string name="uploader_upload_failed_content_single">La carga de %1$s no pudo ser completada</string> + <string name="uploader_upload_failed_content_single">No fue posible cargar %1$s</string> <string name="uploader_upload_failed_credentials_error">Falla en la carga, necesita autenticarse de nuevo</string> <string name="uploads_view_title">Cargas</string> <string name="uploads_view_group_current_uploads">Actual</string> @@ -181,22 +181,22 @@ en los últimos 7 días!</string> <string name="uploads_view_upload_status_failed_localfile_error">No se encontró el archivo local</string> <string name="uploads_view_upload_status_failed_permission_error">Error de permisos</string> <string name="uploads_view_upload_status_conflict">Conflicto</string> - <string name="uploads_view_upload_status_service_interrupted">La aplicación ha cerrado inesperadamente</string> + <string name="uploads_view_upload_status_service_interrupted">La aplicación ha sido terminada</string> <string name="uploads_view_upload_status_unknown_fail">Error desconocido</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Esperando conexión Wi-Fi</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Aguardando conectividad Wi-Fi</string> <string name="uploads_view_later_waiting_to_upload">Esperando para cargar</string> <string name="downloader_download_in_progress_ticker">Descargando …</string> <string name="downloader_download_in_progress_content">%1$d%% Descargando %2$s</string> - <string name="downloader_download_succeeded_ticker">Descarga exitosa</string> + <string name="downloader_download_succeeded_ticker">Descargado</string> <string name="downloader_download_succeeded_content">%1$s descargado</string> <string name="downloader_download_failed_ticker">Falla en la descarga</string> - <string name="downloader_download_failed_content">La descarga de %1$s no pudo ser completada</string> + <string name="downloader_download_failed_content">No fue posible descargar %1$s</string> <string name="downloader_not_downloaded_yet">Aún no ha descargado</string> <string name="downloader_download_failed_credentials_error">Falla en la descarga, necesita ingresar a su cuenta de nuevo</string> <string name="common_choose_account">Elija una cuenta</string> <string name="sync_fail_ticker">Falla en la sincronización</string> - <string name="sync_fail_ticker_unauthorized">Falla en la sincronización; necesita ingresal a su cuenta de nuevo</string> - <string name="sync_fail_content">La sincronización de %1$s no pudo ser completada</string> + <string name="sync_fail_ticker_unauthorized">Falla en la sincronización, necesita volver a inicar sesión</string> + <string name="sync_fail_content">No fue posible completar la sincronización de %1$s</string> <string name="sync_fail_content_unauthorized">Contraseña inválida para %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Se encontraron conflictos</string> <string name="sync_conflicts_in_favourites_content">%1$d archivos mantenidos-en-sincronización no pudieron ser sinconizados</string> @@ -204,14 +204,14 @@ en los últimos 7 días!</string> <string name="sync_fail_in_favourites_content">El contenido de%1$d archivos no pudo ser sincronizado (%2$d conflictos)</string> <string name="sync_foreign_files_forgotten_ticker">Algunos archivos locales se han perdido</string> <string name="sync_foreign_files_forgotten_content">%1$d archivos de la carpeta %2$s no pudieron ser copiadas</string> - <string name="sync_foreign_files_forgotten_explanation">A partir de la versión 1.3.16, los archivos cargados desde este dispositivo son copiados a la carpeta local %1$s para prevenir pérdidas de datos cuando un archivo es sincronizado entre cuentas múltiples.\n\nDebido a este cambio, todos los archivos subidos en versiones anteriores de esta aplicación fueron copiadas a la carpeta %2$s. Sin embargo, un error evitó completar esta operación durante la sincronización de la cuenta. Usted puede dejar el(los) archivo(s) como están y eliminar la liga a %3$s, o bien mover el(los) archivo(s) a la carpeta %1$s y mantener la liga a %4$s.\n\nSe enlistan a continuación los archivos locales y remotos en %5$s a donde estaban ligados.</string> - <string name="sync_current_folder_was_removed">La carpeta %1$s ya no existe.</string> + <string name="sync_foreign_files_forgotten_explanation">A partir de la versión 1.3.16, los archivos cargados desde este dispositivo son copiados a la carpeta local %1$s para prevenir perdidas de datos cuando un archivo se sincroniza entre múltiples cuentas. \n\nDervado de este cambio, todos los archivos cargados con versiones anteriores de la aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error evitó que se completara esta operación durante la sincronizacion de la cuenta. Usted puede dejar el(los) archivo(s) como está(n) y eliminar la liga a %3$s, o bine, mover el(los) archivo(s) a la carpeta %1$s y mantener la liga a%4$s.\n\nSe enlistan a continuación los archivos locales asi como los archivos remotos en %5$s a donde estaban ligados.</string> + <string name="sync_current_folder_was_removed">La carpeta %1$s ya no existe</string> <string name="foreign_files_move">Mover todo</string> <string name="foreign_files_success">Todos los archivos fueron movidos</string> <string name="foreign_files_fail">Algunos archivos no puderon ser movidos</string> <string name="foreign_files_local_text">Local: %1$s</string> <string name="foreign_files_remote_text">Remoto: %1$s</string> - <string name="upload_query_move_foreign_files">No hay suficiente espacio para copair los archivos seleccionados a la carpeta %1$s. Le gustaría moverlos?</string> + <string name="upload_query_move_foreign_files">El espacio insuficiente evita que se copien los archivos seleccionados dentro de la carpeta %1$s. ¿Le gustaría moverlos ahí en su lugar?</string> <string name="pass_code_enter_pass_code">Favor de ingresar su código de seguridad</string> <string name="pass_code_configure_your_pass_code">Ingrese su código de seguridad</string> @@ -229,15 +229,15 @@ en los últimos 7 días!</string> <string name="media_event_done">%1$s reproducción finalizada</string> <string name="media_err_nothing_to_play">No se encontró el archivo</string> <string name="media_err_no_account">No se ha proporcionado una cuenta</string> - <string name="media_err_not_in_owncloud">No se ha encontrado el archivo en una cuenta válida</string> + <string name="media_err_not_in_owncloud">El archivo no está en una cuenta válida</string> <string name="media_err_unsupported">Codec no soportado</string> - <string name="media_err_io">El archivo no ha podido ser leído</string> - <string name="media_err_malformed">El archivo no ha sido codificado correctamente</string> - <string name="media_err_timeout">Tiempo de espera expirado al intentar reproducir</string> - <string name="media_err_invalid_progressive_playback">Archivo de medio no puede ser transmitido como flujo</string> - <string name="media_err_unknown">El archivo de medios no se puede reproducir con el reproductor predeterminado</string> + <string name="media_err_io">No fue posible leer el archivo de medios</string> + <string name="media_err_malformed">El archivo de medios tiene una codificacion incorrecta</string> + <string name="media_err_timeout">El intento de reproducir el archivo agotó el tiempo de espera.</string> + <string name="media_err_invalid_progressive_playback">Archivo de medio no puede ser transformado a un flujo</string> + <string name="media_err_unknown">El reproductor predeterminado no puede reproducir el archivo de medios</string> <string name="media_err_security_ex">Se presentó un error de seguridad al intentar reproducir %1$s</string> - <string name="media_err_io_ex">Se presentó un error en la entrada de datos al intentar reproducir %1$s</string> + <string name="media_err_io_ex">Se presentó un error de entrada al intentar reproducir %1$s </string> <string name="media_err_unexpected">Se presentó un error inesperado al intentar reproducir %1$s</string> <string name="media_rewind_description">Botón de rebobinar</string> <string name="media_play_pause_description">Botón de reproducir o pausar</string> @@ -250,13 +250,13 @@ en los últimos 7 días!</string> <string name="auth_connection_established">Conexión establecida</string> <string name="auth_testing_connection">Probando conexión</string> <string name="auth_not_configured_title">La configuración del servidor está mal formada. </string> - <string name="auth_account_not_new">Una cuenta para el mismo usuario y servidor ya existe en el dispositivo</string> + <string name="auth_account_not_new">Ya existe una cuenta en el dispositivo para el mismo usuario y servidor </string> <string name="auth_account_not_the_same">El usuario ingresado no corresponde con el usuario de esta cuenta</string> <string name="auth_unknown_error_title">¡Se presentó un error desconocido!</string> <string name="auth_unknown_host_title">No fue posible encontrar el servidor</string> - <string name="auth_incorrect_path_title">No se encontró la instancia del servidor</string> + <string name="auth_incorrect_path_title">El servidor no se encontró </string> <string name="auth_timeout_title">El servidor tardó demasiado en responder</string> - <string name="auth_incorrect_address_title">Formato de dirección del servidor erróneo</string> + <string name="auth_incorrect_address_title">El formato de dirección para el servidor es erróneo</string> <string name="auth_ssl_general_error_title">Falla en la inicialización de SSL</string> <string name="auth_ssl_unverified_server_title">No fue posible verificar la identidad del servidor SSL</string> <string name="auth_bad_oc_version_title">Versión del servidor no reconocida</string> @@ -265,14 +265,14 @@ en los últimos 7 días!</string> <string name="auth_unauthorized">Nombre de usuario o contraseña incorrecto</string> <string name="auth_oauth_error">Autorización no exitosa</string> <string name="auth_oauth_error_access_denied">Acceso denegado por el servidor de autorización</string> - <string name="auth_wtf_reenter_URL">Estado inesperado; Favor de reingresar la dirección del servidor</string> + <string name="auth_wtf_reenter_URL">Estado inesperado, favor de reingresar la dirección del servidor</string> <string name="auth_expired_oauth_token_toast">Su autorización ha expirado. Favor de volver a autorizar</string> <string name="auth_expired_basic_auth_toast">Por favor ingrese su contraseña actual</string> <string name="auth_expired_saml_sso_token_toast">Su sesión ha expirado. Favor de conectarse de nuevo</string> - <string name="auth_connecting_auth_server">Conectando al servidor de autenticación ...</string> + <string name="auth_connecting_auth_server">Conectando al servidor de autenticación...</string> <string name="auth_unsupported_auth_method">El servidor no soporta este método de autenticación</string> <string name="auth_unsupported_multiaccount">%1$s no soporta cuentas múltiples</string> - <string name="auth_fail_get_user_name">El servidor no está regresando un Id de usuario correcto, favor de contactar al adminitrador</string> + <string name="auth_fail_get_user_name">Su servidor no está regresando un ID de usuario correcto, favor de contactar al adminitrador</string> <string name="auth_can_not_auth_against_server">No es posible autenticarse en este servidor</string> <string name="auth_account_does_not_exist">La cuenta aún no existe en el dispositivo</string> @@ -285,26 +285,26 @@ en los últimos 7 días!</string> <string name="confirmation_remove_file_alert">¿Realmente desea eliminar %1$s?</string> <string name="confirmation_remove_folder_alert">¿Desea realmente eliminar %1$s y sus contenidos?</string> <string name="confirmation_remove_local">Sólo local</string> - <string name="remove_success_msg">Eliminado exitosamente</string> + <string name="remove_success_msg">Eliminado</string> <string name="remove_fail_msg">Falla al eliminar</string> <string name="rename_dialog_title">Ingrese un nombre nuevo</string> - <string name="rename_local_fail_msg">No ha sido posible cambiar el nombre de la copia local, intente ingresar un nombre differente</string> - <string name="rename_server_fail_msg">No se pudo completar el renombrado</string> - <string name="sync_file_fail_msg">El archivo remoto no pudo ser verificado</string> + <string name="rename_local_fail_msg">No fue posible renombar la copia local, intente con un nombre diferente</string> + <string name="rename_server_fail_msg">No fue posible renombrar el servidor</string> + <string name="sync_file_fail_msg">No fue posible verificar el archivo remoto</string> <string name="sync_file_nothing_to_do_msg">Los contenidos del archivo ya han sido sincronizados</string> - <string name="create_dir_fail_msg">La carpeta no pudo ser creada</string> + <string name="create_dir_fail_msg">No fue posible crear la carpeta</string> <string name="filename_forbidden_characters">Caracteres inválidos: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">El nombre del archivo contiene al menos un caracter inválido.</string> <string name="filename_empty">El nombre del archivo no puede estar vacío</string> - <string name="wait_a_moment">Espere un momento</string> + <string name="wait_a_moment">Espere un momento...</string> <string name="wait_checking_credentials">Verificando credenciales almacenadas</string> - <string name="filedisplay_unexpected_bad_get_content">Problema inesperado; favor de seleccionar el archivo de una aplicación diferente </string> - <string name="filedisplay_no_file_selected">No se ha seleccionado un archivo</string> + <string name="filedisplay_unexpected_bad_get_content">Problema inesperado, favor de seleccionar el archivo desde una aplicación diferente</string> + <string name="filedisplay_no_file_selected">No se ha seleccionado algún archivo</string> <string name="activity_chooser_title">Enviar la liga a …</string> <string name="wait_for_tmp_copy_from_private_storage">Copiando el archivo desde almacenamiento privado</string> <string name="oauth_check_onoff">Iniciar sesión con oAuth2</string> - <string name="oauth_login_connection">Conectando al servidor oAuth2...</string> + <string name="oauth_login_connection">Conectando al servidor OAuth 2...</string> <string name="ssl_validator_header">La identidad del sitio no pudo ser verificada</string> <string name="ssl_validator_reason_cert_not_trusted">- El certificado del servidor no es de confianza</string> @@ -312,7 +312,7 @@ en los últimos 7 días!</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Las fechas del certificado del servidor están en el futuro</string> <string name="ssl_validator_reason_hostname_not_verified">- La URL no corresponde con el nombre del servidor en el certificado</string> <string name="ssl_validator_question">¿Desea confiar en este certificado de todas formas?</string> - <string name="ssl_validator_not_saved">El certificado no pudo ser guardado</string> + <string name="ssl_validator_not_saved">No fue posible guardar el certificado</string> <string name="ssl_validator_btn_details_see">Detalles</string> <string name="ssl_validator_btn_details_hide">Ocultar</string> <string name="ssl_validator_label_subject">Emitido para:</string> @@ -341,9 +341,9 @@ en los últimos 7 días!</string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Cargar sólo mediante WiFi</string> - <string name="instant_upload_on_wifi">Cargar imágenes a través de WiFi únicamente</string> - <string name="instant_video_upload_on_wifi">Cargar videos a través de WiFi únicamente</string> + <string name="auto_upload_on_wifi">Cargar sólo mediante Wi-Fi</string> + <string name="instant_upload_on_wifi">Cargar imágenes sólo a través de Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Cargar videos sólo a través de Wi-Fi</string> <string name="instant_video_upload_on_charging">Cargar archivos sólo con el dispositivo conectado a la toma de corriente</string> <string name="instant_upload_on_charging">Cargar archivos sólo con el dispositivo conectado a la toma de corriente</string> <string name="instant_upload_path">/CargasInstantáneas</string> @@ -353,9 +353,9 @@ en los últimos 7 días!</string> <string name="conflict_use_local_version">versión local</string> <string name="conflict_use_server_version">versión de servidor</string> - <string name="preview_sorry">¡Disculpas por eso!</string> + <string name="preview_sorry">Disculpe. </string> <string name="preview_image_description">Vista previa de imagen</string> - <string name="preview_image_error_unknown_format">La imagen no puede ser mostrada</string> + <string name="preview_image_error_unknown_format">No es posible mostrar la imagen</string> <string name="error__upload__local_file_not_copied">%1$s no pudo ser copiado a la carpeta local %2$s</string> <string name="prefs_instant_upload_path_title">Carpeta de carga instantánea</string> @@ -364,7 +364,7 @@ en los últimos 7 días!</string> <string name="prefs_instant_upload_path_use_subfolders_title">Usar sub carpetas</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Almacenar en sub carpetas con base en el año y mes</string> - <string name="share_link_no_support_share_api">Lo sentimos, no se permite compartir en su servidor. Favor de contactar a su adminstrador. </string> + <string name="share_link_no_support_share_api">No se permite compartir en su servidor. Favor de contactar a su adminstrador. </string> <string name="share_link_file_no_exist">No fue posible compartir. Favor de revisar si el archivo existe</string> <string name="share_link_file_error">Se presentó un error al trtatar de compartir este archivo o carpeta</string> <string name="unshare_link_file_no_exist">Falla al dejar de compartir. Favor de revisar si existe el archivo</string> @@ -382,52 +382,53 @@ en los últimos 7 días!</string> <string name="clipboard_uxexpected_error">Se presentó un error inesperado al copiar al portapapeles</string> <string name="clipboard_label">Texto copiado desde %1$s</string> - <string name="error_cant_bind_to_operations_service">Error crítico: no se pueden realizar operaciones</string> + <string name="error_cant_bind_to_operations_service">Error crítico: No se pueden realizar operaciones</string> - <string name="network_error_socket_exception">Se presentó un error al conectarse con el servidor</string> - <string name="network_error_socket_timeout_exception">Se presentó un error al esperar respuesta del servidor; la operación no pudo ser completada</string> - <string name="network_error_connect_timeout_exception">Se presentó un error al esperar respuesta del servidor; la operación no pudo ser completada</string> - <string name="network_host_not_available">La operación no pudo ser completada; el servidor no está disponible</string> - <string name="forbidden_permissions">Usted no cuenta con los permisos %s</string> + <string name="network_error_socket_exception">Se presentó un error durante la conexión alel servidor.</string> + <string name="network_error_socket_timeout_exception">Se presentó un error al esperar respuesta del servidor. La operación no pudo ser completada.</string> + <string name="network_error_connect_timeout_exception">Se presentó un error al esperar respuesta del servidor La operación no pudo ser completada.</string> + <string name="network_host_not_available">La operación no pudo ser completada. El servidor no está disponible</string> + + <string name="forbidden_permissions">No se le permite %s</string> <string name="forbidden_permissions_rename">para renombrar este archivo</string> <string name="forbidden_permissions_delete">para borrar este archivo</string> <string name="share_link_forbidden_permissions">para compartir este archivo</string> <string name="unshare_link_forbidden_permissions">para dejar de compartir este archivo</string> <string name="update_link_forbidden_permissions">para actualizar este recurso compartido</string> <string name="forbidden_permissions_create">para crear el archivo</string> - <string name="uploader_upload_forbidden_permissions">para cargar esta carpeta</string> + <string name="uploader_upload_forbidden_permissions">para cargar a esta carpeta</string> <string name="downloader_download_file_not_found">El archivo ya no se encuentra disponible en el servidor</string> <string name="file_migration_dialog_title">Actualizando la ruta de almacenamiento</string> <string name="file_migration_finish_button">Terminar</string> - <string name="file_migration_preparing">Preparando para la migración…</string> + <string name="file_migration_preparing">Preparando la migración…</string> <string name="file_migration_checking_destination">Verificando el destino…</string> <string name="file_migration_saving_accounts_configuration">Guardando la configuración de las cuentas…</string> - <string name="file_migration_waiting_for_unfinished_sync">En espera de las sincronizaciones incompletas…</string> + <string name="file_migration_waiting_for_unfinished_sync">Esperando que todas las sincronizaciones terminen…</string> <string name="file_migration_migrating">Moviendo información…</string> <string name="file_migration_updating_index">Actualizando índice…</string> <string name="file_migration_cleaning">Limpiando…</string> - <string name="file_migration_restoring_accounts_configuration">Restaurando configuración de cuentas…</string> + <string name="file_migration_restoring_accounts_configuration">Guardando la configuración de las cuentas…</string> <string name="file_migration_ok_finished">Terminado</string> - <string name="file_migration_failed_not_enough_space">ERROR: No cuenta con espacio suficiente</string> - <string name="file_migration_failed_not_writable">ERROR: El archivo no se puede escribir</string> + <string name="file_migration_failed_not_enough_space">ERROR: Espacio insuficiente</string> + <string name="file_migration_failed_not_writable">ERROR: No se puede escribir el archivo</string> <string name="file_migration_failed_not_readable">ERROR: El archivo no se puede leer</string> <string name="file_migration_failed_dir_already_exists">ERROR: El directorio de Nextcloud ya existe</string> - <string name="file_migration_failed_while_coping">ERROR: Durante la migración</string> - <string name="file_migration_failed_while_updating_index">ERROR: Durante la actualización del índice</string> + <string name="file_migration_failed_while_coping">ERROR: Falla durante la migración</string> + <string name="file_migration_failed_while_updating_index">ERROR: Falla durante la actualización del índice</string> - <string name="file_migration_directory_already_exists">La carpeta de datos ya existe. ¿Qué desa hacer?</string> - <string name="file_migration_override_data_folder">Anular</string> - <string name="file_migration_use_data_folder">Usar existente</string> + <string name="file_migration_directory_already_exists">La carpeta de datos ya existe. Elija una de las siguientes:</string> + <string name="file_migration_override_data_folder">Remplazar</string> + <string name="file_migration_use_data_folder">Usar</string> <string name="prefs_category_accounts">Cuentas</string> <string name="prefs_add_account">Agregar cuenta</string> <string name="drawer_manage_accounts">Administrar cuentas</string> - <string name="auth_redirect_non_secure_connection_title">La conexión segura se está redirigiendo a través de una ruta insegura</string> + <string name="auth_redirect_non_secure_connection_title">La conexión segura se está redirigiendo a través de una ruta insegura.</string> <string name="actionbar_logger">Registros</string> <string name="log_send_history_button">Enviar histórico</string> - <string name="log_send_no_mail_app">No se cuenta con una aplicación para el envío de bitácoras. Favor de instalar una aplicación de correo electrónico. </string> + <string name="log_send_no_mail_app">No se encontró alguna aplicación para el envío de bitácoras. Favor de instalar un cliente de correo electrónico. </string> <string name="log_send_mail_subject"> %1$s bitácora de aplicación Android</string> <string name="log_progress_dialog_text">Cargando información …</string> @@ -435,10 +436,10 @@ en los últimos 7 días!</string> <string name="saml_authentication_wrong_pass">Contraseña incorrecta</string> <string name="actionbar_move">Mover</string> <string name="actionbar_copy">Copiar</string> - <string name="file_list_empty_moving">No hay nada aquí. ¡Puede agregar una carpeta!</string> + <string name="file_list_empty_moving">No hay nada aquí. Puede agregar una carpeta.</string> <string name="folder_picker_choose_button_text">Seleccionar</string> - <string name="move_file_not_found">Falla al mover. Favor de revisar si el archivo existe </string> + <string name="move_file_not_found">No fue posible mover el archivo. Favor de verificar si existe. </string> <string name="move_file_invalid_into_descendent">No es posible mover una carpeta dentro de una de sus sub carpetas</string> <string name="move_file_invalid_overwrite">El archivo ya existe en la carpeta de destino</string> <string name="move_file_error">Se presentó un error al intentar mover este archivo o carpeta</string> @@ -512,7 +513,7 @@ en los últimos 7 días!</string> <string name="share_email_clarification">%1$s (correo electrónico)</string> <string name="share_known_remote_clarification">%1$s ( a las %2$s )</string> - <string name="share_sharee_unavailable">Lo sentimos, su versión del servidor no permite compartir con usuarios entre clientes.\nFavor de contactar a su adminsitrador</string> + <string name="share_sharee_unavailable"> Actualice la versión del servidor para permitir compartir entre usuarios desde dentro de sus clientes.\nFavor de contactar a su adminsitrador</string> <string name="share_privilege_can_share">puede compartir</string> <string name="share_privilege_can_edit">puede editar</string> <string name="share_privilege_can_edit_create">crear</string> @@ -521,42 +522,42 @@ en los últimos 7 días!</string> <string name="edit_share_unshare">Dejar de compartir</string> <string name="edit_share_done">terminado</string> - <string name="action_retry_uploads">Falla en el reintento</string> + <string name="action_retry_uploads">El reintento falló</string> <string name="action_clear_failed_uploads">Borrar fallidos</string> - <string name="action_clear_successful_uploads">Borrar exitosos</string> - <string name="action_clear_finished_uploads">Borrar todos</string> + <string name="action_clear_successful_uploads">Borrados</string> + <string name="action_clear_finished_uploads">Borrar cargas terminadas</string> <string name="action_switch_grid_view">Vista de cuadrícula</string> <string name="action_switch_list_view">Vista de lista</string> <string name="manage_space_title">Administrar espacio</string> - <string name="manage_space_description">Los ajustes, base de datos y certificados del servior de %1$s serán borrados permanentemente.\n\nLos archivos descargados se mantendrán sin cambios.\n\nEste proceso puede tomar algo de tiempo. </string> + <string name="manage_space_description">Los ajustes, base de datos y certificados del servior de los datos de %1$s serán borrados permanentemente.\n\nLos archivos descargados se mantendrán sin cambios.\n\nEste proceso puede tomar algo de tiempo. </string> <string name="manage_space_clear_data">Borrar datos</string> <string name="manage_space_error">No fue posible borrar algunos archivos</string> - <string name="permission_storage_access">Se requieren permisos adicionales para cargar & descargar archivos.</string> - <string name="local_file_not_found_toast">No se encontró el archivo en el disco local</string> + <string name="permission_storage_access">Se requieren permisos adicionales para cargar y descargar archivos. </string> + <string name="local_file_not_found_toast">No se encontró el archivo en sistema de archivos local</string> <string name="confirmation_remove_files_alert">¿Realmente desea eliminar los elementos seleccionados?</string> <string name="confirmation_remove_folders_alert">¿Realmente desea eliminar los elementos seleccionados y su contenido?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Esperando la regarga del dispositivo </string> + <string name="uploads_view_upload_status_waiting_for_charging">Aguardando la regarga del dispositivo </string> <string name="actionbar_search">Buscar</string> <string name="files_drop_not_supported">Esta es una característica de Nextcloud, favor de actualizar.</string> <string name="learn_more">Conozca más</string> <string name="drawer_folder_sync">Carga automática</string> <string name="drawer_participate">Participe</string> - <string name="participate_testing_headline">Ayúdenos a probar</string> + <string name="participate_testing_headline">Ayúdenos probando</string> <string name="participate_testing_bug_text">¿Encontró una falla? ¿Hay algo raro?</string> <string name="participate_testing_report_text">Reportar un tema en Github</string> - <string name="participate_testing_version_text">¿Le interesaría ayudarnos a probar la siguiente Versión?</string> + <string name="participate_testing_version_text">¿Le interesaría ayudarnos a probar la siguiente versión?</string> <string name="participate_beta_headline">Probar la versión de desarrollo</string> - <string name="participate_beta_text">Esto incluye todas las próximas características y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, favor de reportarnoslos. </string> + <string name="participate_beta_text">Esto incluye todas las últimas funcionalidades y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, favor de reportarnoslos. </string> <string name="participate_release_candidate_headline">Candidato a lanzamiento</string> - <string name="participate_release_candidate_text">El candidato a lanzamiento (CL) es una foto del más próximo lanzamiento y se espera que sea estable. Las pruebas a su configuración individual podría ayudarnos a asegurar esto. Regístrese para hacer pruebas en la Play Store o consulte directamente la sección de  \"versiones\" en F-Droid. </string> + <string name="participate_release_candidate_text">El candidato a lanzamiento (CL) es una foto del más próximo lanzamiento y se espera que sea estable. Las pruebas a su configuración individual podrían ayudarnos a asegurar esto. Regístrese para hacer pruebas en la Play Store o consulte directamente la sección de \"versiones\" en F-Droid. </string> <string name="participate_contribute_headline">Contribuya activamente</string> <string name="participate_contribute_irc_text">Únase a las conversaciones en IRC: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Ayude a los demás en el <a href=\"%1$s\">foro</a></string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Traduzca</a> la aplicación</string> - <string name="participate_contribute_github_text">Contribuya como desarrollador, consulte <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUIR.md</a> para más detalles</string> + <string name="participate_contribute_github_text">Revise, corrija y escriba código, consulte <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUIR.md</a> para más detalles</string> <string name="move_to">Mover a…</string> <string name="copy_to">Copiar a…</string> <string name="choose_remote_folder">Seleccione la carpeta…</string> @@ -564,7 +565,7 @@ en los últimos 7 días!</string> <string name="folder_sync_no_results">No se encontraron carpetas de medios</string> <string name="folder_sync_preferences">Preferencias de carga automática</string> <string name="folder_sync_settings">Ajustes</string> - <string name="folder_sync_new_info">La carga instantánea ha sido completamente moderinzada. Favor de ver el menú principal y reconfigurar sus cargas automáticas. Disculpenos por los inconvenientes. \n\nDisfrute de las nuevas y extendidas capacidades de cargas automáticas. </string> + <string name="folder_sync_new_info">La carga instantánea ha sido completamente moderinzada. Reconfigure su carga automática desde el menu principal. \n\nDisfrute de las nuevas y extendidas capacidades de la carga automática. </string> <string name="folder_sync_preferences_folder_path">Para %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d seleccionado</item> @@ -578,7 +579,7 @@ en los últimos 7 días!</string> <string name="notifications_no_results_headline">No hay notificaciones</string> <string name="notifications_no_results_message">Favor de verificar más tarde. </string> - <string name="upload_file_dialog_title">Ingrese el nombre del archivo y el tipo del archivo a cargar</string> + <string name="upload_file_dialog_title">Ingrese el nombre y el tipo del archivo a cargar</string> <string name="upload_file_dialog_filename">Nombre de archivo</string> <string name="upload_file_dialog_filetype">Tipo de archivo</string> <string name="upload_file_dialog_filetype_snippet_text">Archivo snippet de texto(.txt)</string> @@ -594,7 +595,7 @@ en los últimos 7 días!</string> <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Un lugar seguro para todos sus datos</string> - <string name="welcome_feature_1_text">Acceda, comparta  & proteja todos sus archivos de casa y de su empresa</string> + <string name="welcome_feature_1_text">Acceda, comparta y proteja sus archivos en casa y la oficina</string> <string name="welcome_feature_2_title">Multi cuenta</string> <string name="welcome_feature_2_text">Conéctese a todas sus nubes</string> @@ -619,23 +620,23 @@ en los últimos 7 días!</string> <!-- Activities --> <string name="activities_no_results_headline">Aún no hay actividades</string> - <string name="activities_no_results_message">Este flujo le mostrará eventos tales como \nagregados, cambios & compartidos</string> + <string name="activities_no_results_message">Este flujo le mostrará eventos tales como \nagregados, cambios & elementos compartidos</string> <string name="webview_error">Se presentó un error</string> <string name="prefs_category_about">Acerca de</string> - <string name="actionbar_contacts">Respaldo de contactos</string> - <string name="contacts_backup_button">Respaldar ahora</string> + <string name="actionbar_contacts">Respaldar contactos</string> + <string name="contacts_backup_button">Ahora</string> <string name="contacts_restore_button">Restaurar el último respaldo</string> <string name="contacts_header_restore">Restaurar</string> <string name="contacts_header_backup">Respaldar</string> <string name="contacts_automatic_backup">Respaldo de contactos</string> <string name="contacts_last_backup">Último respaldo</string> - <string name="contacts_read_permission">Se requieren permisos de lectura para los contactos</string> - <string name="contacts_write_permission">Se requieren permisos de escritura para los contactos</string> + <string name="contacts_read_permission">Se requiere el permiso para leer la lista de contactos</string> + <string name="contacts_write_permission">Se requiere el permiso para cambiar la lista de contactos</string> <string name="contactlist_title">Restaurar contactos</string> <string name="contaclist_restore_selected">Restaurar los contactos seleccionados</string> - <string name="contactlist_account_chooser_title">Seleccione la cuenta para importar</string> - <string name="contactlist_no_permission">¡Sin permisos, nada ha sido importado!</string> + <string name="contactlist_account_chooser_title">Seleccione la cuenta a importar</string> + <string name="contactlist_no_permission">¡No se otorgaron permisos, nada fue importado!</string> <string name="contacts_preference_choose_date">Seleccione una fecha</string> <string name="contacts_preference_backup_never">nunca</string> <string name="contacts_preferences_no_file_found">No se encontraron archivos</string> @@ -644,6 +645,7 @@ en los últimos 7 días!</string> <!-- Notifications --> <string name="new_notification_received">No se han recibido nuevas notificaciones </string> + <string name="drawer_logout">Salir de la sesión</string> </resources> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 643830614f..c92329dbf4 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">Verrouillage par empreinte digitale</string> <string name="prefs_fingerprint_notsetup">Aucune empreinte digitale n\'a été installée.</string> <string name="prefs_show_hidden_files">Afficher les fichiers masqués</string> - <string name="prefs_instant_upload">Téléversement immédiat des photos</string> - <string name="prefs_instant_upload_summary">Téléverser immédiatement les photos prises par la caméra</string> - <string name="prefs_instant_video_upload">Téléversement immédiat des vidéos</string> - <string name="prefs_instant_video_upload_summary">Téléverser immédiatement les vidéos prises par la caméra</string> + <string name="prefs_instant_upload">Téléversements immédiats de photos</string> + <string name="prefs_instant_upload_summary">Téléverser immédiatement les photos prises par l\'appareil photo</string> + <string name="prefs_instant_video_upload">Téléversements immédiats de vidéos</string> + <string name="prefs_instant_video_upload_summary">Téléverser immédiatement les vidéos prises par l\'appareil photo</string> <string name="prefs_log_title">Activer la journalisation</string> <string name="prefs_log_summary">Cela est utilisé pour la journalisation des problèmes</string> <string name="prefs_log_title_history">Historique de la journalisation</string> @@ -58,23 +58,15 @@ <string name="prefs_calendar_contacts">Configurer la synchronisation de l\'agenda et des contacts</string> <string name="prefs_calendar_contacts_summary">Configurer DAVdroid (v1.3.0+) pour le compte actuel</string> <string name="prefs_calendar_contacts_address_resolve_error">Une adresse de serveur pour le compte pourrait ne pas être résolue par DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">Aucune application Google Play store ou F-Droid installée</string> - <string name="prefs_calendar_contacts_sync_setup_successful">La synchronisation de l\'agenda & des contacts a bien été configurée.</string> <string name="prefs_help">Aide</string> <string name="prefs_recommend">Recommander à un ami</string> <string name="prefs_feedback">Nous contacter par mail</string> <string name="prefs_imprint">Mentions</string> - <string name="prefs_remember_last_share_location">Mémoriser l\'emplacement de partage</string> - <string name="prefs_remember_last_upload_location_summary">Mémoriser le dernier emplacement de téléversement</string> - - <string name="recommend_subject">Essayez %1$s sur votre smartphone !</string> - <string name="recommend_text">J\'aimerais vous inviter à utiliser %1$s sur votre smartphone !\nTéléchargez-le ici : %2$s.</string> - - <string name="auth_check_server">Vérifier le serveur</string> + <string name="recommend_subject">Essayez %1$s sur votre smartphone !</string> + <string name="auth_check_server">Vérifier le serveur</string> <string name="auth_host_url">Adresse du serveur https://…</string> <string name="auth_username">Nom d\'utilisateur</string> <string name="auth_password">Mot de passe</string> - <string name="auth_register">Vous n\'avez pas encore un serveur ?\nCliquez ici pour en obtenir un d\'un fournisseur</string> <string name="sync_string_files">Fichiers</string> <string name="setup_btn_connect">Connecter</string> <string name="uploader_btn_upload_text">Téléverser</string> @@ -86,43 +78,21 @@ <string name="uploader_error_title_no_file_to_upload">Aucun fichier à téléverser</string> <string name="uploader_error_message_received_piece_of_text">%1$s ne peut téléverser un morceau de texte comme un fichier.</string> <string name="uploader_error_message_no_file_to_upload">Les données reçues n\'incluent aucun fichier valide</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Le fichier ne peut pas être téléversé</string> <string name="uploader_error_message_read_permission_not_granted">%1$s n\'est pas autorisé à lire un fichier reçu</string> - <string name="uploader_error_message_source_file_not_found">Le fichier à téléverser n\'a pas été trouvé dans son emplacement. Merci de vérifier si ce fichier existe.</string> - <string name="uploader_error_message_source_file_not_copied">Une erreur est survenue lors de la copie du fichier vers un dossier temporaire. Merci de recommencer votre envoi.</string> <string name="uploader_upload_files_behaviour">Option de téléversement :</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Déplacer le fichier dans le dossier Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Conserver le fichier dans le dossier original</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Supprimer le fichier du dossier original</string> <string name="file_list_seconds_ago">à l\'instant</string> - <string name="file_list_empty_headline">Aucun fichier</string> - <string name="file_list_empty">Déposez du contenu ou synchronisez vos appareils !</string> - <string name="file_list_empty_favorites">Mettez certains fichiers en favoris ou synchronisez vos appareils !</string> - <string name="file_list_empty_favorites_filter_list">Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici</string> - <string name="file_list_empty_favorites_filter">Auncun fichier mis en favori trouvé qui correspond à votre requête !</string> <string name="file_list_loading">Chargement…</string> - <string name="file_list_no_app_for_file_type">Aucune application trouvée pour ce type de fichier !</string> <string name="local_file_list_empty">Aucun fichier n\'est présent dans ce dossier.</string> <string name="file_list_empty_headline_search">Aucun résultat dans ce dossier</string> <string name="file_list_empty_headline_server_search">Aucun résultat</string> - <string name="file_list_empty_favorite_headline">Aucun favoris pour l\'instant</string> <string name="file_list_empty_shared_headline">Rien n\'est partagé pour l\'instant</string> <string name="file_list_empty_shared">Les fichiers et dossiers que vous partagez apparaîtront ici</string> <string name="file_list_empty_headline_server_search_videos">Aucune vidéo</string> <string name="file_list_empty_headline_server_search_photos">Aucune photo</string> - <string name="file_list_empty_search">Essayez de chercher dans un autre dossier ?</string> - <string name="file_list_empty_recently_modified">Aucun fichier modifié au cours des 7 derniers jours trouvé</string> - <string name="file_list_empty_recently_modified_filter">Aucun fichier trouvé qui correspond à votre requête qui a été modifié - durant les 7 derniers jours !</string> - <string name="file_list_empty_recently_added">Auncun fichier ajouté récemment trouvé</string> - <string name="file_list_empty_recently_added_filter">Auncun fichier ajouté récemment trouvé qui correspond à votre requête !</string> - <string name="file_list_empty_text_photos">Téléversez des photos ou activez le téléversement automatique !</string> - <string name="file_list_empty_text_photos_filter">Aucune photo trouvée qui correspond à votre requête !</string> - <string name="file_list_empty_text_videos">Téléversez des vidéos ou activez le téléversement automatique !</string> - <string name="file_list_empty_text_videos_filter">Aucune vidéo trouvée qui correspond à votre requête !</string> <string name="upload_list_empty_headline">Aucun historique de téléversement</string> - <string name="upload_list_empty_text">Téléversez du contenu ou activez le téléversement instantané !</string> - <string name="upload_list_empty_text_auto_upload">Téléversez du contenu ou activez le téléversement instantané !</string> <string name="file_list_folder">dossier</string> <string name="file_list_folders">dossiers</string> <string name="file_list_file">fichier</string> @@ -134,14 +104,11 @@ <string name="filedetails_modified">Modifié le :</string> <string name="filedetails_download">Télécharger</string> <string name="filedetails_sync_file">Synchroniser</string> - <string name="filedetails_renamed_in_upload_msg">Le fichier a été renommé en %1$s pendant le téléversement</string> - <string name="list_layout">Affichage en liste</string> <string name="action_share">Partager</string> <string name="common_yes">Oui</string> <string name="common_no">Non</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Retirer le téléversement</string> - <string name="common_retry_upload">Réessayer le téléversement</string> <string name="common_cancel_sync">Annuler la synchronisation</string> <string name="common_cancel">Annuler</string> <string name="common_back">Retour</string> @@ -161,10 +128,8 @@ <string name="uploader_info_dirname">Nom du dossier</string> <string name="uploader_upload_in_progress_ticker">Téléversement…</string> <string name="uploader_upload_in_progress_content">Téléversement de %2$s : %1$d%%</string> - <string name="uploader_upload_succeeded_ticker">Envoi terminé</string> <string name="uploader_upload_succeeded_content_single">%1$s téléversé</string> <string name="uploader_upload_failed_ticker">Échec du téléversement</string> - <string name="uploader_upload_failed_content_single">Le téléversement de %1$s a échoué</string> <string name="uploader_upload_failed_credentials_error">Le téléversement a échoué, vous devez vous reconnecter</string> <string name="uploads_view_title">Historique des envois</string> <string name="uploads_view_group_current_uploads">Actuellement</string> @@ -181,37 +146,27 @@ <string name="uploads_view_upload_status_failed_localfile_error">Fichier local non trouvé</string> <string name="uploads_view_upload_status_failed_permission_error">Erreur de permissions</string> <string name="uploads_view_upload_status_conflict">Conflit</string> - <string name="uploads_view_upload_status_service_interrupted">L\'application a été arrêtée</string> <string name="uploads_view_upload_status_unknown_fail">Erreur inconnue </string> - <string name="uploads_view_upload_status_waiting_for_wifi">En attente d\'une connexion wifi</string> <string name="uploads_view_later_waiting_to_upload">En attente de téléversement</string> <string name="downloader_download_in_progress_ticker">Téléchargement en cours…</string> <string name="downloader_download_in_progress_content">Téléchargement de %2$s : %1$d%% effectués</string> - <string name="downloader_download_succeeded_ticker">Réception terminée</string> <string name="downloader_download_succeeded_content">%1$s téléchargé</string> <string name="downloader_download_failed_ticker">Le téléchargement a échoué</string> - <string name="downloader_download_failed_content">Le téléchargement de %1$s a échoué</string> <string name="downloader_not_downloaded_yet">Pas encore téléchargé</string> <string name="downloader_download_failed_credentials_error">Le téléchargement a échoué, vous devez vous reconnecter</string> <string name="common_choose_account">Choisissez un compte</string> <string name="sync_fail_ticker">La synchronisation a échoué</string> - <string name="sync_fail_ticker_unauthorized">La synchronisation a échoué, vous devez vous reconnecter</string> - <string name="sync_fail_content">La synchronisation de %1$s a échoué</string> - <string name="sync_fail_content_unauthorized">Mot de passe invalide pour %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Des conflits ont été trouvés</string> <string name="sync_conflicts_in_favourites_content">%1$d fichiers à garder synchronisés n\'ont pu être synchronisés</string> <string name="sync_fail_in_favourites_ticker">La synchronisation des fichiers a échoué</string> <string name="sync_fail_in_favourites_content">Le contenu de %1$d fichiers n\'a pu être synchronisé (%2$d conflits)</string> <string name="sync_foreign_files_forgotten_ticker">Certains fichiers locaux ont été oubliés</string> <string name="sync_foreign_files_forgotten_content">%1$d fichiers du dossier %2$s n\'ont pas pu être copiés dans</string> - <string name="sync_foreign_files_forgotten_explanation">Depuis la version 1.3.16, les fichiers envoyés depuis cet appareil sont copiés dans le dossier local %1$s pour éviter une perte de données lorsqu\'un même fichier est synchronisé avec plusieurs comptes.\n\nEn raison de cette modification, tous les fichiers envoyés avec des versions antérieures de cette application ont été copiés dans le dossier %2$s. Cependant, une erreur a empêché l\'achèvement de cette opération pendant la synchronisation du compte. Vous pouvez soit laisser les fichiers tels quels et supprimer le lien vers %3$s, soit déplacer les fichiers dans le dossier %1$s et garder le lien vers %4$s.\n\nCi-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxquels ils étaient liés.</string> - <string name="sync_current_folder_was_removed">Le dossier %1$s n\'existe plus</string> <string name="foreign_files_move">Tout déplacer</string> <string name="foreign_files_success">Tous les fichiers ont été déplacés</string> <string name="foreign_files_fail">Certains fichiers n\'ont pu être déplacés</string> <string name="foreign_files_local_text">Local : %1$s</string> <string name="foreign_files_remote_text">Distant : %1$s</string> - <string name="upload_query_move_foreign_files">Il n\'y a pas assez d\'espace pour copier les fichiers sélectionnés dans le dossier %1$s. Souhaitez-vous plutôt les déplacer ?</string> <string name="pass_code_enter_pass_code">Veuillez saisir votre code de sécurité</string> <string name="pass_code_configure_your_pass_code">Saisissez votre code de sécurité</string> @@ -229,16 +184,7 @@ <string name="media_event_done">Lecture de %1$s terminée</string> <string name="media_err_nothing_to_play">Aucun fichier média trouvé</string> <string name="media_err_no_account">Aucun compte fourni</string> - <string name="media_err_not_in_owncloud">Le fichier n\'est pas dans un compte valide</string> <string name="media_err_unsupported">Le codec de ce média n\'est pas pris en charge </string> - <string name="media_err_io">Le fichier média ne peut pas être lu</string> - <string name="media_err_malformed">Le fichier média n\'est pas correctement encodé</string> - <string name="media_err_timeout">Délai dépassé pour la lecture du morceau</string> - <string name="media_err_invalid_progressive_playback">Le fichier média ne peut pas être diffusé</string> - <string name="media_err_unknown">Le fichier média ne peut être lu avec le lecteur intégré</string> - <string name="media_err_security_ex">Erreur de sécurité à la lecture de %1$s</string> - <string name="media_err_io_ex">Erreur d\'entrée à la lecture de %1$s</string> - <string name="media_err_unexpected">Erreur inattendue à la lecture de %1$s </string> <string name="media_rewind_description">Bouton de rembobinage</string> <string name="media_play_pause_description">Bouton de lecture ou de pause</string> <string name="media_forward_description">Bouton d\'avance rapide</string> @@ -250,32 +196,21 @@ <string name="auth_connection_established">Connexion établie</string> <string name="auth_testing_connection">Test de connexion en cours</string> <string name="auth_not_configured_title">Configuration du serveur erronée</string> - <string name="auth_account_not_new">Un compte pour les mêmes utilisateur et serveur existe déjà sur cet appareil</string> <string name="auth_account_not_the_same">L\'utilisateur saisi ne correspond pas à l\'utilisateur de ce compte</string> <string name="auth_unknown_error_title">Une erreur inconnue s\'est produite !</string> - <string name="auth_unknown_host_title">Impossible de trouver l\'hôte</string> - <string name="auth_incorrect_path_title">Aucune instance du serveur n\'a été trouvée</string> <string name="auth_timeout_title">Le serveur a pris trop de temps à répondre</string> - <string name="auth_incorrect_address_title">Adresse du serveur non valable</string> <string name="auth_ssl_general_error_title">Échec de l\'initialisation SSL</string> - <string name="auth_ssl_unverified_server_title">Impossible de vérifier l\'identité du serveur SSL</string> <string name="auth_bad_oc_version_title">La version du serveur n\'est pas reconnue</string> - <string name="auth_wrong_connection_title">Impossible d\'établir la connexion</string> <string name="auth_secure_connection">Connexion sécurisée établie</string> <string name="auth_unauthorized">Nom d\'utilisateur ou mot de passe incorrect</string> <string name="auth_oauth_error">Échec d\'autorisation</string> <string name="auth_oauth_error_access_denied">Accès refusé par le serveur d\'autorisation</string> - <string name="auth_wtf_reenter_URL">Problème inattendu ; veuillez saisir à nouveau l\'adresse du serveur</string> <string name="auth_expired_oauth_token_toast">Votre autorisation a expiré. Merci de vous authentifier à nouveau</string> <string name="auth_expired_basic_auth_toast">Veuillez saisir le mot de passe actuel</string> <string name="auth_expired_saml_sso_token_toast">Votre session a expiré. Merci de vous reconnecter</string> - <string name="auth_connecting_auth_server">Connexion au serveur d\'authentification…</string> <string name="auth_unsupported_auth_method">Le serveur ne prend pas en charge cette méthode d\'authentification</string> <string name="auth_unsupported_multiaccount">%1$s ne prend pas en charge les comptes multiples</string> - <string name="auth_fail_get_user_name">Votre serveur a retourné un identifiant d\'utilisateur incorrect. Veuillez contacter un administrateur</string> <string name="auth_can_not_auth_against_server">Impossible de s\'authentifier sur ce serveur</string> - <string name="auth_account_does_not_exist">Le compte n\'existe pas encore sur ce périphérique</string> - <string name="favorite">Rendre disponible hors-ligne</string> <string name="unfavorite">Ne plus rendre disponible hors-ligne</string> <string name="favorite_real">Mettre en favori</string> @@ -283,36 +218,24 @@ <string name="common_rename">Renommer</string> <string name="common_remove">Supprimer</string> <string name="confirmation_remove_file_alert">Voulez-vous vraiment supprimer %1$s ?</string> - <string name="confirmation_remove_folder_alert">Voulez-vous vraiment supprimer %1$s et ses contenus ?</string> <string name="confirmation_remove_local">Local seulement</string> - <string name="remove_success_msg">Suppression terminée avec succès</string> <string name="remove_fail_msg">Échec de la suppression</string> <string name="rename_dialog_title">Entrez un nouveau nom</string> - <string name="rename_local_fail_msg">La version locale ne peut être renommée ; veuillez réessayer avec un nom différent</string> - <string name="rename_server_fail_msg">Échec du renommage</string> - <string name="sync_file_fail_msg">Le fichier distant n\'a pu être vérifié</string> <string name="sync_file_nothing_to_do_msg">Le contenu du fichier est déjà synchronisé</string> - <string name="create_dir_fail_msg">Le dossier n\'a pas pu être créé</string> <string name="filename_forbidden_characters">Caractères interdits : / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Le nom de fichier contient au moins un caractère invalide</string> <string name="filename_empty">Le nom du fichier ne peut pas être vide</string> - <string name="wait_a_moment">Veuillez patienter</string> <string name="wait_checking_credentials">Vérification des identifiants enregistrés</string> - <string name="filedisplay_unexpected_bad_get_content">Problème inattendu ; veuillez sélectionner le fichier depuis une autre application</string> - <string name="filedisplay_no_file_selected">Aucun fichier n\'était sélectionné</string> <string name="activity_chooser_title">Envoyer le lien vers …</string> <string name="wait_for_tmp_copy_from_private_storage">Copie du fichier depuis le stockage privé</string> <string name="oauth_check_onoff">Connexion avec oAuth2</string> - <string name="oauth_login_connection">Connexion au serveur oAuth2…</string> - <string name="ssl_validator_header">L\'identité du site ne peut être vérifiée</string> <string name="ssl_validator_reason_cert_not_trusted">- Le certificat du serveur n\'est pas sûr</string> <string name="ssl_validator_reason_cert_expired">- Le certificat du serveur a expiré</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Le certificat du serveur n\'est pas encore valide</string> <string name="ssl_validator_reason_hostname_not_verified">- L\'URL ne correspond pas au nom d\'hôte du certificat</string> <string name="ssl_validator_question">Voulez-vous tout de même faire confiance à ce certificat ?</string> - <string name="ssl_validator_not_saved">Impossible de sauvegarder le certificat</string> <string name="ssl_validator_btn_details_see">Détails</string> <string name="ssl_validator_btn_details_hide">Masquer</string> <string name="ssl_validator_label_subject">Délivré à :</string> @@ -336,27 +259,17 @@ <string name="placeholder_sentence">Ceci est un espace réservé</string> <string name="placeholder_filename">placeholder.txt</string> - <string name="placeholder_filetype">Image PNG</string> <string name="placeholder_filesize">389 Ko</string> <string name="placeholder_timestamp">18/05/2012 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Téléverse par wifi uniquement</string> - <string name="instant_upload_on_wifi">Téléverser les images via une connexion WiFi uniquement</string> - <string name="instant_video_upload_on_wifi">Téléverser les images via une connexion WiFi uniquement</string> - <string name="instant_video_upload_on_charging">Téléverser les images uniquement si le chargeur est branché</string> - <string name="instant_upload_on_charging">Téléverser les images uniquement si le chargeur est branché</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Conflit de fichiers</string> - <string name="conflict_message">Quels fichiers voulez-vous conserver ? Si vous sélectionnez les deux, un chiffre sera ajouté au nom du fichier local.</string> <string name="conflict_keep_both">Conserver les deux</string> <string name="conflict_use_local_version">version locale</string> <string name="conflict_use_server_version">version serveur</string> - <string name="preview_sorry">Désolé à propos de cela !</string> <string name="preview_image_description">Prévisualisation de l\'image</string> - <string name="preview_image_error_unknown_format">L\'image ne peut pas être affichée</string> - <string name="error__upload__local_file_not_copied">%1$s n\'a pas pu être copié dans le dossier local %2$s</string> <string name="prefs_instant_upload_path_title">Téléversement immédiat du dossier</string> <string name="prefs_folder_sync_local_path_title">Dossier local</string> @@ -364,7 +277,6 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Utiliser des sous-dossiers</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Stocker dans des sous-dossiers basés sur années et mois</string> - <string name="share_link_no_support_share_api">Désolé, le partage n\'est pas disponible sur votre serveur. Veuillez contacter votre administrateur.</string> <string name="share_link_file_no_exist">Impossible de partager. Vérifiez que le fichier est bien présent</string> <string name="share_link_file_error">Une erreur est survenue lors de la tentative de partage de ce fichier ou répertoire</string> <string name="unshare_link_file_no_exist">Impossible de supprimer le partage. Vérifiez que le fichier est bien présent</string> @@ -378,56 +290,29 @@ <string name="copy_link">Copier le lien</string> <string name="clipboard_text_copied">Copié dans le presse-papier</string> - <string name="clipboard_no_text_to_copy">Aucun texte n\'a été reçu pour copier dans le presse-papier</string> <string name="clipboard_uxexpected_error">Erreur inattendue lors de la copie vers le presse-papiers</string> <string name="clipboard_label">Texte copié depuis %1$s</string> - <string name="error_cant_bind_to_operations_service">Erreur critique : impossible de réaliser les opérations</string> - - <string name="network_error_socket_exception">Une erreur est survenue pendant la connexion au serveur.</string> - <string name="network_error_socket_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string> - <string name="network_error_connect_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string> - <string name="network_host_not_available">Impossible de réaliser l\'opération, le serveur n\'est pas accessible.</string> - <string name="forbidden_permissions">Vous n\'avez pas la permission %s</string> <string name="forbidden_permissions_rename">de renommer ce fichier</string> <string name="forbidden_permissions_delete">de supprimer ce fichier</string> <string name="share_link_forbidden_permissions">de partager ce fichier</string> <string name="unshare_link_forbidden_permissions">de cesser le partage de ce fichier</string> <string name="update_link_forbidden_permissions">de modifier ce partage</string> - <string name="forbidden_permissions_create">de créer ce fichier</string> - <string name="uploader_upload_forbidden_permissions">de téléverser dans ce dossier</string> <string name="downloader_download_file_not_found">Ce fichier n’est plus disponible sur le serveur</string> <string name="file_migration_dialog_title">Mise à jour du chemin de stockage</string> <string name="file_migration_finish_button">Terminer</string> - <string name="file_migration_preparing">Préparation pour la migration…</string> <string name="file_migration_checking_destination">Vérification de la destination…</string> - <string name="file_migration_saving_accounts_configuration">Enregistrement de la configuration des comptes…</string> - <string name="file_migration_waiting_for_unfinished_sync">En attente des synchronisations non terminées…</string> <string name="file_migration_migrating">Déplacement des données…</string> <string name="file_migration_updating_index">Mise à jour des indexes…</string> <string name="file_migration_cleaning">Nettoyage…</string> - <string name="file_migration_restoring_accounts_configuration">Restauration de la configuration des comptes…</string> <string name="file_migration_ok_finished">Terminé</string> - <string name="file_migration_failed_not_enough_space">ERREUR : Espace insufisant</string> - <string name="file_migration_failed_not_writable">ERREUR : Le fichier n\'est pas modifiable</string> - <string name="file_migration_failed_not_readable">ERREUR : Le fichier est illisible</string> <string name="file_migration_failed_dir_already_exists">ERREUR : Le dossier Nextcloud existe déjà</string> - <string name="file_migration_failed_while_coping">ERREUR : Lors de la migration</string> - <string name="file_migration_failed_while_updating_index">ERREUR : Lors de la mise à jour de l\'index</string> - - <string name="file_migration_directory_already_exists">Le dossier de données existe déjà, que souhaitez-vous faire ?</string> - <string name="file_migration_override_data_folder">Écraser</string> - <string name="file_migration_use_data_folder">Conserver le dossier actuel</string> - <string name="prefs_category_accounts">Comptes</string> <string name="prefs_add_account">Ajouter un compte</string> <string name="drawer_manage_accounts">Gérer les comptes</string> - <string name="auth_redirect_non_secure_connection_title">Le connexion sécurisée est redirigée vers une route non-sécurisée.</string> - - <string name="actionbar_logger">Journaux</string> + <string name="actionbar_logger">Journaux</string> <string name="log_send_history_button">Envoyer le journal</string> - <string name="log_send_no_mail_app">Aucune application n\'a été trouvée pour envoyer les journaux. Merci d\'installer une application de messagerie.</string> <string name="log_send_mail_subject">Journaux de l\'application Android %1$s</string> <string name="log_progress_dialog_text">Chargement des données …</string> @@ -435,27 +320,20 @@ <string name="saml_authentication_wrong_pass">Mot de passe incorrect</string> <string name="actionbar_move">Déplacer</string> <string name="actionbar_copy">Copier</string> - <string name="file_list_empty_moving">Il n\'y a rien ici. Vous pouvez ajouter un dossier !</string> <string name="folder_picker_choose_button_text">Valider</string> - <string name="move_file_not_found">Impossible de déplacer. Vérifiez que le fichier existe</string> - <string name="move_file_invalid_into_descendent">Il n\'est pas possible de déplacer un dossier vers un de ses descendants</string> - <string name="move_file_invalid_overwrite">Le fichier existe déjà dans le dossier de destination</string> <string name="move_file_error">Une erreur est survenue lors de la tentative de déplacement de ce fichier ou dossier</string> <string name="forbidden_permissions_move">de déplacer ce fichier</string> <string name="copy_file_not_found">Impossible de copier. Vérifiez que le fichier existe</string> - <string name="copy_file_invalid_into_descendent">Il n\'est pas possible de copier un dossier vers un de ses descendants</string> - <string name="copy_file_invalid_overwrite">Le fichier existe déjà dans le dossier de destination</string> <string name="copy_file_error">Une erreur est survenue lors de la copie de ce fichier ou dossier</string> <string name="forbidden_permissions_copy">de copier ce fichier</string> <string name="prefs_category_instant_uploading">Téléversement immédiat</string> <string name="prefs_category_details">Propriétés</string> - <string name="prefs_instant_video_upload_path_title">Téléversement immédiat du dossier vidéos</string> - <string name="sync_folder_failed_content">La synchronisation du dossier %1$s n\'a pas pu être terminée</string> + <string name="sync_folder_failed_content">La synchronisation du dossier %1$s n\'a pas pu être terminée</string> <string name="shared_subject_header">a partagé</string> <string name="with_you_subject_header">avec vous</string> @@ -496,7 +374,6 @@ <string name="share_add_user_or_group">Ajouter un Utilisateur ou un Groupe</string> <string name="share_via_link_section_title">Partager par lien public</string> <string name="share_via_link_expiration_date_label">Indiquer une date d\'expiration</string> - <string name="share_via_link_password_label">Protéger par un mot de passe</string> <string name="share_via_link_password_title">Sécurisé</string> <string name="share_via_link_edit_permission_label">Permettre la modification</string> <string name="share_via_link_hide_file_listing_permission_label">Masquer la liste des fichiers</string> @@ -512,7 +389,6 @@ <string name="share_email_clarification">%1$s (courriel)</string> <string name="share_known_remote_clarification">%1$s (sur %2$s)</string> - <string name="share_sharee_unavailable">Désolé, la version de votre serveur ne permet pas aux applications d\'initier des partages avec d\'autres utilisateurs.\nVeuillez contacter votre administrateur</string> <string name="share_privilege_can_share">peut partager</string> <string name="share_privilege_can_edit">peut modifier</string> <string name="share_privilege_can_edit_create">création</string> @@ -521,50 +397,34 @@ <string name="edit_share_unshare">Terminer le partage</string> <string name="edit_share_done">Terminé</string> - <string name="action_retry_uploads">Relancer les échoués</string> <string name="action_clear_failed_uploads">Effacer les échoués</string> - <string name="action_clear_successful_uploads">Effacer les envoyés</string> - <string name="action_clear_finished_uploads">Effacer tous les terminés</string> - <string name="action_switch_grid_view">Affichage Mosaïque</string> <string name="action_switch_list_view">Affichage Liste</string> <string name="manage_space_title">Gestion de l\'espace</string> - <string name="manage_space_description">Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \n\nLes fichiers téléchargés ne seront pas impactés.\n\nCette opération peut prendre du temps.</string> <string name="manage_space_clear_data">Effacer les données</string> <string name="manage_space_error">Certains fichiers n\'ont pu être supprimés.</string> - <string name="permission_storage_access">Des permissions supplémentaires sont exigées pour téléverser & télécharger des fichiers.</string> - <string name="local_file_not_found_toast">Le fichier n\'a pas été trouvé sur le système de fichier local</string> <string name="confirmation_remove_files_alert">Voulez-vous vraiment supprimer les éléments sélectionnés ?</string> <string name="confirmation_remove_folders_alert">Voulez-vous vraiment supprimer les éléments sélectionnés et leurs contenus ?</string> - <string name="uploads_view_upload_status_waiting_for_charging">En attente de recharge de l\'appareil</string> <string name="actionbar_search">Rechercher</string> <string name="files_drop_not_supported">Il s\'agit d\'une fonctionnalité de Nextcloud ; veuillez mettre à jour..</string> <string name="learn_more">En apprendre plus</string> <string name="drawer_folder_sync">Téléversement automatique</string> <string name="drawer_participate">Participer</string> - <string name="participate_testing_headline">Aidez-nous à améliorer Nextcloud</string> - <string name="participate_testing_bug_text">Vous avez trouvé un bug ? Quelque chose vous semble étrange ?</string> <string name="participate_testing_report_text">Signaler un problème sur Github</string> - <string name="participate_testing_version_text">Vous avez envie de nous aider en testant les futures versions ?</string> <string name="participate_beta_headline">Testez la version Bêta</string> - <string name="participate_beta_text">La version Beta inclut les dernières fonctionnalités qui sont encore toutes fraîches. Des erreurs peuvent se produire et si c\'est le cas, merci de nous les signaler.</string> <string name="participate_release_candidate_headline">Testez la version Release Candidate</string> - <string name="participate_release_candidate_text">La version « release candidate » (RC) est un instantanné de la dernière version supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid.</string> <string name="participate_contribute_headline">Participez activement</string> <string name="participate_contribute_irc_text">Rejoignez la discussion sur IRC <a href=\"%1$s\">#nextcloud-mobile</a>.</string> <string name="participate_contribute_forum_text">Aidez les autres sur le <a href=\"%1$s\">forum</a>.</string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Traduisez</a> l\'application.</string> - <string name="participate_contribute_github_text">Vous êtes développeur ? Consultez <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>.</string> <string name="move_to">Déplacer vers…</string> <string name="copy_to">Copier vers…</string> <string name="choose_remote_folder">Sélectionner le dossier…</string> <string name="folder_sync_loading_folders">Chargement des dossiers…</string> <string name="folder_sync_no_results">Aucun dossier média trouvé.</string> - <string name="folder_sync_preferences">Préférences du téléversement automatique</string> <string name="folder_sync_settings">Paramètres</string> - <string name="folder_sync_new_info">Le téléversement immédiat a été complètement réorganisé. Merci de bien vouloir accéder au menu principal et de reconfigurer votre téléversement automatique. Désolé pour le désagrément.\n\nProfitez des nouvelles capacités étendues du téléversement automatique !</string> <string name="folder_sync_preferences_folder_path">Pour %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d sélectionné</item> @@ -578,7 +438,6 @@ <string name="notifications_no_results_headline">Aucune notification</string> <string name="notifications_no_results_message">Veuillez revenir plus tard.</string> - <string name="upload_file_dialog_title">Spécifiez le nom et le type du fichier téléversé</string> <string name="upload_file_dialog_filename">Nom de fichier</string> <string name="upload_file_dialog_filetype">Type de fichier</string> <string name="upload_file_dialog_filetype_snippet_text">Extrait du fichier texte (.txt)</string> @@ -594,8 +453,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Un endroit sûr pour toutes vos données</string> - <string name="welcome_feature_1_text">Accédez, partagez et protégez vos fichiers personnels et professionnels</string> - <string name="welcome_feature_2_title">Multi-compte</string> <string name="welcome_feature_2_text">Connectez-vous avec plusieurs comptes clouds</string> @@ -609,7 +466,6 @@ <!-- User information --> <string name="user_info_full_name">Nom complet</string> - <string name="user_info_email">Adresse e-mail</string> <string name="user_info_phone">Numéro de téléphone</string> <string name="user_info_address">Adresse</string> <string name="user_info_website">Site web</string> @@ -619,23 +475,16 @@ <!-- Activities --> <string name="activities_no_results_headline">Aucune activité pour le moment</string> - <string name="activities_no_results_message">Ce flux affichera des événements comme\n des ajouts, des changements & des partages</string> <string name="webview_error">Une erreur est survenue</string> <string name="prefs_category_about">À propos</string> - <string name="actionbar_contacts">Copie de sauvegarde des contacts</string> - <string name="contacts_backup_button">Sauvegarder maintenant</string> <string name="contacts_restore_button">Restaurer la dernière copie de sauvegarde</string> <string name="contacts_header_restore">Restaurer</string> <string name="contacts_header_backup">Copie de sauvegarde</string> <string name="contacts_automatic_backup">Copie de sauvegarde des contacts</string> <string name="contacts_last_backup">Dernière copie de sauvegarde</string> - <string name="contacts_read_permission">L\'autorisation de lecture des contacts est nécessaire</string> - <string name="contacts_write_permission">L\'autorisation d\'écriture des contacts est nécessaire</string> <string name="contactlist_title">Restaurer les contacts</string> <string name="contaclist_restore_selected">Restaurer les contacts sélectionnés</string> - <string name="contactlist_account_chooser_title">Choisissez un compte pour importer</string> - <string name="contactlist_no_permission">Aucune autorisation, rien d\'importé !</string> <string name="contacts_preference_choose_date">Choisir la date</string> <string name="contacts_preference_backup_never">jamais</string> <string name="contacts_preferences_no_file_found">Aucun fichier trouvé</string> @@ -644,6 +493,4 @@ <!-- Notifications --> <string name="new_notification_received">Nouvelle notification reçue</string> - - -</resources> + </resources> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 109c16ed41..6e90552fd5 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="about_android">%1$s Android app</string> + <string name="about_android">%1$s Android-program</string> <string name="about_version">versjon %1$s</string> <string name="actionbar_sync">Oppdater konto</string> <string name="actionbar_upload">Last opp</string> @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">Fingeravtrykkslås</string> <string name="prefs_fingerprint_notsetup">Det har ikke blitt satt opp noen fingeravtrykk.</string> <string name="prefs_show_hidden_files">Vis skjulte filer</string> - <string name="prefs_instant_upload">Umiddelbare bildeopplastninger</string> - <string name="prefs_instant_upload_summary">Last opp bilder tatt av kameraet umiddelbart</string> - <string name="prefs_instant_video_upload">Umiddelbar opplasting av filmer</string> - <string name="prefs_instant_video_upload_summary">Last opp filmer tatt opp av kameraet umiddelbart</string> + <string name="prefs_instant_upload">Umiddelbar opplasting av bilder</string> + <string name="prefs_instant_upload_summary">Last opp bilder tatt med kameraet med én gang</string> + <string name="prefs_instant_video_upload">Umiddelbar opplasting av video</string> + <string name="prefs_instant_video_upload_summary">Last opp videoer tatt med kameraet med én gang</string> <string name="prefs_log_title">Aktiver loggføring</string> <string name="prefs_log_summary">Denne er brukt til å loggføre problemer</string> <string name="prefs_log_title_history">Loggføringshistorikk</string> @@ -58,23 +58,16 @@ <string name="prefs_calendar_contacts">Synkroniser kalender & kontakter</string> <string name="prefs_calendar_contacts_summary">Sett opp DAVdroid (v1.3.0+) for nåværende konto</string> <string name="prefs_calendar_contacts_address_resolve_error">Tjeneradressen for kontoen ble ikke funnet for DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">Ingen Google Play butikk eller F-Droid app er installert</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Kalender & kontaktsynkronisering ble satt opp</string> + <string name="prefs_calendar_contacts_no_store_error">Hverken F-droid eller Google play er installert</string> <string name="prefs_help">Hjelp</string> <string name="prefs_recommend">Anbefal til en venn</string> <string name="prefs_feedback">Tilbakemelding</string> <string name="prefs_imprint">Avtrykk</string> - <string name="prefs_remember_last_share_location">Husk delt plassering</string> - <string name="prefs_remember_last_upload_location_summary">Husk sist delt plassering for opplasting</string> - - <string name="recommend_subject">Prøv %1$s på smarttelefonen din!</string> - <string name="recommend_text">Jeg ønsker å invitere deg til å bruke %1$s på smarttelefonen din!\nLast ned her: %2$s</string> - - <string name="auth_check_server">Sjekk tjener</string> + <string name="recommend_subject">Prøv %1$s på smarttelefonen din!</string> + <string name="auth_check_server">Sjekk tjener</string> <string name="auth_host_url">Tjeneradresse https://...</string> <string name="auth_username">Brukernavn</string> <string name="auth_password">Passord</string> - <string name="auth_register">Har du ingen tjener enda?\nKlikk her for å opprette en hos en tilbyder</string> <string name="sync_string_files">Filer</string> <string name="setup_btn_connect">Koble til</string> <string name="uploader_btn_upload_text">Last opp</string> @@ -86,43 +79,29 @@ <string name="uploader_error_title_no_file_to_upload">Ingen fil å laste opp</string> <string name="uploader_error_message_received_piece_of_text">%1$s kan ikke laste opp tekst som en fil.</string> <string name="uploader_error_message_no_file_to_upload">Mottatte data inneholder ingen gyldig fil.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Filen kan ikke lastes opp</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Denne filen kan ikke lastes opp</string> <string name="uploader_error_message_read_permission_not_granted">%1$s er har ikke tilgang til å se mottatt fil</string> - <string name="uploader_error_message_source_file_not_found">Filen som skulle lastes opp ble ikke funnet der den skulle være. Vennligst sjekk at filen finnes.</string> - <string name="uploader_error_message_source_file_not_copied">En feil oppstod under kopiering av filen til en midlertidig mappe. Vennligst prøv å sende på nytt.</string> + <string name="uploader_error_message_source_file_not_found">Fil valgt for opplasting ble ikke funnet. Sjekk hvorvidt filen eksisterer.</string> + <string name="uploader_error_message_source_file_not_copied">Kunne ikke kopiere fil til midlertidig mappe. Prøv å sende igjen.</string> <string name="uploader_upload_files_behaviour">Alternativer for opplasting:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Flytt filen til Nextcloud mappen</string> <string name="uploader_upload_files_behaviour_only_upload">Behold filen i kildemappe</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Slett filen fra kildemappen</string> <string name="file_list_seconds_ago">for få sekunder siden</string> <string name="file_list_empty_headline">Ingen filer her</string> - <string name="file_list_empty">Last opp innhold eller synkroniser med enhetene dine.</string> - <string name="file_list_empty_favorites">Marker noen filer som favoritter eller synkroniser enhetene dine!</string> - <string name="file_list_empty_favorites_filter_list">Filer og mapper du markerer som favoritter vil vises her</string> - <string name="file_list_empty_favorites_filter">Din spørring returnerte ingen filer markert som favoritter!</string> <string name="file_list_loading">Laster…</string> - <string name="file_list_no_app_for_file_type">Ingen applikasjon funnet for filtypen!</string> <string name="local_file_list_empty">Det er ingen filer i denne mappen.</string> <string name="file_list_empty_headline_search">Ingen resultater i denne mappen</string> <string name="file_list_empty_headline_server_search">Ingen resultater</string> - <string name="file_list_empty_favorite_headline">Ingen favoritter ennå</string> <string name="file_list_empty_shared_headline">Ingenting delt enda</string> <string name="file_list_empty_shared">Filer og mapper som du deler vil bli vist her</string> <string name="file_list_empty_headline_server_search_videos">Ingen videoer</string> <string name="file_list_empty_headline_server_search_photos">Ingen bilder</string> - <string name="file_list_empty_search">Vil du prøve i en annen mappe?</string> - <string name="file_list_empty_recently_modified">Fant ingen filer endret de siste syv dagene</string> - <string name="file_list_empty_recently_modified_filter">Spørringen din returnerte ingen filer endret - de siste syv dagene!</string> <string name="file_list_empty_recently_added">Fant ingen nylig tillagte filer</string> - <string name="file_list_empty_recently_added_filter">Din spørring returnerte ingen filer som nylig er blitt lagt til!</string> - <string name="file_list_empty_text_photos">Last opp noen bilder eller aktiver automatisk opplasting!</string> - <string name="file_list_empty_text_photos_filter">Din spørring returnerte ingen bilder!</string> - <string name="file_list_empty_text_videos">Last opp noen videoer eller skru på automatisk opplasting!</string> - <string name="file_list_empty_text_videos_filter">Din spørring returnerte ingen vidoer!</string> + <string name="file_list_empty_recently_added_filter">Søket ditt frambragte ingen nylig tillagte filer.</string> + <string name="file_list_empty_text_photos">Last opp noen bilder eller aktiver automatisk opplasting.</string> + <string name="file_list_empty_text_photos_filter">Ditt søk frambragte ingen bilder.</string> <string name="upload_list_empty_headline">Ingen opplastinger tilgjengelig</string> - <string name="upload_list_empty_text">Last opp innhold eller aktiver umiddelbar opplasting.</string> - <string name="upload_list_empty_text_auto_upload">Last opp noe innhold eller aktiver automatisk opplasting!</string> <string name="file_list_folder">mappe</string> <string name="file_list_folders">mapper</string> <string name="file_list_file">fil</string> @@ -134,14 +113,11 @@ <string name="filedetails_modified">Endret:</string> <string name="filedetails_download">Last ned</string> <string name="filedetails_sync_file">Synkroniser</string> - <string name="filedetails_renamed_in_upload_msg">Filnavnet ble endret til %1$s under opplasting</string> - <string name="list_layout">Listevisning</string> <string name="action_share">Delt ressurs</string> <string name="common_yes">Ja</string> <string name="common_no">Nei</string> <string name="common_ok">Ok</string> <string name="common_remove_upload">Fjern opplasting</string> - <string name="common_retry_upload">Prøv å laste opp igjen.</string> <string name="common_cancel_sync">Avbryt synkronisering</string> <string name="common_cancel">Avbryt</string> <string name="common_back">Tilbake</string> @@ -161,10 +137,10 @@ <string name="uploader_info_dirname">Mappenavn</string> <string name="uploader_upload_in_progress_ticker">Laster opp …</string> <string name="uploader_upload_in_progress_content">%1$d%% Laster opp %2$s</string> - <string name="uploader_upload_succeeded_ticker">Opplasting fullført</string> + <string name="uploader_upload_succeeded_ticker">Opplastet</string> <string name="uploader_upload_succeeded_content_single">%1$s lastet opp</string> <string name="uploader_upload_failed_ticker">Opplasting feilet</string> - <string name="uploader_upload_failed_content_single">Opplasting av %1$s kunne ikke fullføres</string> + <string name="uploader_upload_failed_content_single">Kunne ikke laste opp %1$s</string> <string name="uploader_upload_failed_credentials_error">Opplasting feilet, du må logge inn på nytt</string> <string name="uploads_view_title">Opplastinger</string> <string name="uploads_view_group_current_uploads">Nåværende</string> @@ -181,37 +157,30 @@ <string name="uploads_view_upload_status_failed_localfile_error">Finner ikke lokal fil</string> <string name="uploads_view_upload_status_failed_permission_error">Tillatelsesfeil</string> <string name="uploads_view_upload_status_conflict">Konflikt</string> - <string name="uploads_view_upload_status_service_interrupted">Applikasjonen ble avsluttet</string> <string name="uploads_view_upload_status_unknown_fail">Ukjent feil</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Venter på trådløstilkobling</string> <string name="uploads_view_later_waiting_to_upload">Venter på å laste opp</string> <string name="downloader_download_in_progress_ticker">Laster ned …</string> <string name="downloader_download_in_progress_content">%1$d%% Laster ned %2$s</string> - <string name="downloader_download_succeeded_ticker">Nedlasting fullført</string> + <string name="downloader_download_succeeded_ticker">Nedlastet</string> <string name="downloader_download_succeeded_content">%1$s lastet ned</string> <string name="downloader_download_failed_ticker">Nedlasting feilet</string> - <string name="downloader_download_failed_content">Nedlasting av %1$s kunne ikke fullføres</string> + <string name="downloader_download_failed_content">Kunne ikke laste ned %1$s</string> <string name="downloader_not_downloaded_yet">Ikke lastet ned enda</string> <string name="downloader_download_failed_credentials_error">Nedlasting mislyktes, du må logge inn på nytt</string> <string name="common_choose_account">Velg konto</string> <string name="sync_fail_ticker">Synkronisering feilet</string> - <string name="sync_fail_ticker_unauthorized">Synkronisering feilet, du må logge inn på nytt</string> - <string name="sync_fail_content">Synkronisering av %1$s kunne ikke fullføres</string> - <string name="sync_fail_content_unauthorized">Ugyldig passord for %1$s</string> + <string name="sync_fail_content_unauthorized">Feil passord for %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Konflikter funnet</string> <string name="sync_conflicts_in_favourites_content">%1$d hold-i-synk filer kunne ikke synkroniseres</string> <string name="sync_fail_in_favourites_ticker">Holdt-i-synk -filer mislyktes</string> <string name="sync_fail_in_favourites_content">Innholdet av %1$d filer kunne ikke synkroniseres (%2$d konflikter)</string> <string name="sync_foreign_files_forgotten_ticker">Noen lokale filer ble glemt</string> <string name="sync_foreign_files_forgotten_content">%1$d filer fra %2$s mappen kunne ikke kopieres til</string> - <string name="sync_foreign_files_forgotten_explanation">Fra versjon 1.3.16 blir filer som lastes opp fra denne enheten kopiert inn i den lokale mappen %1$s for å forhindre tap av data når samme fil synkroniseres med flere kontoer.\n\nPga. denne endringen ble alle filer som er blitt lastet opp med tidligere versjoner av denne appen, kopiert til mappe %2$s. Imidlertid kunne ikke denne kopieringen fullføres under konto-synkroniseringen pga. en feil. Du kan enten la filen(e) ligge der de ligger og fjerne lenken til %3$s, eller flytte filene til mappe %1$s og beholde lenken til %4$s.\n\nNedenfor finner du en liste over de lokale filene og de eksterne filene i %5$s som de var lenket til.</string> - <string name="sync_current_folder_was_removed">Mappen %1$s finnes ikke lengre</string> <string name="foreign_files_move">Flytt alle</string> <string name="foreign_files_success">Alle filer ble flyttet</string> <string name="foreign_files_fail">Noen filer kunne ikke fjernes</string> <string name="foreign_files_local_text">Lokal: %1$s</string> <string name="foreign_files_remote_text">Ekstern: %1$s</string> - <string name="upload_query_move_foreign_files">Det er ikke nok plass til å kopiere de valgte filene inn i mappen %1$s. Vil du flytte dem i stedet? </string> <string name="pass_code_enter_pass_code">Sett inn passordet ditt</string> <string name="pass_code_configure_your_pass_code">Skriv inn passordet ditt</string> @@ -229,16 +198,7 @@ <string name="media_event_done">%1$s avspilling avsluttet</string> <string name="media_err_nothing_to_play">Ingen mediafil funnet</string> <string name="media_err_no_account">Ingen konto angitt</string> - <string name="media_err_not_in_owncloud">Filen er ikke i en gyldig konto</string> <string name="media_err_unsupported">Ustøttet mediakodek</string> - <string name="media_err_io">Mediafilen kunne ikke leses</string> - <string name="media_err_malformed">Mediafilen er ikke riktig kodet</string> - <string name="media_err_timeout">Tidsavbrudd under avspillingsforsøk</string> - <string name="media_err_invalid_progressive_playback">Mediafilen kan ikke strømmes</string> - <string name="media_err_unknown">Mediafilen kan ikke spilles med forvalgt mediaspiller</string> - <string name="media_err_security_ex">Sikkerhetsfeil under avspilling av %1$s</string> - <string name="media_err_io_ex">Inndatafeil under avspilling av %1$s</string> - <string name="media_err_unexpected">Uventet feil under avspilling av %1$s</string> <string name="media_rewind_description">Spol tilbake</string> <string name="media_play_pause_description">Spill eller pause</string> <string name="media_forward_description">Spol fremover</string> @@ -250,32 +210,22 @@ <string name="auth_connection_established">Tilkobling opprettet</string> <string name="auth_testing_connection">Tester forbindelsen</string> <string name="auth_not_configured_title">Feil i tjenerkonfigurasjon</string> - <string name="auth_account_not_new">En konto for samme bruker og tjener finnes allerede på enheten</string> <string name="auth_account_not_the_same">Den innskrevne brukeren samsvarer ikke med brukeren av denne kontoen</string> <string name="auth_unknown_error_title">Ukjent feil oppstod!</string> - <string name="auth_unknown_host_title">Fant ikke tjener</string> - <string name="auth_incorrect_path_title">Finner ikke tjenerinstans</string> + <string name="auth_unknown_host_title">Fant ikke vert</string> <string name="auth_timeout_title">Tjeneren brukte for lang tid på å svare</string> - <string name="auth_incorrect_address_title">Feil format på tjeneradresse</string> <string name="auth_ssl_general_error_title">Oppstart av SSL mislyktes</string> - <string name="auth_ssl_unverified_server_title">Kunne ikke verifisere SSL-tjenerens identitet</string> <string name="auth_bad_oc_version_title">Ukjent tjenerversjon</string> - <string name="auth_wrong_connection_title">Klarte ikke å opprette tilkobling</string> <string name="auth_secure_connection">Sikker tilkobling opprettet</string> <string name="auth_unauthorized">Feil brukernavn eller passord</string> <string name="auth_oauth_error">Mislykket autorisasjon</string> <string name="auth_oauth_error_access_denied">Tilgang nektet av autorisasjonstjener</string> - <string name="auth_wtf_reenter_URL">Uventet tilstand. Legg inn tjeneradressen på nytt</string> <string name="auth_expired_oauth_token_toast">Autorisasjonen din har gått ut. Autoriser igjen</string> <string name="auth_expired_basic_auth_toast">Legg inn nåværende passord</string> <string name="auth_expired_saml_sso_token_toast">Økta di har gått ut. Koble til igjen</string> - <string name="auth_connecting_auth_server">Kobler til autentiseringstjener..</string> <string name="auth_unsupported_auth_method">Tjeneren støtter ikke denne autorisasjonsmetoden</string> <string name="auth_unsupported_multiaccount">%1$s støtter ikke flere kontoer</string> - <string name="auth_fail_get_user_name">Tjeneren din svarer ikke med korrekt bruker-ID, vennligst ta kontakt med en administrator </string> <string name="auth_can_not_auth_against_server">Kan ikke autentisere mot denne tjeneren</string> - <string name="auth_account_does_not_exist">Kontoen eksisterer ikke på enheten enda</string> - <string name="favorite">Sett som tilgjengelig frakoblet</string> <string name="unfavorite">Fjern som tilgjengelig frakoblet</string> <string name="favorite_real">Sett som favoritt</string> @@ -283,36 +233,26 @@ <string name="common_rename">Endre navn</string> <string name="common_remove">Fjern</string> <string name="confirmation_remove_file_alert">Vil du virkelig fjerne %1$s?</string> - <string name="confirmation_remove_folder_alert">Vil du virkelig fjerne %1$s inkludert innholdet?</string> <string name="confirmation_remove_local">Kun lokalt</string> - <string name="remove_success_msg">Fjerning var vellykket</string> + <string name="remove_success_msg">"Fjernet"</string> <string name="remove_fail_msg">Fjerning mislyktes</string> <string name="rename_dialog_title">Skriv inn et nytt navn</string> - <string name="rename_local_fail_msg">Lokal kopi kunne ikke endre navn; prøv et annet navn</string> - <string name="rename_server_fail_msg">Klarte ikke å endre navn</string> - <string name="sync_file_fail_msg">Eksterne filer kunne ikke sjekkes</string> <string name="sync_file_nothing_to_do_msg">filinnhold er allerede synkronisert</string> - <string name="create_dir_fail_msg">Mappe kunne ikke opprettes</string> <string name="filename_forbidden_characters">Forbudte tegn: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Filnavnet inneholder minst ett ulovlig tegn</string> <string name="filename_empty">Filnavn kan ikke være tomt</string> - <string name="wait_a_moment">Vent et øyeblikk</string> + <string name="wait_a_moment">Vent et øyeblikk…</string> <string name="wait_checking_credentials">Sjekker lagrede påloggingsdetaljer</string> - <string name="filedisplay_unexpected_bad_get_content">Uventet problem; vennligst velg filen fra en annen applikasjon</string> - <string name="filedisplay_no_file_selected">Ingen fil ble valgt</string> <string name="activity_chooser_title">Send lenke til …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopierer fil fra privat lager</string> <string name="oauth_check_onoff">Logg inn med oAuth2</string> - <string name="oauth_login_connection">Kobler til oAuth2 tjener...</string> - <string name="ssl_validator_header">Identiteten til siden kunne ikke bekreftes</string> <string name="ssl_validator_reason_cert_not_trusted">- Tjenerens sertifikat er ikke til å stole på</string> <string name="ssl_validator_reason_cert_expired">- Tjenerens sertifikat er utløpt</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Tjenersertifikatets gyldige datoer er i fremtiden</string> <string name="ssl_validator_reason_hostname_not_verified">- Nettadressen samsvarer ikke med vertsnavnet i sertifikatet</string> <string name="ssl_validator_question">Vil du stole på dette sertifikatet likevel?</string> - <string name="ssl_validator_not_saved">Sertifikatet kunne ikke lagres</string> <string name="ssl_validator_btn_details_see">Detaljer</string> <string name="ssl_validator_btn_details_hide">Skjul</string> <string name="ssl_validator_label_subject">Utstedt til:</string> @@ -341,21 +281,17 @@ <string name="placeholder_timestamp">18.05.2012 12:23</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Last opp kun via Wi-Fi</string> - <string name="instant_upload_on_wifi">Last opp bilder kun via Wi-Fi</string> - <string name="instant_video_upload_on_wifi">Last kun opp filmer via Wi-Fi</string> - <string name="instant_video_upload_on_charging">Last kun opp under lading</string> - <string name="instant_upload_on_charging">Last kun opp under lading</string> + <string name="auto_upload_on_wifi">Bare last opp på Wi-Fi</string> + <string name="instant_upload_on_wifi">Bare last opp bilder på Wi-Fi</string> <string name="instant_upload_path">/Direkteopplasting</string> <string name="conflict_title">Filkonflikt</string> - <string name="conflict_message">Hvilke filer ønsker du å beholder? Hvis du velger begge versjonene, får den lokale filen lagt til et tall i navnet.</string> <string name="conflict_keep_both">Behold begge</string> <string name="conflict_use_local_version">lokal versjon</string> <string name="conflict_use_server_version">tjenerversjon</string> - <string name="preview_sorry">Beklager!</string> + <string name="preview_sorry">Beklager.</string> <string name="preview_image_description">Bildeforhåndsvisning</string> - <string name="preview_image_error_unknown_format">Bildet kan ikke vises</string> + <string name="preview_image_error_unknown_format">Kunne ikke vise bilde</string> <string name="error__upload__local_file_not_copied">%1$s kunne ikke kopieres til lokal mappe %2$s</string> <string name="prefs_instant_upload_path_title">Mappe for umiddelbar opplasting</string> @@ -364,7 +300,6 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Bruk undermapper</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Lagre filer i undermapper basert på år og måned</string> - <string name="share_link_no_support_share_api">Beklager, deling er ikke skrudd på for din tjener. Ta kontakt med administratoren.</string> <string name="share_link_file_no_exist">Kan ikke dele. Sjekk om filen eksisterer.</string> <string name="share_link_file_error">Det skjedde en feil under deling av denne filen eller mappen</string> <string name="unshare_link_file_no_exist">Kan ikke fjerne deling. Sjekk om filen eksisterer.</string> @@ -378,56 +313,32 @@ <string name="copy_link">Kopier lenke</string> <string name="clipboard_text_copied">Kopiert til utklippstavlen</string> - <string name="clipboard_no_text_to_copy">Ingen tekst ble mottatt for kopi til utklippstavlen</string> <string name="clipboard_uxexpected_error">Uventet feil ved kopiering til utklippstavle</string> <string name="clipboard_label">Teksten ble kopiert fra %1$s</string> - <string name="error_cant_bind_to_operations_service">Kritisk feil: Kan ikke utføre operasjonene</string> - - <string name="network_error_socket_exception">En feil oppstod ved oppretting av forbindelse til tjeneren.</string> - <string name="network_error_socket_timeout_exception">En feil oppstod ved venting på svar fra tjeneren. Operasjonen kunne ikke utføres</string> - <string name="network_error_connect_timeout_exception">En feil oppstod ved venting på svar fra tjeneren. Operasjonen kunne ikke utføres</string> - <string name="network_host_not_available">Operasjonen kunne ikke fullføres. Tjeneren er utilgjengelig</string> - <string name="forbidden_permissions">Du har ikke tillatelse til %s</string> <string name="forbidden_permissions_rename">å gi denne filen nytt navn</string> <string name="forbidden_permissions_delete">å slette denne filen</string> <string name="share_link_forbidden_permissions">å dele denne filen</string> <string name="unshare_link_forbidden_permissions">å avslutte deling av denne filen</string> <string name="update_link_forbidden_permissions">å oppdatere denne delingen</string> - <string name="forbidden_permissions_create">å opprette filen</string> - <string name="uploader_upload_forbidden_permissions">å laste opp i denne mappen</string> <string name="downloader_download_file_not_found">Filen finnes ikke på tjeneren lenger</string> <string name="file_migration_dialog_title">Oppdaterer sti for lagring</string> <string name="file_migration_finish_button">Fullfør</string> - <string name="file_migration_preparing">Forebereder migrering…</string> <string name="file_migration_checking_destination">Sjekker mål…</string> - <string name="file_migration_saving_accounts_configuration">Lagrer kontokonfigurasjon…</string> - <string name="file_migration_waiting_for_unfinished_sync">Venter på uferdig synkronisering…</string> <string name="file_migration_migrating">Flytter data…</string> <string name="file_migration_updating_index">Oppdaterer index…</string> <string name="file_migration_cleaning">Rydder…</string> - <string name="file_migration_restoring_accounts_configuration">Gjenoppretter kontokonfigurasjon…</string> <string name="file_migration_ok_finished">Fullført</string> - <string name="file_migration_failed_not_enough_space">FEIL: Ikke nok plass</string> - <string name="file_migration_failed_not_writable">FEIL: Filen er skrivebeskyttet</string> - <string name="file_migration_failed_not_readable">FEIL: er ikke lesbar</string> <string name="file_migration_failed_dir_already_exists">FEIL: Nextcloudmappen finnes allerede</string> - <string name="file_migration_failed_while_coping">FEIL: Under migrering</string> - <string name="file_migration_failed_while_updating_index">FEIL: Under oppdatering av indeks</string> - - <string name="file_migration_directory_already_exists">Datamappe finnes fra før, hva skal gjøres?</string> - <string name="file_migration_override_data_folder">Overstyr</string> - <string name="file_migration_use_data_folder">Bruk eksisterende</string> + <string name="file_migration_override_data_folder">Erstatt</string> + <string name="file_migration_use_data_folder">Bruk</string> <string name="prefs_category_accounts">Kontoer</string> <string name="prefs_add_account">Legg til en konto</string> <string name="drawer_manage_accounts">Håndter kontoer</string> - <string name="auth_redirect_non_secure_connection_title">Sikker tilkobling videresendes gjennom en usikker rute.</string> - - <string name="actionbar_logger">Logger</string> + <string name="actionbar_logger">Logger</string> <string name="log_send_history_button">Send historikk </string> - <string name="log_send_no_mail_app">Fant inget program til forsendelse av logger. Installer e-post-program.</string> <string name="log_send_mail_subject">%1$s Android applikasjons-logger</string> <string name="log_progress_dialog_text">Laster data …</string> @@ -435,27 +346,20 @@ <string name="saml_authentication_wrong_pass">Feil passord</string> <string name="actionbar_move">Flytt</string> <string name="actionbar_copy">Kopier</string> - <string name="file_list_empty_moving">Ingenting her. Du kan legge til en mappe!</string> <string name="folder_picker_choose_button_text">Velg</string> - <string name="move_file_not_found">Kan ikke flytte. Sjekk om filen eksisterer.</string> - <string name="move_file_invalid_into_descendent">Det er ikke mulig å flytte en mappe inn i sin egen undermappe</string> - <string name="move_file_invalid_overwrite">Filen finnes allerede i målmappen</string> <string name="move_file_error">En feil oppstod ved flytting av denne filen eller mappen</string> <string name="forbidden_permissions_move">å flytte denne filen</string> <string name="copy_file_not_found">Kan ikke kopiere. Sjekk om filen eksisterer</string> - <string name="copy_file_invalid_into_descendent">Det er ikke mulig å kopiere en mappe inn i sin egen undermappe</string> - <string name="copy_file_invalid_overwrite">Filen finnes allerede i målmappen</string> <string name="copy_file_error">En feil oppstod ved kopiering av denne filen eller mappen</string> <string name="forbidden_permissions_copy">å kopiere denne filen</string> <string name="prefs_category_instant_uploading">Umiddelbare opplastinger</string> <string name="prefs_category_details">Detaljer</string> - <string name="prefs_instant_video_upload_path_title">Mappe for umiddelbar opplasting av filmer</string> - <string name="sync_folder_failed_content">Synkronisering av %1$s mappe kunne ikke fullføres</string> + <string name="sync_folder_failed_content">Synkronisering av %1$s mappe kunne ikke fullføres</string> <string name="shared_subject_header">delt</string> <string name="with_you_subject_header">med deg</string> @@ -496,7 +400,6 @@ <string name="share_add_user_or_group">Legg til bruker eller gruppe</string> <string name="share_via_link_section_title">Del lenke</string> <string name="share_via_link_expiration_date_label">Sett utløpsdato</string> - <string name="share_via_link_password_label">Passordbeskyttet</string> <string name="share_via_link_password_title">Sikret</string> <string name="share_via_link_edit_permission_label">Tillat redigering</string> <string name="share_via_link_hide_file_listing_permission_label">Skjul filliste</string> @@ -512,7 +415,6 @@ <string name="share_email_clarification">%1$s (e-post)</string> <string name="share_known_remote_clarification">%1$s ( hos %2$s )</string> - <string name="share_sharee_unavailable">Beklager, tjenerversjonen din tillater ikke klienter å dele med brukere. \nKontakt systemadministratoren</string> <string name="share_privilege_can_share">kan dele</string> <string name="share_privilege_can_edit">kan endre</string> <string name="share_privilege_can_edit_create">opprette</string> @@ -521,50 +423,35 @@ <string name="edit_share_unshare">Avslutt deling</string> <string name="edit_share_done">ferdig</string> - <string name="action_retry_uploads">Forsøkte igjen, feilet.</string> + <string name="action_retry_uploads">Nytt forsøk mislyktes</string> <string name="action_clear_failed_uploads">Sletting feilet</string> - <string name="action_clear_successful_uploads">Sletting vellykket</string> - <string name="action_clear_finished_uploads">Slett alle ferdige</string> - <string name="action_switch_grid_view">Rutenett-visning</string> <string name="action_switch_list_view">Listevisning</string> <string name="manage_space_title">Håndter plass</string> - <string name="manage_space_description">Innstillinger, database og tjenersertifikater fra %1$s\'s filer vil bli slettet. \n\nNedlastede filer blir urørt.\n\nDette kan ta noe tid.</string> <string name="manage_space_clear_data">Nullstill data</string> <string name="manage_space_error">Noen filer kunne ikke fjernes.</string> - <string name="permission_storage_access">Flere tillatelser trengs for å laste opp & ned filer.</string> - <string name="local_file_not_found_toast">Filen ble ikke funnet i lokalt filsystem</string> <string name="confirmation_remove_files_alert">Vil du virkelig fjerne de valgte elementene?</string> <string name="confirmation_remove_folders_alert">Vil du virkelig fjerne de valgte elementene og dets innhold?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Venter på lading av enhet.</string> <string name="actionbar_search">Søk</string> <string name="files_drop_not_supported">Dette er en Nextcloud funksjon, vennligst oppdater.</string> <string name="learn_more">Lær mer</string> <string name="drawer_folder_sync">Auto-opplasting</string> <string name="drawer_participate">Delta</string> - <string name="participate_testing_headline">Hjelp oss å teste</string> - <string name="participate_testing_bug_text">Funnet en feil? Føles noe rart?</string> <string name="participate_testing_report_text">Meld en feil på Github</string> - <string name="participate_testing_version_text">Er du interessert i å hjelpe oss å teste ned neste versjonen?</string> <string name="participate_beta_headline">Test utvikler-versjonen</string> - <string name="participate_beta_text">Dette inkluderer alle kommende funksjoner og er helt på kanten. Feil/feilmeldinger kan oppstå og i sådant fall, meld fra om dem til oss.</string> <string name="participate_release_candidate_headline">Release candidate</string> - <string name="participate_release_candidate_text">Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid.</string> <string name="participate_contribute_headline">Bidra aktivt</string> <string name="participate_contribute_irc_text">Delta i chat på IRC: <a href="%1$s">#nextcloud-mobile</a> </string> <string name="participate_contribute_forum_text">Hjelp andre på <a href="%1$s">forumet</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Oversette</a> app\'en</string> - <string name="participate_contribute_github_text">Bidra som en utvikler, se <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for detaljer</string> <string name="move_to">Flytt til…</string> <string name="copy_to">Kopier til…</string> <string name="choose_remote_folder">Velg mappe…</string> <string name="folder_sync_loading_folders">Laster inn mapper…</string> <string name="folder_sync_no_results">Ingen mediamapper funnet.</string> - <string name="folder_sync_preferences">Innstillinger for auto-opplasting</string> <string name="folder_sync_settings">Innstillinger</string> - <string name="folder_sync_new_info">Umiddelbar opplasting er fullstendig omarbeidet. Se hovedmenyen og konfigurer auto-opplasting på nytt. Beklager uleiligheten.\n\nTa i bruk de nye og utvidede mulighetene i auto-opplasting.</string> <string name="folder_sync_preferences_folder_path">For %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d valgt</item> @@ -578,7 +465,6 @@ <string name="notifications_no_results_headline">Ingen varsler</string> <string name="notifications_no_results_message">Kom innom senere og ta en titt.</string> - <string name="upload_file_dialog_title">Legg inn filnavn og -type for opplasting</string> <string name="upload_file_dialog_filename">Filnavn</string> <string name="upload_file_dialog_filetype">Filtype</string> <string name="upload_file_dialog_filetype_snippet_text">Textfil-snutt(.txt)</string> @@ -594,8 +480,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Et trygt hjem for alle dine data</string> - <string name="welcome_feature_1_text">Benytt, del & beskytt filene dine hjemme og i din bedrift</string> - <string name="welcome_feature_2_title">Multi-konto</string> <string name="welcome_feature_2_text">Foren alle skyene dine</string> @@ -619,23 +503,18 @@ <!-- Activities --> <string name="activities_no_results_headline">Ingen aktivitet enda</string> - <string name="activities_no_results_message">Denne strømmen vil vise hendelser som\nf.eks. innlegging, endring og deling</string> <string name="webview_error">Feil oppstod</string> <string name="prefs_category_about">Om</string> - <string name="actionbar_contacts">Sikkerhetskopiering av kontakter</string> - <string name="contacts_backup_button">Sikkerhetskopier nå</string> + <string name="contacts_backup_button">Nå</string> <string name="contacts_restore_button">Gjenopprett fra siste sikkerhetskopiering</string> <string name="contacts_header_restore">Gjenopprett</string> <string name="contacts_header_backup">Sikkerhetskopier</string> <string name="contacts_automatic_backup">Sikkerhetskopi av kontakter</string> <string name="contacts_last_backup">Siste sikkerhetskopi</string> - <string name="contacts_read_permission">Lesetilgang til kontaktliste trengs</string> - <string name="contacts_write_permission">Skrivetilgang til kontaktliste trengs</string> <string name="contactlist_title">Gjenopprett kontakter</string> <string name="contaclist_restore_selected">Gjenopprett valgte kontakter</string> - <string name="contactlist_account_chooser_title">Velg konto for import</string> - <string name="contactlist_no_permission">Ingen tilgang, ingenting importert!</string> + <string name="contactlist_account_chooser_title">Velg konto å importere</string> <string name="contacts_preference_choose_date">Velg dato</string> <string name="contacts_preference_backup_never">aldri</string> <string name="contacts_preferences_no_file_found">Ingen fil funnet</string> @@ -644,6 +523,4 @@ <!-- Notifications --> <string name="new_notification_received">Nytt varsel mottatt</string> - - -</resources> + </resources> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 3b464afda1..f2d7de2e20 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -47,9 +47,9 @@ <string name="prefs_fingerprint_notsetup">Nenhuma impressão digital foi configurada.</string> <string name="prefs_show_hidden_files">Mostrar arquivos ocultos</string> <string name="prefs_instant_upload">Envio automático de imagens</string> - <string name="prefs_instant_upload_summary">Envia automaticamente as fotos tiradas com a câmera</string> - <string name="prefs_instant_video_upload">Envio automático de vídeos</string> - <string name="prefs_instant_video_upload_summary">Envia automaticamente os vídeos feitos com a câmera</string> + <string name="prefs_instant_upload_summary">Enviar automaticamente as imagens tiradas pela câmera</string> + <string name="prefs_instant_video_upload">Envio automático de vídeos.</string> + <string name="prefs_instant_video_upload_summary">Enviar automaticamente os vídeos gravados pela câmera</string> <string name="prefs_log_title">Habilitar login</string> <string name="prefs_log_summary">Usado para registrar problemas</string> <string name="prefs_log_title_history">Histórico de logins</string> @@ -58,23 +58,23 @@ <string name="prefs_calendar_contacts">Configurar a sincronização do calendário e dos contatos</string> <string name="prefs_calendar_contacts_summary">Configurar o DAVdroid (v1.3.0+) para a conta em uso</string> <string name="prefs_calendar_contacts_address_resolve_error">O endereço do servidor da conta não pôde ser reconhecido pelo DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">Não há um aplicativo F-Droid ou Google Play instalado</string> - <string name="prefs_calendar_contacts_sync_setup_successful">A sincronização do calendário e dos contatos foi configurada com sucesso</string> + <string name="prefs_calendar_contacts_no_store_error">Nem F-droid nem Google Play estão instalados</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Configuração da sincronização de calendário & contatos</string> <string name="prefs_help">Ajuda</string> <string name="prefs_recommend">Recomendar a um amigo</string> <string name="prefs_feedback">Feedback</string> <string name="prefs_imprint">Imprimir</string> - <string name="prefs_remember_last_share_location">Lembrar o local de compartilhamento</string> - <string name="prefs_remember_last_upload_location_summary">Lembrar o último local de envio de compartilhamento</string> + <string name="prefs_remember_last_share_location">Lembrar localização do compartilhamento</string> + <string name="prefs_remember_last_upload_location_summary">Lembrar localização do compartilhamento usado mais recentemente</string> <string name="recommend_subject">Tentar %1$s em seu smartfone!</string> - <string name="recommend_text">Gostaria de convidá-lo a usar %1$s em seu smartphone!\nBaixe aqui: %2$s</string> + <string name="recommend_text">Quero convidar você a usar %1$s em seu smartphone.\nBaixe daqui: %2$s</string> <string name="auth_check_server">Verificar servidor</string> <string name="auth_host_url">Endereço do servidor https://...</string> <string name="auth_username">Nome de usuário</string> <string name="auth_password">Senha</string> - <string name="auth_register">Ainda não tem um servidor?\nClique aqui para obter um de um fornecedor</string> + <string name="auth_register">Você não tem um servidor ainda?\nClique aqui para obter um de um provedor</string> <string name="sync_string_files">Arquivos</string> <string name="setup_btn_connect">Conectar</string> <string name="uploader_btn_upload_text">Enviar</string> @@ -86,22 +86,22 @@ <string name="uploader_error_title_no_file_to_upload">Nenhum arquivo para envio</string> <string name="uploader_error_message_received_piece_of_text">%1$s não pôde enviar um pedaço de texto como um arquivo.</string> <string name="uploader_error_message_no_file_to_upload">Os dados recebidos não incluem um arquivo válido.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">O arquivo não pôde ser enviado</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Este arquivo não pôde ser enviado</string> <string name="uploader_error_message_read_permission_not_granted">%1$s não tem permissão para ler um arquivo recebido</string> - <string name="uploader_error_message_source_file_not_found">Arquivo para envio não foi encontrado em sua localização. Verifique se o arquivo existe.</string> - <string name="uploader_error_message_source_file_not_copied">Ocorreu um erro ao copiar o arquivo para uma pasta temporária. Por favor, tente enviar novamente.</string> + <string name="uploader_error_message_source_file_not_found">O arquivo selectionado para envio não foi encontrado. Verifique se ele existe.</string> + <string name="uploader_error_message_source_file_not_copied">Não foi possível copiar o arquivo para uma pasta temporária. Tente reenviá-lo.</string> <string name="uploader_upload_files_behaviour">Opção de envio:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Mover o arquivo para a pasta do Nextcoud</string> <string name="uploader_upload_files_behaviour_only_upload">Manter o arquivo na pasta de origem</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Excluir o arquivo da pasta de origem</string> <string name="file_list_seconds_ago">segundos atrás</string> <string name="file_list_empty_headline">Nenhum arquivo aqui</string> - <string name="file_list_empty">Faça o envio de conteúdo ou sincronize com seus dispositivos!</string> - <string name="file_list_empty_favorites">Favorite alguns arquivos ou sincronize com seus dispositivos!</string> - <string name="file_list_empty_favorites_filter_list">Arquivos e pastas que você favoritar serão mostrados aqui</string> - <string name="file_list_empty_favorites_filter">Nenhum arquivos favorito encontrado em sua pesquisa!</string> + <string name="file_list_empty">Enviar um conteúdo ou sincronizar com seus dispositivos.</string> + <string name="file_list_empty_favorites">Favoritar algum arquivo ou sincronizar com seus dispositivos.</string> + <string name="file_list_empty_favorites_filter_list">Arquivos e pastas favoritas serão mostradas aqui</string> + <string name="file_list_empty_favorites_filter">Sua pesquisa não retornou nenhum arquivo favorito.</string> <string name="file_list_loading">Carregando…</string> - <string name="file_list_no_app_for_file_type">Nenhum aplicativo encontrado para esse tipo de arquivo!</string> + <string name="file_list_no_app_for_file_type">Nenhuma aplicação definida para manipular este tipo de arquivo.</string> <string name="local_file_list_empty">Não existe nenhum arquivo nesta pasta.</string> <string name="file_list_empty_headline_search">Nenhum resultado nesta pasta</string> <string name="file_list_empty_headline_server_search">Sem resultados</string> @@ -110,19 +110,19 @@ <string name="file_list_empty_shared">Arquivos e pastas que você compartilhar serão mostrados aqui</string> <string name="file_list_empty_headline_server_search_videos"> Sem vídeos</string> <string name="file_list_empty_headline_server_search_photos">Sem fotos</string> - <string name="file_list_empty_search">Tentar encontrar em outra pasta?</string> - <string name="file_list_empty_recently_modified">Nenhum arquivo modificado nos últimos 7 dias</string> - <string name="file_list_empty_recently_modified_filter">Nenhum arquivo modificado nos últimos 7 dias -foram encontrados para sua pesquisa! </string> - <string name="file_list_empty_recently_added">Nenhum arquivo recentemente adicionado foi encontrado!</string> - <string name="file_list_empty_recently_added_filter">Nenhum arquivo recentemente adicionado foi encontrado para sua pesquisa!</string> - <string name="file_list_empty_text_photos">Envie algumas fotos ou ative o envio automático!</string> - <string name="file_list_empty_text_photos_filter">Nenhuma foto foi encontrada para sua pesquisa!</string> - <string name="file_list_empty_text_videos">Envie alguns vídeos ou ative o envio automático!</string> - <string name="file_list_empty_text_videos_filter">Nenhum vídeo encontrado para sua pesquisa!</string> + <string name="file_list_empty_search">Talvez seja uma pasta diferente?</string> + <string name="file_list_empty_recently_modified">Nenhum arquivo alterado nos últimos 7 dias foi encontrado </string> + <string name="file_list_empty_recently_modified_filter">Sua pesquisa não encontrou arquivos alterados + nos últimos 7 dias.</string> + <string name="file_list_empty_recently_added">Nenhum arquivo recente foi adicionado</string> + <string name="file_list_empty_recently_added_filter">Sua pesquisa não encontrou arquivos adicionados recentemente.</string> + <string name="file_list_empty_text_photos">Enviar algumas fotos ou ativar o envio automático.</string> + <string name="file_list_empty_text_photos_filter">Sua pesquisa não encontrou fotos.</string> + <string name="file_list_empty_text_videos">Enviar alguns vídeos ou ativar o envio automático.</string> + <string name="file_list_empty_text_videos_filter">Sua pesquisa não encontrou vídeos.</string> <string name="upload_list_empty_headline">Nenhum envio disponível</string> - <string name="upload_list_empty_text">Envie algum conteúdo ou ative o envio automático!</string> - <string name="upload_list_empty_text_auto_upload">Envie algum conteúdo ou ative o envio automático!</string> + <string name="upload_list_empty_text">Enviar algum conteúdo ou ativar o envio automático.</string> + <string name="upload_list_empty_text_auto_upload">Enviar algum conteúdo ou ativar o envio automático.</string> <string name="file_list_folder">pasta</string> <string name="file_list_folders">pastas</string> <string name="file_list_file">arquivo</string> @@ -135,13 +135,13 @@ foram encontrados para sua pesquisa! </string> <string name="filedetails_download">Baixar</string> <string name="filedetails_sync_file">Sincronizar</string> <string name="filedetails_renamed_in_upload_msg">Arquivo renomeado para %1$s durante o envio</string> - <string name="list_layout">Layout da lista</string> + <string name="list_layout">Layout listado</string> <string name="action_share">Compartilhar</string> <string name="common_yes">Sim</string> <string name="common_no">Não</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Excluir arquivo enviado</string> - <string name="common_retry_upload">Tentar enviar de novo</string> + <string name="common_retry_upload">Retentar o envio</string> <string name="common_cancel_sync">Cancelar sincronização</string> <string name="common_cancel">Cancelar</string> <string name="common_back">Voltar</string> @@ -161,10 +161,10 @@ foram encontrados para sua pesquisa! </string> <string name="uploader_info_dirname">Nome da pasta</string> <string name="uploader_upload_in_progress_ticker">Enviando …</string> <string name="uploader_upload_in_progress_content">%1$d%% enviando %2$s</string> - <string name="uploader_upload_succeeded_ticker">Envio bem sucedido</string> + <string name="uploader_upload_succeeded_ticker">Enviado</string> <string name="uploader_upload_succeeded_content_single">%1$s enviado</string> <string name="uploader_upload_failed_ticker">Falha no envio</string> - <string name="uploader_upload_failed_content_single">O envio de %1$s não pôde ser finalizado</string> + <string name="uploader_upload_failed_content_single">Não foi possível enviar %1$s</string> <string name="uploader_upload_failed_credentials_error">Falha no envio, você precisa reautenticar-se</string> <string name="uploads_view_title">Envios</string> <string name="uploads_view_group_current_uploads">Atual</string> @@ -181,37 +181,37 @@ foram encontrados para sua pesquisa! </string> <string name="uploads_view_upload_status_failed_localfile_error">Arquivo local não encontrado</string> <string name="uploads_view_upload_status_failed_permission_error">Erro de permissão</string> <string name="uploads_view_upload_status_conflict">Conflito</string> - <string name="uploads_view_upload_status_service_interrupted">Aplicativo foi encerrado</string> + <string name="uploads_view_upload_status_service_interrupted">Aplicativo finalizado</string> <string name="uploads_view_upload_status_unknown_fail">Erro desconhecido</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Aguardando conexão wi-fi</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Esperando por conectividade Wi-Fi</string> <string name="uploads_view_later_waiting_to_upload">Aguardando para enviar</string> <string name="downloader_download_in_progress_ticker">Baixando …</string> <string name="downloader_download_in_progress_content">%1$d%% Baixando %2$s</string> - <string name="downloader_download_succeeded_ticker">Download realizado com sucesso</string> + <string name="downloader_download_succeeded_ticker">Baixado</string> <string name="downloader_download_succeeded_content">%1$s baixado</string> <string name="downloader_download_failed_ticker">Download falhou</string> - <string name="downloader_download_failed_content">Download de %1$s não pôde ser concluído</string> + <string name="downloader_download_failed_content">Não foi possível baixar %1$s</string> <string name="downloader_not_downloaded_yet">Ainda não baixado</string> <string name="downloader_download_failed_credentials_error">Falha em baixar o arquivo, você precisa reautenticar-se</string> <string name="common_choose_account">Escolha a conta</string> <string name="sync_fail_ticker">Falha na sincronização</string> - <string name="sync_fail_ticker_unauthorized">Falha na sincronização, você precisa se logar novamente</string> - <string name="sync_fail_content">A sincronização de %1$s não pôde ser finalizada</string> - <string name="sync_fail_content_unauthorized">Senha inválida para %1$s</string> + <string name="sync_fail_ticker_unauthorized">A sincronização falhou. Você precisa reautenticar-se</string> + <string name="sync_fail_content">Não foi possível sincronizar %1$s</string> + <string name="sync_fail_content_unauthorized">Senha errada para %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Conflitos encontrados</string> <string name="sync_conflicts_in_favourites_content">%1$d arquivos \"manter sincronizados\" não puderam ser sincronizados</string> <string name="sync_fail_in_favourites_ticker">Falha ao manter arquivos sincronizados</string> <string name="sync_fail_in_favourites_content">O conteúdo de %1$d arquivos não puderam ser sincronizados (%2$d conflitos)</string> <string name="sync_foreign_files_forgotten_ticker">Alguns arquivos locais foram esquecidos</string> <string name="sync_foreign_files_forgotten_content">%1$d arquivos de %2$s não puderam ser copiados para a pasta</string> - <string name="sync_foreign_files_forgotten_explanation">A partir da versão 1.3.16, os arquivos enviados a partir deste aparelho são copiados para a pasta local %1$s para evitar a perda de dados quando um único arquivo é sincronizado com várias contas. \n\nDevido a essa mudança, todos os arquivos enviados em versões anteriores deste aplicativo foram copiados para a pasta %2$s . No entanto, um erro impediu a conclusão dessa operação durante a sincronização da conta. Você pode tanto deixar os arquivos como estão e remover o link para %3$s, ou mover os arquivo(s) para a pasta %1$s e manter o link para %4$s. \n\nListados abaixo são os arquivo(s) locais, e os arquivo(s) remoto(s) em %5$s que estavam vinculados.</string> - <string name="sync_current_folder_was_removed">Pasta %1s não existe mais</string> + <string name="sync_foreign_files_forgotten_explanation">A partir da versão 1.3.16, os arquivos enviados deste dispositivo serão copiados para a pasta local %1$s para evitar a perda de dados quando um único arquivo é sincronizado em várias contas.\n\nDevido à esta alteração, todos os arquivos enviados com versões anteriores deste aplicativo foram copiados para a pasta %2$s No entanto, um erro impediu a conclusão desta operação durante a sincronização da conta. Você pode deixar o (s) arquivo (s) como está e remover o link para %3$s ou mover os arquivos para a pasta %1$s e manter o link para %4$s.\n\nListados abaixo estão os arquivos locais e os arquivos remotos em %5$s taos quais eles foram vinculados.</string> + <string name="sync_current_folder_was_removed">A pasta %1$s não existe mais</string> <string name="foreign_files_move">Mover todos</string> <string name="foreign_files_success">Todos os arquivos foram movidos</string> <string name="foreign_files_fail">Alguns arquivos não puderam ser movidos</string> <string name="foreign_files_local_text">Local: %1$s</string> <string name="foreign_files_remote_text">Remoto: %1$s</string> - <string name="upload_query_move_foreign_files">Não há espaço suficiente para copiar os arquivos selecionados para a pasta %1$s. Gostaria de movê-los em vez disso?</string> + <string name="upload_query_move_foreign_files">O espaço insuficiente está impedindo a cópia dos arquivos selecionados para a pasta %1$s. Ao invés de copiá-los , gostaria de movê-los para lá?</string> <string name="pass_code_enter_pass_code">Digite sua senha</string> <string name="pass_code_configure_your_pass_code">Digite o código de acesso</string> @@ -229,16 +229,16 @@ foram encontrados para sua pesquisa! </string> <string name="media_event_done">%1$s reprodução finalizada</string> <string name="media_err_nothing_to_play">Nenhum arquivo de mídia encontrado</string> <string name="media_err_no_account">Nenhuma conta fornecida</string> - <string name="media_err_not_in_owncloud">O arquivo não está em uma conta válida</string> + <string name="media_err_not_in_owncloud">O arquivo não é uma conta válida</string> <string name="media_err_unsupported">O codec de mídia não é suportado</string> - <string name="media_err_io">O arquivo de mídia não pode ser lido</string> - <string name="media_err_malformed">O arquivo de mídia não está corretamente codificado</string> - <string name="media_err_timeout">Expirou o tempo durante a tentativa de reproduzir</string> - <string name="media_err_invalid_progressive_playback">O arquivo de mídia não pode ser transmitido</string> - <string name="media_err_unknown">O arquivo de mídia não pode ser reproduzido com o stock media player</string> - <string name="media_err_security_ex">Erro de segurança tentando reproduzir %1$s</string> + <string name="media_err_io">Não foi possível ler o arquivo de mídia</string> + <string name="media_err_malformed">O arquivo de mídia tem uma codificação incorreta</string> + <string name="media_err_timeout">Tempo esgotado tentando reproduzir o arquivo</string> + <string name="media_err_invalid_progressive_playback">O arquivo de mídia não pode ser enviado via streaming</string> + <string name="media_err_unknown">O reprodutor de mídia não consegue reproduzir o arquivo de mídia</string> + <string name="media_err_security_ex">Errro de segurança enquanto se tentava reproduzir %1$s</string> <string name="media_err_io_ex">Erro de entrada tentando reproduzir %1$s</string> - <string name="media_err_unexpected">Erro inesperado tentando reproduzir %1$s</string> + <string name="media_err_unexpected">Erro inesperado euquanto se tentava reproduzir %1$s</string> <string name="media_rewind_description">Botão rebobinar</string> <string name="media_play_pause_description">Botão reproduzir ou pausar</string> <string name="media_forward_description">Botão de avanço rápido</string> @@ -250,31 +250,31 @@ foram encontrados para sua pesquisa! </string> <string name="auth_connection_established">Conexão estabelecida</string> <string name="auth_testing_connection">Testando conexão...</string> <string name="auth_not_configured_title">Configuração do servidor inválida</string> - <string name="auth_account_not_new">Já existe no dispositivo uma conta para o mesmo usuário e servidor</string> + <string name="auth_account_not_new">Uma conta para o mesmo usuário e servidor já existe no dispositivo</string> <string name="auth_account_not_the_same">As informações que o usuário digitou não correspondem ao usuário da conta</string> <string name="auth_unknown_error_title">Ocorreu um erro desconhecido!</string> <string name="auth_unknown_host_title">Não foi possível encontrar o host</string> - <string name="auth_incorrect_path_title">Instância de servidor não encontrada</string> + <string name="auth_incorrect_path_title">Servidor não encontrado</string> <string name="auth_timeout_title">O servidor demorou demais a responder</string> - <string name="auth_incorrect_address_title">Formato de endereço de servidor errado</string> + <string name="auth_incorrect_address_title">O formato de endereço do servidor está errado</string> <string name="auth_ssl_general_error_title">Inicialização SSL falhou</string> <string name="auth_ssl_unverified_server_title">Não foi possível verificar a identidade do servidor SSL</string> <string name="auth_bad_oc_version_title">Versão do servidor desconhecida</string> - <string name="auth_wrong_connection_title">Não foi possível estabelecer conexão</string> + <string name="auth_wrong_connection_title">Não foi possível estabelecer a conexão</string> <string name="auth_secure_connection">Conexão segura estabelecida</string> <string name="auth_unauthorized">Nome de usuário ou senha errado</string> <string name="auth_oauth_error">Autorização sem sucesso</string> <string name="auth_oauth_error_access_denied">Acesso negado pelo servidor de autorização</string> - <string name="auth_wtf_reenter_URL">Estado inesperado. Insira o endereço do servidor novamente</string> + <string name="auth_wtf_reenter_URL">Estado inesperado. Entre o endereço do servidor novamente</string> <string name="auth_expired_oauth_token_toast">Sua autorização expirou. Por favor, autorize novamente</string> <string name="auth_expired_basic_auth_toast">Por favor, digite a senha atual</string> <string name="auth_expired_saml_sso_token_toast">Sua sessão expirou. Por favor, conecte-se novamente</string> <string name="auth_connecting_auth_server">Conectando ao servidor de autenticação...</string> <string name="auth_unsupported_auth_method">O servidor não suporta este método de autenticação</string> <string name="auth_unsupported_multiaccount">%1$s não suporta múltiplas contas</string> - <string name="auth_fail_get_user_name">Seu servidor não está retornando um id de usuário correto. Por favor, entre em contato com um administrador</string> + <string name="auth_fail_get_user_name">Seu servidor não está retornando um ID correto de usuário. Por favor, contacte o administrador</string> <string name="auth_can_not_auth_against_server">Não é possível obter autenticação neste servidor</string> - <string name="auth_account_does_not_exist">Conta ainda não existe no dispositivo</string> + <string name="auth_account_does_not_exist">A conta ainda não existe no dispositivo</string> <string name="favorite">Definir como disponível offline</string> <string name="unfavorite">Definir como não disponível offline</string> @@ -283,28 +283,28 @@ foram encontrados para sua pesquisa! </string> <string name="common_rename">Renomear</string> <string name="common_remove">Excluir</string> <string name="confirmation_remove_file_alert">Deseja realmente excluir %1$s?</string> - <string name="confirmation_remove_folder_alert">Você deseja realmente excluir %1$s e seu conteúdo?</string> + <string name="confirmation_remove_folder_alert">Quer realmente excluir %1$s de seu conteúdo?</string> <string name="confirmation_remove_local">Somente local</string> - <string name="remove_success_msg">Excluído com sucesso</string> + <string name="remove_success_msg">Excluído</string> <string name="remove_fail_msg">Erro ao excluir</string> <string name="rename_dialog_title">Digite um novo nome</string> - <string name="rename_local_fail_msg">Cópia local não pôde ser renomeada. Tente outro nome</string> - <string name="rename_server_fail_msg">Renomeação não pôde ser finalizada</string> - <string name="sync_file_fail_msg">Arquivo remoto não pôde ser verificado</string> + <string name="rename_local_fail_msg">A cópia local não pôde ser renomeada. Tente um nome diferente</string> + <string name="rename_server_fail_msg">Não foi possível dar um nome novo ao servidor</string> + <string name="sync_file_fail_msg">Não foi possível verificar o arquivo remoto</string> <string name="sync_file_nothing_to_do_msg">Conteúdo do arquivo já foi sincronizado</string> - <string name="create_dir_fail_msg">A pasta não pôde ser criada</string> + <string name="create_dir_fail_msg">Não foi possível criar a pasta</string> <string name="filename_forbidden_characters">Caracteres proibidos: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">O nome do arquivo contém pelo menos um caractere inválido </string> <string name="filename_empty">O nome do arquivo não pode estar vazio</string> - <string name="wait_a_moment">Aguarde um momento</string> + <string name="wait_a_moment">Aguarde um momento...</string> <string name="wait_checking_credentials">Verificando credenciais salvas</string> - <string name="filedisplay_unexpected_bad_get_content">Problema inesperado. Por favor, tente selecionar o arquivo com outro aplicativo</string> - <string name="filedisplay_no_file_selected">Nenhum arquivo foi selecionado</string> + <string name="filedisplay_unexpected_bad_get_content">Problema inesperado. Por favor selecione o arquivo de um diferente aplicativo</string> + <string name="filedisplay_no_file_selected">Nenhum arquivo selecionado</string> <string name="activity_chooser_title">Enviar o link para …</string> <string name="wait_for_tmp_copy_from_private_storage">Copiando o arquivo da armazenagem privada</string> <string name="oauth_check_onoff">Login com oAuth2</string> - <string name="oauth_login_connection">Conectando-se a oAuth2 servidor...</string> + <string name="oauth_login_connection">Conectando ao servidor OAuth 2...</string> <string name="ssl_validator_header">A identidade do site não pôde ser verificada</string> <string name="ssl_validator_reason_cert_not_trusted">- O certificado do servidor não é confiável</string> @@ -312,7 +312,7 @@ foram encontrados para sua pesquisa! </string> <string name="ssl_validator_reason_cert_not_yet_valid">- A data de expiração do certificado do servidor está no futuro</string> <string name="ssl_validator_reason_hostname_not_verified">- A URL do host não confere com o host do certificado</string> <string name="ssl_validator_question">Você confia nesse certificado mesmo assim?</string> - <string name="ssl_validator_not_saved">O certificado não pôde ser salvo</string> + <string name="ssl_validator_not_saved">Não foi possível salvar o certificado</string> <string name="ssl_validator_btn_details_see">Detalhes</string> <string name="ssl_validator_btn_details_hide">Ocultar</string> <string name="ssl_validator_label_subject">Emitido para:</string> @@ -341,21 +341,21 @@ foram encontrados para sua pesquisa! </string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Enviar somente via wifi</string> - <string name="instant_upload_on_wifi">Enviar fotos apenas por Wi-Fi</string> - <string name="instant_video_upload_on_wifi">Enviar vídeos apenas por Wi-Fi</string> - <string name="instant_video_upload_on_charging">Enviar apenas quando solicitado</string> - <string name="instant_upload_on_charging">Enviar apenas quando solicitado</string> + <string name="auto_upload_on_wifi">Somente enviar por Wi-Fi</string> + <string name="instant_upload_on_wifi">Somente enviar imagens por Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Somente enviar vídeos por Wi-Fi</string> + <string name="instant_video_upload_on_charging">Somente enviar quando carregando</string> + <string name="instant_upload_on_charging">Somente enviar quando carregando</string> <string name="instant_upload_path">/Upload automático</string> <string name="conflict_title">Conflito de arquivo</string> - <string name="conflict_message">Quais arquivos você deseja manter? Se você selecionar ambas as versões, o arquivo local terá um número adicionado ao seu nome.</string> + <string name="conflict_message">Quais arquivos você quer manter? Se você selecionar ambos, o arquivo local terá um número adicionado ao seu nome.</string> <string name="conflict_keep_both">Manter ambos</string> <string name="conflict_use_local_version">versão local</string> <string name="conflict_use_server_version">versão do servidor</string> - <string name="preview_sorry">Desculpe isso!</string> + <string name="preview_sorry">Desculpe.</string> <string name="preview_image_description">Pré-visualização da imagem</string> - <string name="preview_image_error_unknown_format">Imagem não pôde ser mostrada</string> + <string name="preview_image_error_unknown_format">Não foi possível mostrar a imagem</string> <string name="error__upload__local_file_not_copied">%1$s não pôde ser copiado para pasta local %2$s</string> <string name="prefs_instant_upload_path_title">Pasta de envio automático</string> @@ -364,7 +364,7 @@ foram encontrados para sua pesquisa! </string> <string name="prefs_instant_upload_path_use_subfolders_title">Usar subpastas</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Armazena em subpastas baseado no ano e mês</string> - <string name="share_link_no_support_share_api">Lamentamos, mas o compartilhamento não está ativado no servidor. Entre em contato com o administrador.</string> + <string name="share_link_no_support_share_api">O compartilhamento não está habilitado em seu servidor. Por favor, contact o administrador.</string> <string name="share_link_file_no_exist">Não é possível compartilhar. Por favor verifique se o arquivo existe</string> <string name="share_link_file_error">Ocorreu um erro durante a tentativa de compartilhar esse arquivo ou pasta</string> <string name="unshare_link_file_no_exist">Não é possível descompartilhar. Por favor verifique se o arquivo existe</string> @@ -378,16 +378,17 @@ foram encontrados para sua pesquisa! </string> <string name="copy_link">Copiar link</string> <string name="clipboard_text_copied">Copiado para área de transferência</string> - <string name="clipboard_no_text_to_copy">Nenhum texto recebido para copiar para área de transferência</string> + <string name="clipboard_no_text_to_copy">Nenhum texto foi recebido para copiar para a área de transferência</string> <string name="clipboard_uxexpected_error">Erro inesperado ao copiar para a área de transferência</string> <string name="clipboard_label">Texto copiado de %1$s</string> - <string name="error_cant_bind_to_operations_service">Erro crítico: não foi possível executar as operações</string> + <string name="error_cant_bind_to_operations_service">Erro crítico: Não foi possível executar as operações</string> + + <string name="network_error_socket_exception">Um erro ocorreu durante a conexão ao servidor.</string> + <string name="network_error_socket_timeout_exception">Um erro ocorreu quando esperava pelo servidor. Não foi possível completar a operação.</string> + <string name="network_error_connect_timeout_exception">Um erro ocorreu quando esperava pelo servidor. Não foi possível completar a operação.</string> + <string name="network_host_not_available">Não foi possível completar a operação. O servidor está indisponível</string> - <string name="network_error_socket_exception">Ocorreu um erro durante a conexão com o servidor.</string> - <string name="network_error_socket_timeout_exception">Ocorreu um erro enquanto se espera pelo servidor, a operação pode não ter sido executada</string> - <string name="network_error_connect_timeout_exception">Ocorreu um erro enquanto se espera pelo servidor, a operação pode não ter sido executada</string> - <string name="network_host_not_available">A operação não pôde ser concluída pois o servidor está indisponível</string> <string name="forbidden_permissions">Você não tem permissão %s</string> <string name="forbidden_permissions_rename">para renomear este arquivo</string> <string name="forbidden_permissions_delete">para excluir este arquivo</string> @@ -400,34 +401,34 @@ foram encontrados para sua pesquisa! </string> <string name="file_migration_dialog_title">Atualizando caminho do armazenamento</string> <string name="file_migration_finish_button">Finalizado</string> - <string name="file_migration_preparing">Preparando para migração…</string> + <string name="file_migration_preparing">Preparando migração…</string> <string name="file_migration_checking_destination">Verificando destino…</string> - <string name="file_migration_saving_accounts_configuration">Salvando configuração de contas…</string> - <string name="file_migration_waiting_for_unfinished_sync">Aguardando por sincronismo não-finalizado…</string> + <string name="file_migration_saving_accounts_configuration">Salvando configuração das contas…</string> + <string name="file_migration_waiting_for_unfinished_sync">Esperando por todas as sincronizações terminarem…</string> <string name="file_migration_migrating">Movendo dados…</string> <string name="file_migration_updating_index">Atualizando index…</string> <string name="file_migration_cleaning">Limpando…</string> - <string name="file_migration_restoring_accounts_configuration">Restaurando configurações de contas…</string> + <string name="file_migration_restoring_accounts_configuration">Restaurando a configuração das contas…</string> <string name="file_migration_ok_finished">Finalizado</string> - <string name="file_migration_failed_not_enough_space">ERRO: Espaço Insuficiente</string> - <string name="file_migration_failed_not_writable">ERRO: Arquivo não permite gravação</string> - <string name="file_migration_failed_not_readable">ERRO: Arquivo não permite leitura</string> + <string name="file_migration_failed_not_enough_space">ERRO: Espaço insuficiente</string> + <string name="file_migration_failed_not_writable">ERRO: Arquivo é somente leitura</string> + <string name="file_migration_failed_not_readable">ERRO: Arquivo não é legível</string> <string name="file_migration_failed_dir_already_exists">ERRO: Diretório Nexcloud já existe</string> - <string name="file_migration_failed_while_coping">ERRO: Durante a Migração</string> - <string name="file_migration_failed_while_updating_index">ERRO: Durante atualização de índice</string> + <string name="file_migration_failed_while_coping">ERRO: Falha durante a migração</string> + <string name="file_migration_failed_while_updating_index">ERRO: Falha ao atualizar índice</string> - <string name="file_migration_directory_already_exists">Pasta de dados já existe, o que fazer?</string> - <string name="file_migration_override_data_folder">Sobrescrever</string> - <string name="file_migration_use_data_folder">Usar a existente</string> + <string name="file_migration_directory_already_exists">Pasta Data já existe. Escolha uma das seguintes:</string> + <string name="file_migration_override_data_folder">Substituir</string> + <string name="file_migration_use_data_folder">Usar</string> <string name="prefs_category_accounts">Contas</string> <string name="prefs_add_account">Adicionar uma conta</string> <string name="drawer_manage_accounts">Gerenciar contas</string> - <string name="auth_redirect_non_secure_connection_title">A conexão segura está redirecionada através de uma rota insegura.</string> + <string name="auth_redirect_non_secure_connection_title">A conexão segura foi redirecionada através de uma rota insegura.</string> <string name="actionbar_logger">Logs</string> <string name="log_send_history_button">Enviar histórico</string> - <string name="log_send_no_mail_app">Nenhum aplicativo para envio de logs foi encontrado. Por favor, instale um aplicativo de email.</string> + <string name="log_send_no_mail_app">Nenhum aplicativo para enviar registros foi encontrado. Por favor instale um cliente de email.</string> <string name="log_send_mail_subject">%1$s logs do aplicativo Android</string> <string name="log_progress_dialog_text">Carregando dados …</string> @@ -435,26 +436,26 @@ foram encontrados para sua pesquisa! </string> <string name="saml_authentication_wrong_pass">Senha incorreta</string> <string name="actionbar_move">Mover</string> <string name="actionbar_copy">Copiar</string> - <string name="file_list_empty_moving">Nada aqui. Você pode adicionar uma pasta!</string> + <string name="file_list_empty_moving">Não há nada aqui. Você pode adicionar uma pasta.</string> <string name="folder_picker_choose_button_text">Escolher</string> - <string name="move_file_not_found">Não é possível mover. Por favor, verifique se o arquivo existe</string> - <string name="move_file_invalid_into_descendent">Não é possível mover a pasta para uma descendente</string> - <string name="move_file_invalid_overwrite">O arquivo já existe na pasta de destino</string> + <string name="move_file_not_found">Impossível mover o arquivo. Por favor verifique se ele existe.</string> + <string name="move_file_invalid_into_descendent">Não é possível mover uma pasta para uma das suas próprias pastas subjacentes</string> + <string name="move_file_invalid_overwrite">O arquivo já está presente na pasta destino</string> <string name="move_file_error">Ocorreu um erro ao tentar mover este arquivo ou pasta</string> <string name="forbidden_permissions_move">mover este arquivo</string> <string name="copy_file_not_found">Não é possível copiar. Por favor, verifique se o arquivo existe</string> - <string name="copy_file_invalid_into_descendent">Não é possível copiar uma pasta em uma descendente</string> - <string name="copy_file_invalid_overwrite">O arquivo já existe na pasta de destino</string> + <string name="copy_file_invalid_into_descendent">Não é possível copiar uma pasta para uma das suas próprias pastas subjacentes</string> + <string name="copy_file_invalid_overwrite">O arquivo já está presente na pasta destino</string> <string name="copy_file_error">Ocorreu um erro ao tentar copiar este arquivo ou pasta</string> <string name="forbidden_permissions_copy">copiar este arquivo</string> <string name="prefs_category_instant_uploading">Envio automático</string> <string name="prefs_category_details">Detalhes</string> - <string name="prefs_instant_video_upload_path_title">Pasta de envio automático de vídeos</string> + <string name="prefs_instant_video_upload_path_title">Pasta de vídeo para envios automáticos</string> <string name="sync_folder_failed_content">A sincronização da pasta %1$s não pôde ser finalizada</string> <string name="shared_subject_header">compartilhado</string> @@ -512,7 +513,7 @@ foram encontrados para sua pesquisa! </string> <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( em %2$s )</string> - <string name="share_sharee_unavailable">Lamentamos, mas a versão do seu servidor não permite compartilhar com utilizadores nos clientes.\nPor favor contacte o administrador</string> + <string name="share_sharee_unavailable">Atualize a versão do servidor para permitir compartilhamento entre usuários de dentro de seus clientes.\nPor favor, contacte o administrador</string> <string name="share_privilege_can_share">pode compartilhar</string> <string name="share_privilege_can_edit">pode editar</string> <string name="share_privilege_can_edit_create">criar</string> @@ -521,50 +522,50 @@ foram encontrados para sua pesquisa! </string> <string name="edit_share_unshare">Parar compartilhamento</string> <string name="edit_share_done">finalizado</string> - <string name="action_retry_uploads">Retentar falhou</string> + <string name="action_retry_uploads">Nova tentativa falhou</string> <string name="action_clear_failed_uploads">Limpeza falhou</string> - <string name="action_clear_successful_uploads">Limpo com sucesso</string> - <string name="action_clear_finished_uploads">Limpar tudo finalizado</string> + <string name="action_clear_successful_uploads">Limpo</string> + <string name="action_clear_finished_uploads">Limpar envios termiandos</string> <string name="action_switch_grid_view">Grade de exibição</string> <string name="action_switch_list_view">Lista de visualização</string> <string name="manage_space_title">Gerenciar o espaço</string> - <string name="manage_space_description">Definições, certificados de banco de dados e servidor de dados %1$s serão excluídos permanentemente. \n\nArquivos baixados serão mantidos inalterados. \n\nEste processo pode demorar algum tempo.</string> + <string name="manage_space_description">Configurações, banco de dados e certificados do servidor de dados de %1$s serão excluídos permanentemente.\n\nArquivos baixados serão mantidos intocados.\n\nEste processo pode levar um tempo.</string> <string name="manage_space_clear_data">Limpar dados</string> <string name="manage_space_error">Alguns arquivos não puderam ser excluídos.</string> - <string name="permission_storage_access">Permissões adicionais são necessárias para se enviar e baixar arquivos & .</string> - <string name="local_file_not_found_toast">O arquivo não foi encontrado no sistema de arquivos local</string> + <string name="permission_storage_access">Permissões adicionais são necessárias para enviar ou baixar arquivos.</string> + <string name="local_file_not_found_toast">Arquivo não encontrado no sistema de arquivos local</string> <string name="confirmation_remove_files_alert">Deseja realmente excluir os itens selecionados?</string> <string name="confirmation_remove_folders_alert">Deseja realmente excluir os itens selecionados e seus conteúdos?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Esperando o carregamento do dispositivo</string> + <string name="uploads_view_upload_status_waiting_for_charging">Esperando carregar</string> <string name="actionbar_search">Pesquisar</string> <string name="files_drop_not_supported">Este é um recurso do Nextcloud. Por favor, atualize.</string> <string name="learn_more">Saiba mais</string> <string name="drawer_folder_sync">Envio automático</string> <string name="drawer_participate">Participar</string> - <string name="participate_testing_headline">Ajude-nos a testar</string> - <string name="participate_testing_bug_text">Encontrou um erro? Algo está estranho?</string> + <string name="participate_testing_headline">Ajuda para teste</string> + <string name="participate_testing_bug_text">Encontrou um erro? Comentários?</string> <string name="participate_testing_report_text">Relate o problema no Github</string> - <string name="participate_testing_version_text">Está interessado em ajudar-nos a testar a próxima versão?</string> + <string name="participate_testing_version_text">Interessado em ajudar testando a próxima versão?</string> <string name="participate_beta_headline">Teste a versão dev</string> - <string name="participate_beta_text">Isso inclui todos os próximos recursos. Erros pode ocorrer e irão. Por favor, reporte-os a nós.</string> + <string name="participate_beta_text">Isso inclui todos os recursos futuros e está num limite perigoso. Erros podem ocorrer e acontecendo, por favor reporte-os à nós.</string> <string name="participate_release_candidate_headline">Candidato a versão</string> - <string name="participate_release_candidate_text">O candidato à versão (RC) é um instantâneo do lançamento e espera-se que seja estável. Testar a sua configuração individual pode ajudar a garantir isso. Registre-se para testar na Play Store ou procure manualmente na seção \"versões\" na F-Droid.</string> + <string name="participate_release_candidate_text">O release candidate (RC) é um instantâneo da próxima versão e espera-se que seja estável. Testar sua configuração individual pode ajudar a garantir isso. Inscreva-se para testar na Play Store ou confira a seção \"versões\" no F-Droid.</string> <string name="participate_contribute_headline">Contribuir ativamente</string> <string name="participate_contribute_irc_text">Participe de uma conversa no IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Ajude outros no <a href="%1$s">forum</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Traduza</a> the app</string> - <string name="participate_contribute_github_text">Contribuir como desenvolvedor, veja <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> para detalhes</string> + <string name="participate_contribute_github_text">Revisar, alterar e escrever código, veja <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para detalhes</string> <string name="move_to">Mover para…</string> <string name="copy_to">Copiar para…</string> <string name="choose_remote_folder">Escolha a pasta…</string> <string name="folder_sync_loading_folders">Carregando pastas…</string> <string name="folder_sync_no_results">Nenhuma pasta de mídia encontrada.</string> - <string name="folder_sync_preferences">Preferências do envio automático</string> + <string name="folder_sync_preferences">Preferências do auto envio</string> <string name="folder_sync_settings">Configurações</string> - <string name="folder_sync_new_info">O envio automático foi completamente renovado. Por favor veja o menu principal e reconfigure o seu envio automático. Desculpe o inconveniente. \n\nAproveite as novas e extendidas capacidades do envio automático!</string> + <string name="folder_sync_new_info">O envio automático foi completamente renovado. Reconfigure-o dentro do menu principal.\n\nCurta o novo e estendido envio automático.</string> <string name="folder_sync_preferences_folder_path">Para %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d selecionado</item> @@ -578,7 +579,7 @@ foram encontrados para sua pesquisa! </string> <string name="notifications_no_results_headline">Não há notificações</string> <string name="notifications_no_results_message">Por favor verifique mais tarde.</string> - <string name="upload_file_dialog_title">Forneça o nome e o tipo de arquivo a enviar</string> + <string name="upload_file_dialog_title">Entre o nome e tipo de arquivo a enviar</string> <string name="upload_file_dialog_filename">Nome do Arquivo</string> <string name="upload_file_dialog_filetype">Tipo do Arquivo</string> <string name="upload_file_dialog_filetype_snippet_text">Fragmento de arquivo texto (.txt)</string> @@ -594,7 +595,7 @@ foram encontrados para sua pesquisa! </string> <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Um local seguro para seus dados</string> - <string name="welcome_feature_1_text">Acesse, compartilhe & proteja seus dados em casa e na sua empresa</string> + <string name="welcome_feature_1_text">Acesse, compartilhe e proteja seus arquivos, em casa e no trabalho</string> <string name="welcome_feature_2_title">Multi contas</string> <string name="welcome_feature_2_text">Conectar em todas as suas Nuvens</string> @@ -619,23 +620,23 @@ foram encontrados para sua pesquisa! </string> <!-- Activities --> <string name="activities_no_results_headline">Nenhuma atividade ainda</string> - <string name="activities_no_results_message">O stream irá mostrar eventos como\nadições, mudanças & compartilhamentos</string> + <string name="activities_no_results_message">O fluxo irá mostrar eventos como\nInclusões, alterações e compartilhamentos</string> <string name="webview_error">Um erro ocorreu</string> <string name="prefs_category_about">Sobre</string> - <string name="actionbar_contacts">Backup dos contatos</string> - <string name="contacts_backup_button">Backup agora</string> + <string name="actionbar_contacts">Fazer backup dos contatos</string> + <string name="contacts_backup_button">Agora</string> <string name="contacts_restore_button">Retornar último backup</string> <string name="contacts_header_restore">Retornar</string> <string name="contacts_header_backup">Backup</string> <string name="contacts_automatic_backup">Backup dos contatos</string> <string name="contacts_last_backup">Último backup</string> - <string name="contacts_read_permission">A permissão de leitura dos contatos é necessária</string> - <string name="contacts_write_permission">A permissão de gravação dos contatos é necessária</string> + <string name="contacts_read_permission">Permissão para ler contatos é necessária</string> + <string name="contacts_write_permission">Permissão para alterar a lista de contatos é necessária</string> <string name="contactlist_title">Restaurar contatos</string> <string name="contaclist_restore_selected">Restaurar contatos selecionados</string> - <string name="contactlist_account_chooser_title">Escolha a conta a importar</string> - <string name="contactlist_no_permission">Sem permissão. Nada foi importado!</string> + <string name="contactlist_account_chooser_title">Escolha a conta para importar</string> + <string name="contactlist_no_permission">Nenhuma permissão foi dada, nada importado!</string> <string name="contacts_preference_choose_date">Escolha a data</string> <string name="contacts_preference_backup_never">nunca</string> <string name="contacts_preferences_no_file_found">Nenhum arquivo encontrado</string> @@ -644,6 +645,7 @@ foram encontrados para sua pesquisa! </string> <!-- Notifications --> <string name="new_notification_received">Nova notificação recebida</string> + <string name="drawer_logout">Sair</string> </resources> From 21c4551c45a134fb766ad0a9e52d4f9eaec244cd Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Sat, 29 Apr 2017 08:21:50 +0200 Subject: [PATCH 826/881] default to "keep file in original folder" --- .../java/com/owncloud/android/services/AutoUploadJob.java | 2 +- .../com/owncloud/android/ui/activity/FolderSyncActivity.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/services/AutoUploadJob.java b/src/main/java/com/owncloud/android/services/AutoUploadJob.java index 041bb1a205..7ae6502f6e 100644 --- a/src/main/java/com/owncloud/android/services/AutoUploadJob.java +++ b/src/main/java/com/owncloud/android/services/AutoUploadJob.java @@ -52,7 +52,7 @@ public class AutoUploadJob extends Job { final String filePath = bundle.getString(LOCAL_PATH, ""); final String remotePath = bundle.getString(REMOTE_PATH, ""); final Account account = AccountUtils.getOwnCloudAccountByName(context, bundle.getString(ACCOUNT, "")); - final Integer uploadBehaviour = bundle.getInt(UPLOAD_BEHAVIOUR, -1); + final Integer uploadBehaviour = bundle.getInt(UPLOAD_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_FORGET); File file = new File(filePath); diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java index cf829c6095..3602c6f821 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderSyncActivity.java @@ -45,12 +45,13 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.SyncedFolder; import com.owncloud.android.datamodel.SyncedFolderDisplayItem; import com.owncloud.android.datamodel.SyncedFolderProvider; +import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.ui.adapter.FolderSyncAdapter; import com.owncloud.android.ui.decoration.MediaGridItemDecoration; import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment; import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable; -import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.AnalyticsUtils; +import com.owncloud.android.utils.DisplayUtils; import java.io.File; import java.util.ArrayList; @@ -303,7 +304,7 @@ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapte false, false, AccountUtils.getCurrentOwnCloudAccount(this).name, - 0, + FileUploader.LOCAL_BEHAVIOUR_FORGET, false, mediaFolder.filePaths, mediaFolder.folderName, From fb025d17d0bd7b1e795c56e9401ac7048b323147 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Sat, 29 Apr 2017 09:03:41 +0200 Subject: [PATCH 827/881] db name also "custom" --- src/modified/res/values/setup.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 77bdbed7c5..d1131a2384 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -11,8 +11,8 @@ <string name="users_and_groups_share_with">com.custom.client.provider.UsersAndGroupsSearch.action.SHARE_WITH</string> <string name="document_provider_authority">com.custom.client.provider.Documents</string> <string name="file_provider_authority">com.custom.client.provider.Files</string> - <string name ="db_file">nextcloud.db</string> - <string name ="db_name">nextcloud</string> + <string name ="db_file">custom.db</string> + <string name ="db_name">custom</string> <string name="data_folder">custom</string> <string name ="log_name">nextcloud</string> <string name="default_display_name_for_root_folder">Custom</string> From 1f67a9ae141371e50e0b557426d002f90fdf9daa Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Sat, 29 Apr 2017 09:04:40 +0200 Subject: [PATCH 828/881] change log_name --- src/modified/res/values/setup.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index d1131a2384..65f1c89d7c 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -14,7 +14,7 @@ <string name ="db_file">custom.db</string> <string name ="db_name">custom</string> <string name="data_folder">custom</string> - <string name ="log_name">nextcloud</string> + <string name ="log_name">custom</string> <string name="default_display_name_for_root_folder">Custom</string> <string name ="user_agent">Mozilla/5.0 (Android) ownCloud-android/%1$s</string> From a8230f03c98050cfdecdd92ab27a55899b8fec45 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Sun, 30 Apr 2017 00:21:24 +0000 Subject: [PATCH 829/881] [tx-robot] updated from transifex --- src/main/res/values-de-rDE/strings.xml | 383 +++++++++++++++---------- src/main/res/values-de/strings.xml | 2 +- src/main/res/values-es-rMX/strings.xml | 1 - src/main/res/values-nl/strings.xml | 201 +++---------- src/main/res/values-pt-rBR/strings.xml | 1 - 5 files changed, 273 insertions(+), 315 deletions(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index b3063a5471..f756f0d903 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="about_android">%1$s Android-App</string> + <string name="about_android">%1$s Android App</string> <string name="about_version">Version %1$s</string> <string name="actionbar_sync">Konto aktualisieren</string> <string name="actionbar_upload">Hochladen</string> @@ -13,7 +13,7 @@ <string name="actionbar_send_file">Senden</string> <string name="actionbar_sort">Sortieren</string> <string name="actionbar_sort_title">Sortiere nach</string> - <string name="sort_by">Sortiere nach</string> + <string name="sort_by">Sortieren nach</string> <string name="menu_item_sort_by_name_a_z">A - Z</string> <string name="menu_item_sort_by_name_z_a">Z - A</string> <string name="menu_item_sort_by_date_newest_first">Neueste zuerst</string> @@ -47,13 +47,13 @@ <string name="prefs_fingerprint_notsetup">Keine Fingerabdrücke eingerichtet.</string> <string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string> <string name="prefs_instant_upload">Sofortiges Hochladen von Bildern</string> - <string name="prefs_instant_upload_summary">Sofortiges Hochladen von Bildern, die mit der Kamera gemacht wurden</string> + <string name="prefs_instant_upload_summary">Laden Sie mit der Kamera gemachte Fotos sofort hoch</string> <string name="prefs_instant_video_upload">Sofortiges Hochladen von Videos</string> - <string name="prefs_instant_video_upload_summary">Sofortiges Hochladen von Videos, die mit der Kamera gemacht wurden</string> + <string name="prefs_instant_video_upload_summary">Laden Sie mit der Kamera gemachte Videos sofort hoch</string> <string name="prefs_log_title">Protokollierung aktivieren</string> - <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen benutzt</string> - <string name="prefs_log_title_history">Protokollverlauf</string> - <string name="prefs_log_summary_history">Dies zeigt die gespeicherten Protokolle</string> + <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen genutzt</string> + <string name="prefs_log_title_history">Protokollierungs-Historie</string> + <string name="prefs_log_summary_history">Dies zeigt die gespeicherten Protokollierungen</string> <string name="prefs_log_delete_history_button">Verlauf löschen</string> <string name="prefs_calendar_contacts">Kalender & Kontakte synchronisieren</string> <string name="prefs_calendar_contacts_summary">DAVdroid (v1.3.0+) für aktuelles Konto einrichten</string> @@ -64,17 +64,23 @@ <string name="prefs_recommend">Einem Freund empfehlen</string> <string name="prefs_feedback">Rückmeldungen</string> <string name="prefs_imprint">Impressum</string> - <string name="recommend_subject">%1$s auf Ihrem Smartphone ausprobieren!</string> - <string name="auth_check_server">Server überprüfen</string> + <string name="prefs_remember_last_share_location">Geteilten Speicherort merken</string> + <string name="prefs_remember_last_upload_location_summary">Zuletzt verwendeten, geteilten Upload-Speicherort merken</string> + + <string name="recommend_subject">Probieren Sie %1$s auf Ihrem Smartphone!</string> + <string name="recommend_text">Ich empfehle Ihnen die Nutzung von %1$s auf Ihrem Smartphone!\nLaden Sie es hier herunter: %2$s</string> + + <string name="auth_check_server">Server überprüfen</string> <string name="auth_host_url">Server-Adresse https://…</string> <string name="auth_username">Benutzername</string> <string name="auth_password">Passwort</string> + <string name="auth_register">Sie haben noch keinen Server?\nKlicke hier um Server-Anbieter zu finden</string> <string name="sync_string_files">Dateien</string> <string name="setup_btn_connect">Verbinden</string> <string name="uploader_btn_upload_text">Hochladen</string> <string name="uploader_top_message">Hochladeordner auswählen</string> <string name="uploader_wrn_no_account_title">Kein Konto gefunden</string> - <string name="uploader_wrn_no_account_text">Es sind keine %1$s-Konten auf Ihrem Gerät eingerichtet. Bitte richten Sie zuerst ein Konto ein.</string> + <string name="uploader_wrn_no_account_text">Es sind keine %1$s Konten auf Ihrem Gerät eingerichtet. Bitte erstellen Sie zuerst ein Konto.</string> <string name="uploader_wrn_no_account_setup_btn_text">Einrichten</string> <string name="uploader_wrn_no_account_quit_btn_text">Beenden</string> <string name="uploader_error_title_no_file_to_upload">Keine Datei zum Hochladen</string> @@ -82,41 +88,41 @@ <string name="uploader_error_message_no_file_to_upload">Empfangene Daten enthalten keine gültige Datei.</string> <string name="uploader_error_title_file_cannot_be_uploaded">Diese Datei kan nicht hochgeladen werden</string> <string name="uploader_error_message_read_permission_not_granted">%1$s darf eine empfangene Datei nicht lesen</string> - <string name="uploader_error_message_source_file_not_found">Die zum Hochladen ausgewählte Datei kann nicht gefunden werden. Bitte prüfen Sie ob die Datei existiert.</string> - <string name="uploader_error_message_source_file_not_copied">Konnte Datei nicht in temporärem Ordner speichern. Bitte versuche es erneut.</string> + <string name="uploader_error_message_source_file_not_found">Die zum Hochladen ausgewählte Datei kann nicht gefunden werden. Bitte prüfe ob die Datei existiert. +</string> + <string name="uploader_error_message_source_file_not_copied">Es ist ein Fehler beim Kopieren dieser Datei in einen temporären Ordner aufgetreten. Bitte erneut versuchen die Datei zu senden.</string> <string name="uploader_upload_files_behaviour">Upload Option:</string> - <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">In Nextcloud Ordner verschieben</string> - <string name="uploader_upload_files_behaviour_only_upload">Hochladen und Datei im ursprünglichen Ordner behalten</string> - <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Lösche Datei aus dem ursprünglichen Ordner</string> + <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Datei in Nextcloud Ordner verschieben</string> + <string name="uploader_upload_files_behaviour_only_upload">Hochladen und im Quellordner behalten</string> + <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Hochladen und Datei im Quellordner löschen</string> <string name="file_list_seconds_ago">Gerade eben</string> <string name="file_list_empty_headline"> Keine Dateien vorhanden </string> - <string name="file_list_empty">Lade Dateien hoch oder synchronisiere mit deine Geräte.</string> - <string name="file_list_empty_favorites">Favoritisiere Dateien oder synchronisiere deine Geräte.</string> - <string name="file_list_empty_favorites_filter_list">Dateien und Ordner, die du favoritisierst, werden hier angezeigt</string> - <string name="file_list_empty_favorites_filter">Deine Suche ergab keine favoritisierten Dateien.</string> + <string name="file_list_empty">Laden Sie Inhalt hoch oder synchronisieren Sie mit Ihren Geräten.</string> + <string name="file_list_empty_favorites">Favorisieren Sie einige Dateien oder synchronisieren Sie Ihre Geräte.</string> + <string name="file_list_empty_favorites_filter_list">Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier</string> + <string name="file_list_empty_favorites_filter">Keine favorisierten Dateien in Ihrem Verlauf gefunden.</string> <string name="file_list_loading">Lade…</string> - <string name="file_list_no_app_for_file_type">Keine App verfügbar um diesen Dateityp zu verarbeiten.</string> + <string name="file_list_no_app_for_file_type">Es wurde keine App für diesen Dateityp gefunden!</string> <string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</string> <string name="file_list_empty_headline_search">Keine Ergebnisse in diesem Ordner</string> <string name="file_list_empty_headline_server_search">Keine Ergebnisse</string> - <string name="file_list_empty_favorite_headline">Noch nichts favoritisiert.</string> + <string name="file_list_empty_favorite_headline">Noch keine Favoriten vorhanden</string> <string name="file_list_empty_shared_headline">Noch nichts geteilt</string> - <string name="file_list_empty_shared">Dateien und Ordner, die Sie teilen, werden hier erscheinen</string> + <string name="file_list_empty_shared">Von dir geteilte Dateien und Ordner werden hier erscheinen</string> <string name="file_list_empty_headline_server_search_videos">Keine Videos</string> <string name="file_list_empty_headline_server_search_photos">Keine Fotos</string> - <string name="file_list_empty_search">Vielleicht liegt es in einem anderen Ordner?</string> - <string name="file_list_empty_recently_modified">Keine Dateien gefunden, die in den letzten 7 Tagen modifiziert wurden</string> - <string name="file_list_empty_recently_modified_filter">Deine Such ergab keine Dateien, -die in den letzten 7 Tagen modifiziert wurden.</string> + <string name="file_list_empty_search">Vielleicht befindet es sich in einem anderen Ordner?</string> + <string name="file_list_empty_recently_modified">Keine, innerhalb der letzten 7 Tage, geänderten Dateien gefunden</string> + <string name="file_list_empty_recently_modified_filter">Keine Dateien gefunden, die in den letzten 7 Tagen geändert wurden.</string> <string name="file_list_empty_recently_added">Keine kürzlich hinzugefügten Dateien gefunden</string> - <string name="file_list_empty_recently_added_filter">Deine Suche ergab keine kürzlich hinzugefügten Dateien</string> - <string name="file_list_empty_text_photos">Lade ein paar Fotos hoch oder aktiviere automatisches Hochladen</string> - <string name="file_list_empty_text_photos_filter">Deine Suche hat keine Fotos gefunden.</string> - <string name="file_list_empty_text_videos">Lade ein paar Videos hoch oder aktiviere automatisches Hochladen</string> - <string name="file_list_empty_text_videos_filter">Deine Suche hat keine Videos gefunden.</string> + <string name="file_list_empty_recently_added_filter">Keine kürzlich hinzu gefügten Dateien gefunden!</string> + <string name="file_list_empty_text_photos">Laden Sie Fotos hoch oder aktivieren Sie den Sofortupload!</string> + <string name="file_list_empty_text_photos_filter">Keine Fotos gefunden.</string> + <string name="file_list_empty_text_videos">Laden Sie einige Videos hoch oder aktivieren Sie den Sofortupload.</string> + <string name="file_list_empty_text_videos_filter">Keine Videos gefunden.</string> <string name="upload_list_empty_headline">Keine Uploads verfügbar</string> - <string name="upload_list_empty_text">Lade ein paar Dateien hoch oder aktiviere automatisches Hochladen.</string> - <string name="upload_list_empty_text_auto_upload">Lade ein paar Dateien hoch oder aktiviere automatisches Hochladen.</string> + <string name="upload_list_empty_text">Laden Sie Inhalte hoch oder aktivieren Sie den Sofortupload.</string> + <string name="upload_list_empty_text_auto_upload">Laden Sie Inhalte hoch oder aktivieren Sie den Auto Upload!</string> <string name="file_list_folder">Ordner</string> <string name="file_list_folders">Ordner</string> <string name="file_list_file">Datei</string> @@ -129,17 +135,18 @@ die in den letzten 7 Tagen modifiziert wurden.</string> <string name="filedetails_download">Herunterladen</string> <string name="filedetails_sync_file">Synchronisieren</string> <string name="filedetails_renamed_in_upload_msg">Datei während des Hochladens in %1$s umbenannt</string> + <string name="list_layout">Layout der Liste</string> <string name="action_share">Teilen</string> <string name="common_yes">Ja</string> <string name="common_no">Nein</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Upload entfernen</string> - <string name="common_retry_upload">Versuche erneut hochzuladen</string> + <string name="common_retry_upload">Versuchen Sie es erneut hochzuladen</string> <string name="common_cancel_sync">Synchronisation abbrechen</string> <string name="common_cancel">Abbrechen</string> <string name="common_back">Zurück</string> <string name="common_save">Speichern</string> - <string name="common_save_exit">Speichern & Schließen</string> + <string name="common_save_exit">Speichern & verlassen</string> <string name="common_error">Fehler</string> <string name="common_loading">Lade …</string> <string name="common_unknown">unbekannt</string> @@ -149,8 +156,8 @@ die in den letzten 7 Tagen modifiziert wurden.</string> <string name="change_password">Passwort ändern</string> <string name="delete_account">Benutzerkonto löschen</string> <string name="delete_account_warning">Das Konto %s löschen?\n\nDas Löschen kann nicht rückgängig gemacht werden.</string> - <string name="create_account">Konto erstellen</string> - <string name="upload_chooser_title">Hochladen von …</string> + <string name="create_account">Benutzerkonto erstellen</string> + <string name="upload_chooser_title">Dateien hochladen von …</string> <string name="uploader_info_dirname">Ordnername</string> <string name="uploader_upload_in_progress_ticker">Hochladen …</string> <string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string> @@ -158,14 +165,14 @@ die in den letzten 7 Tagen modifiziert wurden.</string> <string name="uploader_upload_succeeded_content_single">%1$s hochgeladen</string> <string name="uploader_upload_failed_ticker">Hochladen fehlgeschlagen</string> <string name="uploader_upload_failed_content_single">Konnte %1$s nicht hochladen</string> - <string name="uploader_upload_failed_credentials_error">Hochladen fehlgeschlagen, Sie müssen sich erneut anmelden.</string> + <string name="uploader_upload_failed_credentials_error">Hochladen fehlgeschlagen, erneute Anmeldung erforderlich</string> <string name="uploads_view_title">Uploads</string> <string name="uploads_view_group_current_uploads">Aktuell</string> <string name="uploads_view_group_failed_uploads">Fehlgeschlagen (Tippen zum Wiederholen)</string> <string name="uploads_view_group_finished_uploads">Hochgeladen</string> <string name="uploads_view_upload_status_succeeded">Fertiggestellt</string> <string name="uploads_view_upload_status_cancelled">Abgebrochen</string> - <string name="uploads_view_upload_status_paused">Pausiert</string> + <string name="uploads_view_upload_status_paused">pausiert</string> <string name="uploads_view_upload_status_failed_connection_error">Verbindungsfehler</string> <string name="uploads_view_upload_status_failed_retry">Hochladen wird in Kürze erneut versucht</string> <string name="uploads_view_upload_status_failed_credentials_error">Zugangsdaten falsch</string> @@ -177,132 +184,134 @@ die in den letzten 7 Tagen modifiziert wurden.</string> <string name="uploads_view_upload_status_service_interrupted">App beendet</string> <string name="uploads_view_upload_status_unknown_fail">Unbekannter Fehler</string> <string name="uploads_view_upload_status_waiting_for_wifi">Warte auf W-Lan-Verbindung</string> - <string name="uploads_view_later_waiting_to_upload">Warten auf das Hochladen</string> + <string name="uploads_view_later_waiting_to_upload">Warte auf Hochladen</string> <string name="downloader_download_in_progress_ticker">Herunterladen …</string> - <string name="downloader_download_in_progress_content">%1$d%% beim Laden von %2$s</string> + <string name="downloader_download_in_progress_content">%1$d%% Herunterladen %2$s</string> <string name="downloader_download_succeeded_ticker">Heruntergeladen</string> - <string name="downloader_download_succeeded_content">%1$s wurde erfolgreich heruntergeladen</string> + <string name="downloader_download_succeeded_content">%1$s heruntergeladen</string> <string name="downloader_download_failed_ticker">Herunterladen fehlgeschlagen</string> <string name="downloader_download_failed_content">Konnte %1$s nicht herunterladen</string> - <string name="downloader_not_downloaded_yet">Noch nicht heruntergeladen</string> - <string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, Sie müssen sich erneut anmelden.</string> + <string name="downloader_not_downloaded_yet">Noch nicht Heruntergeladen</string> + <string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, erneute Anmeldung erforderlich</string> <string name="common_choose_account">Konto auswählen</string> <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string> <string name="sync_fail_ticker_unauthorized">Synchronisation fehlgeschlagen. Sie müssen sich erneut anmelden</string> <string name="sync_fail_content">Synchronisation von %1$s konnte nicht abgeschlossen werden</string> <string name="sync_fail_content_unauthorized">Falsches Passwort für %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string> - <string name="sync_conflicts_in_favourites_content">%1$d Synchronisationsdateien konnten nicht synchronisiert werden.</string> - <string name="sync_fail_in_favourites_ticker">Synchronisationsdateien konnten nicht synchronisiert werden.</string> + <string name="sync_conflicts_in_favourites_content">%1$d synchron zu haltende Dateien konnten nicht synchronisiert werden.</string> + <string name="sync_fail_in_favourites_ticker">Synchronhalten schlug fehl.</string> <string name="sync_fail_in_favourites_content">Inhalte von %1$d Dateien konnten nicht synchronisiert werden (%2$d Konflikte)</string> <string name="sync_foreign_files_forgotten_ticker">Einige lokale Dateien wurden vergessen</string> - <string name="sync_foreign_files_forgotten_content">%1$d Dateien aus dem %2$s Ordner konnten nicht kopiert werden nach</string> + <string name="sync_foreign_files_forgotten_content">%1$d Dateien aus dem %2$s Verzeichnis konnten nicht kopiert werden nach</string> + <string name="sync_foreign_files_forgotten_explanation">Seit Version 1.3.16 werden Dateien die von diesem Gerät aus hochgeladen werden in den lokalen Ordner %1$s kopiert um Datenverlust zu vermeiden, wenn eine einzelne Datei mit mehreren Accounts synchronisiert wird.\n\nInfolge dieser Änderung wurden alle Dateien, die mit vorherigen Versionen dieser App hochgeladen wurden, in den Ordner %2$s verschoben. Jedoch ist während der Konto-Synchronisation ein Fehler aufgetreten, der das Abschließen dieses Vorgangs verhindert hat. Die Datei(en) können entweder wie sie sind belassen und den Link zu %3$s entfernt werden oder die Datei(en) in den Ordner %1$s verschoben und den Link zu %4$s beibehalten werden.\n\nUnten befindet sich eine Liste der lokalen Datei(en) und der mit ihnen verbundenen Remote-Datei(en) in %5$s.</string> <string name="sync_current_folder_was_removed">Der Ordner %1$s existiert nicht mehr</string> - <string name="foreign_files_move">Verschiebe alle</string> + <string name="foreign_files_move">Alle verschieben</string> <string name="foreign_files_success">Alle Dateien wurden verschoben</string> <string name="foreign_files_fail">Einige Dateien konnten nicht verschoben werden</string> <string name="foreign_files_local_text">Lokal: %1$s</string> - <string name="foreign_files_remote_text">Entfernte Freigabe: %1$s</string> - <string name="upload_query_move_foreign_files">Unzureichender Speicherplatz verhindert das Kopieren der ausgewählten Dateien in den Ordner %1$s . Möchstest du sie stattdessen verschieben?</string> - <string name="pass_code_enter_pass_code">Bitte geben Sie ihre PIN ein</string> + <string name="foreign_files_remote_text">Remote: %1$s</string> + <string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung, um die ausgewählten Dateien in das Verzeichnis %1$s zu kopieren. Sollen diese stattdessen verschoben werden?</string> + <string name="pass_code_enter_pass_code">Bitte geben Sie Ihre PIN ein</string> <string name="pass_code_configure_your_pass_code">Bitte PIN eingeben</string> - <string name="pass_code_configure_your_pass_code_explanation">Die PIN wird jedes mal wenn die App gestartet wird abgefragt</string> - <string name="pass_code_reenter_your_pass_code">Bitte PIN erneut eingeben</string> + <string name="pass_code_configure_your_pass_code_explanation">Die PIN wird jedes mal beim Start der App abgefragt</string> + <string name="pass_code_reenter_your_pass_code">Bitte Ihre PIN nochmals eingeben</string> <string name="pass_code_remove_your_pass_code">PIN entfernen</string> <string name="pass_code_mismatch">Die PINs stimmen nicht überein</string> <string name="pass_code_wrong">PIN nicht korrekt</string> <string name="pass_code_removed">PIN entfernt</string> <string name="pass_code_stored">PIN gespeichert</string> - <string name="media_notif_ticker">%1$s Musikplayer</string> - <string name="media_state_playing">%1$s (läuft)</string> - <string name="media_state_loading">%1$s (lädt)</string> - <string name="media_event_done">%1$s Wiedergabe beendet</string> + <string name="media_notif_ticker">%1$s Musik Player</string> + <string name="media_state_playing">%1$s (wird abgespielt)</string> + <string name="media_state_loading">%1$s (wird geladen)</string> + <string name="media_event_done">%1$s Wiedergabe Beendet</string> <string name="media_err_nothing_to_play">Keine Mediendatei gefunden</string> <string name="media_err_no_account">Kein Konto angegeben</string> <string name="media_err_not_in_owncloud">Die Datei befindet sich nicht in einem gültigen Konto</string> - <string name="media_err_unsupported">Nicht unterstützter Media-codec</string> + <string name="media_err_unsupported">Medien-Codec wird nicht unterstützt</string> <string name="media_err_io">Konnte die Mediendatei nicht lesen</string> - <string name="media_err_malformed"> -Die Mediendatei ist falsch encodiert.</string> - <string name="media_err_timeout"> -Zeitüberschreitung beim Versuch die Datei abzuspielen</string> + <string name="media_err_malformed">Mediendatei ist nicht korrekt encodiert</string> + <string name="media_err_timeout">Wartezeit beim Abspielversuch abgelaufen</string> <string name="media_err_invalid_progressive_playback">Die Mediendatei kann nicht gestreamt werden</string> - <string name="media_err_unknown">Die Standard-Applikation für Musik kann die Mediendatei nicht abspielen. </string> - <string name="media_err_security_ex">Ein Sicherheitsfehler trat beim Abspielen von %1$s auf</string> - <string name="media_err_io_ex">Eingabefehler beim Abspielen von %1$s</string> - <string name="media_err_unexpected"> -Unerwarteter Fehler beim Abspielen von %1$s</string> - <string name="media_rewind_description">Zurückspulknopf</string> - <string name="media_play_pause_description">Wiedergabe- oder Pause-Knopf</string> - <string name="media_forward_description">Vorspul-Knopf</string> + <string name="media_err_unknown">Diese Mediendatei konnte nicht mit dem Standardplayer geöffnet werden</string> + <string name="media_err_security_ex">Sicherheitsfehler beim Versuch %1$s wiederzugeben</string> + <string name="media_err_io_ex">Eingabefehler beim Versuch %1$s wiederzugeben</string> + <string name="media_err_unexpected">Ein unerwarteter Fehler ist aufgetreten beim Versuch %1$s wiederzugeben</string> + <string name="media_rewind_description">Rückspulknopf</string> + <string name="media_play_pause_description">Wiedergabe-/Pause Knopf</string> + <string name="media_forward_description">Vorspul Knopf</string> - <string name="auth_getting_authorization">Erhalte Genehmigung …</string> - <string name="auth_trying_to_login">Anmeldeversuch …</string> + <string name="auth_getting_authorization">Genehmigung erhalten …</string> + <string name="auth_trying_to_login">Der Versuch, sich anzumelden …</string> <string name="auth_no_net_conn_title">Keine Netzwerkverbindung</string> <string name="auth_nossl_plain_ok_title">Sichere Verbindung nicht verfügbar.</string> <string name="auth_connection_established">Verbindung hergestellt</string> - <string name="auth_testing_connection">Teste Verbindung</string> + <string name="auth_testing_connection">Verbindung testen</string> <string name="auth_not_configured_title">Fehlerhafte Server Konfiguration</string> - <string name="auth_account_not_new">Ein Account für den gleichen Benutzer und Server existiert bereits auf diesem Gerät</string> + <string name="auth_account_not_new">Ein Benutzerkonto für den gleichen Benutzer und Server existiert auf diesem Gerät bereits</string> <string name="auth_account_not_the_same">Der eingegebene Benutzer passt nicht zu dem Benutzer dieses Benutzerkontos</string> <string name="auth_unknown_error_title">Ein unbekannter Fehler ist aufgetreten!</string> - <string name="auth_unknown_host_title">Konnte den Server nicht finden</string> + <string name="auth_unknown_host_title">Konnte den Host nicht finden</string> <string name="auth_incorrect_path_title">Server nicht gefunden</string> <string name="auth_timeout_title">Der Server braucht zu lange für eine Antwort.</string> <string name="auth_incorrect_address_title">Falsches Adress-Format für den Server</string> <string name="auth_ssl_general_error_title">SSL-Initialisierung fehlgeschlagen.</string> - <string name="auth_ssl_unverified_server_title">Konnte die Identität des SSL Servers nicht verifizieren</string> + <string name="auth_ssl_unverified_server_title">SSL-Server-Identität konnte nicht überprüft werden</string> <string name="auth_bad_oc_version_title">Unbekannte Server-Version</string> <string name="auth_wrong_connection_title">Verbindung konnte nicht hergestellt werden</string> <string name="auth_secure_connection">Sichere Verbindung hergestellt</string> <string name="auth_unauthorized">Falscher Benutzername oder Passwort</string> - <string name="auth_oauth_error">Legitimierung nicht erfolgreich</string> - <string name="auth_oauth_error_access_denied">Zugriff durch den Legitimierungsserver abgelehnt</string> - <string name="auth_wtf_reenter_URL">Unerwarteter Status, bitte gib die Serveradresse erneut ein</string> - <string name="auth_expired_oauth_token_toast">Ihre Legitimierung ist abgelaufen. Bitte Legitimierung nochmals durchführen</string> - <string name="auth_expired_basic_auth_toast">Bitte geben Sie Ihr aktuelles Passwort ein</string> + <string name="auth_oauth_error">Autorisierung nicht erfolgreich</string> + <string name="auth_oauth_error_access_denied">Zugriff durch den Autorisierungsserver abgelehnt</string> + <string name="auth_wtf_reenter_URL">Unerwarteter Zustand; Bitte gib die Adresse des Servers erneut ein</string> + <string name="auth_expired_oauth_token_toast">Die Autorisierung ist abgelaufen. Bitte Autorisierung nochmals durchführen</string> + <string name="auth_expired_basic_auth_toast">Bitte gib das aktuelle Passwort ein</string> <string name="auth_expired_saml_sso_token_toast">Ihre Sitzung ist abgelaufen. Bitte erneut verbinden</string> - <string name="auth_connecting_auth_server">Verbinde zum Authentifizierungsserver...</string> - <string name="auth_unsupported_auth_method">Der Server unterstützt diese Legitimierungsmethode nicht</string> + <string name="auth_connecting_auth_server">Verbinden zum Authentifizierungs-Server ...</string> + <string name="auth_unsupported_auth_method">Der Server unterstützt diese Authentifizierung-Methode nicht</string> <string name="auth_unsupported_multiaccount">%1$s unterstützt nicht mehrere Benutzerkonten</string> - <string name="auth_fail_get_user_name">Dein Server sendet keine korrekte Benutzer ID, bitte kontaktiere den Serveradministrator</string> - <string name="auth_can_not_auth_against_server">Die Authentifizierung gegenüber dem Server konnte nicht durchgeführt werden</string> - <string name="auth_account_does_not_exist">Account existiert auf diesem Gerät noch nicht</string> + <string name="auth_fail_get_user_name">Ihr Server gibt keine korrekte Benutzer-ID zurück, bitte kontaktieren Sie einen Administrator</string> + <string name="auth_can_not_auth_against_server">Kann sich nicht auf diesem Server authentifizieren</string> + <string name="auth_account_does_not_exist">Das Benutzerkonto ist bis jetzt noch nicht auf dem Gerät vorhanden</string> <string name="favorite">Als Offline verfügbar markieren</string> - <string name="unfavorite">Markierung Offline verfügbar entfernen</string> + <string name="unfavorite">Offline verfügbar Markierung entfernen</string> <string name="favorite_real">Als Favorit markieren</string> <string name="unset_favorite_real">Markierung als Favorit entfernen</string> <string name="common_rename">Umbenennen</string> <string name="common_remove">Entfernen</string> - <string name="confirmation_remove_file_alert">Möchten Sie %1$s wirklich löschen?</string> + <string name="confirmation_remove_file_alert">Möchten Sie %1$s wirklich entfernen?</string> <string name="confirmation_remove_local">Nur lokal</string> <string name="remove_success_msg">Entfernt</string> <string name="remove_fail_msg">Entfernen fehlgeschlagen</string> - <string name="rename_dialog_title">Geben Sie einen neuen Namen ein</string> - <string name="rename_local_fail_msg">Lokale Kopie konnte nicht umbenannt werden, versuche einen anderen Namen</string> - <string name="rename_server_fail_msg">Konnte dem Server keinen neuen Namen geben</string> - <string name="sync_file_fail_msg">Konnte die entfernte Datei nicht überprüfen</string> + <string name="rename_dialog_title">Gib einen neuen Namen ein</string> + <string name="rename_local_fail_msg">Die lokale Kopie konnte nicht umbenannt werden. Versuche es mit einem anderen Namen.</string> + <string name="rename_server_fail_msg">Die Umbenennung konnte nicht abgeschlossen werden.</string> + <string name="sync_file_fail_msg">Die entfernte Datei konnte nicht überprüft werden</string> <string name="sync_file_nothing_to_do_msg">Dateiinhalte bereits synchronisiert</string> - <string name="create_dir_fail_msg">Konnte den Ordner nicht erstellen</string> + <string name="create_dir_fail_msg">Verzeichnis konnte nicht erstellt werden</string> <string name="filename_forbidden_characters">Verbotene Zeichen: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Der Dateiname enthält mindestens ein ungültiges Zeichen</string> <string name="filename_empty">Dateiname darf nicht leer sein</string> <string name="wait_a_moment">Bitte warten...</string> - <string name="wait_checking_credentials">Prüfe gespeicherte Anmeldeinformationen</string> + <string name="wait_checking_credentials">Überprüfe gespeicherte Anmeldeinformationen</string> + <string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuche, die Datei in einer anderen App zu öffnen</string> <string name="filedisplay_no_file_selected">Keine Datei gewählt</string> <string name="activity_chooser_title">Link senden an …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string> <string name="oauth_check_onoff">Anmelden mit oAuth2</string> + <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server...</string> + <string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string> <string name="ssl_validator_reason_cert_not_trusted">- Das Zertifikat des Servers ist nicht vertrauenswürdig</string> <string name="ssl_validator_reason_cert_expired">- Das Zertifikat des Servers ist abgelaufen</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Das Gültigkeitsdatum des Serverzertifikats liegt in der Zukunft</string> - <string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string> - <string name="ssl_validator_question">Möchten Sie diesem Zertifikat trotzdem vertrauen?</string> + <string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string> + <string name="ssl_validator_question">Soll diesem Zertifikat trotzdem vertraut werden?</string> + <string name="ssl_validator_not_saved">Das Zertifikat konnte nicht gespeichert werden</string> <string name="ssl_validator_btn_details_see">Details</string> <string name="ssl_validator_btn_details_hide">Ausblenden</string> <string name="ssl_validator_label_subject">Ausgestellt für:</string> @@ -315,19 +324,20 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="ssl_validator_label_L">Ort:</string> <string name="ssl_validator_label_validity">Gültigkeit:</string> <string name="ssl_validator_label_validity_from">Von:</string> - <string name="ssl_validator_label_validity_to">An:</string> + <string name="ssl_validator_label_validity_to">Bis:</string> <string name="ssl_validator_label_signature">Signatur:</string> <string name="ssl_validator_label_signature_algorithm">Algorithmus:</string> - <string name="digest_algorithm_not_available">Dieser Hash-Algorithmus ist auf Ihrem Handy nicht Verfügbar.</string> + <string name="digest_algorithm_not_available">Dieser Algorithmus-Auszug ist auf Ihrem Handy nicht verfügbar.</string> <string name="ssl_validator_label_certificate_fingerprint">Fingerabdruck:</string> - <string name="certificate_load_problem">Es ist ein Problem beim Laden des Zertifikats aufgetreten.</string> + <string name="certificate_load_problem">Beim Laden des Zertifikats ist ein Fehler aufgetreten.</string> <string name="ssl_validator_null_cert">Das Zertifikat konnte nicht angezeigt werden.</string> <string name="ssl_validator_no_info_about_error">- Keine Informationen über den Fehler</string> <string name="placeholder_sentence">Dies ist ein Platzhalter</string> <string name="placeholder_filename">platzhalter.txt</string> + <string name="placeholder_filetype">PNG-Bild</string> <string name="placeholder_filesize">389 KB</string> - <string name="placeholder_timestamp">18.05.2012 12:23</string> + <string name="placeholder_timestamp">18.5.2012 12:23</string> <string name="placeholder_media_time">12:23:45</string> <string name="auto_upload_on_wifi">Nur über W-Lan hochladen</string> @@ -336,40 +346,49 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="instant_video_upload_on_charging">Nur während des Ladens hochladen</string> <string name="instant_upload_on_charging">Nur während des Ladens hochladen</string> <string name="instant_upload_path">/SofortUpload</string> - <string name="conflict_title">Dateikonflikt</string> + <string name="conflict_title">Dateikonfilikt</string> + <string name="conflict_message">Welche Datei soll behalten werden? Wenn Sie beide Versionen wählen, wird der lokalen Datei eine Zahl am Ende des Dateinamens angefügt.</string> <string name="conflict_keep_both">Beide behalten</string> - <string name="conflict_use_local_version">lokale Version</string> - <string name="conflict_use_server_version">Server-Version</string> + <string name="conflict_use_local_version">Lokale Version</string> + <string name="conflict_use_server_version">Serverversion</string> <string name="preview_sorry">Entschuldigung.</string> <string name="preview_image_description">Bildvorschau</string> <string name="preview_image_error_unknown_format">Bild kann nicht angezeigt werden</string> <string name="error__upload__local_file_not_copied">%1$s konnte nicht in den lokalen %2$s Ordner kopiert werden</string> - <string name="prefs_instant_upload_path_title">Pfad zum sofortigen Bilder-Upload</string> - <string name="prefs_folder_sync_local_path_title">Lokaler Ordner</string> - <string name="prefs_folder_sync_remote_path_title">Server-Ordner</string> - <string name="prefs_instant_upload_path_use_subfolders_title">Verwende Unterordner</string> - <string name="prefs_instant_upload_path_use_subfolders_summary">Speichere in Unterordnern basierend auf Jahr und Monat</string> + <string name="prefs_instant_upload_path_title">Sofort-Upload-Ordner</string> + <string name="prefs_folder_sync_local_path_title">Lokales Verzeichnis</string> + <string name="prefs_folder_sync_remote_path_title">Entferntes Verzeichnis</string> + <string name="prefs_instant_upload_path_use_subfolders_title">Unterordner benutzen</string> + <string name="prefs_instant_upload_path_use_subfolders_summary">In Unterordnern speichern, basierend auf Jahr und Monat</string> <string name="share_link_no_support_share_api">Teilen ist auf Ihrem Server nicht aktiviert. Bitte kontaktieren Sie den Administrator.</string> - <string name="share_link_file_no_exist">Teilen nicht möglich. Prüfen Sie, ob die Datei existiert</string> + <string name="share_link_file_no_exist">Teilen nicht möglich. Prüfe, ob die Datei existiert</string> <string name="share_link_file_error">Es ist ein Fehler beim Freigeben der Datei oder des Ordners aufgetreten.</string> - <string name="unshare_link_file_no_exist">Entfernen der Freigabe nicht möglich. Prüfen Sie, ob die Datei existiert</string> + <string name="unshare_link_file_no_exist">Entfernen der Freigabe nicht möglich. Prüfe, dass die Datei existiert</string> <string name="unshare_link_file_error">Es ist ein Fehler beim Entfernen der Freigabe für diese Datei oder den Ordner aufgetreten.</string> - <string name="update_link_file_no_exist">Aktualisierung der Datei nicht möglich. Prüfen Sie, ob die Datei existiert</string> + <string name="update_link_file_no_exist">Aktualisierung der Datei nicht möglich. Prüfe, ob die Datei existiert</string> <string name="update_link_file_error">Es ist ein Fehler beim Aktualisieren der Freigabe aufgetreten</string> <string name="share_link_password_title">Passwort eingeben</string> - <string name="share_link_empty_password">Sie müssen ein Passwort eingeben</string> + <string name="share_link_empty_password">Si müssen ein Passwort eingeben</string> <string name="activity_chooser_send_file_title">Senden</string> <string name="copy_link">Link kopieren</string> <string name="clipboard_text_copied">In die Zwischenablage kopiert</string> + <string name="clipboard_no_text_to_copy">Kein Text zum Kopieren in die Zwischenablage empfangen</string> <string name="clipboard_uxexpected_error">Unerwarteter Fehler beim Kopieren in die Zwischenablage</string> <string name="clipboard_label">Text von %1$s kopiert</string> - <string name="forbidden_permissions">Ihnen fehlt die Erlaubnis %s</string> + <string name="error_cant_bind_to_operations_service">Kritischer Fehler: Operationen können nicht ausgeführt werden</string> + + <string name="network_error_socket_exception">Es ist ein Fehler beim Verbinden mit dem Server aufgetreten.</string> + <string name="network_error_socket_timeout_exception">Es ist ein Fehler beim Warten auf den Server aufgetreten, die Operation konnte nicht abgeschlossen werden</string> + <string name="network_error_connect_timeout_exception">Es ist ein Fehler beim Warten auf den Server aufgetreten, die Operationkonnte nicht abgeschlossen werden</string> + <string name="network_host_not_available">Die Operation kann nicht abgeschlossen werden, der Server ist nicht erreichbar</string> + + <string name="forbidden_permissions">Dir fehlt die Erlaubnis %s</string> <string name="forbidden_permissions_rename">diese Datei umzubenennen</string> <string name="forbidden_permissions_delete">diese Datei zu löschen</string> <string name="share_link_forbidden_permissions">diese Datei zu teilen</string> @@ -395,38 +414,54 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="file_migration_failed_not_readable">FEHLER: Datei kann nicht gelesen werden</string> <string name="file_migration_failed_dir_already_exists">FEHLER: Nextcloud Ordner existiert bereits</string> <string name="file_migration_failed_while_coping">FEHLER: Migration fehlgeschlagen</string> + <string name="file_migration_failed_while_updating_index">FEHLER: Während der Aktualisierung des Indexes</string> + + <string name="file_migration_directory_already_exists">Datenordner existiert bereits, was soll geschehen?</string> + <string name="file_migration_override_data_folder">Überschreiben</string> + <string name="file_migration_use_data_folder">Verwende bestehenden</string> + <string name="prefs_category_accounts">Konten</string> <string name="prefs_add_account">Konto hinzufügen</string> <string name="drawer_manage_accounts">Konten verwalten</string> - <string name="actionbar_logger">Protokolle</string> - <string name="log_send_history_button">Verlauf senden</string> - <string name="log_send_mail_subject">%1$s Android-App Meldungen</string> - <string name="log_progress_dialog_text">Lade Daten …</string> + <string name="auth_redirect_non_secure_connection_title">Die gesicherte Verbindung wird durch eine ungesicherte Route geleitet.</string> - <string name="saml_authentication_required_text">Authentifizierung erforderlich</string> + <string name="actionbar_logger">Protokolle</string> + <string name="log_send_history_button">versende die Chronik</string> + <string name="log_send_no_mail_app">Es wurde keine App gefunden die Logs verschicken kann. Bitte installiere eine App die E-Mails verschicken kann.</string> + <string name="log_send_mail_subject">%1$s Android-App Meldungen</string> + <string name="log_progress_dialog_text">Daten werden geladen …</string> + + <string name="saml_authentication_required_text">Legitimierung benötigt</string> <string name="saml_authentication_wrong_pass">Falsches Passwort</string> <string name="actionbar_move">Verschieben</string> <string name="actionbar_copy">Kopieren</string> + <string name="file_list_empty_moving">Noch nichts vorhanden. Sie können einen Ordner hinzufügen.</string> <string name="folder_picker_choose_button_text">Auswählen</string> - <string name="move_file_error">Es ist ein Fehler beim Verschieben dieser Datei oder dieses Ordners aufgetreten.</string> + <string name="move_file_not_found">Verschieben nicht möglich. Prüfe, ob die Datei existiert</string> + <string name="move_file_invalid_into_descendent">Es ist nicht möglich, einen Ordner in einen seiner Unterordner zu verschieben</string> + <string name="move_file_invalid_overwrite">Die Datei ist bereits im Zielordner vorhanden</string> + <string name="move_file_error">Es ist ein Fehler beim Verschieben der Datei oder des Ordners aufgetreten.</string> <string name="forbidden_permissions_move">um diese Datei zu verschieben</string> - <string name="copy_file_not_found">Kopieren nicht möglich. Bitte überprüfen Sie, ob die Datei existiert</string> - <string name="copy_file_error">Es ist ein Fehler beim Kopieren dieser Datei oder dieses Ordners aufgetreten</string> - <string name="forbidden_permissions_copy">um diese Datei zu kopieren</string> + <string name="copy_file_not_found">Kopieren nicht möglich. Prüfe, dass die Datei existiert</string> + <string name="copy_file_invalid_into_descendent">Es ist nicht möglich, einen Ordner in einen seiner Unterordner zu kopieren</string> + <string name="copy_file_invalid_overwrite">Die Datei existiert bereits im Zielverzeichnis</string> + <string name="copy_file_error">Es ist ein Fehler beim Kopieren der Datei oder des Ordners aufgetreten.</string> + <string name="forbidden_permissions_copy">diese Datei zu kopieren</string> - <string name="prefs_category_instant_uploading">Sofortiges Hochladen</string> + <string name="prefs_category_instant_uploading">sofort hochladen</string> <string name="prefs_category_details">Details</string> - <string name="sync_folder_failed_content">Bei der Synchronisation konnte %1$s Ordner nicht fertig gestellt werden</string> + <string name="prefs_instant_video_upload_path_title">Video Speicherpfad wählen</string> + <string name="sync_folder_failed_content">Bei der Synchronisation konnte %1$s Ordner nicht fertig gestellt werden</string> <string name="shared_subject_header">geteilt</string> - <string name="with_you_subject_header">Mit Ihnen</string> + <string name="with_you_subject_header">Mit Dir</string> - <string name="subject_user_shared_with_you">%1$s hat \"%2$s\" mit Ihnen geteilt</string> - <string name="subject_shared_with_you">\"%1$s\" wurde mit Ihnen geteilt</string> + <string name="subject_user_shared_with_you">%1$s hat \"%2$s\" mit Dir geteilt</string> + <string name="subject_shared_with_you">\"%1$s\" wurde mit Dir geteilt</string> <string name="auth_refresh_button">Verbindung aktualisieren</string> <string name="auth_host_address">Serveradresse</string> @@ -444,8 +479,8 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="file_list__footer__files_and_folders">%1$d Dateien, %2$d Ordner</string> <string name="prefs_instant_behaviour_dialogTitle">Originaldatei wird…</string> <string name="prefs_instant_behaviour_title">Originaldatei wird…</string> - <string name="upload_copy_files">Datei kopieren</string> - <string name="upload_move_files">Datei verschieben</string> + <string name="upload_copy_files">kopiere Datei</string> + <string name="upload_move_files">verschiebe Datei</string> <string name="select_all">Alle auswählen</string> <string name="pref_behaviour_entries_keep_file">im Originalordner behalten</string> @@ -455,27 +490,29 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="prefs_common">Allgemein</string> <string name="share_dialog_title">Teilen</string> - <string name="share_file">%1$s teilen</string> - <string name="share_with_user_section_title">Mit Benutzern und Gruppen teilen</string> - <string name="share_no_users">Bis jetzt hast du noch keine Dateien mit anderen geteilt</string> - <string name="share_add_user_or_group">Benutzer oder Gruppe hinzufügen</string> + <string name="share_file">Teile %1$s</string> + <string name="share_with_user_section_title">Mit Benutzern oder Gruppen teilen</string> + <string name="share_no_users">Es wurden noch keine Dateien mit Benutzern geteilt</string> + <string name="share_add_user_or_group">Füge Benutzer oder Gruppe hinzu</string> <string name="share_via_link_section_title">Link teilen</string> - <string name="share_via_link_expiration_date_label">Ein Ablaufdatum setzen</string> + <string name="share_via_link_expiration_date_label">Setze ein Ablaufdatum</string> + <string name="share_via_link_password_label">Passwortschutz</string> <string name="share_via_link_password_title">Gesichert</string> <string name="share_via_link_edit_permission_label">Bearbeitung erlauben</string> <string name="share_via_link_hide_file_listing_permission_label">Dateiliste verbergen</string> - <string name="share_get_public_link_button">Link erstellen</string> - <string name="share_with_title">Teilen mit …</string> - <string name="share_with_edit_title">Teilen mit %1$s</string> + <string name="share_get_public_link_button">Link erhalten</string> + <string name="share_with_title">Teile mit …</string> + <string name="share_with_edit_title">Teile mit %1$s</string> <string name="share_search">Suche</string> - <string name="search_users_and_groups_hint">Nach Benutzern und Gruppen suchen</string> + <string name="search_users_and_groups_hint">Nutzer und Gruppen suchen</string> <string name="share_group_clarification">%1$s (Gruppe)</string> - <string name="share_remote_clarification">%1$s (entfernte Freigabe)</string> + <string name="share_remote_clarification">%1$s (remote)</string> <string name="share_email_clarification">%1$s (E-Mail)</string> - <string name="share_known_remote_clarification">%1$s ( auf %2$s )</string> + <string name="share_known_remote_clarification">%1$s ( at %2$s )</string> + <string name="share_sharee_unavailable">Entschuldigung, Ihre Serverversion erlaubt das Teilen mit Nutzern innerhalb der Clients nicht. \nBitte kontaktieren Sie Ihren Administrator</string> <string name="share_privilege_can_share">kann teilen</string> <string name="share_privilege_can_edit">kann bearbeiten</string> <string name="share_privilege_can_edit_create">erstellen</string> @@ -484,34 +521,50 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="edit_share_unshare">Freigabe löschen</string> <string name="edit_share_done">Erledigt</string> + <string name="action_retry_uploads">Fehlgeschlagene erneut versuchen</string> <string name="action_clear_failed_uploads">Entferne Fehlversuche</string> - <string name="action_switch_grid_view">Zur Rasteransicht wechseln</string> - <string name="action_switch_list_view">Zur Listenansicht wechseln</string> + <string name="action_clear_successful_uploads">Entferne erfolgreiche Uploads</string> + <string name="action_clear_finished_uploads">Alles aufräumen</string> - <string name="manage_space_title">Speicher verwalten</string> - <string name="manage_space_clear_data">Lösche Daten</string> + <string name="action_switch_grid_view">Rasteransicht</string> + <string name="action_switch_list_view">Listenansicht</string> + + <string name="manage_space_title">Verwalte Speicherplatz</string> + <string name="manage_space_description">Einstellungen, Datenbank und Server-Zertifikate von %1$s\'s Daten werden dauerhaft gelöscht.\n\nHerunter geladene Dateien bleiben unangetastet.\n\nDieser Vorgang kann eine Zeit dauern.</string> + <string name="manage_space_clear_data">Daten löschen</string> <string name="manage_space_error">Einige Dateien konnten nicht gelöscht werden.</string> + <string name="permission_storage_access">Sie haben nicht die erforderlichen Rechte, um Dateien hoch- oder herunterzuladen.</string> + <string name="local_file_not_found_toast">Die Datei wurde im lokalen Dateisystem nicht gefunden</string> <string name="confirmation_remove_files_alert">Wollen Sie die ausgewählten Einträge wirklich löschen?</string> <string name="confirmation_remove_folders_alert">Wollen Sie die ausgewählten Einträge und deren Inhalte wirklich löschen?</string> + <string name="uploads_view_upload_status_waiting_for_charging">Warte auf das Aufladen des Gerätes</string> <string name="actionbar_search">Suche</string> <string name="files_drop_not_supported">Dies ist eine Nextcloud Funktion, bitte updaten.</string> <string name="learn_more">Mehr</string> - <string name="drawer_folder_sync">Auto-Upload</string> + <string name="drawer_folder_sync">Automatisches Hochladen</string> <string name="drawer_participate">Mitmachen</string> + <string name="participate_testing_headline">Hilf uns Testen</string> + <string name="participate_testing_bug_text">Fehler gefunden? Komisches Verhalten?</string> <string name="participate_testing_report_text">Fehler melden auf Github</string> - <string name="participate_beta_headline">Testen Sie die Beta-Version</string> - <string name="participate_release_candidate_headline">Vorabversionen</string> + <string name="participate_testing_version_text">Interessiert uns beim Test der nächsten Version zu unterstützen?</string> + <string name="participate_beta_headline">Teste die Entwicklerversion</string> + <string name="participate_beta_text">Dies beinhaltet neue Funktionalitäten und ist nicht vollumfänglich qualitätsgesichert. Es können daher Fehler/Bugs auftreten, melde uns diese bitte.</string> + <string name="participate_release_candidate_headline">Vorabversion</string> + <string name="participate_release_candidate_text">Eine Vorabversion, auch Release Candidate (RC) genannt, ist ein stabiler Stand der kommenden, finalen Version. Ein Test in der eigenen Umgebung hilft uns diese Stabilität sicherzustellen. Melden Sie sich als Tester im Play Store an oder suchen und installieren Sie die passende Version bei F-Droid unter „Versionen“.</string> <string name="participate_contribute_headline">Aktiv etwas beitragen</string> - <string name="participate_contribute_irc_text">An Diskussionen im IRC teilnehmen: <a href=\"%1$s\">#nextcloud-mobile</a></string> - <string name="participate_contribute_forum_text">Helfen Sie anderen im <a href="%1$s">Forum</a></string> - <string name="participate_contribute_translate_text">Die App <a href=\"%1$s\">übersetzen</a></string> + <string name="participate_contribute_irc_text">An Chats teilnehmen auf IRC: <a href="%1$s">#nextcloud-mobile</a></string> + <string name="participate_contribute_forum_text">Hilf anderen im <a href="%1$s">Forum</a></string> + <string name="participate_contribute_translate_text">Die App <a href="%1$s">Übersetzen</a></string> + <string name="participate_contribute_github_text">Zum Überprüfen, Ändern und Schreiben von Quellcode schaue bitte unter <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> für weitere Details.</string> <string name="move_to">Verschieben nach…</string> <string name="copy_to">Kopieren nach…</string> - <string name="choose_remote_folder">Ordner auswählen…</string> - <string name="folder_sync_loading_folders">Ordner laden…</string> - <string name="folder_sync_no_results">Keine Medienordner gefunden.</string> + <string name="choose_remote_folder">Wähle Verzeichnis…</string> + <string name="folder_sync_loading_folders">Lade Verzeichnisse…</string> + <string name="folder_sync_no_results">Keine Medienverzeichnisse gefunden.</string> + <string name="folder_sync_preferences">Einstellungen Auto-Hochladen</string> <string name="folder_sync_settings">Einstellungen</string> + <string name="folder_sync_new_info">Sofortiger Upload wurde vollständig überarbeitet. Bitte über das Hauptmenü zum Auto Upload gehen und neu configurieren. Bitte entschuldige die Unannehmlichkeiten.\n\nViel Vergnügen mit den neuen und erweiterten Möglichkeiten des Auto Uploads.</string> <string name="folder_sync_preferences_folder_path">Für %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d ausgewählt</item> @@ -523,13 +576,14 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <string name="notifications_loading_activity">Lade Benachrichtigungen…</string> <string name="notifications_no_results_headline">Keine Benachrichtigungen</string> - <string name="notifications_no_results_message">Bitte sehen Sie später noch einmal nach.</string> + <string name="notifications_no_results_message">Bitte später noch einmal nachsehen.</string> + <string name="upload_file_dialog_title">Dateinamen und -typ zum Hochladen eingeben</string> <string name="upload_file_dialog_filename">Dateiname</string> <string name="upload_file_dialog_filetype">Dateityp</string> - <string name="upload_file_dialog_filetype_snippet_text">Schnipsel-Textdatei (.txt)</string> - <string name="upload_file_dialog_filetype_internet_shortcut">Website-Verknüpfungsdatei (%s)</string> - <string name="upload_file_dialog_filetype_googlemap_shortcut">Google Maps-Verknüpfungsdatei (%s)</string> + <string name="upload_file_dialog_filetype_snippet_text">Schnipsel Textdatei (.txt)</string> + <string name="upload_file_dialog_filetype_internet_shortcut">Internet Abkürzungs-Datei (%s)</string> + <string name="upload_file_dialog_filetype_googlemap_shortcut">Google Maps Abkürzungs-Datei (%s)</string> <string name="storage_description_default">Standard</string> <string name="storage_description_sd_no">SD Karte %1$d</string> @@ -540,6 +594,8 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Ein sicheres Zuhause für alle Ihre Daten</string> + <string name="welcome_feature_1_text">Zugriff, Freigabe & Schutz Ihrer Dateien zu Hause und in Ihrem Unternehmen.</string> + <string name="welcome_feature_2_title">Mehrfachkonto</string> <string name="welcome_feature_2_text">Verbinden Sie sich mit all Ihren Clouds</string> @@ -553,6 +609,7 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <!-- User information --> <string name="user_info_full_name">Vollständiger Name</string> + <string name="user_info_email">E-Mail</string> <string name="user_info_phone">Telefonnummer</string> <string name="user_info_address">Adresse</string> <string name="user_info_website">Webseite</string> @@ -562,16 +619,23 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <!-- Activities --> <string name="activities_no_results_headline">Bislang keine Aktivitäten</string> + <string name="activities_no_results_message">Dieser Stream zeigt Ereignisse wie\nHinzugekommenes, Änderungen und Freigaben an</string> <string name="webview_error">Fehler aufgetreten</string> <string name="prefs_category_about">Über</string> + <string name="actionbar_contacts">Kontakte-Sicherung</string> + <string name="contacts_backup_button">Sicherung jetzt erstellen</string> <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> <string name="contacts_header_restore">Wiederherstellen</string> <string name="contacts_header_backup">Sicherung</string> <string name="contacts_automatic_backup">Adressen-Sicherung</string> <string name="contacts_last_backup">Letzte Sicherung</string> + <string name="contacts_read_permission">Leseberechtigung auf Kontakte erforderlich</string> + <string name="contacts_write_permission">Schreibberechtigung auf Kontakte erforderlich</string> <string name="contactlist_title">Adressen wiederherstellen</string> <string name="contaclist_restore_selected">Ausgewählte Adressen wiederherstellen</string> + <string name="contactlist_account_chooser_title">Konto für den Import auswählen</string> + <string name="contactlist_no_permission">Keine Berechtigung, es wurde nichts importiert!</string> <string name="contacts_preference_choose_date">Datum auswählen</string> <string name="contacts_preference_backup_never">nie</string> <string name="contacts_preferences_no_file_found">Keine Datei gefunden</string> @@ -580,4 +644,7 @@ Unerwarteter Fehler beim Abspielen von %1$s</string> <!-- Notifications --> <string name="new_notification_received">Neue Benachrichtigung erhalten</string> - </resources> + <string name="drawer_logout">Abmelden</string> + + +</resources> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 81cad2d864..9d3e664ec8 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -283,7 +283,6 @@ <string name="common_rename">Umbenennen</string> <string name="common_remove">Entfernen</string> <string name="confirmation_remove_file_alert">Möchtest Du %1$s wirklich entfernen?</string> - <string name="confirmation_remove_folder_alert">Soll %1$s und dessen Inhalt wirklich entfernt werden?</string> <string name="confirmation_remove_local">Nur lokal</string> <string name="remove_success_msg">Entfernt</string> <string name="remove_fail_msg">Entfernen fehlgeschlagen</string> @@ -557,6 +556,7 @@ <string name="participate_contribute_irc_text">An Chats teilnehmen auf IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Hilf anderen im <a href="%1$s">Forum</a></string> <string name="participate_contribute_translate_text">Die App <a href="%1$s">Übersetzen</a></string> + <string name="participate_contribute_github_text">Zum Überprüfen, Ändern und Schreiben von Quellcode schaue bitte unter <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> für weitere Details.</string> <string name="move_to">Verschieben nach…</string> <string name="copy_to">Kopieren nach…</string> <string name="choose_remote_folder">Wähle Verzeichnis…</string> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index f5a72dc0e6..cd48027639 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -283,7 +283,6 @@ en los últimos 7 días. </string> <string name="common_rename">Renombrar</string> <string name="common_remove">Eliminar</string> <string name="confirmation_remove_file_alert">¿Realmente desea eliminar %1$s?</string> - <string name="confirmation_remove_folder_alert">¿Desea realmente eliminar %1$s y sus contenidos?</string> <string name="confirmation_remove_local">Sólo local</string> <string name="remove_success_msg">Eliminado</string> <string name="remove_fail_msg">Falla al eliminar</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index d580d28513..fe5dd45c5a 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -46,10 +46,6 @@ <string name="prefs_fingerprint">Vingerafdrukbeveiliging</string> <string name="prefs_fingerprint_notsetup">Er zijn geen vingerafdrukken ingesteld.</string> <string name="prefs_show_hidden_files">Verborgen bestanden weergeven</string> - <string name="prefs_instant_upload">Directe upload van afbeeldingen</string> - <string name="prefs_instant_upload_summary">Direct uploaden van foto\'s genomen met de camera</string> - <string name="prefs_instant_video_upload">Directe upload van video\'s</string> - <string name="prefs_instant_video_upload_summary">Direct uploaden van video\'s opgenomen met de camera</string> <string name="prefs_log_title">Logging inschakelen</string> <string name="prefs_log_summary">Dit wordt gebruikt om problemen te loggen.</string> <string name="prefs_log_title_history">Logging-geschiedenis</string> @@ -58,23 +54,15 @@ <string name="prefs_calendar_contacts">Synchroniseren agenda & contactpersonen</string> <string name="prefs_calendar_contacts_summary">DAVdroid (v1.3.0+) voor huidige account instellen</string> <string name="prefs_calendar_contacts_address_resolve_error">Serveradres voor dit account kon niet worden gevonden voor DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">Geen Google Play- of F-Droid-app geïnstalleerd</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Agenda- & contactpersonensynchronisatie met succes ingesteld</string> + <string name="prefs_calendar_contacts_no_store_error">Noch F-droid, noch Google Play is geïnstalleerd</string> <string name="prefs_help">Help</string> - <string name="prefs_recommend">Aanbevelen bij een vriend</string> <string name="prefs_feedback">Feedback</string> <string name="prefs_imprint">afdruk</string> - <string name="prefs_remember_last_share_location">Onthoud de share locatie</string> - <string name="prefs_remember_last_upload_location_summary">Onthoud de laatste upload locatie</string> - - <string name="recommend_subject">Probeer %1$s op je smartphone!</string> - <string name="recommend_text">Ik nodig je uit om eens %1$s op je smartphone te proberen!\nDownload hier: %2$s</string> - - <string name="auth_check_server">Controleer server</string> + <string name="recommend_subject">Probeer %1$s op je smartphone!</string> + <string name="auth_check_server">Controleer server</string> <string name="auth_host_url">Serveradres https://…</string> <string name="auth_username">Gebruikersnaam</string> <string name="auth_password">Wachtwoord</string> - <string name="auth_register">Heb je nog geen server?\nKlik hier om er een van een provider te krijgen</string> <string name="sync_string_files">Bestanden</string> <string name="setup_btn_connect">Verbinden</string> <string name="uploader_btn_upload_text">Uploaden</string> @@ -86,42 +74,29 @@ <string name="uploader_error_title_no_file_to_upload">Niets te uploaden</string> <string name="uploader_error_message_received_piece_of_text">%1$s kan niet een stuk tekst als bestand uploaden.</string> <string name="uploader_error_message_no_file_to_upload">Ontvangen gegevens bevatten geen geldig bestand.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Bestand kan niet worden geüpload</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Dit bestand kan niet worden geüpload</string> <string name="uploader_error_message_read_permission_not_granted">%1$s heeft geen toestemming om een ontvangen bestand te lezen</string> - <string name="uploader_error_message_source_file_not_found">Het te uploaden bestand is hier niet. Controleer of het bestand wel bestaat.</string> - <string name="uploader_error_message_source_file_not_copied">Er trad een fout op bij het kopiëren van het bestand naar een tijdelijke map. Probeer het opnieuw te versturen.</string> <string name="uploader_upload_files_behaviour">Uploadoptie:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Verplaats bestand naar Nextcloud-map</string> <string name="uploader_upload_files_behaviour_only_upload">Bewaar het bestand in de bronmap</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Verwijder bestand uit bronmap</string> <string name="file_list_seconds_ago">seconden geleden</string> - <string name="file_list_empty_headline">Hier zijn geen bestanden</string> - <string name="file_list_empty">Upload bestanden of synchroniseer met je apparaten!</string> - <string name="file_list_empty_favorites">Maak enkele bestanden favoriet of synchroniseer met je apparaten!</string> - <string name="file_list_empty_favorites_filter_list">Bestanden en mappen gemarkeerd als favoriet worden hier getoond</string> - <string name="file_list_empty_favorites_filter">Geen favoriete bestanden gevonden voor je zoekopdracht!</string> + <string name="file_list_empty_headline">Hier geen bestanden</string> <string name="file_list_loading">Laden …</string> - <string name="file_list_no_app_for_file_type">Geen app gevonden voor dit bestandsformaat!</string> <string name="local_file_list_empty">Er staan geen bestanden in deze map.</string> <string name="file_list_empty_headline_search">Geen resultaten in deze map</string> <string name="file_list_empty_headline_server_search">Geen resultaten</string> - <string name="file_list_empty_favorite_headline">Nog geen favorieten</string> + <string name="file_list_empty_favorite_headline">Nog niets als favoriet gemarkeerd</string> <string name="file_list_empty_shared_headline">Nog niets gedeeld</string> <string name="file_list_empty_shared">Bestanden en mappen die je deelt, worden hier getoond</string> <string name="file_list_empty_headline_server_search_videos">Geen video\'s</string> <string name="file_list_empty_headline_server_search_photos">Geen foto\'s</string> - <string name="file_list_empty_search">In een andere map kijken?</string> - <string name="file_list_empty_recently_modified">Geen bestanden gevonden die  de laatste 7 dagen zijn gewijzigd</string> - <string name="file_list_empty_recently_modified_filter">Geen gewijzigde bestanden gevonden voor je zoekopdracht die de laatste 7 dagen zijn gewijzigd!</string> - <string name="file_list_empty_recently_added">Geen recent toegevoegde bestanden gevoden</string> - <string name="file_list_empty_recently_added_filter">Geen recent toegevoegde bestanden gevonden voor je zoekopdracht!</string> - <string name="file_list_empty_text_photos">Upload enkele foto\'s of activeer auto-upload!</string> - <string name="file_list_empty_text_photos_filter">Geen foto\'s voor je zoekopdracht gevonden!</string> - <string name="file_list_empty_text_videos">Upload enkele videos of activeer auto-upload!</string> - <string name="file_list_empty_text_videos_filter">Geen video\'s voor je zoekopdracht gevonden!</string> + <string name="file_list_empty_search">Misschien staat het in een andere map?</string> + <string name="file_list_empty_recently_modified">Geen bestanden gevonden die de afgelopen 7 dagen werden gewijzigd</string> + <string name="file_list_empty_recently_modified_filter">Je zoekopdracht vond geen bestanden die + in de laatste 7 dagen werden gewijzigd.</string> + <string name="file_list_empty_recently_added">Geen recent toegevoegde bestanden gevonden</string> <string name="upload_list_empty_headline">Geen uploads beschikbaar</string> - <string name="upload_list_empty_text">Upload bestanden of activeer directe uploads!</string> - <string name="upload_list_empty_text_auto_upload">Upload enkele gegevens of activeer auto upload!</string> <string name="file_list_folder">map</string> <string name="file_list_folders">mappen</string> <string name="file_list_file">bestand</string> @@ -133,14 +108,12 @@ <string name="filedetails_modified">Aangepast:</string> <string name="filedetails_download">Downloaden</string> <string name="filedetails_sync_file">Synchroniseren</string> - <string name="filedetails_renamed_in_upload_msg">Bestand is tijdens het uploaden hernoemd naar %1$s</string> - <string name="list_layout">Lijstoverzicht</string> <string name="action_share">Delen</string> <string name="common_yes">Ja</string> <string name="common_no">Nee</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Upload verwijderen</string> - <string name="common_retry_upload">Upload opnieuw proberen</string> + <string name="common_retry_upload">Opnieuw uploaden</string> <string name="common_cancel_sync">Synchronisatie annuleren</string> <string name="common_cancel">Annuleren</string> <string name="common_back">Terug</string> @@ -160,10 +133,10 @@ <string name="uploader_info_dirname">Mapnaam</string> <string name="uploader_upload_in_progress_ticker">Uploaden …</string> <string name="uploader_upload_in_progress_content">%1$d%% Uploaden van %2$s</string> - <string name="uploader_upload_succeeded_ticker">Uploaden gelukt </string> + <string name="uploader_upload_succeeded_ticker">Geüpload</string> <string name="uploader_upload_succeeded_content_single">%1$s geüpload</string> <string name="uploader_upload_failed_ticker">Uploaden mislukt</string> - <string name="uploader_upload_failed_content_single">Uploaden van %1$s kon niet voltooid worden</string> + <string name="uploader_upload_failed_content_single">Kon %1$s niet uploaden</string> <string name="uploader_upload_failed_credentials_error">Uploaden mislukt, je moet opnieuw inloggen</string> <string name="uploads_view_title">Uploads</string> <string name="uploads_view_group_current_uploads">Huidige</string> @@ -180,37 +153,32 @@ <string name="uploads_view_upload_status_failed_localfile_error">Lokaal bestand niet gevonden</string> <string name="uploads_view_upload_status_failed_permission_error">Permissiefout</string> <string name="uploads_view_upload_status_conflict">Conflict</string> - <string name="uploads_view_upload_status_service_interrupted">App werd gesloten</string> + <string name="uploads_view_upload_status_service_interrupted">App afgesloten</string> <string name="uploads_view_upload_status_unknown_fail">Onbekende fout</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Wachten op wifi-verbinding</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Wachten op Wi-Fi verbinding</string> <string name="uploads_view_later_waiting_to_upload">Wachten om te uploaden</string> <string name="downloader_download_in_progress_ticker">Downloaden …</string> <string name="downloader_download_in_progress_content">%1$d%% Downloaden van %2$s</string> - <string name="downloader_download_succeeded_ticker">Downloaden gelukt</string> + <string name="downloader_download_succeeded_ticker">Gedownload</string> <string name="downloader_download_succeeded_content">%1$s gedownload.</string> <string name="downloader_download_failed_ticker">Downloaden mislukt</string> - <string name="downloader_download_failed_content">Downloaden van %1$s kon niet worden voltooid</string> <string name="downloader_not_downloaded_yet">Nog niet gedownload</string> <string name="downloader_download_failed_credentials_error">Downloaden mislukt, je moet opnieuw inloggen</string> <string name="common_choose_account">Account kiezen</string> <string name="sync_fail_ticker">Synchronisatie mislukt</string> - <string name="sync_fail_ticker_unauthorized">Synchronisatie mislukt, je moet opnieuw inloggen</string> - <string name="sync_fail_content">Synchronisatie van %1$s kon niet worden voltooid</string> - <string name="sync_fail_content_unauthorized">Ongeldig wachtwoord voor %1$s</string> + <string name="sync_fail_content_unauthorized">Onjuist wachtwoord voor %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Conflicten gevonden</string> <string name="sync_conflicts_in_favourites_content">%1$d gesynchroniseerd te houden bestanden konden niet worden gesynchroniseerd</string> <string name="sync_fail_in_favourites_ticker">Gesynchroniseerd te houden bestanden mislukt</string> <string name="sync_fail_in_favourites_content">Inhoud van %1$d bestanden kon niet worden gesynchroniseerd (%2$d conflicten)</string> <string name="sync_foreign_files_forgotten_ticker">Een paar lokale bestanden werden vergeten</string> <string name="sync_foreign_files_forgotten_content">%1$d bestanden uit de %2$s-map konden niet worden gekopieerd naar</string> - <string name="sync_foreign_files_forgotten_explanation">Vanaf versie 1.3.16 worden bestanden die vanaf dit apparaat worden geüpload ook gekopieerd naar de lokale map %1$s om gegevensverlies te voorkomen als een enkel bestand wordt gesynchroniseerd met meerdere accounts.\n\nDoor deze aanpassing werden alle bestanden die met een eerdere versie zijn geüpload gekopieerd naar de map %2$s. Maar een fout voorkwam het succesvol afronden van deze actie tijdens het synchroniseren. Je kunt de/het bestand(en) laten staan zoals ze nu zijn en de link naar %3$s verwijderen, of je kunt de bestanden verplaatsen naar de map %1$s en de link naar %4$s laten staan.\n\nHieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar verwezen.</string> - <string name="sync_current_folder_was_removed">Map %1$s bestaat niet meer</string> + <string name="sync_current_folder_was_removed">Map %1$s bestaat niet meer</string> <string name="foreign_files_move">Alles verplaatsen</string> <string name="foreign_files_success">Alle bestanden zijn verplaatst</string> <string name="foreign_files_fail">Een paar bestanden konden niet worden verplaatst</string> <string name="foreign_files_local_text">Lokaal: %1$s</string> <string name="foreign_files_remote_text">Extern: %1$s</string> - <string name="upload_query_move_foreign_files">Er is niet genoeg ruimte om de geselecteerde bestanden te kopieren naar %1$s. Wilt u ze in plaats daarvan verplaatsen?</string> <string name="pass_code_enter_pass_code">Voer je toegangscode in</string> <string name="pass_code_configure_your_pass_code">Toegangscode invoeren</string> @@ -228,16 +196,8 @@ <string name="media_event_done">%1$s afspelen beëindigd</string> <string name="media_err_nothing_to_play">Geen mediabestand gevonden</string> <string name="media_err_no_account">Geen account opgegeven</string> - <string name="media_err_not_in_owncloud">Bestand niet in een geldig account</string> + <string name="media_err_not_in_owncloud">Het bestand hoort niet bij een geldig account</string> <string name="media_err_unsupported">Niet-ondersteunde mediacodec</string> - <string name="media_err_io">Mediabestand kon niet worden gelezen</string> - <string name="media_err_malformed">Mediabestand niet goed gecodeerd</string> - <string name="media_err_timeout">Time-out tijdens het spelen</string> - <string name="media_err_invalid_progressive_playback">Mediabestand kan niet worden gestreamd</string> - <string name="media_err_unknown">Mediabestand kan niet worden afgespeeld met de standaard mediaplayer</string> - <string name="media_err_security_ex">Beveiligingsfout bij afspelen %1$s</string> - <string name="media_err_io_ex">Invoerfout bij afspelen %1$1s</string> - <string name="media_err_unexpected">Onverwachte fout bij afspelen %1$s</string> <string name="media_rewind_description">Terugpoelknop</string> <string name="media_play_pause_description">Speel- of pauzeknop</string> <string name="media_forward_description">Doorspoelknop</string> @@ -249,31 +209,24 @@ <string name="auth_connection_established">Verbinding tot stand gebracht</string> <string name="auth_testing_connection">Verbinding testen</string> <string name="auth_not_configured_title">Foutieve serverconfiguratie</string> - <string name="auth_account_not_new">Er bestaat al een account voor deze gebruiker en server op dit apparaat</string> <string name="auth_account_not_the_same">De opgegeven gebruiker komt niet overeen met de gebruiker van dit account</string> <string name="auth_unknown_error_title">Onbekende fout opgetreden!</string> - <string name="auth_unknown_host_title">Kon host niet vinden</string> - <string name="auth_incorrect_path_title">Serverinstantie niet gevonden</string> + <string name="auth_unknown_host_title">Kon server niet vinden</string> + <string name="auth_incorrect_path_title">Server niet gevonden</string> <string name="auth_timeout_title">De server reageerde niet op tijd</string> - <string name="auth_incorrect_address_title">Verkeerd serveradresformaat</string> <string name="auth_ssl_general_error_title">SSL-initialisatie mislukt</string> - <string name="auth_ssl_unverified_server_title">Kon de identiteit van de SSL-server niet verifiëren</string> <string name="auth_bad_oc_version_title">Niet-herkende serverversie</string> - <string name="auth_wrong_connection_title">Kon verbinding niet tot stand brengen</string> <string name="auth_secure_connection">Veilige verbinding tot stand gebracht</string> <string name="auth_unauthorized">Verkeerde gebruikersnaam of wachtwoord</string> <string name="auth_oauth_error">Autorisatie niet succesvol</string> <string name="auth_oauth_error_access_denied">Toegang geweigerd door autorisatieserver</string> - <string name="auth_wtf_reenter_URL">Onverwachte toestand; voer nogmaals het serveradres in</string> <string name="auth_expired_oauth_token_toast">Je autorisatie is verstreken. Autoriseer opnieuw</string> <string name="auth_expired_basic_auth_toast">Voer het huidige wachtwoord in</string> <string name="auth_expired_saml_sso_token_toast">Je sessie is verstreken. Verbind opnieuw</string> - <string name="auth_connecting_auth_server">Verbinden met authenticatieserver …</string> <string name="auth_unsupported_auth_method">De server ondersteunt deze authenticatiemethode niet</string> <string name="auth_unsupported_multiaccount">%1$s ondersteunt het gebruik van meerdere accounts niet</string> - <string name="auth_fail_get_user_name">Je server geeft geen goede userid terug, neem contact op met je beheerder</string> <string name="auth_can_not_auth_against_server">Kan niet autenticeren tegen deze server</string> - <string name="auth_account_does_not_exist">Het account bestaat nog niet in dit apparaat</string> + <string name="auth_account_does_not_exist">Account bestaan nog niet op dit apparaat</string> <string name="favorite">Offline beschikbaar maken</string> <string name="unfavorite">Niet langer offline beschikbaar maken</string> @@ -282,28 +235,25 @@ <string name="common_rename">Hernoemen</string> <string name="common_remove">Verwijderen</string> <string name="confirmation_remove_file_alert">Wil je %1$s echt verwijderen?</string> - <string name="confirmation_remove_folder_alert">Wil je %1$s en de inhoud ervan werkelijk verwijderen?</string> <string name="confirmation_remove_local">Alleen lokaal</string> - <string name="remove_success_msg">Succesvol verwijderd</string> + <string name="remove_success_msg">Verwijderd</string> <string name="remove_fail_msg">Verwijderen mislukt</string> <string name="rename_dialog_title">Voer een nieuwe naam in</string> - <string name="rename_local_fail_msg">Lokale kopie kon niet worden hernoemd; probeer een andere naam</string> - <string name="rename_server_fail_msg">Hernoemen kon niet worden voltooid</string> - <string name="sync_file_fail_msg">Extern bestand kon niet worden gecontroleerd</string> + <string name="rename_server_fail_msg">Kon de server geen nieuwe naam geven</string> + <string name="sync_file_fail_msg">Kon extern bestand niet controleren</string> <string name="sync_file_nothing_to_do_msg">Bestandsinhoud is al gesynchroniseerd</string> - <string name="create_dir_fail_msg">Map kon niet worden aangemaakt</string> + <string name="create_dir_fail_msg">Kan map niet aanmaken</string> <string name="filename_forbidden_characters">Verboden tekens: / \\ < > : " | ? *</string> <string name="filename_forbidden_charaters_from_server">De bestandsnaam bevat ten minste één ongeldig teken</string> <string name="filename_empty">Bestandsnaam mag niet leeg zijn</string> - <string name="wait_a_moment">Even geduld</string> + <string name="wait_a_moment">Even geduld...</string> <string name="wait_checking_credentials">Opgeslagen inloggegevens nakijken</string> - <string name="filedisplay_unexpected_bad_get_content">Onverwacht probleem; probeer het bestand met een andere app te selecteren</string> - <string name="filedisplay_no_file_selected">Er werd geen bestand geselecteerd</string> + <string name="filedisplay_no_file_selected">Geen bestand geselecteerd</string> <string name="activity_chooser_title">Verstuur link naar …</string> <string name="wait_for_tmp_copy_from_private_storage">Bestand vanaf privéopslag kopiëren</string> <string name="oauth_check_onoff">Inloggen met oAuth2</string> - <string name="oauth_login_connection">Verbinden met oAuth2-server …</string> + <string name="oauth_login_connection">Verbinden met OAuth 2 server…</string> <string name="ssl_validator_header">De identiteit van de site kan niet worden gecontroleerd</string> <string name="ssl_validator_reason_cert_not_trusted">- Het servercertificaat wordt niet vertrouwd</string> @@ -311,7 +261,6 @@ <string name="ssl_validator_reason_cert_not_yet_valid">- Het servercertificaat is nog niet geldig</string> <string name="ssl_validator_reason_hostname_not_verified">- De URL komt niet overeen met de hostname in het certificaat</string> <string name="ssl_validator_question">Wil je dit certificaat alsnog vertrouwen?</string> - <string name="ssl_validator_not_saved">Het certificaat kon niet worden opgeslagen</string> <string name="ssl_validator_btn_details_see">Details</string> <string name="ssl_validator_btn_details_hide">Verbergen</string> <string name="ssl_validator_label_subject">Uitgegeven aan:</string> @@ -335,26 +284,25 @@ <string name="placeholder_sentence">Dit is een plaatshouder</string> <string name="placeholder_filename">plaatshouder.txt</string> - <string name="placeholder_filetype">PNG-afbeelding</string> + <string name="placeholder_filetype">PNG afbeelding</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">2012/05/18 12:23</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Alleen via wifi uploaden</string> - <string name="instant_upload_on_wifi">Afbeeldingen alleen via WiFi uploaden</string> - <string name="instant_video_upload_on_wifi">Videos alleen via WiFi uploaden</string> - <string name="instant_video_upload_on_charging">Alleen tijdens opladen uploaden</string> - <string name="instant_upload_on_charging">Alleen tijdens opladen uploaden</string> + <string name="auto_upload_on_wifi">Alleen uploaden via Wi-Fi</string> + <string name="instant_upload_on_wifi">Alleen afbeeldingen uploaden via Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Alleen video\'s uploaden via Wi-Fi</string> + <string name="instant_video_upload_on_charging">Alleen uploaden bij opladen</string> + <string name="instant_upload_on_charging">Alleen uploaden bij opladen</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Bestandsconflict</string> - <string name="conflict_message">Welke bestanden wil je bewaren? Als je beide versies selecteert zal het lokale bestand een volgnummer aan de naam toegevoegd krijgen.</string> <string name="conflict_keep_both">Beide bewaren</string> <string name="conflict_use_local_version">lokale versie</string> <string name="conflict_use_server_version">serverversie</string> - <string name="preview_sorry">Sorry hiervoor!</string> + <string name="preview_sorry">Sorry.</string> <string name="preview_image_description">Voorvertoning van afbeelding</string> - <string name="preview_image_error_unknown_format">Afbeelding kan niet worden getoond</string> + <string name="preview_image_error_unknown_format">Kan afbeelding niet tonen</string> <string name="error__upload__local_file_not_copied">%1$s kon niet worden gekopieerd naar de lokale map %2$s</string> <string name="prefs_instant_upload_path_title">Directe-uploadmap</string> @@ -363,7 +311,6 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Gebruik submappen</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Opslaan in submappen, gebaseerd op jaar en maand</string> - <string name="share_link_no_support_share_api">Sorry, delen is niet ingeschakeld op jouw server. Neem contact op met je beheerder.</string> <string name="share_link_file_no_exist">Kan dit niet delen. Controleer of dit bestand wel bestaat</string> <string name="share_link_file_error">Er trad een fout op bij je poging dit bestand of deze map te delen</string> <string name="unshare_link_file_no_exist">Kan delen niet beëindigen. Ga na of het bestand bestaat</string> @@ -377,56 +324,32 @@ <string name="copy_link">Link kopiëren</string> <string name="clipboard_text_copied">Gekopieerd naar het klembord</string> - <string name="clipboard_no_text_to_copy">Geen tekst ontvangen om te kopiëren naar het klembord</string> <string name="clipboard_uxexpected_error">Onverwachte fout bij het kopiëren naar het klembord</string> <string name="clipboard_label">Tekst gekopieerd uit %1$s</string> - <string name="error_cant_bind_to_operations_service">Kritieke fout: kan de acties niet uitvoeren</string> - - <string name="network_error_socket_exception">Er trad een fout op bij het verbinden met de server.</string> - <string name="network_error_socket_timeout_exception">Er trad een fout op bij het wachten op de server, de verwerking kon niet plaatsvinden</string> - <string name="network_error_connect_timeout_exception">Er trad een fout op bij het wachten op de server, de verwerking kon niet plaatsvinden</string> - <string name="network_host_not_available">De verwerking kon niet plaatsvinden, de server is niet beschikbaar</string> - <string name="forbidden_permissions">Je mist autorisatie %s</string> <string name="forbidden_permissions_rename">om dit bestand te hernoemen</string> <string name="forbidden_permissions_delete">om dit bestand te verwijderen</string> <string name="share_link_forbidden_permissions">om dit bestand te delen</string> <string name="unshare_link_forbidden_permissions">om dit bestand niet meer te delen</string> <string name="update_link_forbidden_permissions">om deze share bij te werken</string> - <string name="forbidden_permissions_create">om dit bestand te creëren</string> - <string name="uploader_upload_forbidden_permissions">om dit bestand in deze map te uploaden</string> <string name="downloader_download_file_not_found">Dit bestand is niet langer beschikbaar op de server</string> <string name="file_migration_dialog_title">Opslagpad bijwerken</string> <string name="file_migration_finish_button">Afronden</string> - <string name="file_migration_preparing">Voorbereiden van migratie …</string> <string name="file_migration_checking_destination">Doelmap controleren …</string> - <string name="file_migration_saving_accounts_configuration">Accountconfiguratie opslaan …</string> - <string name="file_migration_waiting_for_unfinished_sync">Wachten op onvoltooide synchronisaties …</string> <string name="file_migration_migrating">Gegevens verplaatsen …</string> <string name="file_migration_updating_index">Index bijwerken …</string> <string name="file_migration_cleaning">Opruimen …</string> - <string name="file_migration_restoring_accounts_configuration">Accountconfiguratie herstellen …</string> <string name="file_migration_ok_finished">Afgerond</string> - <string name="file_migration_failed_not_enough_space">FOUT: Niet genoeg ruimte</string> - <string name="file_migration_failed_not_writable">FOUT: Bestand niet beschrijfbaar</string> - <string name="file_migration_failed_not_readable">FOUT: Bestand niet leesbaar</string> <string name="file_migration_failed_dir_already_exists">FOUT: Nextcloudmap bestaat al</string> - <string name="file_migration_failed_while_coping">FOUT: Tijdens migratie</string> - <string name="file_migration_failed_while_updating_index">FOUT: Tijdens bijwerken index</string> - - <string name="file_migration_directory_already_exists">Gegevensmap bestaat al, wat te doen?</string> - <string name="file_migration_override_data_folder">Overschrijven</string> - <string name="file_migration_use_data_folder">Bestaande gebruiken</string> + <string name="file_migration_override_data_folder">Vervangen</string> + <string name="file_migration_use_data_folder">Gebruiken</string> <string name="prefs_category_accounts">Accounts</string> <string name="prefs_add_account">Account toevoegen</string> <string name="drawer_manage_accounts">Accounts beheren </string> - <string name="auth_redirect_non_secure_connection_title">De beveiligde verbinding is omgeleid via een onveilige route.</string> - - <string name="actionbar_logger">Logs</string> + <string name="actionbar_logger">Logs</string> <string name="log_send_history_button">Geschiedenis versturen</string> - <string name="log_send_no_mail_app">Geen applicatie gevonden voor het versturen van de logs. Installeer een e-mailapplicatie.</string> <string name="log_send_mail_subject">%1$s-Android-app-logs</string> <string name="log_progress_dialog_text">Gegevens laden …</string> @@ -434,27 +357,20 @@ <string name="saml_authentication_wrong_pass">Onjuist wachtwoord</string> <string name="actionbar_move">Verplaatsen</string> <string name="actionbar_copy">Kopiëren</string> - <string name="file_list_empty_moving">Het is hier leeg. Je kan een map toevoegen!</string> <string name="folder_picker_choose_button_text">Kiezen</string> - <string name="move_file_not_found">Kan niet verplaatsen. Ga na of het bestand wel bestaat</string> - <string name="move_file_invalid_into_descendent">De map kan niet naar een onderliggende map worden verplaatst</string> - <string name="move_file_invalid_overwrite">Het bestand bestaat al in de doelmap</string> <string name="move_file_error">Er trad een fout op bij het verplaatsen van dit bestand of deze map</string> <string name="forbidden_permissions_move">om dit bestand te verplaatsen</string> <string name="copy_file_not_found">Kan niet kopiëren. Ga na of het bestand wel bestaat</string> - <string name="copy_file_invalid_into_descendent">Een map kan niet naar een onderliggende map worden gekopieerd</string> - <string name="copy_file_invalid_overwrite">Het bestand bestaat al in de doelmap</string> <string name="copy_file_error">Er trad een fout op bij het kopiëren van dit bestand of deze map</string> <string name="forbidden_permissions_copy">om dit bestand te kopiëren</string> <string name="prefs_category_instant_uploading">Direct uploaden</string> <string name="prefs_category_details">Details</string> - <string name="prefs_instant_video_upload_path_title">Directe-uploadmap voor video\'s</string> - <string name="sync_folder_failed_content">Synchronisatie van map %1$s kon niet worden voltooid</string> + <string name="sync_folder_failed_content">Synchronisatie van map %1$s kon niet worden voltooid</string> <string name="shared_subject_header">gedeeld</string> <string name="with_you_subject_header">met jou</string> @@ -495,7 +411,6 @@ <string name="share_add_user_or_group">Voeg gebruiker of groep toe</string> <string name="share_via_link_section_title">Deel link</string> <string name="share_via_link_expiration_date_label">Stel vervaldatum in</string> - <string name="share_via_link_password_label">Beveilig met wachtwoord</string> <string name="share_via_link_password_title">Beveiligd</string> <string name="share_via_link_edit_permission_label">Bewerken toestaan</string> <string name="share_via_link_hide_file_listing_permission_label">Verberg bestandsoverzicht</string> @@ -511,7 +426,6 @@ <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( op %2$s )</string> - <string name="share_sharee_unavailable">Helaas, je serverversie staat niet toe om binnen clients te delen met gebruikers.\nNeem contact op met je beheerder</string> <string name="share_privilege_can_share">kan delen</string> <string name="share_privilege_can_edit">kan bewerken</string> <string name="share_privilege_can_edit_create">creëer</string> @@ -520,50 +434,37 @@ <string name="edit_share_unshare">Stop met delen</string> <string name="edit_share_done">gedaan</string> - <string name="action_retry_uploads">Mislukte opnieuw proberen</string> <string name="action_clear_failed_uploads">Mislukte opschonen</string> - <string name="action_clear_successful_uploads">Gelukte opschonen</string> - <string name="action_clear_finished_uploads">Alle voltoooide opschonen</string> - <string name="action_switch_grid_view">Rasterindeling </string> <string name="action_switch_list_view">Lijstindeling</string> <string name="manage_space_title">Beheer ruimte</string> - <string name="manage_space_description">Instellingen, database en servercertificaten van de data van %1$s zullen permanent worden verwijderd. \n\nGedownloade bestanden blijven onaangeroerd.\n\nDit proces kan even duren.</string> <string name="manage_space_clear_data">Gegevens verwijderen</string> <string name="manage_space_error">Sommige bestanden konden niet worden verwijderd</string> - <string name="permission_storage_access">Aanvullende permessies vereist voor het uploaden en downloaden van bestanden.</string> - <string name="local_file_not_found_toast">Het bestand is niet te vinden binnen het lokale bestandssysteem.</string> <string name="confirmation_remove_files_alert">Wil je de geselecteerde objecten echt verwijderen?</string> <string name="confirmation_remove_folders_alert">Wil je de geselecteerde objecten en hun inhoud echt verwijderen?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Wachten to apparaat wordt opgeladen</string> <string name="actionbar_search">Zoeken</string> <string name="files_drop_not_supported">Dit is een Nextcloud-optie, gelieve te updaten.</string> <string name="learn_more">Meer weten</string> <string name="drawer_folder_sync">Automatisch uploaden</string> <string name="drawer_participate">Meedoen</string> - <string name="participate_testing_headline">Help ons testen</string> - <string name="participate_testing_bug_text">Foutje gevonden? Of iets raars?</string> + <string name="participate_testing_headline">Help bij testen</string> + <string name="participate_testing_bug_text">Bug gevonden? Rare dingen?</string> <string name="participate_testing_report_text">Meld het op Github</string> - <string name="participate_testing_version_text">Geïnteresseerd om ons te helpen de volgende versie te testen?</string> <string name="participate_beta_headline">Test de dev versie</string> - <string name="participate_beta_text">Dit omvat alle komende opties en is zeer \'bleeding edge\'. Bugs/fouten kunnen voorkomen en in dat geval vragen we je die aan ons te melden.</string> <string name="participate_release_candidate_headline">Release candidate</string> - <string name="participate_release_candidate_text">De Release Candidate (RC) is een kopie van de komende release en zou stabiel moeten zijn. Testen van jouw installatie kan ons helpen om dit te bevestigen. Meld je aan om te testen op de Play Store of bekijk handmatig de \"versies\"-sectie op F-Droid.</string> <string name="participate_contribute_headline">Actief meedoen</string> <string name="participate_contribute_irc_text">Doe mee met de chat op IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Help andere gebruikers in de <a href="%1$s">forums</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Vertaal</a> de app</string> - <string name="participate_contribute_github_text">Doe mee als ontwikkelaar, zie <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> voor details</string> + <string name="participate_contribute_github_text">Review, voeg toe en schrijf code, bekijk <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> voor details</string> <string name="move_to">Verplaats naar …</string> <string name="copy_to">Kopieer naar …</string> <string name="choose_remote_folder">Kies map …</string> <string name="folder_sync_loading_folders">Mappen laden …</string> <string name="folder_sync_no_results">Geen mediamappen gevonden.</string> - <string name="folder_sync_preferences">Voorkeuren voor automatisch uploaden</string> <string name="folder_sync_settings">Instellingen</string> - <string name="folder_sync_new_info">Direct uploaden is helemaal herzien. Bekijk het hoofdmenu en herconfigureer je auto-uploadfunctie. Onze excuses voor het ongemak.\n\nVeel plezier met de nieuwe en meer uitgebreide auto-upload-mogelijkheden!</string> <string name="folder_sync_preferences_folder_path">Voor %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d geselecteerd</item> @@ -577,7 +478,6 @@ <string name="notifications_no_results_headline">Geen meldingen</string> <string name="notifications_no_results_message">Controleer later opnieuw.</string> - <string name="upload_file_dialog_title">Opgeven upload bestandsnaam en bestandstype</string> <string name="upload_file_dialog_filename">Bestandsnaam</string> <string name="upload_file_dialog_filetype">Bestandstype</string> <string name="upload_file_dialog_filetype_snippet_text">Snippet tekstbestand(.txt)</string> @@ -593,8 +493,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Een veilige plek voor al je gegevens</string> - <string name="welcome_feature_1_text">Benader, deel & beveilig je gegevens thuis en binnen je organisatie</string> - <string name="welcome_feature_2_title">Meerdere accounts</string> <string name="welcome_feature_2_text">Verbind met al je clouds</string> @@ -618,23 +516,17 @@ <!-- Activities --> <string name="activities_no_results_headline">Nog geen activiteit</string> - <string name="activities_no_results_message">Deze stream laat gebeurtenissen zoals\ntoevoegingen, veranderingen & gedeelde bestanden zien</string> <string name="webview_error">Er heeft zich een fout voorgedaan</string> <string name="prefs_category_about">Over</string> - <string name="actionbar_contacts">Contactpersonen backup</string> - <string name="contacts_backup_button">Nu backupppen</string> + <string name="contacts_backup_button">Nu</string> <string name="contacts_restore_button">Herstel de laatste backup</string> <string name="contacts_header_restore">Herstellen</string> <string name="contacts_header_backup">Backuppen</string> <string name="contacts_automatic_backup">Contactpersonen backup</string> <string name="contacts_last_backup">Laatsts backup</string> - <string name="contacts_read_permission">Leesrechten voor contactpersonen vereist</string> - <string name="contacts_write_permission">Schrijfrechten voor contactpersonen vereist</string> <string name="contactlist_title">Herstellen contactpersonen</string> <string name="contaclist_restore_selected">Herstel de geselecteerde contactpersonen</string> - <string name="contactlist_account_chooser_title">Kies een account voor import</string> - <string name="contactlist_no_permission">Geen permissies, niets geïnporteerd!</string> <string name="contacts_preference_choose_date">Kies datum</string> <string name="contacts_preference_backup_never">nooit</string> <string name="contacts_preferences_no_file_found">Geen bestand gevonden</string> @@ -643,6 +535,7 @@ <!-- Notifications --> <string name="new_notification_received">Nieuwe meldingen ontvangen</string> + <string name="drawer_logout">Uitloggen</string> </resources> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index f2d7de2e20..07f1ced923 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -283,7 +283,6 @@ <string name="common_rename">Renomear</string> <string name="common_remove">Excluir</string> <string name="confirmation_remove_file_alert">Deseja realmente excluir %1$s?</string> - <string name="confirmation_remove_folder_alert">Quer realmente excluir %1$s de seu conteúdo?</string> <string name="confirmation_remove_local">Somente local</string> <string name="remove_success_msg">Excluído</string> <string name="remove_fail_msg">Erro ao excluir</string> From 13ddc014675c3a2de62ea1996ed2003babd4f7bd Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Sun, 30 Apr 2017 13:02:31 +0200 Subject: [PATCH 830/881] NPE during Activity orientation change --- .../android/ui/activity/ActivitiesListActivity.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java b/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java index 0b22e2e40f..59767dd4fb 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java @@ -51,8 +51,8 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.activities.GetRemoteActivitiesOperation; import com.owncloud.android.ui.adapter.ActivityListAdapter; -import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.AnalyticsUtils; +import com.owncloud.android.utils.DisplayUtils; import java.io.IOException; import java.util.ArrayList; @@ -74,10 +74,8 @@ public class ActivitiesListActivity extends FileActivity { @BindView(R.id.empty_list_view) public LinearLayout emptyContentContainer; - @BindView(R.id.swipe_containing_list) public SwipeRefreshLayout swipeListRefreshLayout; - @BindView(R.id.swipe_containing_empty) public SwipeRefreshLayout swipeEmptyListRefreshLayout; @BindView(R.id.empty_list_view_text) @@ -111,9 +109,13 @@ public class ActivitiesListActivity extends FileActivity { setContentView(R.layout.activity_list_layout); unbinder = ButterKnife.bind(this); + // setup toolbar setupToolbar(); + swipeEmptyListRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_containing_empty); + swipeListRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_containing_list); + // setup drawer setupDrawer(R.id.nav_activity); getSupportActionBar().setTitle(getString(R.string.drawer_item_activities)); @@ -197,8 +199,7 @@ public class ActivitiesListActivity extends FileActivity { RemoteOperation getRemoteNotificationOperation = new GetRemoteActivitiesOperation(); Log_OC.d(TAG, "BEFORE getRemoteActivitiesOperation.execute"); - final RemoteOperationResult result = - getRemoteNotificationOperation.execute(mClient); + final RemoteOperationResult result = getRemoteNotificationOperation.execute(mClient); if (result.isSuccess() && result.getData() != null) { final ArrayList<Object> activities = result.getData(); From a7eab02d088d7b57bbb5b9f6188a3a16dc4d6df6 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Sun, 30 Apr 2017 19:40:27 +0200 Subject: [PATCH 831/881] Fix codacy stuff --- .../owncloud/android/datamodel/ArbitraryDataProvider.java | 5 +++-- .../android/ui/activity/ContactsPreferenceActivity.java | 3 --- .../ui/fragment/contactsbackup/ContactsBackupFragment.java | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java index 4dc4111959..9ea88704dc 100644 --- a/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java +++ b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java @@ -1,9 +1,10 @@ /** * Nextcloud Android client application - * <p> + * * Copyright (C) 2017 Tobias Kaminsky + * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Nextcloud. - * <p> + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index b69304a154..3a062faadc 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -33,7 +33,6 @@ import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; import com.owncloud.android.R; -import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.services.ContactsBackupJob; @@ -56,8 +55,6 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag public static final String PREFERENCE_CONTACTS_AUTOMATIC_BACKUP = "PREFERENCE_CONTACTS_AUTOMATIC_BACKUP"; public static final String PREFERENCE_CONTACTS_LAST_BACKUP = "PREFERENCE_CONTACTS_LAST_BACKUP"; - private ArbitraryDataProvider arbitraryDataProvider; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index ce709d54ea..150826763a 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -117,7 +117,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC)) { + if (checkAndAskForContactsReadPermission()) { if (isChecked) { setAutomaticBackup(true); } else { @@ -243,7 +243,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi @OnClick(R.id.contacts_backup_now) public void backupContacts() { - if (checkAndAskForContactsReadPermission(PermissionUtil.PERMISSIONS_READ_CONTACTS_MANUALLY)) { + if (checkAndAskForContactsReadPermission()) { startContactsBackupJob(); } } @@ -284,7 +284,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi String.valueOf(bool)); } - private boolean checkAndAskForContactsReadPermission(final int permission) { + private boolean checkAndAskForContactsReadPermission() { final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); // check permissions From e44a5d690ccc9472c1259fba391965c3b9a1aa1b Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Mon, 1 May 2017 00:21:49 +0000 Subject: [PATCH 832/881] [tx-robot] updated from transifex --- src/main/res/values-cs-rCZ/strings.xml | 210 +++++++++---------------- src/main/res/values-de-rDE/strings.xml | 2 +- src/main/res/values-de/strings.xml | 2 +- src/main/res/values-el/strings.xml | 162 +++---------------- src/main/res/values-es-rMX/strings.xml | 1 - src/main/res/values-fr/strings.xml | 52 +++++- src/main/res/values-nb-rNO/strings.xml | 1 - src/main/res/values-nl/strings.xml | 52 +++++- src/main/res/values-pt-rBR/strings.xml | 2 +- src/main/res/values-zh-rCN/strings.xml | 172 ++------------------ 10 files changed, 213 insertions(+), 443 deletions(-) diff --git a/src/main/res/values-cs-rCZ/strings.xml b/src/main/res/values-cs-rCZ/strings.xml index 03aa07a1d9..5c9c7c90a6 100644 --- a/src/main/res/values-cs-rCZ/strings.xml +++ b/src/main/res/values-cs-rCZ/strings.xml @@ -13,10 +13,24 @@ <string name="actionbar_send_file">Odeslat</string> <string name="actionbar_sort">Seřadit</string> <string name="actionbar_sort_title">Seřadit podle</string> + <string name="sort_by">Řadit podle</string> + <string name="menu_item_sort_by_name_a_z">A - Z</string> + <string name="menu_item_sort_by_name_z_a">Z - A</string> + <string name="menu_item_sort_by_date_newest_first">První nejnovější</string> + <string name="menu_item_sort_by_date_oldest_first">První nejstarší</string> + <string name="menu_item_sort_by_size_biggest_first">První největší</string> <string name="drawer_item_all_files">Všechny soubory</string> + <string name="drawer_item_home">Domů</string> + <string name="drawer_item_favorites">Oblíbené</string> + <string name="drawer_item_photos">Fotky</string> <string name="drawer_item_on_device">Na přístroji</string> + <string name="drawer_item_recently_added">Nedávno přidané</string> + <string name="drawer_item_recently_modified">Nedávno změněné</string> + <string name="drawer_item_shared">Sdíleno</string> <string name="drawer_item_settings">Nastavení</string> <string name="drawer_item_uploads_list">Nahrání</string> + <string name="drawer_item_activities">Aktivity</string> + <string name="drawer_item_notifications">Upozornění</string> <string name="drawer_quota">%1$s z %2$s použito</string> <string name="drawer_close">Zavřít</string> <string name="drawer_open">Otevřít</string> @@ -25,11 +39,9 @@ <string name="prefs_accounts">Účty</string> <string name="prefs_manage_accounts">Spravovat účty</string> <string name="prefs_passcode">Zámek bezpečnostního kódu</string> + <string name="prefs_fingerprint">Zámek otiskemprstu</string> + <string name="prefs_fingerprint_notsetup">Nebyly nastaveny žádné otisky prstů.</string> <string name="prefs_show_hidden_files">Zobrazit skryté soubory</string> - <string name="prefs_instant_upload">Okamžité nahrávání obrázků</string> - <string name="prefs_instant_upload_summary">Okamžitě nahrávat vytvořené fotografie</string> - <string name="prefs_instant_video_upload">Okamžité nahrávání videa</string> - <string name="prefs_instant_video_upload_summary">Okamžitě odesílat nahrané video</string> <string name="prefs_log_title">Povolit logování</string> <string name="prefs_log_summary">Použito k zaznamenávání problémů</string> <string name="prefs_log_title_history">Historie logu</string> @@ -38,23 +50,15 @@ <string name="prefs_calendar_contacts">Synchronizovat kalendář & kontakty</string> <string name="prefs_calendar_contacts_summary">Nastavit DAVdroid (v1.3.0+) pro aktuální účet</string> <string name="prefs_calendar_contacts_address_resolve_error">Počítačová adresa konta pro DAVdroid nebyla nalezena</string> - <string name="prefs_calendar_contacts_no_store_error">Nenainstalován Google Play store nebo F-Droid app</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Synchronizace kalendáře & kontaktů úspěšně dokončena</string> <string name="prefs_help">Nápověda</string> - <string name="prefs_recommend">Doporučit přátelům</string> <string name="prefs_feedback">Odezva</string> <string name="prefs_imprint">Imprint</string> <string name="prefs_remember_last_share_location">Zapamatovat umístění sdílení</string> - <string name="prefs_remember_last_upload_location_summary">Zapamatovat poslední umístění pro nahrání sdílených souborů</string> - - <string name="recommend_subject">Zkuste %1$s na svém chytrém telefonu!</string> - <string name="recommend_text">Chtěl bych vás pozvat k používání %1$s na vašem chytrém telefonu!\nKe stažení zde: %2$s</string> - - <string name="auth_check_server">Ověřit server</string> + <string name="recommend_subject">Zkuste %1$s na svém chytrém telefonu!</string> + <string name="auth_check_server">Ověřit server</string> <string name="auth_host_url">Adresa serveru https://...</string> <string name="auth_username">Uživatelské jméno</string> <string name="auth_password">Heslo</string> - <string name="auth_register">Ještě nemáte server?\nKlikněte sem a získejte ho od poskytovatele</string> <string name="sync_string_files">Soubory</string> <string name="setup_btn_connect">Připojit</string> <string name="uploader_btn_upload_text">Nahrát</string> @@ -66,24 +70,18 @@ <string name="uploader_error_title_no_file_to_upload">Žádný soubor k nahrání</string> <string name="uploader_error_message_received_piece_of_text">%1$s neumí nahrát text jako soubor.</string> <string name="uploader_error_message_no_file_to_upload">Obdržená data neobsahují žádný platný soubor.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Soubor nelze nahrát</string> <string name="uploader_error_message_read_permission_not_granted">%1$s nemá oprávnění číst přijatý soubor</string> - <string name="uploader_error_message_source_file_not_found">Soubor k nahrání nebyl v tomto umístění nalezen. Zkontrolujte prosím zda soubor existuje.</string> - <string name="uploader_error_message_source_file_not_copied">Došlo k chybě při kopírování souboru do dočasného adresáře. Zkuste prosím zopakovat odeslání.</string> <string name="uploader_upload_files_behaviour">Nahrát možnost:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Přesunout soubor do Nextcloud adresáře</string> <string name="uploader_upload_files_behaviour_only_upload">Jen uploadovat</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Uploadovat a vymazat ze zdroje</string> <string name="file_list_seconds_ago">před pár sekundami</string> - <string name="file_list_empty_headline">Nejsou zde žádné soubory</string> - <string name="file_list_empty">Nahrajte nějaký obsah, nebo synchronizujte s vašimi zařízeními!</string> <string name="file_list_loading">Načítání…</string> - <string name="file_list_no_app_for_file_type">Pro tento typ souboru nebyla nalezena aplikace!</string> <string name="local_file_list_empty">V tomto adresáři nejsou žádné soubory.</string> <string name="file_list_empty_headline_search">V této složce nebylo nic nalezeno</string> - <string name="file_list_empty_search">Zkusit hledat v jiné složce?</string> + <string name="file_list_empty_headline_server_search">Žádné výsledky</string> + <string name="file_list_empty_favorite_headline">Zatím není nic oblíbeno</string> <string name="upload_list_empty_headline">Nic k nahrání</string> - <string name="upload_list_empty_text">Nahrajte nějaký obsah, nebo aktivujte okamžité nahrání!</string> <string name="file_list_folder">adresář</string> <string name="file_list_folders">adresářů</string> <string name="file_list_file">soubor</string> @@ -95,14 +93,12 @@ <string name="filedetails_modified">Upraven:</string> <string name="filedetails_download">Stáhnout</string> <string name="filedetails_sync_file">Synchronizovat</string> - <string name="filedetails_renamed_in_upload_msg">Soubor byl v průběhu odesílání přejmenován na %1$s</string> - <string name="list_layout">Náhled seznamu</string> + <string name="filedetails_renamed_in_upload_msg">Soubor byl během nahrávání přejmenován na %1$s</string> <string name="action_share">Sdílet</string> <string name="common_yes">Ano</string> <string name="common_no">Ne</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Odstranit nahrávání</string> - <string name="common_retry_upload">Opakovat nahrání</string> <string name="common_cancel_sync">Zrušit synchronizaci</string> <string name="common_cancel">Zrušit</string> <string name="common_back">Zpět</string> @@ -122,10 +118,10 @@ <string name="uploader_info_dirname">Název adresáře</string> <string name="uploader_upload_in_progress_ticker">Odesílám …</string> <string name="uploader_upload_in_progress_content">%1$d%% Odesílám %2$s</string> - <string name="uploader_upload_succeeded_ticker">Odesílání úspěšné</string> + <string name="uploader_upload_succeeded_ticker">Nahráno</string> <string name="uploader_upload_succeeded_content_single">%1$s nahráno</string> <string name="uploader_upload_failed_ticker">Odesílání selhalo</string> - <string name="uploader_upload_failed_content_single">Odesílání %1$s nemohlo být dokončeno</string> + <string name="uploader_upload_failed_content_single">Nepodařilo se nahrát %1$s</string> <string name="uploader_upload_failed_credentials_error">Nahrání selhalo, je třeba se znovu přihlásit</string> <string name="uploads_view_title">Nahrání</string> <string name="uploads_view_group_current_uploads">Aktuální</string> @@ -142,37 +138,32 @@ <string name="uploads_view_upload_status_failed_localfile_error">Místní soubor nenalezen</string> <string name="uploads_view_upload_status_failed_permission_error">Chyba oprávnění</string> <string name="uploads_view_upload_status_conflict">Konflikt</string> - <string name="uploads_view_upload_status_service_interrupted">Aplikace byla ukončena</string> + <string name="uploads_view_upload_status_service_interrupted">Aplikace ukončena</string> <string name="uploads_view_upload_status_unknown_fail">Neznámá chyba</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Čekání na wifi připojení</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Čeká se na Wi-Fi připojení</string> <string name="uploads_view_later_waiting_to_upload">Čekání na nahrávání</string> <string name="downloader_download_in_progress_ticker">Stahuji …</string> <string name="downloader_download_in_progress_content">%1$d%% Stahuji %2$s</string> - <string name="downloader_download_succeeded_ticker">Stažení úspěšné</string> + <string name="downloader_download_succeeded_ticker">Staženo</string> <string name="downloader_download_succeeded_content">%1$s staženo</string> <string name="downloader_download_failed_ticker">Stažení selhalo</string> - <string name="downloader_download_failed_content">Stažení %1$s nemohlo být dokončeno</string> + <string name="downloader_download_failed_content">Nepodařilo se stáhnout %1$s</string> <string name="downloader_not_downloaded_yet">Ještě nestaženo</string> <string name="downloader_download_failed_credentials_error">Stažení selhalo, je třeba se znovu přihlásit</string> <string name="common_choose_account">Vybrat účet</string> <string name="sync_fail_ticker">Synchronizace selhala</string> - <string name="sync_fail_ticker_unauthorized">Synchronizace selhala, je třeba se znovu přihlásit</string> - <string name="sync_fail_content">Synchronizace %1$s nemohla být dokončena</string> - <string name="sync_fail_content_unauthorized">Chybné heslo pro %1$s</string> + <string name="sync_fail_ticker_unauthorized">Synchronizace se nezdařila, musíte se znovu přihlásit.</string> <string name="sync_conflicts_in_favourites_ticker">Nalezeny konflikty</string> <string name="sync_conflicts_in_favourites_content">%1$d souborů z automatické synchronizace nelze synchronizovat</string> <string name="sync_fail_in_favourites_ticker">Automatická synchronizace souborů selhala</string> <string name="sync_fail_in_favourites_content">Obsah %1$d souborů nemohl být synchronizován (počet konfliktů: %2$d)</string> <string name="sync_foreign_files_forgotten_ticker">Některé místní soubory byly zapomenuty</string> <string name="sync_foreign_files_forgotten_content">%1$d souborů z %2$s adresáře se nepodařilo zkopírovat do</string> - <string name="sync_foreign_files_forgotten_explanation">Od verze 1.3.16 jsou soubory nahrané z tohoto zařízení kopírovány do místního adresáře %1$s, aby se zabránilo ztrátě dat při synchronizaci jednoho souboru s více účty.\n\nVšechny soubory nahrané předchozími verzemi aplikace byly z tohoto důvodu překopírovány do adresáře %2$s. Bohužel se objevila chyba zabraňující dokončení této operace v průběhu synchronizace účtu. Buď můžete soubor(y) ponechat jak jsou a odebrat odkaz do adresáře %3$s, nebo přesunout soubor(y) do adresáře %1$s a zachovat odkaz na %4$s.\n\nNíže je seznam místních i vzdálených souborů v adresáři %5$s, do kterého byly odkázány.</string> - <string name="sync_current_folder_was_removed">Adresář %1$s již neexistuje</string> <string name="foreign_files_move">Přesunout vše</string> <string name="foreign_files_success">Všechny soubory byly přesunuty</string> <string name="foreign_files_fail">Některé soubory nebylo možno přesunout</string> <string name="foreign_files_local_text">Místní: %1$s</string> <string name="foreign_files_remote_text">Vzdálené: %1$s</string> - <string name="upload_query_move_foreign_files">Pro zkopírování vybraných souborů do %1$s adresáře není dostatek volného místa. Chcete je místo toho přesunout?</string> <string name="pass_code_enter_pass_code">Zadejte prosím svůj bezpečnostní kód</string> <string name="pass_code_configure_your_pass_code">Zadejte svůj bezpečnostní kód</string> @@ -190,16 +181,10 @@ <string name="media_event_done">%1$s přehrávání dokončeno</string> <string name="media_err_nothing_to_play">Nenalezen žádný multimediální soubor</string> <string name="media_err_no_account">Neposkytnut žádný účet</string> - <string name="media_err_not_in_owncloud">Soubor není v platném účtu</string> <string name="media_err_unsupported">Nepodporovaný kodek</string> - <string name="media_err_io">Multimediální soubor nelze přečíst</string> - <string name="media_err_malformed">Multimediální soubor není správně kódován</string> - <string name="media_err_timeout">Vypršel čas při pokusu o přehrání</string> - <string name="media_err_invalid_progressive_playback">Multimediální soubor nelze proudově odesílat</string> - <string name="media_err_unknown">Multimediální soubor nemůže být přehrán s výchozím přehrávačem</string> - <string name="media_err_security_ex">Chyba zabezpečení při pokusu o přehrání %1$s</string> - <string name="media_err_io_ex">Chyba vstupu při pokusu o přehrání %1$s</string> - <string name="media_err_unexpected">Neočekávaná chyba při pokusu o přehrání %1$s</string> + <string name="media_err_io">Nepodařilo se přečíst soubor médií</string> + <string name="media_err_malformed">Soubor médií má neplatné kódování</string> + <string name="media_err_security_ex">Při pokusu o přehrání %1$s došlo k bezpečnostní chybě</string> <string name="media_rewind_description">Tlačítko Přetočit</string> <string name="media_play_pause_description">Tlačítko Přehrát/Pozastavit</string> <string name="media_forward_description">Tlačítko Rychle vpřed</string> @@ -211,67 +196,50 @@ <string name="auth_connection_established">Spojení navázáno</string> <string name="auth_testing_connection">Testuje se připojení</string> <string name="auth_not_configured_title">Neplatné nastavení serveru</string> - <string name="auth_account_not_new">Účet pro stejného uživatele a server již v zařízení existuje</string> <string name="auth_account_not_the_same">Zadaný uživatel neodpovídá uživateli tohoto účtu</string> <string name="auth_unknown_error_title">Nastala neznámá chyba</string> - <string name="auth_unknown_host_title">Nelze najít hostitele</string> - <string name="auth_incorrect_path_title">Instance serveru nenalezena</string> + <string name="auth_incorrect_path_title">Server nenalezen</string> <string name="auth_timeout_title">Serveru trvalo příliš dlouho odpovědět</string> - <string name="auth_incorrect_address_title">Chybný formát adresy serveru</string> <string name="auth_ssl_general_error_title">Inicializace SSL selhala</string> - <string name="auth_ssl_unverified_server_title">Nemohu ověřit SSL identitu serveru</string> <string name="auth_bad_oc_version_title">Nerozpoznaná verze serveru</string> - <string name="auth_wrong_connection_title">Nemohu navázat spojení</string> <string name="auth_secure_connection">Zabezpečené spojení navázáno</string> <string name="auth_unauthorized">Chybné přihlašovací jméno nebo heslo</string> <string name="auth_oauth_error">Neúspěšné přihlášení</string> <string name="auth_oauth_error_access_denied">Přístup zamítnut autorizačním serverem</string> - <string name="auth_wtf_reenter_URL">Neočekávaný stav; zadejte prosím znovu adresu serveru</string> <string name="auth_expired_oauth_token_toast">Vaše přihlášení vypršelo. Přihlaste se prosím znovu</string> <string name="auth_expired_basic_auth_toast">Zadejte prosím aktuální heslo</string> <string name="auth_expired_saml_sso_token_toast">Vaše přihlášení vypršelo. Přihlaste se prosím znovu</string> - <string name="auth_connecting_auth_server">Připojování k ověřovacímu serveru ...</string> <string name="auth_unsupported_auth_method">Server nepodporuje tuto přihlašovací metodu</string> <string name="auth_unsupported_multiaccount">%1$s nepodporuje více účtů</string> - <string name="auth_fail_get_user_name">Váš server nevrací správné přihlašovací ID, kontaktujte prosím svého správce systému</string> <string name="auth_can_not_auth_against_server">Na tomto serveru nelze ověřit</string> - <string name="auth_account_does_not_exist">V zařízení není zatím nastaven účet</string> - <string name="favorite">Nastavit jako dostupné offline</string> <string name="unfavorite">Zrušit nastavení dostupnosti offline</string> + <string name="favorite_real">Nastavit jako oblíbené</string> + <string name="unset_favorite_real">Zrušit jako oblíbené</string> <string name="common_rename">Přejmenovat</string> <string name="common_remove">Odstranit</string> <string name="confirmation_remove_file_alert">Opravdu chcete odstranit %1$s?</string> - <string name="confirmation_remove_folder_alert">Opravdu chcete odstranit %1$s a jeho obsah?</string> <string name="confirmation_remove_local">Pouze místní</string> - <string name="remove_success_msg">Úspěšně odstraněno</string> + <string name="remove_success_msg">Odstraněno</string> <string name="remove_fail_msg">Odstranění nelze dokončit</string> <string name="rename_dialog_title">Zadejte nový název</string> - <string name="rename_local_fail_msg">Místní kopii nelze přejmenovat, zkuste jiný nový název</string> - <string name="rename_server_fail_msg">Přejmenování nelze dokončit</string> - <string name="sync_file_fail_msg">Vzdálený soubor nemohl být zkontrolován</string> + <string name="sync_file_fail_msg">Nepodařilo se zkontrolovat vzdálený soubor</string> <string name="sync_file_nothing_to_do_msg">Obsah souboru je již synchronizován</string> - <string name="create_dir_fail_msg">Adresář nemohl být vytvořen</string> + <string name="create_dir_fail_msg">Nepodařilo se vytvořit složku</string> <string name="filename_forbidden_characters">Zakázané znaky: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Jméno souboru obsahuje aelspoň jeden neplatný znak</string> <string name="filename_empty">Název nemůže být prázdný</string> - <string name="wait_a_moment">Počkejte chvíli</string> <string name="wait_checking_credentials">Ověřování uložených přihlašovacích údajů</string> - <string name="filedisplay_unexpected_bad_get_content">Neočekávaný problém - zkuste zvolit soubor jinou aplikací</string> - <string name="filedisplay_no_file_selected">Žádný soubor nebyl vybrán</string> <string name="activity_chooser_title">Odeslat odkaz …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopírování souboru z privátního úložiště</string> <string name="oauth_check_onoff">Přihlásit se s oAuth2</string> - <string name="oauth_login_connection">Připojuji se k oAuth2 serveru...</string> - <string name="ssl_validator_header">Identitu stránky nelze ověřit</string> <string name="ssl_validator_reason_cert_not_trusted">- Certifikát serveru je nedůvěryhodný</string> <string name="ssl_validator_reason_cert_expired">- Certifikátu serveru vypršela platnost</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Datum platnosti certifikátu je v budoucnosti</string> <string name="ssl_validator_reason_hostname_not_verified">- URL neodpovídá hodnotě hostname certifikátu</string> <string name="ssl_validator_question">Přejete si přesto tomuto certifikátu důvěřovat?</string> - <string name="ssl_validator_not_saved">Certifikát nelze uložit</string> <string name="ssl_validator_btn_details_see">Detaily</string> <string name="ssl_validator_btn_details_hide">Skrýt</string> <string name="ssl_validator_label_subject">Vydáno pro:</string> @@ -295,25 +263,21 @@ <string name="placeholder_sentence">Zástupný text</string> <string name="placeholder_filename">placeholder.txt</string> - <string name="placeholder_filetype">Obrázek PNG</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Nahrávat pouze přes wifi</string> - <string name="instant_upload_on_wifi">Nahrávat obrázky pouze přes wifi</string> - <string name="instant_video_upload_on_wifi">Nahrávat videa pouze přes wifi</string> - <string name="instant_video_upload_on_charging">Nahrávat pouze při nabíjení</string> + <string name="instant_upload_on_wifi">Nahrávat obrázky pouze na Wi-Fi</string> <string name="instant_upload_on_charging">Nahrávat pouze při nabíjení</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Konflikt souboru</string> - <string name="conflict_message">Které soubory chcete ponechat? Pokud zvolíte obě verze, zkopírovaný soubor bude mít název doplněný o číslo.</string> <string name="conflict_keep_both">Ponechat oba</string> <string name="conflict_use_local_version">místní verze</string> <string name="conflict_use_server_version">serverová verze</string> - <string name="preview_sorry">Omlouváme se za to!</string> <string name="preview_image_description">Náhled obrázku</string> + <string name="preview_image_error_unknown_format">Nelze zobrazit obrázek</string> + <string name="error__upload__local_file_not_copied">%1$s nelze zkopírovat do místního adresáře %2$s</string> <string name="prefs_instant_upload_path_title">Adresář pro okamžité nahrání</string> <string name="prefs_folder_sync_local_path_title">Místní adresář</string> @@ -321,7 +285,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Používat podadresáře</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Ukládat v podadresářích podle roku a měsíce</string> - <string name="share_link_no_support_share_api">Je nám líto, ale sdílení není na vašem serveru povoleno. Kontaktujte svého správce systému.</string> + <string name="share_link_no_support_share_api">Sdílení není na vašem serveru povoleno. Prosím, kontaktujte vašeho administrátora.</string> <string name="share_link_file_no_exist">Nelze sdílet. Zkontrolujte prosím že soubor existuje</string> <string name="share_link_file_error">Při pokusu o sdílení tohoto souboru či adresáře nastala chyba</string> <string name="unshare_link_file_no_exist">Nelze ukončit sdílení. Zkontrolujte prosím že soubor existuje</string> @@ -335,56 +299,36 @@ <string name="copy_link">Zkopírovat odkaz</string> <string name="clipboard_text_copied">Zkopírováno do schránky</string> - <string name="clipboard_no_text_to_copy">Žádný výběr textu pro kopírování do schránky</string> <string name="clipboard_uxexpected_error">Neočekávaná chyba při kopírování do schránky</string> <string name="clipboard_label">Text zkopírován z %1$s</string> - <string name="error_cant_bind_to_operations_service">Kritická chyba: operace nelze provést</string> - - <string name="network_error_socket_exception">Při pokusu o připojení k serveru došlo k chybě.</string> - <string name="network_error_socket_timeout_exception">Při čekání na odpověď serveru se vyskytla chyba, operace nemohla být dokončena</string> - <string name="network_error_connect_timeout_exception">Při čekání na odpověď serveru se vyskytla chyba, operace nemohla být dokončena</string> - <string name="network_host_not_available">Operace nemohla být dokončena, server je nedostupný</string> - <string name="forbidden_permissions">Nemáte oprávnění %s</string> + <string name="forbidden_permissions">Nemáte oprávnění k %s</string> <string name="forbidden_permissions_rename">přejmenovat tento soubor</string> <string name="forbidden_permissions_delete">smazat tento soubor</string> <string name="share_link_forbidden_permissions">sdílet tento soubor</string> <string name="unshare_link_forbidden_permissions">zrušit sdílení tohoto souboru</string> <string name="update_link_forbidden_permissions">pro aktualizaci tohoto sdílení</string> - <string name="forbidden_permissions_create">vytvořit tento soubor</string> - <string name="uploader_upload_forbidden_permissions">nahrávat do tohoto adresáře</string> <string name="downloader_download_file_not_found">Tento soubor již není dostupný na serveru</string> <string name="file_migration_dialog_title">Aktualizace cesty k úložišti</string> <string name="file_migration_finish_button">Dokončit</string> - <string name="file_migration_preparing">Příprava na migraci…</string> <string name="file_migration_checking_destination">Prověřování cílového umístění…</string> - <string name="file_migration_saving_accounts_configuration">Ukládání konfigurace účtů…</string> - <string name="file_migration_waiting_for_unfinished_sync">Čekání na nedokončené synchronizace…</string> <string name="file_migration_migrating">Přesun dat…</string> <string name="file_migration_updating_index">Aktualizace indexu…</string> <string name="file_migration_cleaning">Čištění…</string> - <string name="file_migration_restoring_accounts_configuration">Obnovování konfigurace účtů…</string> <string name="file_migration_ok_finished">Dokončeno</string> - <string name="file_migration_failed_not_enough_space">CHYBA: Nedostatek volného prostoru</string> - <string name="file_migration_failed_not_writable">CHYBA: Do souboru nelze zapisovat</string> - <string name="file_migration_failed_not_readable">CHYBA: Soubor nelze číst</string> + <string name="file_migration_failed_not_enough_space">CHYBA: Nedostatečné místo</string> + <string name="file_migration_failed_not_writable">CHYBA: Soubor není zapisovatelný</string> <string name="file_migration_failed_dir_already_exists">CHYBA: Nextcloud adresář již existuje</string> - <string name="file_migration_failed_while_coping">CHYBA: V průběhu migrace</string> - <string name="file_migration_failed_while_updating_index">CHYBA: V průběhu aktualizace indexu</string> - - <string name="file_migration_directory_already_exists">Datový adresář již existuje, co teď?</string> - <string name="file_migration_override_data_folder">Přepsat</string> - <string name="file_migration_use_data_folder">Použít existující</string> + <string name="file_migration_override_data_folder">Nahradit</string> + <string name="file_migration_use_data_folder">Použít</string> <string name="prefs_category_accounts">Účty</string> <string name="prefs_add_account">Přidat účet</string> <string name="drawer_manage_accounts">Spravovat účty</string> - <string name="auth_redirect_non_secure_connection_title">Zabezpečené spojení je přesměrováváno nezabezpečenou trasou.</string> - - <string name="actionbar_logger">Logy</string> + <string name="actionbar_logger">Logy</string> <string name="log_send_history_button">Historie odesílání</string> - <string name="log_send_no_mail_app">Nenalezena aplikace pro odesílání logů. Nainstalujte prosím emailovou aplikaci.</string> + <string name="log_send_no_mail_app">Nebyla nalezena aplikace k odesílání protokolů. Prosím, nainstalujte e-mailového klienta.</string> <string name="log_send_mail_subject">%1$s logy aplikace pro Android</string> <string name="log_progress_dialog_text">Nahrávání dat …</string> @@ -392,27 +336,22 @@ <string name="saml_authentication_wrong_pass">Nesprávné heslo</string> <string name="actionbar_move">Přesunout</string> <string name="actionbar_copy">Kopírovat</string> - <string name="file_list_empty_moving">Zde nic není. Můžete přidat adresář!</string> <string name="folder_picker_choose_button_text">Vybrat</string> - <string name="move_file_not_found">Nelze přesunout. Zkontrolujte prosím že soubor existuje</string> - <string name="move_file_invalid_into_descendent">Není možné adresář přesunout do vlastního podadresáře</string> - <string name="move_file_invalid_overwrite">Soubor již v cílovém adresáři existuje</string> + <string name="move_file_invalid_overwrite">Soubor již v cílové složce existuje</string> <string name="move_file_error">Při pokusu o přesun tohoto souboru či adresáře nastala chyba</string> <string name="forbidden_permissions_move">pro přesun tohoto souboru</string> <string name="copy_file_not_found">Nelze zkopírpovat. Zkontrolujte prosím že soubor existuje</string> - <string name="copy_file_invalid_into_descendent">Není možné adresář zkopírovat do jeho vlastního podadresáře</string> - <string name="copy_file_invalid_overwrite">Soubor již v cílovém adresáři existuje</string> + <string name="copy_file_invalid_overwrite">Soubor již v cílové složce existuje</string> <string name="copy_file_error">Při pokusu o zkopírování tohoto souboru či adresáře došlo k chybě</string> <string name="forbidden_permissions_copy">pro zkopírování tohoto souboru</string> <string name="prefs_category_instant_uploading">Okamžitá odesílání</string> <string name="prefs_category_details">Podrobnosti</string> - <string name="prefs_instant_video_upload_path_title">Adresář pro okamžité nahrání videa</string> - <string name="sync_folder_failed_content">Synchronizaci adresáře %1$s nelze dokončit</string> + <string name="sync_folder_failed_content">Synchronizaci adresáře %1$s nelze dokončit</string> <string name="shared_subject_header">sdílené</string> <string name="with_you_subject_header">s vámi</string> @@ -453,7 +392,6 @@ <string name="share_add_user_or_group">Přidat uživatele nebo skupinu</string> <string name="share_via_link_section_title">Sdílet odkaz</string> <string name="share_via_link_expiration_date_label">Nastavit datum vypršení platnosti</string> - <string name="share_via_link_password_label">Chránit heslem</string> <string name="share_via_link_password_title">Zabezpečeno</string> <string name="share_via_link_edit_permission_label">Povolit úpravy</string> <string name="share_via_link_hide_file_listing_permission_label">Skrýt seznam souborů</string> @@ -469,7 +407,6 @@ <string name="share_email_clarification">%1$s (e-mail)</string> <string name="share_known_remote_clarification">%1$s ( v %2$s )</string> - <string name="share_sharee_unavailable">Omlouváme se, verze vašeho serveru neumožňuje v klientské aplikaci sdílení dat mezi uživateli. \nKontaktujte prosím svého administrátora</string> <string name="share_privilege_can_share">může sdílet</string> <string name="share_privilege_can_edit">lze upravovat</string> <string name="share_privilege_can_edit_create">vytvořit</string> @@ -478,49 +415,38 @@ <string name="edit_share_unshare">Ukončit sdílení</string> <string name="edit_share_done">dokončeno</string> - <string name="action_retry_uploads">Opakování selhalo</string> <string name="action_clear_failed_uploads">Vyčištění selhalo</string> - <string name="action_clear_successful_uploads">Vyčištění úspěšné</string> - <string name="action_clear_finished_uploads">Vyčistit všechny ukončené</string> + <string name="action_clear_successful_uploads">Vyčištěno</string> + <string name="action_clear_finished_uploads">Vyčistit dokončená nahrávání</string> <string name="action_switch_grid_view">Zobrazení v mřížce</string> <string name="action_switch_list_view">Zobrazení v seznamu</string> <string name="manage_space_title">Spravovat úložný prostor</string> - <string name="manage_space_description">Nastavení, databáze a certifikáty serverů z %1$s data budou permanentně smazány. \n\nStažené soubory nebudou rozbaleny.\n\nTento proces může chvíli trvat.</string> <string name="manage_space_clear_data">Vyčistit data</string> <string name="manage_space_error">Některé soubory nebylo možno smazat.</string> - <string name="permission_storage_access">Vyžadována dodatečná oprávnění pro nahrávání & stahování souborů.</string> - <string name="local_file_not_found_toast">Soubor nebyl nalezen v místním souborovém systému</string> <string name="confirmation_remove_files_alert">Opravdu chcete odstranit vybrané položky?</string> <string name="confirmation_remove_folders_alert">Opravdu chcete odstranit vybrané položky a jejich obsah?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Čekání na zahájení nabíjení</string> + <string name="uploads_view_upload_status_waiting_for_charging">Čekání na nabití</string> <string name="actionbar_search">Hledat</string> <string name="files_drop_not_supported">Toto je Nextcloud funkce, prosím nahrát</string> <string name="learn_more">Více</string> <string name="drawer_folder_sync">Automatické nahrávání</string> <string name="drawer_participate">Zúčastnit se</string> - <string name="participate_testing_headline">Pomoz nám testovat</string> - <string name="participate_testing_bug_text">Našel jsi chybu? Něco nefunguje?</string> + <string name="participate_testing_bug_text">Našli jste chybu? Něco podivného?</string> <string name="participate_testing_report_text">Nahlásit chybu na Github</string> - <string name="participate_testing_version_text">Chceš nám pomoci testovat další verzi?</string> - <string name="participate_beta_text">Zahrnuje všechny nadcházející funkce a pohybuje se na hraně stability. Mohou se vyskytnout chyby, a pokud ano, nahlašte nám je prosím.</string> <string name="participate_release_candidate_headline">Předběžná verze</string> - <string name="participate_release_candidate_text">Předběžná verze nebo také Release Candidate (RC) je stabilní stav připravované, finální verze. Přihlas se jako tester v Play store nebo si najdi a instaluj hodící se verzi z F-Droid pod \"Verze\".</string> <string name="participate_contribute_headline">Aktivně něčím přispět</string> <string name="participate_contribute_irc_text">Diskutovat na IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Pomozte ostatním na <a href="%1$s">fóru</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Přeložte</a> aplikaci</string> - <string name="participate_contribute_github_text">Přispět jako vývojář, detaily pod <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a></string> <string name="move_to">Přesunout do…</string> <string name="copy_to">Kopírovat do…</string> <string name="choose_remote_folder">Vybrat adresář…</string> <string name="folder_sync_loading_folders">Načítání adresářů…</string> <string name="folder_sync_no_results">Nebyly nalezeny žádné adresáře médií.</string> - <string name="folder_sync_preferences">Nastavení automatického nahrávání</string> <string name="folder_sync_settings">Nastavení</string> - <string name="folder_sync_new_info">Okamžité nahrávání dat bylo kompletně předěláno. Navštivte hlavní menu a nakonfigurujte automatické nahrávání svých dat. Omlouváme se za nepříjemnosti.\n\nUžívejte si nové a rozšířené možnosti nahrávání dat!</string> <string name="folder_sync_preferences_folder_path">Pro %1$s</string> <plurals name="items_selected_count"> <item quantity="one">vybráno %d</item> @@ -528,7 +454,10 @@ <item quantity="other">vybráno %d</item> </plurals> - <string name="upload_file_dialog_title">Zadejte jméno a typ souboru k nahrání</string> + <string name="activity_list_loading_activity">Načítání aktivit…</string> + <string name="notifications_no_results_message">Prosíme, vraťte se později.</string> + + <string name="upload_file_dialog_title">Jméno a typ vstupního souboru k nahrání</string> <string name="upload_file_dialog_filename">Jméno souboru</string> <string name="upload_file_dialog_filetype">Typ souboru</string> <string name="upload_file_dialog_filetype_snippet_text">Soubor textového úryvku(.txt)</string> @@ -544,7 +473,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Bezpečné místo pro všechna vaše data</string> - <string name="welcome_feature_1_text">Přistupujte, sdílejte a ochraňte své soubory doma, ale i ve své firmě</string> + <string name="welcome_feature_1_text">Přistupujte, sdílejte a ochraňte své domácí a pracovní soubory</string> <string name="welcome_feature_2_title">Multi účet</string> <string name="welcome_feature_2_text">Připojte se ke všem svým cloudům</string> @@ -554,9 +483,12 @@ <string name="whats_new_skip">Přeskočit</string> + <string name="fingerprint_scan_finger">Prosím, naskenujte svůj otisk prstu</string> + <string name="fingerprint_unknown">Otisk prstu nerozpoznán</string> + <!-- User information --> <string name="user_info_full_name">Celé jméno</string> - <string name="user_info_email">Email</string> + <string name="user_info_email">E-mail</string> <string name="user_info_phone">Telefonní číslo</string> <string name="user_info_address">Adresa</string> <string name="user_info_website">Webová stránka</string> @@ -564,4 +496,18 @@ <string name="user_information_description">Uživatelské informace</string> + <!-- Activities --> + <string name="activities_no_results_headline">Zatím žádná aktivita</string> + <string name="webview_error">Došlo k chybě</string> + <string name="prefs_category_about">O aplikaci</string> + + <string name="contacts_restore_button">Obnovit poslední zálohu</string> + <string name="contacts_header_restore">Obnovit</string> + <string name="contacts_header_backup">Záloha</string> + <string name="contacts_last_backup">Poslední záloha</string> + <string name="contacts_read_permission">Je třeba oprávnění ke čtení seznamu kontaktů</string> + <string name="contacts_preference_choose_date">Zvolte datum</string> + <string name="contacts_preference_backup_never">Nikdy</string> + <!-- Notifications --> + <string name="new_notification_received">Přijato nové upozornění</string> </resources> diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index f756f0d903..f7688bcbee 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -283,6 +283,7 @@ <string name="common_rename">Umbenennen</string> <string name="common_remove">Entfernen</string> <string name="confirmation_remove_file_alert">Möchten Sie %1$s wirklich entfernen?</string> + <string name="confirmation_remove_folder_alert">Wollen Sie %1$s und deren Inhalte wirklich löschen?</string> <string name="confirmation_remove_local">Nur lokal</string> <string name="remove_success_msg">Entfernt</string> <string name="remove_fail_msg">Entfernen fehlgeschlagen</string> @@ -624,7 +625,6 @@ <string name="prefs_category_about">Über</string> <string name="actionbar_contacts">Kontakte-Sicherung</string> - <string name="contacts_backup_button">Sicherung jetzt erstellen</string> <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> <string name="contacts_header_restore">Wiederherstellen</string> <string name="contacts_header_backup">Sicherung</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 9d3e664ec8..02e7d11c1d 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -283,6 +283,7 @@ <string name="common_rename">Umbenennen</string> <string name="common_remove">Entfernen</string> <string name="confirmation_remove_file_alert">Möchtest Du %1$s wirklich entfernen?</string> + <string name="confirmation_remove_folder_alert">Willst Du %1$s deren Inhalte wirklich löschen?</string> <string name="confirmation_remove_local">Nur lokal</string> <string name="remove_success_msg">Entfernt</string> <string name="remove_fail_msg">Entfernen fehlgeschlagen</string> @@ -624,7 +625,6 @@ <string name="prefs_category_about">Über</string> <string name="actionbar_contacts">Kontakte-Sicherung</string> - <string name="contacts_backup_button">Sicherung jetzt erstellen</string> <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> <string name="contacts_header_restore">Wiederherstellen</string> <string name="contacts_header_backup">Sicherung</string> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 9148029045..61e8a5021b 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">Κλείδωμα με αποτύπωμα</string> <string name="prefs_fingerprint_notsetup">Δεν έχει οριστεί αποτύπωμα</string> <string name="prefs_show_hidden_files">Εμφάνιση κρυφών αρχείων</string> - <string name="prefs_instant_upload">Άμεση μεταφόρτωση εικόνων</string> - <string name="prefs_instant_upload_summary">Άμεση μεταφόρτωση φωτογραφιών από την κάμερα</string> + <string name="prefs_instant_upload">Άμεσες μεταφορτώσεις φωτογραφιών</string> + <string name="prefs_instant_upload_summary">Άμεση μεταφόρτωση φωτογραφιών που λήφθησαν από την φωτογραφική μηχανή</string> <string name="prefs_instant_video_upload">Άμεση μεταφόρτωση βίντεο</string> - <string name="prefs_instant_video_upload_summary">Άμεση μεταφόρτωση των βίντεο από την κάμερα</string> + <string name="prefs_instant_video_upload_summary">Άμεση μεταφόρτωση βίντεο που λήφθησαν από την φωτογραφική μηχανή</string> <string name="prefs_log_title">Ενεργοποίηση καταγραφής ιστορικού</string> <string name="prefs_log_summary">Χρησιμοποιείται για την καταγραφή προβλημάτων</string> <string name="prefs_log_title_history">Καταγραφή ιστορικού</string> @@ -58,23 +58,16 @@ <string name="prefs_calendar_contacts">Συγχρονισμός ημερολογίου & επαφών</string> <string name="prefs_calendar_contacts_summary">Ρυθμίστε το DAVdroid (v1.3.0+) για τον τρέχον λογαριασμό</string> <string name="prefs_calendar_contacts_address_resolve_error">Η διεύθυνση του διακομιστή για τον λογαριασμό δεν μπορεί να καθοριστεί για το DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">Δεν είναι εγκατεστημένα το Google Play ή το F-Droid</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Επιτυχής ρύθμιση συγχρονισμού ημερολογίου & επαφών</string> + <string name="prefs_calendar_contacts_no_store_error">Δεν είναι εγκατεστημένο το F-droid αλλά ούτε και το Google Play</string> <string name="prefs_help">Βοήθεια</string> <string name="prefs_recommend">Προτείνετε σε φίλο</string> <string name="prefs_feedback">Aνάδραση</string> <string name="prefs_imprint">Αποτύπωμα</string> - <string name="prefs_remember_last_share_location">Απομνημόνευση θέσης διαμοιρασμού</string> - <string name="prefs_remember_last_upload_location_summary">Απομνημόνευση τελευταιας τοποθεσίας διαμοιρασμού μεταφορτώσεων</string> - - <string name="recommend_subject">Δοκιμή %1$s στο κινητό σας!</string> - <string name="recommend_text">Θα ήθελα να σε προσκαλέσω να χρησιμοποιήσεις το %1$s στο κινητό σου!\\nΛήψη από εδώ: %2$s</string> - - <string name="auth_check_server">Έλεγχος διακομιστή</string> + <string name="recommend_subject">Δοκιμή %1$s στο κινητό σας!</string> + <string name="auth_check_server">Έλεγχος διακομιστή</string> <string name="auth_host_url">Διεύθυνση διακομιστή https://…</string> <string name="auth_username">Όνομα χρήστη</string> <string name="auth_password">Συνθηματικό</string> - <string name="auth_register">Δεν έχετε ακόμα διακομιστή;\\nΚάντε κλικ εδώ για να πάρετε έναν από ένα πάροχο</string> <string name="sync_string_files">Αρχεία</string> <string name="setup_btn_connect">Σύνδεση</string> <string name="uploader_btn_upload_text">Μεταφόρτωση</string> @@ -88,20 +81,12 @@ <string name="uploader_error_message_no_file_to_upload">Τα ληφθέντα δεδομένα δεν περιλαμβάνουν έγκυρο αρχείο.</string> <string name="uploader_error_title_file_cannot_be_uploaded">Το αρχείο δεν μπορεί να μεταφορτωθεί</string> <string name="uploader_error_message_read_permission_not_granted">Ο %1$s δεν επιτρέπεται να αναγνώσει ένα ληφθέν αρχείο</string> - <string name="uploader_error_message_source_file_not_found">Το αρχείο προς αποστολή δεν βρέθηκε στην τοποθεσία. Παρακαλώ ελέγξτε εάν υπάρχει το αρχείο.</string> - <string name="uploader_error_message_source_file_not_copied">Παρουσιάστηκε σφάλμα κατά την αντιγραφή του αρχείου στον προσωρινό φάκελο. Παρακαλούμε δοκιμάστε να στείλετε ξανά.</string> <string name="uploader_upload_files_behaviour">Επιλογή μεταφόρτωσης:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Μετακίνηση αρχείου στον φάκελο Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Διατήρηση του αρχείου στον πηγαίο φάκελο</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Διαγραφή αρχείου από τον πηγαίο φάκελο</string> <string name="file_list_seconds_ago">δευτερόλεπτα πριν</string> - <string name="file_list_empty_headline">Δεν υπάρχουν αρχεία</string> - <string name="file_list_empty">Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!</string> - <string name="file_list_empty_favorites">Σημειώστε ως αγαπημένα ορισμένα αρχεία ή συγχρονίστε τα με τις συσκευές σας!</string> - <string name="file_list_empty_favorites_filter_list">Τα αρχεία ή οι φάκελοι που σημειώσατε ως αγαπημένα θα εμφανιστούν εδώ</string> - <string name="file_list_empty_favorites_filter">Δεν βρέθηκαν αρχεία σημειωμένα ως αγαπημένα για το ερώτημά σας!</string> <string name="file_list_loading">Φόρτωση…</string> - <string name="file_list_no_app_for_file_type">Δεν βρέθηκε εφαρμογή για τον τύπο αρχείου!</string> <string name="local_file_list_empty">Δεν υπάρχουν αρχεία σε αυτό τον φάκελο.</string> <string name="file_list_empty_headline_search">Κανενα αποτέλεσμα σε αυτον τον φάκελο</string> <string name="file_list_empty_headline_server_search">Κανένα αποτέλεσμα</string> @@ -109,19 +94,7 @@ <string name="file_list_empty_shared">Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανίζονται εδώ</string> <string name="file_list_empty_headline_server_search_videos">Κανένα βίντεο</string> <string name="file_list_empty_headline_server_search_photos">Καμιά φωτογραφία</string> - <string name="file_list_empty_search">Θα δοκιμάστε αναζήτηση και σε άλλο φάκελο;</string> - <string name="file_list_empty_recently_modified">Δεν βρέθηκαν αρχεία που να έχουν τροποποιηθεί τις τελευταίες 7 ημέρες</string> - <string name="file_list_empty_recently_modified_filter">Δεν βρέθηκαν αρχεία για το αίτημά σας που να έχουν τροποποιηθεί - τις τελευταίες 7 ημέρες!</string> - <string name="file_list_empty_recently_added">Δεν βρέθηκαν πρόσφατα προστεθημένα αρχεία</string> - <string name="file_list_empty_recently_added_filter">Δεν βρέθηκαν πρόσφατα προστεθημένα αρχεία για το αίτημά σας!</string> - <string name="file_list_empty_text_photos">Μεταφόρτωση μερικών φωτογραφιών ή ενεργοποιήστε την αυτόματη μεταφόρτωση!</string> - <string name="file_list_empty_text_photos_filter">Δεν βρέθηκαν φωτογραφίες για το αίτημά σας!</string> - <string name="file_list_empty_text_videos">Μεταφορτώστε μερικά βίντεο ή ενεργοποιήστε την αυτόματη μεταφόρτωση!</string> - <string name="file_list_empty_text_videos_filter">Δεν βρέθηκε βίντεο για το αίτημά σας!</string> <string name="upload_list_empty_headline">Μη διαθέσιμες μεταφορτώσεις</string> - <string name="upload_list_empty_text">Μεταφορτώστε περιεχόμενο ή ενεργοποιήστε την άμεση μεταφόρτωση!</string> - <string name="upload_list_empty_text_auto_upload">Μεταφορτώστε περιεχόμενο ή ενεργοποιήστε την αυτόματη μεταφόρτωση!</string> <string name="file_list_folder">φάκελος</string> <string name="file_list_folders">φάκελοι</string> <string name="file_list_file">αρχείο</string> @@ -133,14 +106,11 @@ <string name="filedetails_modified">Τροποποιήθηκε:</string> <string name="filedetails_download">Λήψη</string> <string name="filedetails_sync_file">Συγχρονισμός</string> - <string name="filedetails_renamed_in_upload_msg">Το αρχείο μετονομάστηκε σε %1$s κατά τη μεταφόρτωση</string> - <string name="list_layout">Διάταξη λίστας</string> <string name="action_share">Διαμοιρασμός</string> <string name="common_yes">Ναι</string> <string name="common_no">Όχι</string> <string name="common_ok">Εντάξει</string> <string name="common_remove_upload">Αφαίρεση μεταφόρτωσης</string> - <string name="common_retry_upload">Επανάληψη μεταφόρτωσης</string> <string name="common_cancel_sync">Ακύρωση συγχρονισμού</string> <string name="common_cancel">Ακύρωση</string> <string name="common_back">Επιστροφή</string> @@ -160,10 +130,9 @@ <string name="uploader_info_dirname">Όνομα φακέλου</string> <string name="uploader_upload_in_progress_ticker">Μεταφόρτωση …</string> <string name="uploader_upload_in_progress_content">%1$d%% Μεταφορτώνονται %2$s</string> - <string name="uploader_upload_succeeded_ticker">Επιτυχημένη μεταφόρτωση</string> + <string name="uploader_upload_succeeded_ticker">Μεταφορτώθηκε</string> <string name="uploader_upload_succeeded_content_single">Το %1$s μεταφορτώθηκε</string> <string name="uploader_upload_failed_ticker">Η μεταφόρτωση απέτυχε</string> - <string name="uploader_upload_failed_content_single">Η μεταφόρτωση του %1$s δεν ήταν δυνατόν να ολοκληρωθεί</string> <string name="uploader_upload_failed_credentials_error">Η μεταφόρτωση απέτυχε, πρέπει να επανασυνδεθείτε</string> <string name="uploads_view_title">Μεταφορτώσεις</string> <string name="uploads_view_group_current_uploads">Τρέχουσα</string> @@ -180,37 +149,29 @@ <string name="uploads_view_upload_status_failed_localfile_error">Δεν βρέθηκε το τοπικό αρχείο</string> <string name="uploads_view_upload_status_failed_permission_error">Σφάλμα δικαιωμάτων</string> <string name="uploads_view_upload_status_conflict">Διένεξη</string> - <string name="uploads_view_upload_status_service_interrupted">Η εφαρμογή τερματίστηκε</string> <string name="uploads_view_upload_status_unknown_fail">Άγνωστο σφάλμα</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Αναμονή για σύνδεση wifi</string> <string name="uploads_view_later_waiting_to_upload">Αναμονή για μεταφόρτωση</string> <string name="downloader_download_in_progress_ticker">Λαμβάνονται …</string> <string name="downloader_download_in_progress_content">%1$d%% Λαμβάνονται %2$s</string> - <string name="downloader_download_succeeded_ticker">Επιτυχημένη λήψη</string> + <string name="downloader_download_succeeded_ticker">Ληφθέντα</string> <string name="downloader_download_succeeded_content">%1$s ελήφθησαν</string> <string name="downloader_download_failed_ticker">Αποτυχημένη λήψη</string> - <string name="downloader_download_failed_content">Η λήψη του %1$s δεν μπόρεσε να ολοκληρωθεί</string> <string name="downloader_not_downloaded_yet">Δεν έχει ληφθεί ακόμα</string> <string name="downloader_download_failed_credentials_error">Αποτυχία λήψης, πρέπει να εισέλθετε ξανά</string> <string name="common_choose_account">Επιλογή λογαριασμού</string> <string name="sync_fail_ticker">Αποτυχία συγχρονισμού</string> - <string name="sync_fail_ticker_unauthorized">Αποτυχία συγχρονισμού, χρειάζεται να εισέλθετε ξανά</string> - <string name="sync_fail_content">Ο συγχρονισμός του %1$s δεν μπόρεσε να ολοκληρωθεί</string> - <string name="sync_fail_content_unauthorized">Μη έγκυρο συνθηματικό για %1$s</string> + <string name="sync_fail_content_unauthorized">Εσφαλμένο συνθηματικό για τον %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Βρέθηκαν διενέξεις</string> <string name="sync_conflicts_in_favourites_content">%1$d αρχεία σε αναμονή προς συγχρονισμό δεν μπόρεσαν να συγχρονιστούν</string> <string name="sync_fail_in_favourites_ticker">Τα αρχεία σε αναμονή προς συγχρονισμού απέτυχαν</string> <string name="sync_fail_in_favourites_content">Τα περιεχόμενα των %1$d αρχείων δεν μπόρεσαν να συγχρονιστούν (%2$d διενέξεις)</string> <string name="sync_foreign_files_forgotten_ticker">Ορισμένα τοπικά αρχεία ξεχάστηκαν</string> <string name="sync_foreign_files_forgotten_content">%1$d αρχεία από τον %2$s φάκελο δεν ήταν δυνατό να αντιγραφούν σε</string> - <string name="sync_foreign_files_forgotten_explanation">Από την έκδοση 1.3.16, τα αρχεία που μεταφορτώθηκαν από αυτήν τη συσκευή αντιγράφηκαν στον τοπικό φάκελο %1$s για να αποτραπεί η απώλεια δεδομένων όταν ένα αρχείο είναι συγχρονισμένο με πολλαπλούς λογαριασμούς. \n\nΛόγω αυτής της αλλαγής, όλα τα αρχεία που μεταφορτώθηκαν με προηγούμενες εκδόσεις αυτής της εφαρμογής αντιγράφηκαν στον φάκελο %2$s. Ωστόσο, ένα σφάλμα εμπόδισε την ολοκλήρωση αυτής της λειτουργίας κατά το συγχρονισμό του λογαριασμού. Μπορείτε είτε να αφήσετε το(α) αρχείο(α) όπως είναι και να καταργήσετε τη σύνδεση με το %3$s ή να μετακινήσετε τα αρχεία στο φάκελο %1$s και να διατηρήσετε τη σύνδεση με το %4$s. \n\nΑπαριθμημένα πιο κάτω είναι τα τοπικά αρχεία(ο) και τα απομακρυσμένα αρχεία(ο) στο %5$s με τα οποία συνδέονταν.</string> - <string name="sync_current_folder_was_removed">Ο φάκελος %1$s δεν υπάρχει πια</string> <string name="foreign_files_move">Μετακίνηση όλων</string> <string name="foreign_files_success">Όλα τα αρχεία μετακινήθηκαν</string> <string name="foreign_files_fail">Μερικά αρχεία δεν μπόρεσαν να μετακινηθούν</string> <string name="foreign_files_local_text">Τοπικά: %1$s</string> <string name="foreign_files_remote_text">Απομακρυσμένα: %1$s</string> - <string name="upload_query_move_foreign_files">Δεν υπάρχει αρκετός διαθέσιμος αποθηκευτικός χώρος για να αντιγραφούν τα επιλεγμένα αρχεία στον φάκελο %1$s. Θα θέλατε να τα μετακινήσετε αντί αυτού;</string> <string name="pass_code_enter_pass_code">Παρακαλούμε εισάγετε τον κωδικό πρόσβασης</string> <string name="pass_code_configure_your_pass_code">Εισάγετε τον κωδικό πρόσβασης</string> @@ -228,16 +189,9 @@ <string name="media_event_done">%1$s αναπαραγωγή τελείωσε</string> <string name="media_err_nothing_to_play">Δεν βρέθηκαν αρχεία πολυμέσων</string> <string name="media_err_no_account">Δεν δόθηκε λογαριασμός</string> - <string name="media_err_not_in_owncloud">Το αρχείο δεν βρίσκεται σε έγκυρο λογαριασμό</string> <string name="media_err_unsupported">Δεν υποστηρίζεται η μορφή κωδικοποιήσης πολυμέσων</string> <string name="media_err_io">Αδυναμία ανάγνωσης αρχείου πολυμέσων</string> - <string name="media_err_malformed">Εσφαλμένη κωδικοποίηση αρχείου πολυμέσων</string> <string name="media_err_timeout">Λήξη χρόνου κατά την προσπάθεια αναπαραγωγής</string> - <string name="media_err_invalid_progressive_playback">Το αρχείο πολυμέσων δεν μπορεί να μεταδοθεί</string> - <string name="media_err_unknown">Το αρχείο πολυμέσων δεν μπορεί να αναπαραχθεί με την παρεχόμενη εφαρμογή αναπαραγωγής πολυμέσων</string> - <string name="media_err_security_ex">Σφάλμα ασφαλείας κατά την προσπάθεια αναπαραγωγής του %1$s</string> - <string name="media_err_io_ex">Σφάλμα εισόδου κατά την προσπάθεια αναπαραγωγής του %1$s</string> - <string name="media_err_unexpected">Απροσδόκητο σφάλμα κατά την προσπάθεια αναπαραγωγής του %1$s</string> <string name="media_rewind_description">Κουμπί ταχείας κίνησης πίσω</string> <string name="media_play_pause_description">Κουμπί αναπαραγωγής ή παύσης</string> <string name="media_forward_description">Κουμπί γρήγορης προώθησης</string> @@ -249,32 +203,24 @@ <string name="auth_connection_established">Εδραίωση σύνδεσης</string> <string name="auth_testing_connection">Έλεγχος σύνδεσης</string> <string name="auth_not_configured_title">Εσφαλμένες ρυθμίσεις διακομιστή</string> - <string name="auth_account_not_new">Ένας λογαριασμός για τον ίδιο χρήστη και διακομιστή υπάρχει ήδη στη συσκευή</string> <string name="auth_account_not_the_same">Ο χρήστης που εισάγατε δεν ταιριάζει με το χρήστη αυτού του λογαριασμού</string> <string name="auth_unknown_error_title">Παρουσιάστηκε άγνωστο σφάλμα!</string> - <string name="auth_unknown_host_title">Δεν βρέθηκε κεντρικός υπολογιστής</string> - <string name="auth_incorrect_path_title">Δεν βρέθηκε εγκατεστημένος διακομιστής</string> + <string name="auth_unknown_host_title">Αδυναμία εύρεσης κεντρικού υπολογιστή</string> + <string name="auth_incorrect_path_title">Δεν βρέθηκε διακομιστής</string> <string name="auth_timeout_title">Ο διακομιστής αργεί πολύ να απαντήσει</string> <string name="auth_incorrect_address_title">Εσφαλμένη μορφή διεύθυνσης διακομιστή</string> <string name="auth_ssl_general_error_title">Η αρχικοποίηση του SSL απέτυχε</string> - <string name="auth_ssl_unverified_server_title">Αδυναμία επιβεβαίωσης της ταυτότητας του διακομιστή SSL </string> <string name="auth_bad_oc_version_title">Μη αναγνωρίσιμη έκδοση διακομιστή</string> - <string name="auth_wrong_connection_title">Αδυναμία δημιουργίας σύνδεσης</string> <string name="auth_secure_connection">Επιτεύχθηκε ασφαλής σύνδεση</string> <string name="auth_unauthorized">Εσφαλμένο όνομα χρήστη ή συνθηματικό</string> <string name="auth_oauth_error">Ανεπιτυχής πιστοποίηση</string> <string name="auth_oauth_error_access_denied">Άρνηση πρόσβασης από τον διακομιστή πιστοποίησης</string> - <string name="auth_wtf_reenter_URL">Απροσδόκητη κατάσταση, παρακαλoύμε εισάγετε ξανά τη διεύθυνση του διακομιστή</string> <string name="auth_expired_oauth_token_toast">Η πιστοποιίησή σας έληξε. Παρακαλούμε εξουσιοδοτήστε ξανά</string> <string name="auth_expired_basic_auth_toast">Παρακαλούμε εισάγετε το τρέχον συνθηματικό</string> <string name="auth_expired_saml_sso_token_toast">Η συνεδρία σας έληξε. Παρακαλούμε συνδεθείτε ξανά</string> - <string name="auth_connecting_auth_server">Σύνδεση με το διακομιστή πιστοποίησης ...</string> <string name="auth_unsupported_auth_method">Ο διακομιστής δεν υποστηρίζει αυτή τη μέθοδο πιστοποίησης</string> <string name="auth_unsupported_multiaccount">Ο %1$s δεν υποστηρίζει πολλαπλούς λογαριασμούς</string> - <string name="auth_fail_get_user_name">Ο διακομιστής σας δεν επιστρέφει το σωστό αναγνωριστικό χρήστη, παρακαλούμε επικοινωνήστε τον διαχειριστή</string> <string name="auth_can_not_auth_against_server">Αδυαμία πιστοποίησης με αυτόν το διακομιστή</string> - <string name="auth_account_does_not_exist">Ο λογαριασμός δεν υπάρχει ακόμα στη συσκευή</string> - <string name="favorite">Ορισμός ως διαθέσιμο εκτός σύνδεσης</string> <string name="unfavorite">Αναίρεση ορισμού ως διαθέσιμο εκτός σύνδεσης</string> <string name="favorite_real">Ορισμός ως αγαπημένο</string> @@ -282,36 +228,29 @@ <string name="common_rename">Μετονομασία</string> <string name="common_remove">Αφαίρεση</string> <string name="confirmation_remove_file_alert">Θέλετε να αφαιρέσετε το %1$s;</string> - <string name="confirmation_remove_folder_alert">Θέλετε να αφαιρέσετε το %1$s και τα περιεχόμενά του;</string> <string name="confirmation_remove_local">Μόνο τοπικά</string> - <string name="remove_success_msg">Επιτυχής αφαίρεση</string> + <string name="remove_success_msg">Αφαιρέθηκε</string> <string name="remove_fail_msg">Αποτυχημένη αφαίρεση</string> <string name="rename_dialog_title">Εισάγετε νέο όνομα</string> - <string name="rename_local_fail_msg">Το τοπικό αντίγραφο δεν ήταν δυνατόν να μετονομαστεί. Παρακαλούμε επιλέξτε ένα διαφορετικό όνομα.</string> - <string name="rename_server_fail_msg">Η μετονομασία δεν μπόρεσε να ολοκληρωθεί</string> - <string name="sync_file_fail_msg">Αδυναμία ελέγχου του απομακρυσμένου αρχείου</string> <string name="sync_file_nothing_to_do_msg">Τα περιεχόμενα του αρχείου έχουν ήδη συγχρονιστεί</string> - <string name="create_dir_fail_msg">Ο φάκελος δεν μπορεί να δημιουργηθεί</string> + <string name="create_dir_fail_msg">Αδυναμία δημιουργίας φακέλου</string> <string name="filename_forbidden_characters">Απαγορευμένοι χαρακτήρες: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Το όνομα αρχείου περιέχει έναν τουλάχιστον μη έγκυρο χαρακτήρα</string> <string name="filename_empty">Το όνομα αρχείου δεν μπορεί να είναι κενό</string> - <string name="wait_a_moment">Παρακαλούμε περιμένετε</string> + <string name="wait_a_moment">Παρακαλούμε περιμένετε...</string> <string name="wait_checking_credentials">Γίνεται έλεγχος αποθηκευμένων διαπιστευτηρίων</string> - <string name="filedisplay_unexpected_bad_get_content">Μη αναμενόμενο πρόβλημα, παρακαλώ ελέγξτε το αρχείο από διαφορετική εφαρμογή</string> <string name="filedisplay_no_file_selected">Δεν επιλέχθηκε αρχείο</string> <string name="activity_chooser_title">Αποστολή συνδέσμου σε …</string> <string name="wait_for_tmp_copy_from_private_storage">Γίνεται αντιγραφή αρχείου από ιδιωτικό αποθηκευτικό χώρο</string> <string name="oauth_check_onoff">Σύνδεση με oAuth2</string> - <string name="oauth_login_connection">Γίνεται σύνδεση στο διακομιστή oAuth2...</string> - <string name="ssl_validator_header">Η ταυτότητα της σελίδας δεν μπορεί να επληθευτεί</string> <string name="ssl_validator_reason_cert_not_trusted">- Το πιστοποιητικό του διακομιστή δεν είναι έμπιστο</string> <string name="ssl_validator_reason_cert_expired">- Το πιστοποιητικό του διακομιστή έχει λήξει</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Οι έγκυρες ημερομηνίες του πιστοποιητικού του διακομιστή είναι στο μέλλον</string> <string name="ssl_validator_reason_hostname_not_verified">- Η URL δεν ταιριάζει με το όνομα του συστήματος στο πιστοποιητικό</string> <string name="ssl_validator_question">Θέλετε να θεωρείται έμπιστο το πιστοποιητικό παρ\' όλα αυτά;</string> - <string name="ssl_validator_not_saved">Το πιστοποιητικό δεν ήταν δυνατόν να αποθηκευτεί</string> + <string name="ssl_validator_not_saved">Αδυναμία αποθήκευσης πιστοποιητικού</string> <string name="ssl_validator_btn_details_see">Λεπτομέρειες</string> <string name="ssl_validator_btn_details_hide">Απόκρυψη</string> <string name="ssl_validator_label_subject">Εκδόθηκε για:</string> @@ -347,12 +286,11 @@ <string name="instant_upload_on_charging">Μεταφόρτωση μόνο κατά τη διάρκεια φόρτισης</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Διένεξη αρχείων</string> - <string name="conflict_message">Ποια αρχεία θέλετε να διατηρήσετε; Αν επιλέξετε και τις δύο εκδόσεις, θα προστεθεί ένας αριθμός στο όνομα του τοπικού αρχείου.</string> <string name="conflict_keep_both">Διατήρηση και των δύο</string> <string name="conflict_use_local_version">τοπική έκδοση</string> <string name="conflict_use_server_version">έκδοση διακομιστή</string> - <string name="preview_sorry">Σας ζητούμε συγγνώμη γι\'αυτό!</string> + <string name="preview_sorry">Σας ζητούμε συγγνώμη.</string> <string name="preview_image_description">Προεπισκόπηση εικόνας</string> <string name="preview_image_error_unknown_format">Αδυναμία προβολής εικόνας</string> @@ -363,7 +301,6 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Χρήση υποφακέλων</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Αποθήκευση σε υποφακέλους με βάση το χρόνο και μήνα</string> - <string name="share_link_no_support_share_api">Λυπούμαστε, ο διαμοιρασμός δεν είναι διαθέσιμος στο διακομιστή σας. Παρακαλούμε επικοινωνήστε με τον διαχειριστή.</string> <string name="share_link_file_no_exist">Αδυναμία διαμοιρασμού. Παρακαλούμε ελέγξτε αν υπάρχει ο φάκελος</string> <string name="share_link_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια διαμοιρασμού αυτού του αρχείου ή φακέλου</string> <string name="unshare_link_file_no_exist">Αδυναμία αναίρεσης κοινής χρήσης. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> @@ -377,56 +314,39 @@ <string name="copy_link">Αντιγραφή συνδέσμου</string> <string name="clipboard_text_copied">Αντιγράφηκε στο πρόχειρο</string> - <string name="clipboard_no_text_to_copy">Δεν ελήφθη κείμενο για αντιγραφή στο πρόχειρο</string> <string name="clipboard_uxexpected_error">Μη αναμενόμενο σφάλμα κατά την αντιγραφή στο πρόχειρο</string> <string name="clipboard_label">Κείμενο που αντιγράφηκε από τον %1$s</string> - <string name="error_cant_bind_to_operations_service">Κρίσιμο σφάλμα: αδύνατη η εκτέλεση λειτουργιών</string> - - <string name="network_error_socket_exception">Παρουσιάστηκε σφάλμα κατά τη σύνδεση με το διακομιστή.</string> - <string name="network_error_socket_timeout_exception">Παρουσιάστηκε σφάλμα κατά την αναμονή για τον διακομιστή. Η λειτουργία δεν μπορεί να ολοκληρωθεί</string> - <string name="network_error_connect_timeout_exception">Παρουσιάστηκε σφάλμα κατά την αναμονή για τον διακομιστή. Η λειτουργία δεν μπορεί να ολοκληρωθεί</string> - <string name="network_host_not_available">Η λειτουργία δεν μπορεί να ολοκληρωθεί. Ο διακομιστής δεν είναι διαθέσιμος</string> - <string name="forbidden_permissions">Δεν έχετε δικαιώματα %s</string> <string name="forbidden_permissions_rename">για να μετονομάσετε αυτό το αρχείο</string> <string name="forbidden_permissions_delete">για να διαγράψετε αυτό το αρχείο</string> <string name="share_link_forbidden_permissions">για να διαμοιραστείτε αυτό το αρχείο</string> <string name="unshare_link_forbidden_permissions">για να αναιρέσετε το διαμοιρασμό αυτού του αρχείου</string> <string name="update_link_forbidden_permissions">για να ενημερώσετε αυτό τον διαμοιρασμό</string> - <string name="forbidden_permissions_create">για να δημιουργήσετε το αρχείο</string> - <string name="uploader_upload_forbidden_permissions">για να μεταφορτώσετε σε αυτό το φάκελο</string> + <string name="forbidden_permissions_create">για να δημιουργήσετε αυτό το αρχείο</string> + <string name="uploader_upload_forbidden_permissions">για να μεταφορτώσετε αυτό το αρχείο</string> <string name="downloader_download_file_not_found">Αυτό το αρχείο δεν είναι πια διαθέσιμο στον διακομιστή</string> <string name="file_migration_dialog_title">Ενημέρωση διαδρομής αποθηκευτικού χώρου</string> <string name="file_migration_finish_button">Ολοκλήρωση</string> - <string name="file_migration_preparing">Προετοιμασία για μεταφορά…</string> <string name="file_migration_checking_destination">Γίνεται έλεγχος προορισμού…</string> - <string name="file_migration_saving_accounts_configuration">Γίνεται αποθήκευση ρυθμίσεων λογαριασμών…</string> - <string name="file_migration_waiting_for_unfinished_sync">Αναμονή για τους μη ολοκληρωμένους συγχρονισμούς…</string> <string name="file_migration_migrating">Γίνεται μετακίνηση δεδομένων…</string> <string name="file_migration_updating_index">Γίνεται ενημέρωση ευρετηρίου…</string> <string name="file_migration_cleaning">Γίνεται εκκαθάριση…</string> - <string name="file_migration_restoring_accounts_configuration">Γίνεται επαναφορά ρυθμίσεων λογαριασμών…</string> <string name="file_migration_ok_finished">Ολοκληρώθηκε</string> <string name="file_migration_failed_not_enough_space">ΣΦΑΛΜΑ: Ανεπαρκής αποθηκευτικός χώρος</string> <string name="file_migration_failed_not_writable">ΣΦΑΛΜΑ: Το αρχείο δεν είναι εγγράψιμο</string> <string name="file_migration_failed_not_readable">ΣΦΑΛΜΑ: Το αρχείο δεν είναι αναγνώσιμο</string> <string name="file_migration_failed_dir_already_exists">ΣΦΑΛΜΑ: Υπάρχει ήδη ο κατάλογος Nextcloud</string> - <string name="file_migration_failed_while_coping">ΣΦΑΛΜΑ: Κατά την μεταφορά</string> <string name="file_migration_failed_while_updating_index">ΣΦΑΛΜΑ: Κατά την ενημέρωση ευρετηρίου</string> - <string name="file_migration_directory_already_exists">Ο φάκελος των δεδομένων υπάρχει ήδη, τι να κάνω;</string> <string name="file_migration_override_data_folder">Αντικατάσταση</string> - <string name="file_migration_use_data_folder">Χρήση υπάρχοντος</string> + <string name="file_migration_use_data_folder">Χρήση</string> <string name="prefs_category_accounts">Λογαριασμοί</string> <string name="prefs_add_account">Προσθήκη λογαριασμού</string> <string name="drawer_manage_accounts">Διαχείριση λογαριασμών</string> - <string name="auth_redirect_non_secure_connection_title">Η ασφαλής σύνδεση ανακατευθύνεται μέσω μιας μη ασφαλούς διαδρομής.</string> - - <string name="actionbar_logger">Αρχεία καταγραφών</string> + <string name="actionbar_logger">Αρχεία καταγραφών</string> <string name="log_send_history_button">Αποστολή ιστορικού</string> - <string name="log_send_no_mail_app">Δεν εντοπίστηκε εφαρμογή αποστολής ιστορικού συστήματος. Παρακαλούμε εγκαταστήστε μια εφαρμογή ηλεκτρονικού ταχυδρομείου.</string> <string name="log_send_mail_subject">%1$s ιστορικό της εφαρμογής Android</string> <string name="log_progress_dialog_text">Φόρτωση δεδομένων …</string> @@ -434,27 +354,20 @@ <string name="saml_authentication_wrong_pass">Εσφαλμένο συνθηματικό</string> <string name="actionbar_move">Μετακίνηση</string> <string name="actionbar_copy">Αντιγραφή</string> - <string name="file_list_empty_moving">Δεν υπάρχει τίποτα εδώ. Μπορείτε να προσθέσετε ένα φάκελο!</string> <string name="folder_picker_choose_button_text">Επιλέξτε</string> - <string name="move_file_not_found">Αδύνατη η μετακίνηση. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> - <string name="move_file_invalid_into_descendent">Δεν είναι δυνατό να μετακινηθεί ο φάκελος σε έναν απογονικό</string> - <string name="move_file_invalid_overwrite">Το αρχείο υπάρχει ήδη στο φάκελο προορισμού</string> <string name="move_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια μετακίνησης αυτού του αρχείου ή φακέλου</string> <string name="forbidden_permissions_move">για μετακίνηση αυτού του αρχείου</string> <string name="copy_file_not_found">Αδυναμία αντιγραφής. Παρακαλούμε ελέγξτε αν το αρχείο υπάρχει</string> - <string name="copy_file_invalid_into_descendent">Δεν είναι δυνατό να αντιγραφεί ο φάκελος σε απογονικό</string> - <string name="copy_file_invalid_overwrite">Το αρχείο υπάρχει ήδη στο φάκελο προορισμού</string> <string name="copy_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια αντιγραφής αυτού του αρχείου ή φακέλου</string> <string name="forbidden_permissions_copy">για αντιγραφή αυτού του αρχείου</string> <string name="prefs_category_instant_uploading">Άμεσες μεταφορτώσεις</string> <string name="prefs_category_details">Λεπτομέρειες</string> - <string name="prefs_instant_video_upload_path_title">Φάκελος άμεσης μεταφόρτωσης βίντεο</string> - <string name="sync_folder_failed_content">Ο συγχρονισμός του φακέλου %1$s δεν μπόρεσε να ολοκληρωθεί</string> + <string name="sync_folder_failed_content">Ο συγχρονισμός του φακέλου %1$s δεν μπόρεσε να ολοκληρωθεί</string> <string name="shared_subject_header">διαμοιρασμένα</string> <string name="with_you_subject_header">με εσάς</string> @@ -495,7 +408,7 @@ <string name="share_add_user_or_group">Προσθήκη χρήστη ή ομάδας</string> <string name="share_via_link_section_title">Διαμοιρασμός συνδέσμου</string> <string name="share_via_link_expiration_date_label">Ορισμός ημερομηνίας λήξης</string> - <string name="share_via_link_password_label">Προστασία συνθηματικού</string> + <string name="share_via_link_password_label">Προστασία με συνθηματικό</string> <string name="share_via_link_password_title">Ασφαλίστηκε</string> <string name="share_via_link_edit_permission_label">Επιτρέπεται η επεξεργασία</string> <string name="share_via_link_hide_file_listing_permission_label">Απόκρυψη λίστας αρχείου</string> @@ -511,7 +424,6 @@ <string name="share_email_clarification">%1$s (ηλ. ταχυδρομείο)</string> <string name="share_known_remote_clarification">%1$s ( στο %2$s )</string> - <string name="share_sharee_unavailable">Δεν επιτρέπεται ο διαμοιρασμός μεταξύ χρηστών μέσω πελατών, σε αυτή την έκδοση διακομιστή. \nΕπικοινωνήστε με το διαχειριστή</string> <string name="share_privilege_can_share">δυνατότητα διαμοιρασμού</string> <string name="share_privilege_can_edit">δυνατότητα επεξεργασίας</string> <string name="share_privilege_can_edit_create">δημιουργία</string> @@ -520,50 +432,34 @@ <string name="edit_share_unshare">Διακοπή διαμοιρασμού</string> <string name="edit_share_done">ολοκληρώθηκε</string> - <string name="action_retry_uploads">Αποτυχία επανάληψης</string> <string name="action_clear_failed_uploads">Αποτυχία εκκαθάρισης</string> - <string name="action_clear_successful_uploads">Επιτυχία εκκαθάρισης</string> - <string name="action_clear_finished_uploads">Ολοκλήρωση εκκαθάρισης όλων</string> - <string name="action_switch_grid_view">Προβολή πλέγματος</string> <string name="action_switch_list_view">Προβολή λίστας</string> <string name="manage_space_title">Διαχείριση χώρου</string> - <string name="manage_space_description">Τα πιστοποιητικά ρυθμίσεων, βάσης δεδομένων και διακομιστή από τα δεδομένα %1$s\'s θα διαγραφούν μόνιμα.\n\nΤα ληφθέντα αρχεία θα παραμείνουν ανέπαφα.\n\nΑυτή η διαδικασία ενδεχομένως να διαρκέσει αρκετά.</string> <string name="manage_space_clear_data">Εκκαθάριση δεδομένων</string> <string name="manage_space_error">Μερικά αρχεία δεν μπορούν να διαγραφούν.</string> - <string name="permission_storage_access">Επιπλέον διακαιώματα απαιτούνται για μεταφόρτωση & λήψη αρχείων.</string> - <string name="local_file_not_found_toast">Το αρχείο δεν βρέθηκε στο τοπικό σύστημα αρχείων</string> <string name="confirmation_remove_files_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα;</string> <string name="confirmation_remove_folders_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα με τα περιεχόμενά τους;</string> - <string name="uploads_view_upload_status_waiting_for_charging">Αναμονή για φόρτιση συσκευής</string> <string name="actionbar_search">Αναζήτηση</string> <string name="files_drop_not_supported">Αυτό είναι χαρακτηριστικό του Nextcloud, παρακαλούμε ενημερώστε.</string> <string name="learn_more">Μάθετε περισσότερα</string> <string name="drawer_folder_sync">Αυτόματη μεταφόρτωση</string> <string name="drawer_participate">Συμμετοχή</string> - <string name="participate_testing_headline">Βοηθήστε μας στις δοκιμές</string> - <string name="participate_testing_bug_text">Βρήκατε σφάλμα; Κάτι σας φαίνεται παράξενο;</string> <string name="participate_testing_report_text">Αναφέρετε σφάλμα στο Github</string> - <string name="participate_testing_version_text">Σας ενδιαφέρει να μας βοηθήσετε να δοκιμάσουμε την επόμενη έκδοση;</string> <string name="participate_beta_headline">Δοκιμή της εκδοσης προς ανάπτυξη</string> - <string name="participate_beta_text">Αυτή περιέχει όλες τις επερχόμενες λειτουργίες και δαθέτει ότι τελευταίο έχει ενσωματωθεί. Σφάλματα/λάθη μπορεί να προκύψουν. Σας παρακαλούμε να μας τα αναφέρετε.</string> <string name="participate_release_candidate_headline">Release candidate</string> - <string name="participate_release_candidate_text">Η υποψήφια κυκλοφορία (RC) είναι ένα στιγμιότυπο της επερχόμενης έκδοσης και αναμένεται να είναι σταθερή. Η δοκιμή της μεμονωμένης εγκατάστασής σας θα βοηθήσει στην εξασφάλιση αυτού. Εγγραφείτε για δοκιμές στο Play store ή χειροκίνητα αναζητείστε στο τμήμα \"εκδόσεις\" στο F-Droid.</string> <string name="participate_contribute_headline">Ενεργή συνεισφορά</string> <string name="participate_contribute_irc_text">Συμμετέχετε στη συνομιλία στο IRC: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Βοηθήστε χρήστες στο <a href=\"%1$s\">forum</a></string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Μεταφράστε</a> την εφαρμογή</string> - <string name="participate_contribute_github_text">Συνεισφέρετε ως προγραμματιστής, για περισσότερες λεπτομέρειες δείτε <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a></string> <string name="move_to">Μετακίνηση σε…</string> <string name="copy_to">Αντιγραφή σε…</string> <string name="choose_remote_folder">Επιλογή φακέλου…</string> <string name="folder_sync_loading_folders">Φόρτωση φακέλων…</string> <string name="folder_sync_no_results">Δεν βρέθηκαν φάκελοι πολυμέσων.</string> - <string name="folder_sync_preferences">Προτιμήσεις αυτόματης μεταφόρτωσης</string> <string name="folder_sync_settings">Ρυθμίσεις</string> - <string name="folder_sync_new_info">Η άμεση μεταφόρτωση έχει ανανεωθεί τελείως. Παρακαλούμε δείτε το κυρίως μενού και ρυθμίστε ξανά την αυτόματη μεταφόρτωση. Σας ζητούμε συγγνώμη για την ενόχληση\n\nΑπολαύστε τις νέες και εκτεταμένες δυνατότητες της αυτόματης μεταφόρτωσης!</string> <string name="folder_sync_preferences_folder_path">Για %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d επιλέχθηκε</item> @@ -577,7 +473,6 @@ <string name="notifications_no_results_headline">Καμία ειδοποίηση</string> <string name="notifications_no_results_message">Παρακαλούμε ελέγξτε ξανά αργότερα. </string> - <string name="upload_file_dialog_title">Εισαγωγή ονόματος και τύπου αρχείου μεταφόρτωσης</string> <string name="upload_file_dialog_filename">Όνομα αρχείου</string> <string name="upload_file_dialog_filetype">Τύπος αρχείου</string> <string name="upload_file_dialog_filetype_snippet_text">Απόσπασμα αρχείου κειμένου(.txt)</string> @@ -593,8 +488,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Μια ασφαλής τοποθεσία για όλα σας τα δεδομένα</string> - <string name="welcome_feature_1_text">Πρόσβαση, διαμοιρασμός & προστασία των αρχείων σας στο σπίτι και στην εταιρία σας</string> - <string name="welcome_feature_2_title">Πολλαπλός λογαριασμός</string> <string name="welcome_feature_2_text">Σύνδεση με όλα τα clouds σας</string> @@ -608,7 +501,6 @@ <!-- User information --> <string name="user_info_full_name">Πλήρες όνομα</string> - <string name="user_info_email">Ηλεκτρονικό ταχυδρομείο</string> <string name="user_info_phone">Αριθμός τηλεφώνου</string> <string name="user_info_address">Διεύθυνση</string> <string name="user_info_website">Ιστοσελίδα</string> @@ -618,22 +510,16 @@ <!-- Activities --> <string name="activities_no_results_headline">Καμία δραστηριότητα ακόμα</string> - <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές & κοινόχρηστα</string> <string name="webview_error">Παρουσιάστηκε σφάλμα</string> <string name="prefs_category_about">Περί</string> - <string name="actionbar_contacts">Αντίγραφο ασφαλείας επαφών</string> - <string name="contacts_backup_button">Δημιουργία αντιγράφου ασφαλείας τώρα</string> <string name="contacts_restore_button">Επαναφορά τελευταίου αντιγράφου ασφαλείας</string> <string name="contacts_header_restore">Επαναφορά</string> <string name="contacts_header_backup">Αντίγραφο ασφαλείας</string> <string name="contacts_automatic_backup">Αντίγραφο ασφαλείας επαφών</string> <string name="contacts_last_backup">Τελευταίο αντίγραφο ασφαλείας</string> - <string name="contacts_read_permission">Απαιτείτούνται δικαιώματα ανάγνωσης για τις επαφές</string> - <string name="contacts_write_permission">Απαιτείτούνται δικαιώματα εγγραφής για τις επαφές</string> <string name="contactlist_title">Επαναφορά επαφών</string> <string name="contaclist_restore_selected">Επαναφορά επιλεγμένων επαφών</string> - <string name="contactlist_account_chooser_title">Επιλογή λογαριασμού για εισαγωγή</string> <string name="contacts_preference_choose_date">Επιλογή ημερομηνίας</string> <string name="contacts_preference_backup_never">ποτέ</string> <string name="contacts_preferences_no_file_found">Δεν βρέθηκε αρχείο</string> @@ -642,6 +528,4 @@ <!-- Notifications --> <string name="new_notification_received">Νέα ενημέρωση ελήφθη </string> - - -</resources> + </resources> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index cd48027639..f4e2520ff4 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -624,7 +624,6 @@ en los últimos 7 días. </string> <string name="prefs_category_about">Acerca de</string> <string name="actionbar_contacts">Respaldar contactos</string> - <string name="contacts_backup_button">Ahora</string> <string name="contacts_restore_button">Restaurar el último respaldo</string> <string name="contacts_header_restore">Restaurar</string> <string name="contacts_header_backup">Respaldar</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index c92329dbf4..3f309a4b9b 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -58,15 +58,19 @@ <string name="prefs_calendar_contacts">Configurer la synchronisation de l\'agenda et des contacts</string> <string name="prefs_calendar_contacts_summary">Configurer DAVdroid (v1.3.0+) pour le compte actuel</string> <string name="prefs_calendar_contacts_address_resolve_error">Une adresse de serveur pour le compte pourrait ne pas être résolue par DAVdroid</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Synchronisation de l\'agenda & des contacts configurée</string> <string name="prefs_help">Aide</string> <string name="prefs_recommend">Recommander à un ami</string> <string name="prefs_feedback">Nous contacter par mail</string> <string name="prefs_imprint">Mentions</string> <string name="recommend_subject">Essayez %1$s sur votre smartphone !</string> - <string name="auth_check_server">Vérifier le serveur</string> + <string name="recommend_text">J\'aimerais vous inviter à utiliser %1$s sur votre smartphone.\nTéléchargez-la ici : %2$s.</string> + + <string name="auth_check_server">Vérifier le serveur</string> <string name="auth_host_url">Adresse du serveur https://…</string> <string name="auth_username">Nom d\'utilisateur</string> <string name="auth_password">Mot de passe</string> + <string name="auth_register">Vous n\'avez pas encore un serveur ?\nCliquez ici pour en obtenir un d\'un fournisseur</string> <string name="sync_string_files">Fichiers</string> <string name="setup_btn_connect">Connecter</string> <string name="uploader_btn_upload_text">Téléverser</string> @@ -78,21 +82,38 @@ <string name="uploader_error_title_no_file_to_upload">Aucun fichier à téléverser</string> <string name="uploader_error_message_received_piece_of_text">%1$s ne peut téléverser un morceau de texte comme un fichier.</string> <string name="uploader_error_message_no_file_to_upload">Les données reçues n\'incluent aucun fichier valide</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Le fichier ne peut pas être téléversé</string> <string name="uploader_error_message_read_permission_not_granted">%1$s n\'est pas autorisé à lire un fichier reçu</string> + <string name="uploader_error_message_source_file_not_found">Le fichier à téléverser n\'a pas été trouvé. Merci de vérifier si ce fichier existe.</string> + <string name="uploader_error_message_source_file_not_copied">Impossible de copier le fichier vers un dossier temporaire. Merci de recommencer votre envoi.</string> <string name="uploader_upload_files_behaviour">Option de téléversement :</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Déplacer le fichier dans le dossier Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Conserver le fichier dans le dossier original</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Supprimer le fichier du dossier original</string> <string name="file_list_seconds_ago">à l\'instant</string> + <string name="file_list_empty_headline">Aucun fichier ici</string> + <string name="file_list_empty">Déposez du contenu ou synchronisez vos appareils.</string> + <string name="file_list_empty_favorites">Mettez certains fichiers en favoris ou synchronisez vos appareils.</string> + <string name="file_list_empty_favorites_filter_list">Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici</string> <string name="file_list_loading">Chargement…</string> <string name="local_file_list_empty">Aucun fichier n\'est présent dans ce dossier.</string> <string name="file_list_empty_headline_search">Aucun résultat dans ce dossier</string> <string name="file_list_empty_headline_server_search">Aucun résultat</string> + <string name="file_list_empty_favorite_headline">Rien n\'est mis en favoris pour l\'instant</string> <string name="file_list_empty_shared_headline">Rien n\'est partagé pour l\'instant</string> <string name="file_list_empty_shared">Les fichiers et dossiers que vous partagez apparaîtront ici</string> <string name="file_list_empty_headline_server_search_videos">Aucune vidéo</string> <string name="file_list_empty_headline_server_search_photos">Aucune photo</string> + <string name="file_list_empty_search">Il se trouve peut-être dans un autre dossier ?</string> + <string name="file_list_empty_recently_modified">Aucun fichier modifié au cours des 7 derniers jours trouvé</string> + <string name="file_list_empty_recently_modified_filter">Votre recherche n\'a pas retourné de fichiers modifiés dans les 7 derniers jours.</string> + <string name="file_list_empty_recently_added">Aucun fichier ajouté récemment trouvé</string> + <string name="file_list_empty_recently_added_filter">Votre recherche n\'a pas renvoyée de fichiers récement ajoutés.</string> + <string name="file_list_empty_text_photos">Téléversez des photos ou activez le téléversement automatique.</string> + <string name="file_list_empty_text_videos">Téléversez des vidéos ou activez le téléversement automatique.</string> <string name="upload_list_empty_headline">Aucun historique de téléversement</string> + <string name="upload_list_empty_text">Téléversez du contenu ou activez le téléversement instantané.</string> + <string name="upload_list_empty_text_auto_upload">Téléversez du contenu ou activez le téléversement automatique.</string> <string name="file_list_folder">dossier</string> <string name="file_list_folders">dossiers</string> <string name="file_list_file">fichier</string> @@ -104,11 +125,13 @@ <string name="filedetails_modified">Modifié le :</string> <string name="filedetails_download">Télécharger</string> <string name="filedetails_sync_file">Synchroniser</string> + <string name="filedetails_renamed_in_upload_msg">Le fichier a été renommé en %1$s pendant le téléversement</string> <string name="action_share">Partager</string> <string name="common_yes">Oui</string> <string name="common_no">Non</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Retirer le téléversement</string> + <string name="common_retry_upload">Réessayer le téléversement</string> <string name="common_cancel_sync">Annuler la synchronisation</string> <string name="common_cancel">Annuler</string> <string name="common_back">Retour</string> @@ -128,8 +151,10 @@ <string name="uploader_info_dirname">Nom du dossier</string> <string name="uploader_upload_in_progress_ticker">Téléversement…</string> <string name="uploader_upload_in_progress_content">Téléversement de %2$s : %1$d%%</string> + <string name="uploader_upload_succeeded_ticker">Téléversé</string> <string name="uploader_upload_succeeded_content_single">%1$s téléversé</string> <string name="uploader_upload_failed_ticker">Échec du téléversement</string> + <string name="uploader_upload_failed_content_single">Impossible de téléverser %1$s</string> <string name="uploader_upload_failed_credentials_error">Le téléversement a échoué, vous devez vous reconnecter</string> <string name="uploads_view_title">Historique des envois</string> <string name="uploads_view_group_current_uploads">Actuellement</string> @@ -146,22 +171,30 @@ <string name="uploads_view_upload_status_failed_localfile_error">Fichier local non trouvé</string> <string name="uploads_view_upload_status_failed_permission_error">Erreur de permissions</string> <string name="uploads_view_upload_status_conflict">Conflit</string> + <string name="uploads_view_upload_status_service_interrupted">L\'application a été arrêtée</string> <string name="uploads_view_upload_status_unknown_fail">Erreur inconnue </string> + <string name="uploads_view_upload_status_waiting_for_wifi">En attente d\'une connexion WiFi</string> <string name="uploads_view_later_waiting_to_upload">En attente de téléversement</string> <string name="downloader_download_in_progress_ticker">Téléchargement en cours…</string> <string name="downloader_download_in_progress_content">Téléchargement de %2$s : %1$d%% effectués</string> + <string name="downloader_download_succeeded_ticker">Téléchargé</string> <string name="downloader_download_succeeded_content">%1$s téléchargé</string> <string name="downloader_download_failed_ticker">Le téléchargement a échoué</string> + <string name="downloader_download_failed_content">Impossible de télécharger %1$s</string> <string name="downloader_not_downloaded_yet">Pas encore téléchargé</string> <string name="downloader_download_failed_credentials_error">Le téléchargement a échoué, vous devez vous reconnecter</string> <string name="common_choose_account">Choisissez un compte</string> <string name="sync_fail_ticker">La synchronisation a échoué</string> + <string name="sync_fail_ticker_unauthorized">La synchronisation a échoué, vous devez vous reconnecter</string> + <string name="sync_fail_content">Impossible de terminer la synchronisation de %1$s</string> + <string name="sync_fail_content_unauthorized">Mauvais mot de passe pour %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Des conflits ont été trouvés</string> <string name="sync_conflicts_in_favourites_content">%1$d fichiers à garder synchronisés n\'ont pu être synchronisés</string> <string name="sync_fail_in_favourites_ticker">La synchronisation des fichiers a échoué</string> <string name="sync_fail_in_favourites_content">Le contenu de %1$d fichiers n\'a pu être synchronisé (%2$d conflits)</string> <string name="sync_foreign_files_forgotten_ticker">Certains fichiers locaux ont été oubliés</string> <string name="sync_foreign_files_forgotten_content">%1$d fichiers du dossier %2$s n\'ont pas pu être copiés dans</string> + <string name="sync_current_folder_was_removed">Le dossier %1$s n\'existe plus</string> <string name="foreign_files_move">Tout déplacer</string> <string name="foreign_files_success">Tous les fichiers ont été déplacés</string> <string name="foreign_files_fail">Certains fichiers n\'ont pu être déplacés</string> @@ -184,7 +217,11 @@ <string name="media_event_done">Lecture de %1$s terminée</string> <string name="media_err_nothing_to_play">Aucun fichier média trouvé</string> <string name="media_err_no_account">Aucun compte fourni</string> + <string name="media_err_not_in_owncloud">Le fichier n\'est pas dans un compte valide</string> <string name="media_err_unsupported">Le codec de ce média n\'est pas pris en charge </string> + <string name="media_err_io">Impossible de lire le fichier média</string> + <string name="media_err_malformed">Le fichier média n\'est pas correctement encodé</string> + <string name="media_err_invalid_progressive_playback">Le fichier média ne peut pas être diffusé</string> <string name="media_rewind_description">Bouton de rembobinage</string> <string name="media_play_pause_description">Bouton de lecture ou de pause</string> <string name="media_forward_description">Bouton d\'avance rapide</string> @@ -219,13 +256,16 @@ <string name="common_remove">Supprimer</string> <string name="confirmation_remove_file_alert">Voulez-vous vraiment supprimer %1$s ?</string> <string name="confirmation_remove_local">Local seulement</string> + <string name="remove_success_msg">Supprimé</string> <string name="remove_fail_msg">Échec de la suppression</string> <string name="rename_dialog_title">Entrez un nouveau nom</string> <string name="sync_file_nothing_to_do_msg">Le contenu du fichier est déjà synchronisé</string> <string name="filename_forbidden_characters">Caractères interdits : / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Le nom de fichier contient au moins un caractère invalide</string> <string name="filename_empty">Le nom du fichier ne peut pas être vide</string> + <string name="wait_a_moment">Veuillez patienter...</string> <string name="wait_checking_credentials">Vérification des identifiants enregistrés</string> + <string name="filedisplay_no_file_selected">Aucun fichier sélectionné</string> <string name="activity_chooser_title">Envoyer le lien vers …</string> <string name="wait_for_tmp_copy_from_private_storage">Copie du fichier depuis le stockage privé</string> @@ -259,6 +299,7 @@ <string name="placeholder_sentence">Ceci est un espace réservé</string> <string name="placeholder_filename">placeholder.txt</string> + <string name="placeholder_filetype">Image PNG</string> <string name="placeholder_filesize">389 Ko</string> <string name="placeholder_timestamp">18/05/2012 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> @@ -269,6 +310,7 @@ <string name="conflict_use_local_version">version locale</string> <string name="conflict_use_server_version">version serveur</string> + <string name="preview_sorry">Désolé.</string> <string name="preview_image_description">Prévisualisation de l\'image</string> <string name="error__upload__local_file_not_copied">%1$s n\'a pas pu être copié dans le dossier local %2$s</string> <string name="prefs_instant_upload_path_title">Téléversement immédiat du dossier</string> @@ -466,6 +508,7 @@ <!-- User information --> <string name="user_info_full_name">Nom complet</string> + <string name="user_info_email">Adresse e-mail</string> <string name="user_info_phone">Numéro de téléphone</string> <string name="user_info_address">Adresse</string> <string name="user_info_website">Site web</string> @@ -481,7 +524,7 @@ <string name="contacts_restore_button">Restaurer la dernière copie de sauvegarde</string> <string name="contacts_header_restore">Restaurer</string> <string name="contacts_header_backup">Copie de sauvegarde</string> - <string name="contacts_automatic_backup">Copie de sauvegarde des contacts</string> + <string name="contacts_automatic_backup">Sauvegarde des contacts</string> <string name="contacts_last_backup">Dernière copie de sauvegarde</string> <string name="contactlist_title">Restaurer les contacts</string> <string name="contaclist_restore_selected">Restaurer les contacts sélectionnés</string> @@ -493,4 +536,7 @@ <!-- Notifications --> <string name="new_notification_received">Nouvelle notification reçue</string> - </resources> + <string name="drawer_logout">Se déconnecter</string> + + +</resources> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 6e90552fd5..cca06b033f 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -506,7 +506,6 @@ <string name="webview_error">Feil oppstod</string> <string name="prefs_category_about">Om</string> - <string name="contacts_backup_button">Nå</string> <string name="contacts_restore_button">Gjenopprett fra siste sikkerhetskopiering</string> <string name="contacts_header_restore">Gjenopprett</string> <string name="contacts_header_backup">Sikkerhetskopier</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index fe5dd45c5a..f485a16070 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -46,6 +46,10 @@ <string name="prefs_fingerprint">Vingerafdrukbeveiliging</string> <string name="prefs_fingerprint_notsetup">Er zijn geen vingerafdrukken ingesteld.</string> <string name="prefs_show_hidden_files">Verborgen bestanden weergeven</string> + <string name="prefs_instant_upload">Directe upload van afbeeldingen</string> + <string name="prefs_instant_upload_summary">Direct vanaf camera uploaden van afbeeldingen</string> + <string name="prefs_instant_video_upload">Directe upload van video\'s</string> + <string name="prefs_instant_video_upload_summary">Direct vanaf de camera uploaden video\'s</string> <string name="prefs_log_title">Logging inschakelen</string> <string name="prefs_log_summary">Dit wordt gebruikt om problemen te loggen.</string> <string name="prefs_log_title_history">Logging-geschiedenis</string> @@ -55,14 +59,23 @@ <string name="prefs_calendar_contacts_summary">DAVdroid (v1.3.0+) voor huidige account instellen</string> <string name="prefs_calendar_contacts_address_resolve_error">Serveradres voor dit account kon niet worden gevonden voor DAVdroid</string> <string name="prefs_calendar_contacts_no_store_error">Noch F-droid, noch Google Play is geïnstalleerd</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Agenda & contactpersonen sync instellingen</string> <string name="prefs_help">Help</string> + <string name="prefs_recommend">Aanbevelen bij vriend</string> <string name="prefs_feedback">Feedback</string> <string name="prefs_imprint">afdruk</string> - <string name="recommend_subject">Probeer %1$s op je smartphone!</string> - <string name="auth_check_server">Controleer server</string> + <string name="prefs_remember_last_share_location">Onthoud de share locatie</string> + <string name="prefs_remember_last_upload_location_summary">Onthoud de laatst gebruikte share locatie</string> + + <string name="recommend_subject">Probeer %1$s op je smartphone!</string> + <string name="recommend_text">Ik wil je uitnodigen om %1$s op je smartphone te gebruiken.\nDownload hier: %2$s</string> + + <string name="auth_check_server">Controleer server</string> <string name="auth_host_url">Serveradres https://…</string> <string name="auth_username">Gebruikersnaam</string> <string name="auth_password">Wachtwoord</string> + <string name="auth_register">Heb je nog geen server?\n +Kies er eentje van een provider.</string> <string name="sync_string_files">Bestanden</string> <string name="setup_btn_connect">Verbinden</string> <string name="uploader_btn_upload_text">Uploaden</string> @@ -76,13 +89,16 @@ <string name="uploader_error_message_no_file_to_upload">Ontvangen gegevens bevatten geen geldig bestand.</string> <string name="uploader_error_title_file_cannot_be_uploaded">Dit bestand kan niet worden geüpload</string> <string name="uploader_error_message_read_permission_not_granted">%1$s heeft geen toestemming om een ontvangen bestand te lezen</string> + <string name="uploader_error_message_source_file_not_found">Voor upload geselecteerde bestand niet gevonden. Controleer of het bestaat.</string> <string name="uploader_upload_files_behaviour">Uploadoptie:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Verplaats bestand naar Nextcloud-map</string> <string name="uploader_upload_files_behaviour_only_upload">Bewaar het bestand in de bronmap</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Verwijder bestand uit bronmap</string> <string name="file_list_seconds_ago">seconden geleden</string> <string name="file_list_empty_headline">Hier geen bestanden</string> + <string name="file_list_empty">Upload je inhoud of synchroniseer met je apparaten.</string> <string name="file_list_loading">Laden …</string> + <string name="file_list_no_app_for_file_type">Er is geen app ingesteld om dit bestandformaat te behandelen.</string> <string name="local_file_list_empty">Er staan geen bestanden in deze map.</string> <string name="file_list_empty_headline_search">Geen resultaten in deze map</string> <string name="file_list_empty_headline_server_search">Geen resultaten</string> @@ -96,7 +112,14 @@ <string name="file_list_empty_recently_modified_filter">Je zoekopdracht vond geen bestanden die in de laatste 7 dagen werden gewijzigd.</string> <string name="file_list_empty_recently_added">Geen recent toegevoegde bestanden gevonden</string> + <string name="file_list_empty_recently_added_filter">Geen recent toegevoegde bestanden gevonden voor je zoekopdracht!</string> + <string name="file_list_empty_text_photos">Upload enkele foto\'s of activeer auto-upload.</string> + <string name="file_list_empty_text_photos_filter">Geen foto\'s voor je zoekopdracht.</string> + <string name="file_list_empty_text_videos">Upload enkele video\'s of activeer auto-upload.</string> + <string name="file_list_empty_text_videos_filter">Geen video\'s voor je zoekopdracht.</string> <string name="upload_list_empty_headline">Geen uploads beschikbaar</string> + <string name="upload_list_empty_text">Upload enkele gegevens of activeer directe upload.</string> + <string name="upload_list_empty_text_auto_upload">Upload enkele gegevens of activeer auto-upload.</string> <string name="file_list_folder">map</string> <string name="file_list_folders">mappen</string> <string name="file_list_file">bestand</string> @@ -108,6 +131,7 @@ <string name="filedetails_modified">Aangepast:</string> <string name="filedetails_download">Downloaden</string> <string name="filedetails_sync_file">Synchroniseren</string> + <string name="filedetails_renamed_in_upload_msg">Bestand hernoemd naar %1$s tijdens de upload</string> <string name="action_share">Delen</string> <string name="common_yes">Ja</string> <string name="common_no">Nee</string> @@ -162,10 +186,13 @@ <string name="downloader_download_succeeded_ticker">Gedownload</string> <string name="downloader_download_succeeded_content">%1$s gedownload.</string> <string name="downloader_download_failed_ticker">Downloaden mislukt</string> + <string name="downloader_download_failed_content">Kon %1$s niet downloaden</string> <string name="downloader_not_downloaded_yet">Nog niet gedownload</string> <string name="downloader_download_failed_credentials_error">Downloaden mislukt, je moet opnieuw inloggen</string> <string name="common_choose_account">Account kiezen</string> <string name="sync_fail_ticker">Synchronisatie mislukt</string> + <string name="sync_fail_ticker_unauthorized">Synchronisatie mislukt, je moet opnieuw inloggen</string> + <string name="sync_fail_content">Synchronisatie van %1$s kon niet worden voltooid</string> <string name="sync_fail_content_unauthorized">Onjuist wachtwoord voor %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Conflicten gevonden</string> <string name="sync_conflicts_in_favourites_content">%1$d gesynchroniseerd te houden bestanden konden niet worden gesynchroniseerd</string> @@ -173,6 +200,7 @@ <string name="sync_fail_in_favourites_content">Inhoud van %1$d bestanden kon niet worden gesynchroniseerd (%2$d conflicten)</string> <string name="sync_foreign_files_forgotten_ticker">Een paar lokale bestanden werden vergeten</string> <string name="sync_foreign_files_forgotten_content">%1$d bestanden uit de %2$s-map konden niet worden gekopieerd naar</string> + <string name="sync_foreign_files_forgotten_explanation">Vanaf versie 1.3.16 worden bestanden die vanaf dit apparaat worden geüpload ook gekopieerd naar de lokale map %1$s om gegevensverlies te voorkomen als een enkel bestand wordt gesynchroniseerd met meerdere accounts.\n\nDoor deze aanpassing werden alle bestanden die met een eerdere versie zijn geüpload gekopieerd naar de map %2$s. Maar een fout voorkwam het succesvol afronden van deze actie tijdens het synchroniseren. Je kunt de/het bestand(en) laten staan zoals ze nu zijn en de link naar %3$s verwijderen, of je kunt de bestanden verplaatsen naar map %1$s en de link naar %4$s laten staan.\n\nHieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar verwezen.</string> <string name="sync_current_folder_was_removed">Map %1$s bestaat niet meer</string> <string name="foreign_files_move">Alles verplaatsen</string> <string name="foreign_files_success">Alle bestanden zijn verplaatst</string> @@ -198,6 +226,14 @@ <string name="media_err_no_account">Geen account opgegeven</string> <string name="media_err_not_in_owncloud">Het bestand hoort niet bij een geldig account</string> <string name="media_err_unsupported">Niet-ondersteunde mediacodec</string> + <string name="media_err_io">Kon het mediabestand niet lezen</string> + <string name="media_err_malformed">Mediabestand niet goed gecodeerd</string> + <string name="media_err_timeout">Time-out tijdens het afspelen</string> + <string name="media_err_invalid_progressive_playback">Mediabestand kan niet worden gestreamd</string> + <string name="media_err_unknown">Mediabestand kan niet worden afgespeeld met de standaard mediaplayer</string> + <string name="media_err_security_ex">Beveiligingsfout bij afspelen %1$s</string> + <string name="media_err_io_ex">Invoerfout bij afspelen %1$s</string> + <string name="media_err_unexpected">Onverwachte fout bij afspelen %1$s</string> <string name="media_rewind_description">Terugpoelknop</string> <string name="media_play_pause_description">Speel- of pauzeknop</string> <string name="media_forward_description">Doorspoelknop</string> @@ -209,22 +245,29 @@ <string name="auth_connection_established">Verbinding tot stand gebracht</string> <string name="auth_testing_connection">Verbinding testen</string> <string name="auth_not_configured_title">Foutieve serverconfiguratie</string> + <string name="auth_account_not_new">Er bestaat al een account voor deze gebruiker en server op dit apparaat</string> <string name="auth_account_not_the_same">De opgegeven gebruiker komt niet overeen met de gebruiker van dit account</string> <string name="auth_unknown_error_title">Onbekende fout opgetreden!</string> <string name="auth_unknown_host_title">Kon server niet vinden</string> <string name="auth_incorrect_path_title">Server niet gevonden</string> <string name="auth_timeout_title">De server reageerde niet op tijd</string> + <string name="auth_incorrect_address_title">Verkeerd adresformaat voor server</string> <string name="auth_ssl_general_error_title">SSL-initialisatie mislukt</string> + <string name="auth_ssl_unverified_server_title">Kon de identiteit van de SSL-server niet verifiëren</string> <string name="auth_bad_oc_version_title">Niet-herkende serverversie</string> + <string name="auth_wrong_connection_title">Kon verbinding niet tot stand brengen</string> <string name="auth_secure_connection">Veilige verbinding tot stand gebracht</string> <string name="auth_unauthorized">Verkeerde gebruikersnaam of wachtwoord</string> <string name="auth_oauth_error">Autorisatie niet succesvol</string> <string name="auth_oauth_error_access_denied">Toegang geweigerd door autorisatieserver</string> + <string name="auth_wtf_reenter_URL">Onverwachte toestand; voer het serveradres opnieuw in</string> <string name="auth_expired_oauth_token_toast">Je autorisatie is verstreken. Autoriseer opnieuw</string> <string name="auth_expired_basic_auth_toast">Voer het huidige wachtwoord in</string> <string name="auth_expired_saml_sso_token_toast">Je sessie is verstreken. Verbind opnieuw</string> + <string name="auth_connecting_auth_server">Verbinden met authenticatieserver...</string> <string name="auth_unsupported_auth_method">De server ondersteunt deze authenticatiemethode niet</string> <string name="auth_unsupported_multiaccount">%1$s ondersteunt het gebruik van meerdere accounts niet</string> + <string name="auth_fail_get_user_name">Je server geeft geen goede userid terug, neem contact op met je beheerder</string> <string name="auth_can_not_auth_against_server">Kan niet autenticeren tegen deze server</string> <string name="auth_account_does_not_exist">Account bestaan nog niet op dit apparaat</string> @@ -235,10 +278,12 @@ <string name="common_rename">Hernoemen</string> <string name="common_remove">Verwijderen</string> <string name="confirmation_remove_file_alert">Wil je %1$s echt verwijderen?</string> + <string name="confirmation_remove_folder_alert">Wil je %1$s en de inhoud ervan werkelijk verwijderen?</string> <string name="confirmation_remove_local">Alleen lokaal</string> <string name="remove_success_msg">Verwijderd</string> <string name="remove_fail_msg">Verwijderen mislukt</string> <string name="rename_dialog_title">Voer een nieuwe naam in</string> + <string name="rename_local_fail_msg">Lokale kopie kon niet worden hernoemd; probeer een andere naam</string> <string name="rename_server_fail_msg">Kon de server geen nieuwe naam geven</string> <string name="sync_file_fail_msg">Kon extern bestand niet controleren</string> <string name="sync_file_nothing_to_do_msg">Bestandsinhoud is al gesynchroniseerd</string> @@ -248,6 +293,7 @@ <string name="filename_empty">Bestandsnaam mag niet leeg zijn</string> <string name="wait_a_moment">Even geduld...</string> <string name="wait_checking_credentials">Opgeslagen inloggegevens nakijken</string> + <string name="filedisplay_unexpected_bad_get_content">Onverwacht probleem; probeer het bestand met een andere app te selecteren</string> <string name="filedisplay_no_file_selected">Geen bestand geselecteerd</string> <string name="activity_chooser_title">Verstuur link naar …</string> <string name="wait_for_tmp_copy_from_private_storage">Bestand vanaf privéopslag kopiëren</string> @@ -519,7 +565,6 @@ <string name="webview_error">Er heeft zich een fout voorgedaan</string> <string name="prefs_category_about">Over</string> - <string name="contacts_backup_button">Nu</string> <string name="contacts_restore_button">Herstel de laatste backup</string> <string name="contacts_header_restore">Herstellen</string> <string name="contacts_header_backup">Backuppen</string> @@ -527,6 +572,7 @@ <string name="contacts_last_backup">Laatsts backup</string> <string name="contactlist_title">Herstellen contactpersonen</string> <string name="contaclist_restore_selected">Herstel de geselecteerde contactpersonen</string> + <string name="contactlist_account_chooser_title">Kies een account voor import</string> <string name="contacts_preference_choose_date">Kies datum</string> <string name="contacts_preference_backup_never">nooit</string> <string name="contacts_preferences_no_file_found">Geen bestand gevonden</string> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 07f1ced923..9495d69ae4 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -283,6 +283,7 @@ <string name="common_rename">Renomear</string> <string name="common_remove">Excluir</string> <string name="confirmation_remove_file_alert">Deseja realmente excluir %1$s?</string> + <string name="confirmation_remove_folder_alert">Você realmente quer remover %1$s e seu conteúdo?</string> <string name="confirmation_remove_local">Somente local</string> <string name="remove_success_msg">Excluído</string> <string name="remove_fail_msg">Erro ao excluir</string> @@ -624,7 +625,6 @@ <string name="prefs_category_about">Sobre</string> <string name="actionbar_contacts">Fazer backup dos contatos</string> - <string name="contacts_backup_button">Agora</string> <string name="contacts_restore_button">Retornar último backup</string> <string name="contacts_header_restore">Retornar</string> <string name="contacts_header_backup">Backup</string> diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index f6046fd8a6..12ef642224 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">指纹锁</string> <string name="prefs_fingerprint_notsetup">指纹锁没有设置</string> <string name="prefs_show_hidden_files">显示隐藏文件</string> - <string name="prefs_instant_upload">即时图片上传</string> - <string name="prefs_instant_upload_summary">即时上传相机拍摄的图片</string> - <string name="prefs_instant_video_upload">即时上传视频</string> - <string name="prefs_instant_video_upload_summary">即时上传由相机拍摄的视频</string> + <string name="prefs_instant_upload">立刻上传图片</string> + <string name="prefs_instant_upload_summary">立刻上传摄像头拍摄的图片</string> + <string name="prefs_instant_video_upload">立刻上传视频</string> + <string name="prefs_instant_video_upload_summary">立刻上传摄像头拍摄的视频</string> <string name="prefs_log_title">开启日志</string> <string name="prefs_log_summary">用于记录问题</string> <string name="prefs_log_title_history">历史日志</string> @@ -58,23 +58,17 @@ <string name="prefs_calendar_contacts">同步日历和通讯录</string> <string name="prefs_calendar_contacts_summary">为现在的用户设置DAVdroid(v1.3.0+)</string> <string name="prefs_calendar_contacts_address_resolve_error">用户目前的服务器地址对于DAVdroid不能被解析</string> - <string name="prefs_calendar_contacts_no_store_error">没有安装谷歌或F-Droid的应用商店</string> - <string name="prefs_calendar_contacts_sync_setup_successful">日历和通讯录的同步设置成功</string> + <string name="prefs_calendar_contacts_no_store_error">F-droid或谷歌商店都没有装</string> + <string name="prefs_calendar_contacts_sync_setup_successful">日历&联系人同步设置</string> <string name="prefs_help">帮助</string> <string name="prefs_recommend">推荐给朋友</string> <string name="prefs_feedback">反馈</string> <string name="prefs_imprint">版本说明</string> - <string name="prefs_remember_last_share_location">记住共享位置</string> - <string name="prefs_remember_last_upload_location_summary">记住上次共享上传的位置</string> - - <string name="recommend_subject">在您的智能手机上试用 %1$s!</string> - <string name="recommend_text">我邀请你在智能手机上使用 %1$s\n下载路径:%2$s</string> - - <string name="auth_check_server">检查服务器</string> + <string name="recommend_subject">在您的智能手机上试用 %1$s!</string> + <string name="auth_check_server">检查服务器</string> <string name="auth_host_url">服务器地址 https://...</string> <string name="auth_username">用户名</string> <string name="auth_password">密码</string> - <string name="auth_register">还没有服务器吗? \n点击这里从提供商那里获取一个</string> <string name="sync_string_files">文件</string> <string name="setup_btn_connect">连接</string> <string name="uploader_btn_upload_text">上传</string> @@ -86,23 +80,13 @@ <string name="uploader_error_title_no_file_to_upload">文件没有上传</string> <string name="uploader_error_message_received_piece_of_text">%1$s不能把一段文字做为文件上传</string> <string name="uploader_error_message_no_file_to_upload">得到的数据没有包括有效文件</string> - <string name="uploader_error_title_file_cannot_be_uploaded">文件无法被上传</string> <string name="uploader_error_message_read_permission_not_granted">%1$s 不让读取已经获得的文件</string> - <string name="uploader_error_message_source_file_not_found">要上传的文件没有在本地发现,请检查文件是否存在 -</string> - <string name="uploader_error_message_source_file_not_copied">当文件复制到临时文件夹时有错误发生,请重新发送</string> <string name="uploader_upload_files_behaviour">上传选项:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">移动文件到Nextcloud文件夹</string> <string name="uploader_upload_files_behaviour_only_upload">在原文件夹中保留文件</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">从原文件夹中删除文件</string> <string name="file_list_seconds_ago">几秒前</string> - <string name="file_list_empty_headline">这里没有文件</string> - <string name="file_list_empty">上传一些内容或者和你的设备同步</string> - <string name="file_list_empty_favorites">收藏一些文件或和你的设备同步!</string> - <string name="file_list_empty_favorites_filter_list">收藏的文件和文件夹会在这里显示</string> - <string name="file_list_empty_favorites_filter">未找到你要搜索的收藏文件</string> <string name="file_list_loading">加载中…</string> - <string name="file_list_no_app_for_file_type">没有找到程序打开文件格式!</string> <string name="local_file_list_empty">在该文件夹中不存在文件。</string> <string name="file_list_empty_headline_search">此文件夹无结果</string> <string name="file_list_empty_headline_server_search">没有结果</string> @@ -110,18 +94,7 @@ <string name="file_list_empty_shared">您共享的文件和文件夹将显示在这里</string> <string name="file_list_empty_headline_server_search_videos">无视频</string> <string name="file_list_empty_headline_server_search_photos">无照片</string> - <string name="file_list_empty_search">在其他文件夹找找试试?</string> - <string name="file_list_empty_recently_modified">未找到 7 日内有更改的文件</string> - <string name="file_list_empty_recently_modified_filter">未找到你要搜索的 7 日内有更改的文件!</string> - <string name="file_list_empty_recently_added">未找到最近添加的文件</string> - <string name="file_list_empty_recently_added_filter">未找到你要搜索的最近添加文件</string> - <string name="file_list_empty_text_photos">上传一些照片或启用自动上传!</string> - <string name="file_list_empty_text_photos_filter">未找到你要搜索的照片!</string> - <string name="file_list_empty_text_videos">上传一些视频或启用自动上传!</string> - <string name="file_list_empty_text_videos_filter">未找到你要搜索的视频!</string> <string name="upload_list_empty_headline">没有可以上传的</string> - <string name="upload_list_empty_text">上传一些内容或者激活实时上传</string> - <string name="upload_list_empty_text_auto_upload">上传一些内容或启用自动上传!</string> <string name="file_list_folder">文件夹</string> <string name="file_list_folders">文件夹</string> <string name="file_list_file">文件</string> @@ -133,14 +106,11 @@ <string name="filedetails_modified">修改于:</string> <string name="filedetails_download">下载</string> <string name="filedetails_sync_file">同步</string> - <string name="filedetails_renamed_in_upload_msg">上传过程中文件被更名为了 %1$s</string> - <string name="list_layout">列表布局</string> <string name="action_share">共享</string> <string name="common_yes">是</string> <string name="common_no">否</string> <string name="common_ok">确定</string> <string name="common_remove_upload">移除上传任务</string> - <string name="common_retry_upload">重试上传任务</string> <string name="common_cancel_sync">取消同步</string> <string name="common_cancel">取消</string> <string name="common_back">返回</string> @@ -160,10 +130,8 @@ <string name="uploader_info_dirname">文件夹名称</string> <string name="uploader_upload_in_progress_ticker">上传 …</string> <string name="uploader_upload_in_progress_content">%1$d%% 上传 %2$s</string> - <string name="uploader_upload_succeeded_ticker">上传成功</string> <string name="uploader_upload_succeeded_content_single">%1$s 上传成功</string> <string name="uploader_upload_failed_ticker">上传失败</string> - <string name="uploader_upload_failed_content_single">%1$s 未能成功上传</string> <string name="uploader_upload_failed_credentials_error">上传失败,你需要重新登录</string> <string name="uploads_view_title">上传</string> <string name="uploads_view_group_current_uploads">当前</string> @@ -180,37 +148,27 @@ <string name="uploads_view_upload_status_failed_localfile_error">本地文件未找到</string> <string name="uploads_view_upload_status_failed_permission_error">权限错误</string> <string name="uploads_view_upload_status_conflict">冲突</string> - <string name="uploads_view_upload_status_service_interrupted">应该将被终止</string> <string name="uploads_view_upload_status_unknown_fail">未知错误</string> - <string name="uploads_view_upload_status_waiting_for_wifi">等待WiFi连接</string> <string name="uploads_view_later_waiting_to_upload">等待上传...</string> <string name="downloader_download_in_progress_ticker">下载中 …</string> <string name="downloader_download_in_progress_content">%1$d%% 下载中 %2$s</string> - <string name="downloader_download_succeeded_ticker">下载成功</string> <string name="downloader_download_succeeded_content">%1$s 下载成功</string> <string name="downloader_download_failed_ticker">下载失败</string> - <string name="downloader_download_failed_content">%1$s 下载未能完成</string> <string name="downloader_not_downloaded_yet">未下载完毕</string> <string name="downloader_download_failed_credentials_error">下载失败,你需要重新登录</string> <string name="common_choose_account">选择账户</string> <string name="sync_fail_ticker">同步失败</string> - <string name="sync_fail_ticker_unauthorized">同步错误;你需要重新登陆</string> - <string name="sync_fail_content">%1$s 的同步无法完成</string> - <string name="sync_fail_content_unauthorized">%1$s 的密码错误</string> <string name="sync_conflicts_in_favourites_ticker">发现冲突</string> <string name="sync_conflicts_in_favourites_content">%1$d 文件无法同步</string> <string name="sync_fail_in_favourites_ticker">文件同步失败</string> <string name="sync_fail_in_favourites_content">无法同步 %1$d 文件内容(%2$d 冲突)</string> <string name="sync_foreign_files_forgotten_ticker">某些本地文件已被遗忘</string> <string name="sync_foreign_files_forgotten_content">%2$s 目录中的 %1$d 个文件不能被复制到</string> - <string name="sync_foreign_files_forgotten_explanation">从 1.3.16 版起,从此设备上传的文件将被复制到本地的 %1$s 文件夹,以防止某个单一文件在多个账户间同步而造成的数据损失。\n\n 由于此项变化,此应用之前的版本上传的全部文件都已被复制到了 %2$s 文件夹。然而,账户同步期间有一个错误阻止了此操作的完成。您可能想保持文件不动,并移除指向 %3$s 的链接,或将文件移动到 %1$s 文件夹中并保持其到 %4$s 的链接。下面列出的是本地文件,以及它们被链接到的 %5$s 中的远程文件。</string> - <string name="sync_current_folder_was_removed">文件夹%1$s 已经不存在</string> <string name="foreign_files_move">移动所有</string> <string name="foreign_files_success">所有文件已被移动</string> <string name="foreign_files_fail">某些文件无法被移动</string> <string name="foreign_files_local_text">本地: %1$s</string> <string name="foreign_files_remote_text">远程:%1$s</string> - <string name="upload_query_move_foreign_files">没有足够的空间把选上的文件复制到%1$s目录,你愿意改成转移他们吗?</string> <string name="pass_code_enter_pass_code">请输入你的密码</string> <string name="pass_code_configure_your_pass_code">输入您的密码</string> @@ -228,16 +186,7 @@ <string name="media_event_done">%1$s 播放完毕</string> <string name="media_err_nothing_to_play">没有发现播放文件</string> <string name="media_err_no_account">未提供账号</string> - <string name="media_err_not_in_owncloud">文件不在合法账户</string> <string name="media_err_unsupported">不支持的编码格式</string> - <string name="media_err_io">文件不可读</string> - <string name="media_err_malformed">文件编码错误</string> - <string name="media_err_timeout">播放超时</string> - <string name="media_err_invalid_progressive_playback">文件不支持流播</string> - <string name="media_err_unknown">当前媒体播放器不支持。</string> - <string name="media_err_security_ex">尝试播放%1$s时保护错误</string> - <string name="media_err_io_ex">尝试播放%1$s时输入错误</string> - <string name="media_err_unexpected">尝试播放%1$s时未知错误</string> <string name="media_rewind_description">后退按钮</string> <string name="media_play_pause_description">播放暂停按钮</string> <string name="media_forward_description">快进按钮</string> @@ -249,32 +198,21 @@ <string name="auth_connection_established">连接已建立。</string> <string name="auth_testing_connection">测试连接</string> <string name="auth_not_configured_title">服务器配置不正确</string> - <string name="auth_account_not_new">此设备中已经存在同名同服务器的帐号</string> <string name="auth_account_not_the_same">输入用户与此帐户的用户不符</string> <string name="auth_unknown_error_title">发生未知错误!</string> - <string name="auth_unknown_host_title">无法找到主机</string> - <string name="auth_incorrect_path_title">未发现服务器实例</string> <string name="auth_timeout_title">看起来服务器不太给力</string> - <string name="auth_incorrect_address_title">错误的服务器地址</string> <string name="auth_ssl_general_error_title">SSL初始化失败</string> - <string name="auth_ssl_unverified_server_title">无法验证 SSL 服务器的身份</string> <string name="auth_bad_oc_version_title">不可辨识的服务器服务器版本</string> - <string name="auth_wrong_connection_title">无法建立连接</string> <string name="auth_secure_connection">安全连接已建立</string> <string name="auth_unauthorized">用户名或密码错误</string> <string name="auth_oauth_error">认证不成功</string> <string name="auth_oauth_error_access_denied">访问被认证服务器拒绝</string> - <string name="auth_wtf_reenter_URL">未知状态,请重新输入服务器地址</string> <string name="auth_expired_oauth_token_toast">你的授权已经过期。请重新授权。</string> <string name="auth_expired_basic_auth_toast">请输入当前的密码</string> <string name="auth_expired_saml_sso_token_toast">您的会话超时了,请重新连接</string> - <string name="auth_connecting_auth_server">连接认证服务器...</string> <string name="auth_unsupported_auth_method">服务器不支持这种验证方式</string> <string name="auth_unsupported_multiaccount">%1$s不支持多个账户</string> - <string name="auth_fail_get_user_name">你的服务器没有返回正确的用户ID,请联系管理员</string> <string name="auth_can_not_auth_against_server">无法连接认证服务器</string> - <string name="auth_account_does_not_exist">设备中还未存在该帐号</string> - <string name="favorite">可以设置离线</string> <string name="unfavorite">不可以设置离线</string> <string name="favorite_real">加入收藏</string> @@ -282,36 +220,24 @@ <string name="common_rename">重命名</string> <string name="common_remove">删除</string> <string name="confirmation_remove_file_alert">你确定要删除%1$s?</string> - <string name="confirmation_remove_folder_alert">您确定要删除 %1$s 及其内容吗?</string> <string name="confirmation_remove_local">仅本地</string> - <string name="remove_success_msg">成功删除</string> <string name="remove_fail_msg">无法完成删除</string> <string name="rename_dialog_title">请输出新的名字</string> - <string name="rename_local_fail_msg">本地副本无法重命名,请尝试另外的名字</string> - <string name="rename_server_fail_msg">重命名未完成</string> - <string name="sync_file_fail_msg">无法核实远程文件</string> <string name="sync_file_nothing_to_do_msg">文件内容已同步</string> - <string name="create_dir_fail_msg">文件夹无法创建</string> <string name="filename_forbidden_characters">禁用字符: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">文件名中存在至少一个非法字符</string> <string name="filename_empty">文件名不能为空</string> - <string name="wait_a_moment">请稍候</string> <string name="wait_checking_credentials">检查保存的证书</string> - <string name="filedisplay_unexpected_bad_get_content">未预见错误,请从其它程序中选取文件</string> - <string name="filedisplay_no_file_selected">未选择文件</string> <string name="activity_chooser_title">发送链接给 …</string> <string name="wait_for_tmp_copy_from_private_storage">从私有存储中拷贝文件</string> <string name="oauth_check_onoff">使用oAuth2登陆</string> - <string name="oauth_login_connection">连接oAuth2 服务器...</string> - <string name="ssl_validator_header">站点身份无法验证</string> <string name="ssl_validator_reason_cert_not_trusted">- 不受信任的服务器证书</string> <string name="ssl_validator_reason_cert_expired">- 服务器证书过期</string> <string name="ssl_validator_reason_cert_not_yet_valid">- 服务器证书时间比当前时间还晚</string> <string name="ssl_validator_reason_hostname_not_verified">- 主机名与证书中的记录不匹配</string> <string name="ssl_validator_question">是否信任此证书?</string> - <string name="ssl_validator_not_saved">证书无法保存</string> <string name="ssl_validator_btn_details_see">详细信息</string> <string name="ssl_validator_btn_details_hide">隐藏</string> <string name="ssl_validator_label_subject">授权给:</string> @@ -335,27 +261,17 @@ <string name="placeholder_sentence">占位符</string> <string name="placeholder_filename">点位符.txt</string> - <string name="placeholder_filetype">PNG图像格式</string> <string name="placeholder_filesize">389字节</string> <string name="placeholder_timestamp">2012/05/18 下午12:23 </string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">只通过wifi上传</string> - <string name="instant_upload_on_wifi">仅通过 WIFI 上传照片</string> - <string name="instant_video_upload_on_wifi">仅通过 WIFI 上传图片。</string> - <string name="instant_video_upload_on_charging">只在充电时上传</string> - <string name="instant_upload_on_charging">只在充电时上传</string> <string name="instant_upload_path">/实时上传</string> <string name="conflict_title">文件冲突</string> - <string name="conflict_message">您想要保留哪个文件?如果您同时选中了两个版本,本地的文件的文件名将被加上一个数字</string> <string name="conflict_keep_both">保留两者</string> <string name="conflict_use_local_version">本地版本</string> <string name="conflict_use_server_version">服务器版本</string> - <string name="preview_sorry">对此抱歉!</string> <string name="preview_image_description">图片预览</string> - <string name="preview_image_error_unknown_format">无法显示图片</string> - <string name="error__upload__local_file_not_copied">无法复制 %1$s 到本地目录 %2$s</string> <string name="prefs_instant_upload_path_title">实时上传文件夹</string> <string name="prefs_folder_sync_local_path_title">本地文件夹</string> @@ -363,7 +279,6 @@ <string name="prefs_instant_upload_path_use_subfolders_title">使用子文件夹</string> <string name="prefs_instant_upload_path_use_subfolders_summary">基于年和月存于子文件夹</string> - <string name="share_link_no_support_share_api">抱歉,你的服务器无法分享,请联系你的管理员</string> <string name="share_link_file_no_exist">无法共享。请检查文件是否存在</string> <string name="share_link_file_error">共享文件或目录出错</string> <string name="unshare_link_file_no_exist">无法取消共享。请检查文件是否存在</string> @@ -377,56 +292,29 @@ <string name="copy_link">复制链接</string> <string name="clipboard_text_copied">复制到剪贴板</string> - <string name="clipboard_no_text_to_copy">没有取得文本可以复制到剪贴板</string> <string name="clipboard_uxexpected_error">发生未预见的错误当复制到剪贴板</string> <string name="clipboard_label">从%1$s复制文本</string> - <string name="error_cant_bind_to_operations_service">严重错误:无法执行操作</string> - - <string name="network_error_socket_exception">连接到服务器时发生了一个错误。</string> - <string name="network_error_socket_timeout_exception">当等待服务器时发生错误,操作不能完成</string> - <string name="network_error_connect_timeout_exception">当等待服务器时发生错误,操作不能完成</string> - <string name="network_host_not_available">操作无法无成,服务器不可用</string> - <string name="forbidden_permissions">你没有权限%s</string> <string name="forbidden_permissions_rename">重命名该文件</string> <string name="forbidden_permissions_delete">删除该文件</string> <string name="share_link_forbidden_permissions">共享该文件</string> <string name="unshare_link_forbidden_permissions">取消共享该文件</string> <string name="update_link_forbidden_permissions">更新共享</string> - <string name="forbidden_permissions_create">创建文件</string> - <string name="uploader_upload_forbidden_permissions">在此文件夹上传</string> <string name="downloader_download_file_not_found">该文件在服务器上不可用</string> <string name="file_migration_dialog_title">更新存储路径</string> <string name="file_migration_finish_button">完成</string> - <string name="file_migration_preparing">正在准备迁移…</string> <string name="file_migration_checking_destination">检查目的地…</string> - <string name="file_migration_saving_accounts_configuration">保存用户设置…</string> - <string name="file_migration_waiting_for_unfinished_sync">正在同步,请等候…</string> <string name="file_migration_migrating">正在转移数据…</string> <string name="file_migration_updating_index">更新目录…</string> <string name="file_migration_cleaning">清除…</string> - <string name="file_migration_restoring_accounts_configuration">重新装入用户设置…</string> <string name="file_migration_ok_finished">完成</string> - <string name="file_migration_failed_not_enough_space">错误:没有足够空间</string> - <string name="file_migration_failed_not_writable">错误:文件不可写</string> - <string name="file_migration_failed_not_readable">错误:文件不可读</string> <string name="file_migration_failed_dir_already_exists">错误:Nextcloud目录已经存在</string> - <string name="file_migration_failed_while_coping">错误:等待迁移</string> - <string name="file_migration_failed_while_updating_index">错误:正在更新目录</string> - - <string name="file_migration_directory_already_exists">数据目录已经存在,怎么办?</string> - <string name="file_migration_override_data_folder">覆盖</string> - <string name="file_migration_use_data_folder">使用存在</string> - <string name="prefs_category_accounts">账号</string> <string name="prefs_add_account">添加账号</string> <string name="drawer_manage_accounts">管理账号</string> - <string name="auth_redirect_non_secure_connection_title">安全连接是通过一个非安全路由定向的。</string> - - <string name="actionbar_logger">日志</string> + <string name="actionbar_logger">日志</string> <string name="log_send_history_button">发送历史日志</string> - <string name="log_send_no_mail_app">无法发送日志,请安装邮箱应用。</string> <string name="log_send_mail_subject">%1$s Android 程序日志</string> <string name="log_progress_dialog_text">加载数据 …</string> @@ -434,27 +322,20 @@ <string name="saml_authentication_wrong_pass">错误密码</string> <string name="actionbar_move">移动</string> <string name="actionbar_copy">复制</string> - <string name="file_list_empty_moving">这里还什么都没有。上传些东西吧!</string> <string name="folder_picker_choose_button_text">选择</string> - <string name="move_file_not_found">无法移动。请检查文件是否存在</string> - <string name="move_file_invalid_into_descendent">无法把一个目录移动到它的下级</string> - <string name="move_file_invalid_overwrite">该文件已经存在在目标文件夹</string> <string name="move_file_error">尝试移动该文件或文件夹时发生错误</string> <string name="forbidden_permissions_move">移动该文件</string> <string name="copy_file_not_found">无法复制文件。请检查文件是否存在</string> - <string name="copy_file_invalid_into_descendent">将一个目录移动到它的子目录是不可能的</string> - <string name="copy_file_invalid_overwrite">该文件已经存在在目标文件夹</string> <string name="copy_file_error">尝试复制这个文件或文件夹时发生了错误</string> <string name="forbidden_permissions_copy">复制这个文件</string> <string name="prefs_category_instant_uploading">即时上传</string> <string name="prefs_category_details">详细信息</string> - <string name="prefs_instant_video_upload_path_title">实时上传视频目录</string> - <string name="sync_folder_failed_content"> %1$s同步未完成。</string> + <string name="sync_folder_failed_content"> %1$s同步未完成。</string> <string name="shared_subject_header">已共享</string> <string name="with_you_subject_header">与你</string> @@ -495,7 +376,6 @@ <string name="share_add_user_or_group">添加用户或组</string> <string name="share_via_link_section_title">分享链接</string> <string name="share_via_link_expiration_date_label">设置过期日期</string> - <string name="share_via_link_password_label">密码保护</string> <string name="share_via_link_password_title">安全</string> <string name="share_via_link_edit_permission_label">允许编辑</string> <string name="share_via_link_hide_file_listing_permission_label">隐藏文件列表</string> @@ -511,7 +391,6 @@ <string name="share_email_clarification">%1$s (邮件)</string> <string name="share_known_remote_clarification">%1$s ( 在 %2$s )</string> - <string name="share_sharee_unavailable">抱歉,你的服务器版本不允许你分享给用户在客户端,请联系管理员</string> <string name="share_privilege_can_share">可共享</string> <string name="share_privilege_can_edit">可编辑</string> <string name="share_privilege_can_edit_create">创建</string> @@ -520,50 +399,34 @@ <string name="edit_share_unshare">停止共享</string> <string name="edit_share_done">完成</string> - <string name="action_retry_uploads">重试失败</string> <string name="action_clear_failed_uploads">清除失败</string> - <string name="action_clear_successful_uploads">清除成功</string> - <string name="action_clear_finished_uploads">清除所有完成任务</string> - <string name="action_switch_grid_view">网格视图</string> <string name="action_switch_list_view">列表视图</string> <string name="manage_space_title">管理空间</string> - <string name="manage_space_description">在%1$s的数据中,设置、数据库和服务器认证都会永久性删除,\n\n下载目录会保存。\n\n这个过程会持续些时间。</string> <string name="manage_space_clear_data">清除数据</string> <string name="manage_space_error">某些文件无法删除。</string> - <string name="permission_storage_access">没有权限上传和下载文件。</string> - <string name="local_file_not_found_toast">在当地的文件系统中找不到这个文件</string> <string name="confirmation_remove_files_alert">你是否真的要删除所选的项目?</string> <string name="confirmation_remove_folders_alert">你是否真的要删除所选的项目和它们的内容?</string> - <string name="uploads_view_upload_status_waiting_for_charging">请等待,设备在充电</string> <string name="actionbar_search">搜索</string> <string name="files_drop_not_supported">这是一个Nextcloud的特征,请更新</string> <string name="learn_more">学习更多</string> <string name="drawer_folder_sync">自动上传</string> <string name="drawer_participate">参加</string> - <string name="participate_testing_headline">帮助我们测试</string> - <string name="participate_testing_bug_text">发现一个错误?事情很奇怪?</string> <string name="participate_testing_report_text">在GIthub在报告问题</string> - <string name="participate_testing_version_text">有感兴趣帮我们测试下一个版本吗?</string> <string name="participate_beta_headline">检查这个设备的版本</string> - <string name="participate_beta_text">这包括所有即将加入的特性,有相当的风险。如果Bug 或错误发生,请向我们报告。</string> <string name="participate_release_candidate_headline">发行候选版本</string> - <string name="participate_release_candidate_text">候选发行版(RC)是下一个版本的快照,希望它是稳定的,你可以帮助测试以确认这一点。可以注册登陆在应用商店或手工在F-Droid的版本部分查找,并进行测试。</string> <string name="participate_contribute_headline">活跃的候选版</string> <string name="participate_contribute_irc_text">在IRC上加入这个会话: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">帮助他人在 <a href="%1$s">论坛</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">翻译</a> 应用程序</string> - <string name="participate_contribute_github_text">做为有贡献的开发者,可以看<a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a>的细节</string> <string name="move_to">转移到…</string> <string name="copy_to">复制到</string> <string name="choose_remote_folder">选择文件夹…</string> <string name="folder_sync_loading_folders">加载文件夹…</string> <string name="folder_sync_no_results">没有发现媒体文件夹</string> - <string name="folder_sync_preferences">自动上传喜欢的部分</string> <string name="folder_sync_settings">设置</string> - <string name="folder_sync_new_info">即时上传已经被完全更新,请查看主菜单,重新设置你的自动上传,很抱歉给你带来的不便。\n\n享受新的并已扩展的上传功能!</string> <string name="folder_sync_preferences_folder_path">为%1$s</string> <plurals name="items_selected_count"> <item quantity="other">%d被选择</item> @@ -576,7 +439,6 @@ <string name="notifications_no_results_headline">没有提示</string> <string name="notifications_no_results_message">请稍后核对</string> - <string name="upload_file_dialog_title">输入上传的文件名和文件类型</string> <string name="upload_file_dialog_filename">文件名</string> <string name="upload_file_dialog_filetype">文件类型</string> <string name="upload_file_dialog_filetype_snippet_text">片段文本文件(.txt)</string> @@ -592,8 +454,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">给你所有的数据一个安全的家</string> - <string name="welcome_feature_1_text">在家里或公司,访问,分享,保护你的文件</string> - <string name="welcome_feature_2_title">多用户</string> <string name="welcome_feature_2_text">联接你所有的云</string> @@ -607,7 +467,6 @@ <!-- User information --> <string name="user_info_full_name">全名</string> - <string name="user_info_email">电子邮件</string> <string name="user_info_phone">电话号码</string> <string name="user_info_address">地址</string> <string name="user_info_website">网站</string> @@ -617,23 +476,16 @@ <!-- Activities --> <string name="activities_no_results_headline">暂无动态</string> - <string name="activities_no_results_message">瀑布流中会显示诸如添加\n更改&分享之类的事件</string> <string name="webview_error">发生错误</string> <string name="prefs_category_about">关于</string> - <string name="actionbar_contacts">联系人备份</string> - <string name="contacts_backup_button">现在备份</string> <string name="contacts_restore_button">恢复上次备份</string> <string name="contacts_header_restore">恢复</string> <string name="contacts_header_backup">备份</string> <string name="contacts_automatic_backup">联系人备份</string> <string name="contacts_last_backup">上次备份</string> - <string name="contacts_read_permission">需要联系人的读书权限</string> - <string name="contacts_write_permission">需要联系人的写权限</string> <string name="contactlist_title">恢复联系人</string> <string name="contaclist_restore_selected">恢复选中的联系人</string> - <string name="contactlist_account_chooser_title">选择客户导入</string> - <string name="contactlist_no_permission">没有权限,无法导入!</string> <string name="contacts_preference_choose_date">选择时间</string> <string name="contacts_preference_backup_never">永远不</string> <string name="contacts_preferences_no_file_found">没有文件被发现</string> @@ -642,6 +494,4 @@ <!-- Notifications --> <string name="new_notification_received">收到新提示</string> - - -</resources> + </resources> From d77b446e0dc3d33a4d094f10eb3cfd0e29f7b911 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Tue, 2 May 2017 00:21:53 +0000 Subject: [PATCH 833/881] [tx-robot] updated from transifex --- src/main/res/values-cs-rCZ/strings.xml | 104 ++++++++++- src/main/res/values-de-rDE/strings.xml | 3 + src/main/res/values-de/strings.xml | 3 + src/main/res/values-es/strings.xml | 246 +++++++++++++++---------- src/main/res/values-fr/strings.xml | 118 +++++++++++- src/main/res/values-nl/strings.xml | 71 ++++++- src/main/res/values-pl/strings.xml | 238 ++++++++++-------------- src/main/res/values-pt-rBR/strings.xml | 3 + src/main/res/values-tr/strings.xml | 138 +++++++------- 9 files changed, 606 insertions(+), 318 deletions(-) diff --git a/src/main/res/values-cs-rCZ/strings.xml b/src/main/res/values-cs-rCZ/strings.xml index 5c9c7c90a6..0f2a756694 100644 --- a/src/main/res/values-cs-rCZ/strings.xml +++ b/src/main/res/values-cs-rCZ/strings.xml @@ -42,6 +42,10 @@ <string name="prefs_fingerprint">Zámek otiskemprstu</string> <string name="prefs_fingerprint_notsetup">Nebyly nastaveny žádné otisky prstů.</string> <string name="prefs_show_hidden_files">Zobrazit skryté soubory</string> + <string name="prefs_instant_upload">Okamžité nahrávání obrázků</string> + <string name="prefs_instant_upload_summary">Okamžitě nahrávat vytvořené fotografie</string> + <string name="prefs_instant_video_upload">Okamžité nahrávání videa</string> + <string name="prefs_instant_video_upload_summary">Okamžitě odesílat nahrané video</string> <string name="prefs_log_title">Povolit logování</string> <string name="prefs_log_summary">Použito k zaznamenávání problémů</string> <string name="prefs_log_title_history">Historie logu</string> @@ -50,15 +54,23 @@ <string name="prefs_calendar_contacts">Synchronizovat kalendář & kontakty</string> <string name="prefs_calendar_contacts_summary">Nastavit DAVdroid (v1.3.0+) pro aktuální účet</string> <string name="prefs_calendar_contacts_address_resolve_error">Počítačová adresa konta pro DAVdroid nebyla nalezena</string> + <string name="prefs_calendar_contacts_no_store_error">Nenainstalován Google Play store nebo F-Droid app</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Synchronizace kalendáře & kontaktů úspěšně dokončena</string> <string name="prefs_help">Nápověda</string> + <string name="prefs_recommend">Doporučit přátelům</string> <string name="prefs_feedback">Odezva</string> <string name="prefs_imprint">Imprint</string> <string name="prefs_remember_last_share_location">Zapamatovat umístění sdílení</string> - <string name="recommend_subject">Zkuste %1$s na svém chytrém telefonu!</string> - <string name="auth_check_server">Ověřit server</string> + <string name="prefs_remember_last_upload_location_summary">Zapamatovat poslední umístění pro nahrání sdílených souborů</string> + + <string name="recommend_subject">Zkuste %1$s na svém chytrém telefonu!</string> + <string name="recommend_text">Chtěl bych vás pozvat k používání %1$s na vašem chytrém telefonu!\nKe stažení zde: %2$s</string> + + <string name="auth_check_server">Ověřit server</string> <string name="auth_host_url">Adresa serveru https://...</string> <string name="auth_username">Uživatelské jméno</string> <string name="auth_password">Heslo</string> + <string name="auth_register">Ještě nemáte server?\nKlikněte sem a získejte ho od poskytovatele</string> <string name="sync_string_files">Soubory</string> <string name="setup_btn_connect">Připojit</string> <string name="uploader_btn_upload_text">Nahrát</string> @@ -70,18 +82,26 @@ <string name="uploader_error_title_no_file_to_upload">Žádný soubor k nahrání</string> <string name="uploader_error_message_received_piece_of_text">%1$s neumí nahrát text jako soubor.</string> <string name="uploader_error_message_no_file_to_upload">Obdržená data neobsahují žádný platný soubor.</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Soubor nelze nahrát</string> <string name="uploader_error_message_read_permission_not_granted">%1$s nemá oprávnění číst přijatý soubor</string> + <string name="uploader_error_message_source_file_not_found">Soubor k nahrání nebyl v tomto umístění nalezen. Zkontrolujte prosím zda soubor existuje.</string> + <string name="uploader_error_message_source_file_not_copied">Došlo k chybě při kopírování souboru do dočasného adresáře. Zkuste prosím zopakovat odeslání.</string> <string name="uploader_upload_files_behaviour">Nahrát možnost:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Přesunout soubor do Nextcloud adresáře</string> <string name="uploader_upload_files_behaviour_only_upload">Jen uploadovat</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Uploadovat a vymazat ze zdroje</string> <string name="file_list_seconds_ago">před pár sekundami</string> + <string name="file_list_empty_headline">Nejsou zde žádné soubory</string> + <string name="file_list_empty">Nahrajte nějaký obsah, nebo synchronizujte s vašimi zařízeními!</string> <string name="file_list_loading">Načítání…</string> + <string name="file_list_no_app_for_file_type">Pro tento typ souboru nebyla nalezena aplikace!</string> <string name="local_file_list_empty">V tomto adresáři nejsou žádné soubory.</string> <string name="file_list_empty_headline_search">V této složce nebylo nic nalezeno</string> <string name="file_list_empty_headline_server_search">Žádné výsledky</string> <string name="file_list_empty_favorite_headline">Zatím není nic oblíbeno</string> + <string name="file_list_empty_search">Zkusit hledat v jiné složce?</string> <string name="upload_list_empty_headline">Nic k nahrání</string> + <string name="upload_list_empty_text">Nahrajte nějaký obsah, nebo aktivujte okamžité nahrání!</string> <string name="file_list_folder">adresář</string> <string name="file_list_folders">adresářů</string> <string name="file_list_file">soubor</string> @@ -94,11 +114,13 @@ <string name="filedetails_download">Stáhnout</string> <string name="filedetails_sync_file">Synchronizovat</string> <string name="filedetails_renamed_in_upload_msg">Soubor byl během nahrávání přejmenován na %1$s</string> + <string name="list_layout">Náhled seznamu</string> <string name="action_share">Sdílet</string> <string name="common_yes">Ano</string> <string name="common_no">Ne</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Odstranit nahrávání</string> + <string name="common_retry_upload">Opakovat nahrání</string> <string name="common_cancel_sync">Zrušit synchronizaci</string> <string name="common_cancel">Zrušit</string> <string name="common_back">Zpět</string> @@ -153,17 +175,22 @@ <string name="common_choose_account">Vybrat účet</string> <string name="sync_fail_ticker">Synchronizace selhala</string> <string name="sync_fail_ticker_unauthorized">Synchronizace se nezdařila, musíte se znovu přihlásit.</string> + <string name="sync_fail_content">Synchronizace %1$s nemohla být dokončena</string> + <string name="sync_fail_content_unauthorized">Chybné heslo pro %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Nalezeny konflikty</string> <string name="sync_conflicts_in_favourites_content">%1$d souborů z automatické synchronizace nelze synchronizovat</string> <string name="sync_fail_in_favourites_ticker">Automatická synchronizace souborů selhala</string> <string name="sync_fail_in_favourites_content">Obsah %1$d souborů nemohl být synchronizován (počet konfliktů: %2$d)</string> <string name="sync_foreign_files_forgotten_ticker">Některé místní soubory byly zapomenuty</string> <string name="sync_foreign_files_forgotten_content">%1$d souborů z %2$s adresáře se nepodařilo zkopírovat do</string> + <string name="sync_foreign_files_forgotten_explanation">Od verze 1.3.16 jsou soubory nahrané z tohoto zařízení kopírovány do místního adresáře %1$s, aby se zabránilo ztrátě dat při synchronizaci jednoho souboru s více účty.\n\nVšechny soubory nahrané předchozími verzemi aplikace byly z tohoto důvodu překopírovány do adresáře %2$s. Bohužel se objevila chyba zabraňující dokončení této operace v průběhu synchronizace účtu. Buď můžete soubor(y) ponechat jak jsou a odebrat odkaz do adresáře %3$s, nebo přesunout soubor(y) do adresáře %1$s a zachovat odkaz na %4$s.\n\nNíže je seznam místních i vzdálených souborů v adresáři %5$s, do kterého byly odkázány.</string> + <string name="sync_current_folder_was_removed">Adresář %1$s již neexistuje</string> <string name="foreign_files_move">Přesunout vše</string> <string name="foreign_files_success">Všechny soubory byly přesunuty</string> <string name="foreign_files_fail">Některé soubory nebylo možno přesunout</string> <string name="foreign_files_local_text">Místní: %1$s</string> <string name="foreign_files_remote_text">Vzdálené: %1$s</string> + <string name="upload_query_move_foreign_files">Pro zkopírování vybraných souborů do %1$s adresáře není dostatek volného místa. Chcete je místo toho přesunout?</string> <string name="pass_code_enter_pass_code">Zadejte prosím svůj bezpečnostní kód</string> <string name="pass_code_configure_your_pass_code">Zadejte svůj bezpečnostní kód</string> @@ -181,10 +208,16 @@ <string name="media_event_done">%1$s přehrávání dokončeno</string> <string name="media_err_nothing_to_play">Nenalezen žádný multimediální soubor</string> <string name="media_err_no_account">Neposkytnut žádný účet</string> + <string name="media_err_not_in_owncloud">Soubor není v platném účtu</string> <string name="media_err_unsupported">Nepodporovaný kodek</string> <string name="media_err_io">Nepodařilo se přečíst soubor médií</string> <string name="media_err_malformed">Soubor médií má neplatné kódování</string> + <string name="media_err_timeout">Vypršel čas při pokusu o přehrání</string> + <string name="media_err_invalid_progressive_playback">Multimediální soubor nelze proudově odesílat</string> + <string name="media_err_unknown">Multimediální soubor nemůže být přehrán s výchozím přehrávačem</string> <string name="media_err_security_ex">Při pokusu o přehrání %1$s došlo k bezpečnostní chybě</string> + <string name="media_err_io_ex">Chyba vstupu při pokusu o přehrání %1$s</string> + <string name="media_err_unexpected">Neočekávaná chyba při pokusu o přehrání %1$s</string> <string name="media_rewind_description">Tlačítko Přetočit</string> <string name="media_play_pause_description">Tlačítko Přehrát/Pozastavit</string> <string name="media_forward_description">Tlačítko Rychle vpřed</string> @@ -196,22 +229,32 @@ <string name="auth_connection_established">Spojení navázáno</string> <string name="auth_testing_connection">Testuje se připojení</string> <string name="auth_not_configured_title">Neplatné nastavení serveru</string> + <string name="auth_account_not_new">Účet pro stejného uživatele a server již v zařízení existuje</string> <string name="auth_account_not_the_same">Zadaný uživatel neodpovídá uživateli tohoto účtu</string> <string name="auth_unknown_error_title">Nastala neznámá chyba</string> + <string name="auth_unknown_host_title">Nelze najít hostitele</string> <string name="auth_incorrect_path_title">Server nenalezen</string> <string name="auth_timeout_title">Serveru trvalo příliš dlouho odpovědět</string> + <string name="auth_incorrect_address_title">Chybný formát adresy serveru</string> <string name="auth_ssl_general_error_title">Inicializace SSL selhala</string> + <string name="auth_ssl_unverified_server_title">Nemohu ověřit SSL identitu serveru</string> <string name="auth_bad_oc_version_title">Nerozpoznaná verze serveru</string> + <string name="auth_wrong_connection_title">Nemohu navázat spojení</string> <string name="auth_secure_connection">Zabezpečené spojení navázáno</string> <string name="auth_unauthorized">Chybné přihlašovací jméno nebo heslo</string> <string name="auth_oauth_error">Neúspěšné přihlášení</string> <string name="auth_oauth_error_access_denied">Přístup zamítnut autorizačním serverem</string> + <string name="auth_wtf_reenter_URL">Neočekávaný stav; zadejte prosím znovu adresu serveru</string> <string name="auth_expired_oauth_token_toast">Vaše přihlášení vypršelo. Přihlaste se prosím znovu</string> <string name="auth_expired_basic_auth_toast">Zadejte prosím aktuální heslo</string> <string name="auth_expired_saml_sso_token_toast">Vaše přihlášení vypršelo. Přihlaste se prosím znovu</string> + <string name="auth_connecting_auth_server">Připojování k ověřovacímu serveru ...</string> <string name="auth_unsupported_auth_method">Server nepodporuje tuto přihlašovací metodu</string> <string name="auth_unsupported_multiaccount">%1$s nepodporuje více účtů</string> + <string name="auth_fail_get_user_name">Váš server nevrací správné přihlašovací ID, kontaktujte prosím svého správce systému</string> <string name="auth_can_not_auth_against_server">Na tomto serveru nelze ověřit</string> + <string name="auth_account_does_not_exist">V zařízení není zatím nastaven účet</string> + <string name="favorite">Nastavit jako dostupné offline</string> <string name="unfavorite">Zrušit nastavení dostupnosti offline</string> <string name="favorite_real">Nastavit jako oblíbené</string> @@ -219,27 +262,36 @@ <string name="common_rename">Přejmenovat</string> <string name="common_remove">Odstranit</string> <string name="confirmation_remove_file_alert">Opravdu chcete odstranit %1$s?</string> + <string name="confirmation_remove_folder_alert">Opravdu chcete odstranit %1$s a jeho obsah?</string> <string name="confirmation_remove_local">Pouze místní</string> <string name="remove_success_msg">Odstraněno</string> <string name="remove_fail_msg">Odstranění nelze dokončit</string> <string name="rename_dialog_title">Zadejte nový název</string> + <string name="rename_local_fail_msg">Místní kopii nelze přejmenovat, zkuste jiný nový název</string> + <string name="rename_server_fail_msg">Přejmenování nelze dokončit</string> <string name="sync_file_fail_msg">Nepodařilo se zkontrolovat vzdálený soubor</string> <string name="sync_file_nothing_to_do_msg">Obsah souboru je již synchronizován</string> <string name="create_dir_fail_msg">Nepodařilo se vytvořit složku</string> <string name="filename_forbidden_characters">Zakázané znaky: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Jméno souboru obsahuje aelspoň jeden neplatný znak</string> <string name="filename_empty">Název nemůže být prázdný</string> + <string name="wait_a_moment">Počkejte chvíli</string> <string name="wait_checking_credentials">Ověřování uložených přihlašovacích údajů</string> + <string name="filedisplay_unexpected_bad_get_content">Neočekávaný problém - zkuste zvolit soubor jinou aplikací</string> + <string name="filedisplay_no_file_selected">Žádný soubor nebyl vybrán</string> <string name="activity_chooser_title">Odeslat odkaz …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopírování souboru z privátního úložiště</string> <string name="oauth_check_onoff">Přihlásit se s oAuth2</string> + <string name="oauth_login_connection">Připojuji se k oAuth2 serveru...</string> + <string name="ssl_validator_header">Identitu stránky nelze ověřit</string> <string name="ssl_validator_reason_cert_not_trusted">- Certifikát serveru je nedůvěryhodný</string> <string name="ssl_validator_reason_cert_expired">- Certifikátu serveru vypršela platnost</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Datum platnosti certifikátu je v budoucnosti</string> <string name="ssl_validator_reason_hostname_not_verified">- URL neodpovídá hodnotě hostname certifikátu</string> <string name="ssl_validator_question">Přejete si přesto tomuto certifikátu důvěřovat?</string> + <string name="ssl_validator_not_saved">Certifikát nelze uložit</string> <string name="ssl_validator_btn_details_see">Detaily</string> <string name="ssl_validator_btn_details_hide">Skrýt</string> <string name="ssl_validator_label_subject">Vydáno pro:</string> @@ -263,14 +315,19 @@ <string name="placeholder_sentence">Zástupný text</string> <string name="placeholder_filename">placeholder.txt</string> + <string name="placeholder_filetype">Obrázek PNG</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> + <string name="auto_upload_on_wifi">Nahrávat pouze přes wifi</string> <string name="instant_upload_on_wifi">Nahrávat obrázky pouze na Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Nahrávat videa pouze přes wifi</string> + <string name="instant_video_upload_on_charging">Nahrávat pouze při nabíjení</string> <string name="instant_upload_on_charging">Nahrávat pouze při nabíjení</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Konflikt souboru</string> + <string name="conflict_message">Které soubory chcete ponechat? Pokud zvolíte obě verze, zkopírovaný soubor bude mít název doplněný o číslo.</string> <string name="conflict_keep_both">Ponechat oba</string> <string name="conflict_use_local_version">místní verze</string> <string name="conflict_use_server_version">serverová verze</string> @@ -299,34 +356,55 @@ <string name="copy_link">Zkopírovat odkaz</string> <string name="clipboard_text_copied">Zkopírováno do schránky</string> + <string name="clipboard_no_text_to_copy">Žádný výběr textu pro kopírování do schránky</string> <string name="clipboard_uxexpected_error">Neočekávaná chyba při kopírování do schránky</string> <string name="clipboard_label">Text zkopírován z %1$s</string> + <string name="error_cant_bind_to_operations_service">Kritická chyba: operace nelze provést</string> + + <string name="network_error_socket_exception">Při pokusu o připojení k serveru došlo k chybě.</string> + <string name="network_error_socket_timeout_exception">Při čekání na odpověď serveru se vyskytla chyba, operace nemohla být dokončena</string> + <string name="network_error_connect_timeout_exception">Při čekání na odpověď serveru se vyskytla chyba, operace nemohla být dokončena</string> + <string name="network_host_not_available">Operace nemohla být dokončena, server je nedostupný</string> + <string name="forbidden_permissions">Nemáte oprávnění k %s</string> <string name="forbidden_permissions_rename">přejmenovat tento soubor</string> <string name="forbidden_permissions_delete">smazat tento soubor</string> <string name="share_link_forbidden_permissions">sdílet tento soubor</string> <string name="unshare_link_forbidden_permissions">zrušit sdílení tohoto souboru</string> <string name="update_link_forbidden_permissions">pro aktualizaci tohoto sdílení</string> + <string name="forbidden_permissions_create">vytvořit tento soubor</string> + <string name="uploader_upload_forbidden_permissions">nahrávat do tohoto adresáře</string> <string name="downloader_download_file_not_found">Tento soubor již není dostupný na serveru</string> <string name="file_migration_dialog_title">Aktualizace cesty k úložišti</string> <string name="file_migration_finish_button">Dokončit</string> + <string name="file_migration_preparing">Příprava na migraci…</string> <string name="file_migration_checking_destination">Prověřování cílového umístění…</string> + <string name="file_migration_saving_accounts_configuration">Ukládání konfigurace účtů…</string> + <string name="file_migration_waiting_for_unfinished_sync">Čekání na nedokončené synchronizace…</string> <string name="file_migration_migrating">Přesun dat…</string> <string name="file_migration_updating_index">Aktualizace indexu…</string> <string name="file_migration_cleaning">Čištění…</string> + <string name="file_migration_restoring_accounts_configuration">Obnovování konfigurace účtů…</string> <string name="file_migration_ok_finished">Dokončeno</string> <string name="file_migration_failed_not_enough_space">CHYBA: Nedostatečné místo</string> <string name="file_migration_failed_not_writable">CHYBA: Soubor není zapisovatelný</string> + <string name="file_migration_failed_not_readable">CHYBA: Soubor nelze číst</string> <string name="file_migration_failed_dir_already_exists">CHYBA: Nextcloud adresář již existuje</string> + <string name="file_migration_failed_while_coping">CHYBA: V průběhu migrace</string> + <string name="file_migration_failed_while_updating_index">CHYBA: V průběhu aktualizace indexu</string> + + <string name="file_migration_directory_already_exists">Datový adresář již existuje, co teď?</string> <string name="file_migration_override_data_folder">Nahradit</string> <string name="file_migration_use_data_folder">Použít</string> <string name="prefs_category_accounts">Účty</string> <string name="prefs_add_account">Přidat účet</string> <string name="drawer_manage_accounts">Spravovat účty</string> - <string name="actionbar_logger">Logy</string> + <string name="auth_redirect_non_secure_connection_title">Zabezpečené spojení je přesměrováváno nezabezpečenou trasou.</string> + + <string name="actionbar_logger">Logy</string> <string name="log_send_history_button">Historie odesílání</string> <string name="log_send_no_mail_app">Nebyla nalezena aplikace k odesílání protokolů. Prosím, nainstalujte e-mailového klienta.</string> <string name="log_send_mail_subject">%1$s logy aplikace pro Android</string> @@ -336,14 +414,18 @@ <string name="saml_authentication_wrong_pass">Nesprávné heslo</string> <string name="actionbar_move">Přesunout</string> <string name="actionbar_copy">Kopírovat</string> + <string name="file_list_empty_moving">Zde nic není. Můžete přidat adresář!</string> <string name="folder_picker_choose_button_text">Vybrat</string> + <string name="move_file_not_found">Nelze přesunout. Zkontrolujte prosím že soubor existuje</string> + <string name="move_file_invalid_into_descendent">Není možné adresář přesunout do vlastního podadresáře</string> <string name="move_file_invalid_overwrite">Soubor již v cílové složce existuje</string> <string name="move_file_error">Při pokusu o přesun tohoto souboru či adresáře nastala chyba</string> <string name="forbidden_permissions_move">pro přesun tohoto souboru</string> <string name="copy_file_not_found">Nelze zkopírpovat. Zkontrolujte prosím že soubor existuje</string> + <string name="copy_file_invalid_into_descendent">Není možné adresář zkopírovat do jeho vlastního podadresáře</string> <string name="copy_file_invalid_overwrite">Soubor již v cílové složce existuje</string> <string name="copy_file_error">Při pokusu o zkopírování tohoto souboru či adresáře došlo k chybě</string> <string name="forbidden_permissions_copy">pro zkopírování tohoto souboru</string> @@ -351,7 +433,8 @@ <string name="prefs_category_instant_uploading">Okamžitá odesílání</string> <string name="prefs_category_details">Podrobnosti</string> - <string name="sync_folder_failed_content">Synchronizaci adresáře %1$s nelze dokončit</string> + <string name="prefs_instant_video_upload_path_title">Adresář pro okamžité nahrání videa</string> + <string name="sync_folder_failed_content">Synchronizaci adresáře %1$s nelze dokončit</string> <string name="shared_subject_header">sdílené</string> <string name="with_you_subject_header">s vámi</string> @@ -392,6 +475,7 @@ <string name="share_add_user_or_group">Přidat uživatele nebo skupinu</string> <string name="share_via_link_section_title">Sdílet odkaz</string> <string name="share_via_link_expiration_date_label">Nastavit datum vypršení platnosti</string> + <string name="share_via_link_password_label">Chránit heslem</string> <string name="share_via_link_password_title">Zabezpečeno</string> <string name="share_via_link_edit_permission_label">Povolit úpravy</string> <string name="share_via_link_hide_file_listing_permission_label">Skrýt seznam souborů</string> @@ -407,6 +491,7 @@ <string name="share_email_clarification">%1$s (e-mail)</string> <string name="share_known_remote_clarification">%1$s ( v %2$s )</string> + <string name="share_sharee_unavailable">Omlouváme se, verze vašeho serveru neumožňuje v klientské aplikaci sdílení dat mezi uživateli. \nKontaktujte prosím svého administrátora</string> <string name="share_privilege_can_share">může sdílet</string> <string name="share_privilege_can_edit">lze upravovat</string> <string name="share_privilege_can_edit_create">vytvořit</string> @@ -415,6 +500,7 @@ <string name="edit_share_unshare">Ukončit sdílení</string> <string name="edit_share_done">dokončeno</string> + <string name="action_retry_uploads">Opakování selhalo</string> <string name="action_clear_failed_uploads">Vyčištění selhalo</string> <string name="action_clear_successful_uploads">Vyčištěno</string> <string name="action_clear_finished_uploads">Vyčistit dokončená nahrávání</string> @@ -423,9 +509,12 @@ <string name="action_switch_list_view">Zobrazení v seznamu</string> <string name="manage_space_title">Spravovat úložný prostor</string> + <string name="manage_space_description">Nastavení, databáze a certifikáty serverů z %1$s data budou permanentně smazány. \n\nStažené soubory nebudou rozbaleny.\n\nTento proces může chvíli trvat.</string> <string name="manage_space_clear_data">Vyčistit data</string> <string name="manage_space_error">Některé soubory nebylo možno smazat.</string> + <string name="permission_storage_access">Vyžadována dodatečná oprávnění pro nahrávání & stahování souborů.</string> + <string name="local_file_not_found_toast">Soubor nebyl nalezen v místním souborovém systému</string> <string name="confirmation_remove_files_alert">Opravdu chcete odstranit vybrané položky?</string> <string name="confirmation_remove_folders_alert">Opravdu chcete odstranit vybrané položky a jejich obsah?</string> <string name="uploads_view_upload_status_waiting_for_charging">Čekání na nabití</string> @@ -434,9 +523,14 @@ <string name="learn_more">Více</string> <string name="drawer_folder_sync">Automatické nahrávání</string> <string name="drawer_participate">Zúčastnit se</string> + <string name="participate_testing_headline">Pomoz nám testovat</string> <string name="participate_testing_bug_text">Našli jste chybu? Něco podivného?</string> <string name="participate_testing_report_text">Nahlásit chybu na Github</string> + <string name="participate_testing_version_text">Chceš nám pomoci testovat další verzi?</string> + <string name="participate_beta_headline">Testovat noční verzi</string> + <string name="participate_beta_text">Zahrnuje všechny nadcházející funkce a pohybuje se na hraně stability. Mohou se vyskytnout chyby, a pokud ano, nahlašte nám je prosím.</string> <string name="participate_release_candidate_headline">Předběžná verze</string> + <string name="participate_release_candidate_text">Předběžná verze nebo také Release Candidate (RC) je stabilní stav připravované, finální verze. Přihlas se jako tester v Play store nebo si najdi a instaluj hodící se verzi z F-Droid pod \"Verze\".</string> <string name="participate_contribute_headline">Aktivně něčím přispět</string> <string name="participate_contribute_irc_text">Diskutovat na IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Pomozte ostatním na <a href="%1$s">fóru</a></string> @@ -446,7 +540,9 @@ <string name="choose_remote_folder">Vybrat adresář…</string> <string name="folder_sync_loading_folders">Načítání adresářů…</string> <string name="folder_sync_no_results">Nebyly nalezeny žádné adresáře médií.</string> + <string name="folder_sync_preferences">Nastavení automatického nahrávání</string> <string name="folder_sync_settings">Nastavení</string> + <string name="folder_sync_new_info">Okamžité nahrávání dat bylo kompletně předěláno. Navštivte hlavní menu a nakonfigurujte automatické nahrávání svých dat. Omlouváme se za nepříjemnosti.\n\nUžívejte si nové a rozšířené možnosti nahrávání dat!</string> <string name="folder_sync_preferences_folder_path">Pro %1$s</string> <plurals name="items_selected_count"> <item quantity="one">vybráno %d</item> diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index f7688bcbee..d8eace745d 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -625,6 +625,8 @@ <string name="prefs_category_about">Über</string> <string name="actionbar_contacts">Kontakte-Sicherung</string> + <string name="actionbar_contacts_restore">Adressen wiederherstellen</string> + <string name="contacts_backup_button">Sicherung jetzt starten</string> <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> <string name="contacts_header_restore">Wiederherstellen</string> <string name="contacts_header_backup">Sicherung</string> @@ -639,6 +641,7 @@ <string name="contacts_preference_choose_date">Datum auswählen</string> <string name="contacts_preference_backup_never">nie</string> <string name="contacts_preferences_no_file_found">Keine Datei gefunden</string> + <string name="contacts_preferences_something_strange_happened">Wir können Ihr letztes Backup nicht finden!</string> <string name="contacts_preferences_backup_scheduled">Sicherung geplant und wird in Kürze starten</string> <string name="contacts_preferences_import_scheduled">Import geplant und wird in Kürze starten</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 02e7d11c1d..71fca6342c 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -625,6 +625,8 @@ <string name="prefs_category_about">Über</string> <string name="actionbar_contacts">Kontakte-Sicherung</string> + <string name="actionbar_contacts_restore">Adressen wiederherstellen</string> + <string name="contacts_backup_button">Sicherung jetzt starten</string> <string name="contacts_restore_button">Letztes Backup wiederherstellen</string> <string name="contacts_header_restore">Wiederherstellen</string> <string name="contacts_header_backup">Sicherung</string> @@ -639,6 +641,7 @@ <string name="contacts_preference_choose_date">Datum auswählen</string> <string name="contacts_preference_backup_never">nie</string> <string name="contacts_preferences_no_file_found">Keine Datei gefunden</string> + <string name="contacts_preferences_something_strange_happened">Wir können dein letztes Backup nicht finden!</string> <string name="contacts_preferences_backup_scheduled">Sicherung geplant und wird in Kürze starten</string> <string name="contacts_preferences_import_scheduled">Import geplant und wird in Kürze starten</string> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index a55d659165..67d4c3b87b 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -34,6 +34,7 @@ <string name="drawer_item_settings">Ajustes</string> <string name="drawer_item_uploads_list">Subidas</string> <string name="drawer_item_activities">Actividades</string> + <string name="drawer_item_notifications">Notificaciones</string> <string name="drawer_quota">%1$s de %2$s utilizado</string> <string name="drawer_close">Cerrar</string> <string name="drawer_open">Abrir</string> @@ -42,11 +43,13 @@ <string name="prefs_accounts">Cuentas</string> <string name="prefs_manage_accounts">Gestionar cuentas</string> <string name="prefs_passcode">Contraseña</string> + <string name="prefs_fingerprint">Bloqueo con huella dactilar</string> + <string name="prefs_fingerprint_notsetup">No se han configurado huellas dactilares</string> <string name="prefs_show_hidden_files">Mostrar archivos ocultos</string> <string name="prefs_instant_upload">Subida instantánea de imágenes</string> - <string name="prefs_instant_upload_summary">Sube instantáneamente las fotos tomadas con la cámara</string> - <string name="prefs_instant_video_upload">Subidas instantáneas de video</string> - <string name="prefs_instant_video_upload_summary">Sube instantáneamente los vídeos grabados con la cámara</string> + <string name="prefs_instant_upload_summary">Subir instantáneamente imágenes de la cámara</string> + <string name="prefs_instant_video_upload">Subida instantánea de vídeo</string> + <string name="prefs_instant_video_upload_summary">Subir instantáneamente vídeos grabajdos con la cámara</string> <string name="prefs_log_title">Habilitar registro</string> <string name="prefs_log_summary">Esto es usado para registrar problemas</string> <string name="prefs_log_title_history">Historial del registro</string> @@ -55,23 +58,23 @@ <string name="prefs_calendar_contacts">Sincronizar calendario y contactos</string> <string name="prefs_calendar_contacts_summary">Configurar DAVdroid (v1.3.0 +) de la cuenta actual</string> <string name="prefs_calendar_contacts_address_resolve_error">La dirección del Servidor para su cuenta no ha podido ser resuelta por DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">No está instalada la aplicación de Google Play ni la de F-Droid</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Calendario & contactos se ha sincronizado exitosamente</string> + <string name="prefs_calendar_contacts_no_store_error">Ni F-Droid ni Google Play están instalados</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Sincronización de calendario y contactos configurada</string> <string name="prefs_help">Ayuda</string> <string name="prefs_recommend">Recomendar a un amigo</string> <string name="prefs_feedback">Observaciones</string> <string name="prefs_imprint">Pie de imprenta</string> - <string name="prefs_remember_last_share_location">Recordar la ubicación de los archivos compartidos</string> - <string name="prefs_remember_last_upload_location_summary">Recordar la ubicación de los últimos archivos compartidos subidos</string> + <string name="prefs_remember_last_share_location">Recordar la localización del compartido</string> + <string name="prefs_remember_last_upload_location_summary">Recordar la localización del compartido más recientemente usado</string> <string name="recommend_subject">¡Prueba %1$s en su smarthphone!</string> - <string name="recommend_text">¡Quiero invitarle a usar %1$s en su smartphone!\nDescárgalo aquí: %2$s</string> + <string name="recommend_text">Quiero invitarte a usar %1$s en tu móvil.\nDescárgalo aquí: %2$s</string> <string name="auth_check_server">Verificar servidor</string> <string name="auth_host_url">Dirección del servidor https://…</string> <string name="auth_username">Nombre de usuario</string> <string name="auth_password">Contraseña</string> - <string name="auth_register">¿No tiene un servidor aun?\nHaga click aquí para obtener uno desde un proveedor</string> + <string name="auth_register">¿No tienes todavía un servidor?\Pulsa aquí para conseguir uno de un proveedor</string> <string name="sync_string_files">Archivos</string> <string name="setup_btn_connect">Conectar</string> <string name="uploader_btn_upload_text">Subir</string> @@ -83,42 +86,43 @@ <string name="uploader_error_title_no_file_to_upload">Ningún archivo para subir</string> <string name="uploader_error_message_received_piece_of_text">%1$s No se puede subir un texto como si fuera un archivo.</string> <string name="uploader_error_message_no_file_to_upload">No hay ningún archivo válido en los datos recibidos.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">No se puede subir el archivo</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Este archivo no puede subirse</string> <string name="uploader_error_message_read_permission_not_granted">%1$s No está autorizado a leer el archivo.</string> - <string name="uploader_error_message_source_file_not_found">El archivo a subir no se encuentra. Compruebe que el archivo existe.</string> - <string name="uploader_error_message_source_file_not_copied">Ha ocurrido un error al copiar a la carpeta temporal. Por favor intentelo de nuevo.</string> + <string name="uploader_error_message_source_file_not_found">No se encuentra el archivo seleccionado para subir. Por favor, comprueba que el archivo existe.</string> + <string name="uploader_error_message_source_file_not_copied">No se pudo copiar el archivo a una carpeta temporal. Intenta volver a enviarlo.</string> <string name="uploader_upload_files_behaviour">Configuraciones de subida:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Mover el archivo a la carpeta de Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Mantener el archivo en la carpeta original</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Borrar archivo de la carpeta original</string> <string name="file_list_seconds_ago">hace segundos</string> <string name="file_list_empty_headline">No hay archivos aquí</string> - <string name="file_list_empty">¡Suba algun contenido o sincronice con sus dispositivos!</string> - <string name="file_list_empty_favorites">¡Marque algun archivos como favoritos o sincronice con sus dispositivos!</string> - <string name="file_list_empty_favorites_filter_list">Los archivos y carpetas que marque como favoritos aparecerán aquí</string> - <string name="file_list_empty_favorites_filter">¡No se encontraron archivos favoritos en su consulta!</string> + <string name="file_list_empty">Sube algún contenido o sincroniza con tus dispositivos.</string> + <string name="file_list_empty_favorites">Marca como favoritos algunos archivos o sincronízalos con tus dispositivos.</string> + <string name="file_list_empty_favorites_filter_list">Los archivos y carpetas que marques como favoritos aparecerán aquí</string> + <string name="file_list_empty_favorites_filter">Tu búsqueda no encontró ningún archivo favorito.</string> <string name="file_list_loading">Cargando…</string> - <string name="file_list_no_app_for_file_type">¡Aplicación no encontrada para el tipo de archivo!</string> + <string name="file_list_no_app_for_file_type">No hay una app configurada para manejar este tipo de archivos.</string> <string name="local_file_list_empty">No hay archivos en esta carpeta.</string> <string name="file_list_empty_headline_search">No hay resultados en esta carpeta</string> <string name="file_list_empty_headline_server_search">Sin resultados</string> + <string name="file_list_empty_favorite_headline">Nada marcado como favorito todavía</string> <string name="file_list_empty_shared_headline">Aún no hay nada compartido</string> <string name="file_list_empty_shared">Aquí aparecerán los archivos y carpetas que usted comparta</string> <string name="file_list_empty_headline_server_search_videos">No hay videos</string> <string name="file_list_empty_headline_server_search_photos">No hay fotos</string> - <string name="file_list_empty_search">¿Ha intentado buscar en otra carpeta?</string> - <string name="file_list_empty_recently_modified">No se modificaron archivos en los últimos 7 días</string> - <string name="file_list_empty_recently_modified_filter">¡No se encontraron para su consulta, archivos que - fueran modificados en los últimos 7 días!</string> - <string name="file_list_empty_recently_added">No se encontraron archivos agregados recientemente</string> - <string name="file_list_empty_recently_added_filter">¡No se encontraron archivos agregados recientemente para su consulta!</string> - <string name="file_list_empty_text_photos">¡Suba algunos archivos o active la subida automática!</string> - <string name="file_list_empty_text_photos_filter">¡No hay fotos encontradas para su consulta!</string> - <string name="file_list_empty_text_videos">¡Suba unos videos o active la subida automática!</string> - <string name="file_list_empty_text_videos_filter">¡No se encontraron videos para su consulta!</string> + <string name="file_list_empty_search">¿Quizás está en una carpeta diferente?</string> + <string name="file_list_empty_recently_modified">No se encontraron archivos modificados en los últimos 7 días.</string> + <string name="file_list_empty_recently_modified_filter">Tu búsqueda no encontró archivos modificados + en los últimos 7 días.</string> + <string name="file_list_empty_recently_added">No se encontraron archivos recientemente añadidos</string> + <string name="file_list_empty_recently_added_filter">Tu búsqueda no encontró archivos recientemente añadidos.</string> + <string name="file_list_empty_text_photos">Sube algunas imágenes o activa la subid automática.</string> + <string name="file_list_empty_text_photos_filter">Tu búsqueda no encontró fotos.</string> + <string name="file_list_empty_text_videos">Sube algunos vídeos o activa la subida automática.</string> + <string name="file_list_empty_text_videos_filter">Tu búsqueda no encontró vídeos.</string> <string name="upload_list_empty_headline">No hay subidas disponibles</string> - <string name="upload_list_empty_text">¡Suba algún contenido o active subidas instantáneas!</string> - <string name="upload_list_empty_text_auto_upload">¡Suba con tenido o active la subida automática!</string> + <string name="upload_list_empty_text">Sube algún contenido o activa la subida instantánea.</string> + <string name="upload_list_empty_text_auto_upload">Sube algún contenido o active la subida automática.</string> <string name="file_list_folder">carpeta</string> <string name="file_list_folders">carpetas</string> <string name="file_list_file">archivo</string> @@ -130,14 +134,14 @@ <string name="filedetails_modified">Modificado:</string> <string name="filedetails_download">Descargar</string> <string name="filedetails_sync_file">Sincronizar</string> - <string name="filedetails_renamed_in_upload_msg">El archivo fue renombrado como %1$s durante la subida</string> - <string name="list_layout">Listar diseño</string> + <string name="filedetails_renamed_in_upload_msg">Archivo renombrado a %1$s durante la subida</string> + <string name="list_layout">Formato de lista</string> <string name="action_share">Compartir</string> <string name="common_yes">Sí</string> <string name="common_no">No</string> <string name="common_ok">Aceptar</string> <string name="common_remove_upload">Quitar los datos para subir</string> - <string name="common_retry_upload">Reintentar la subida</string> + <string name="common_retry_upload">Volver a intentar la subida</string> <string name="common_cancel_sync">Cancelar sincronización</string> <string name="common_cancel">Cancelar</string> <string name="common_back">Volver</string> @@ -157,10 +161,10 @@ <string name="uploader_info_dirname">Nombre de la carpeta</string> <string name="uploader_upload_in_progress_ticker">Subiendo …</string> <string name="uploader_upload_in_progress_content">%1$d%% Subiendo %2$s</string> - <string name="uploader_upload_succeeded_ticker">Subido con éxito</string> + <string name="uploader_upload_succeeded_ticker">Subido</string> <string name="uploader_upload_succeeded_content_single">%1$s subido</string> <string name="uploader_upload_failed_ticker">Error en la subida</string> - <string name="uploader_upload_failed_content_single">La subida de %1$s no se pudo completar</string> + <string name="uploader_upload_failed_content_single">No se pudo subir %1$s</string> <string name="uploader_upload_failed_credentials_error">Subida fallida, necesita volver a iniciar sesión</string> <string name="uploads_view_title">Subidas</string> <string name="uploads_view_group_current_uploads">Actual</string> @@ -179,29 +183,29 @@ <string name="uploads_view_upload_status_conflict">Conflicto</string> <string name="uploads_view_upload_status_service_interrupted">La aplicación se ha interrumpido</string> <string name="uploads_view_upload_status_unknown_fail">Error desconocido</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Esperando a la conexión wifi</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Esperando la conexóin Wi-Fi</string> <string name="uploads_view_later_waiting_to_upload">Esperando para subir</string> <string name="downloader_download_in_progress_ticker">Descargando …</string> <string name="downloader_download_in_progress_content">%1$d%% Descargado de %2$s</string> - <string name="downloader_download_succeeded_ticker">Descarga completa</string> + <string name="downloader_download_succeeded_ticker">Descargado</string> <string name="downloader_download_succeeded_content">%1$s descargado</string> <string name="downloader_download_failed_ticker">Falló la descarga</string> - <string name="downloader_download_failed_content">La descarga de %1$s no se pudo completar</string> + <string name="downloader_download_failed_content">No se pudo descargar %1$s</string> <string name="downloader_not_downloaded_yet">No descargado</string> <string name="downloader_download_failed_credentials_error">La descarga falló, necesita volver a iniciar sesión</string> <string name="common_choose_account">Elija una cuenta</string> <string name="sync_fail_ticker">Sincronización fallida</string> - <string name="sync_fail_ticker_unauthorized">Sincronización fallida, necesita volver a iniciar sesión</string> - <string name="sync_fail_content">La sincronización de %1$s no pudo ser completada</string> - <string name="sync_fail_content_unauthorized">Contraseña no válida para %1$s</string> + <string name="sync_fail_ticker_unauthorized">La sincronización falló, tienes que volver a iniciar sesión</string> + <string name="sync_fail_content">No se pudo completar la sincronización de %1$s</string> + <string name="sync_fail_content_unauthorized">Contraseña errónea para %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Se encontraron conflictos</string> <string name="sync_conflicts_in_favourites_content">No se pudo mantener sincronizados los contenidos de %1$d archivos</string> <string name="sync_fail_in_favourites_ticker">Fallos en la sincronización de contenidos</string> <string name="sync_fail_in_favourites_content">Los contenidos de %1$d archivos no pudieron sincronizarse (%2$d conflictos)</string> <string name="sync_foreign_files_forgotten_ticker">Algunos archivos locales se han perdido</string> <string name="sync_foreign_files_forgotten_content">%1$d archivos en la carpeta %2$s no pudieron ser copiados a</string> - <string name="sync_foreign_files_forgotten_explanation">A partir de la versión 1.3.16, los archivos subidos desde este dispositivo se copian en la carpeta local %1$s para evitar la pérdida de datos cuando se sincroniza un único archivo con varias cuentas.\n\nDebido a este cambio, todos los archivos subidos con versiones anteriores de esta aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error impidió que se completara esta operación durante la sincronización de la cuenta. Puede dejar los archivos tal cual como están y eliminar el enlace hacia %3$s o mover los archivos a la carpeta %1$s y mantener el enlace hacia %4$s.\n\nAbajo se muestran los archivos locales y los archivos remotos en %5$s a los que fueron enlazados.</string> - <string name="sync_current_folder_was_removed">La carpeta local %1$s no existe.</string> + <string name="sync_foreign_files_forgotten_explanation">A partir de la versión 1.3.16, los archivos subidos desde este dispositivo se copian en la carpeta local %1$s para evitar la pérdida de datos cuando se sincroniza un único archivo con varias cuentas.\n\nDebido a este cambio, todos los archivos subidos con versiones anteriores de esta aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error impidió que se completara esta operación durante la sincronización de la cuenta. Puede dejar los archivos tal cual como están y eliminar el enlace hacia %3$s o mover los archivos a la carpeta %1$s y mantener el enlace hacia %4$s.\n\nDebajo se muestran los archivos locales y los archivos remotos en %5$s a los que fueron enlazados.</string> + <string name="sync_current_folder_was_removed">La carpeta %1$s ya no existe</string> <string name="foreign_files_move">Mover todo</string> <string name="foreign_files_success">Todos los archivos fueron movidos</string> <string name="foreign_files_fail">No se han podido mover algunos archivos</string> @@ -228,11 +232,11 @@ <string name="media_err_not_in_owncloud">El archivo no está en una cuenta válida </string> <string name="media_err_unsupported">Códec no soportado</string> <string name="media_err_io">El archivo de medios no pudo ser leído </string> - <string name="media_err_malformed">Archivo no codificado correctamente</string> + <string name="media_err_malformed">El archivo de medios tiene una codificación incorrecta</string> <string name="media_err_timeout">Tiempo de espera agotado en el intento de reproducción</string> <string name="media_err_invalid_progressive_playback">El archivo de medios no puede ser transmitido</string> - <string name="media_err_unknown">El archivo de medios no se puede reproducir con el reproductor de medios por defecto </string> - <string name="media_err_security_ex">Error de seguridad al intentar reproducir %1$s</string> + <string name="media_err_unknown">El reproductor por defecto no puede reproducir el archivo de medios</string> + <string name="media_err_security_ex">Se encontró un error de seguridad intentando reproducir %1$s</string> <string name="media_err_io_ex">Error de entrada al intentar reproducir %1$s</string> <string name="media_err_unexpected">Error inesperado al intentar reproducir %1$s</string> <string name="media_rewind_description">Botón de rebobinado</string> @@ -249,28 +253,28 @@ <string name="auth_account_not_new">Ya existe una cuenta en este dispositivo con los mismos datos de usuario y servidor</string> <string name="auth_account_not_the_same">El usuario introducido no concuerda con el usuario de esta cuenta</string> <string name="auth_unknown_error_title">Ocurrió un error desconocido</string> - <string name="auth_unknown_host_title">Error: no se pudo encontrar el host</string> - <string name="auth_incorrect_path_title">Instancia de servidor no encontrada</string> + <string name="auth_unknown_host_title">No se pudo encontrar el host</string> + <string name="auth_incorrect_path_title">Servidor no encontrado</string> <string name="auth_timeout_title">El servidor ha tardado demasiado en responder</string> <string name="auth_incorrect_address_title">Formato de dirección del servidor incorrecto</string> <string name="auth_ssl_general_error_title">Falló la inicialización SSL</string> - <string name="auth_ssl_unverified_server_title">No fue posible verificar la identidad del servidor SSL</string> + <string name="auth_ssl_unverified_server_title">No se ha podido verificar la identidad del servidor SSL</string> <string name="auth_bad_oc_version_title">No se reconoce la versión del servidor </string> <string name="auth_wrong_connection_title">No se ha podido establecer la conexión</string> <string name="auth_secure_connection">Conexión segura establecida</string> <string name="auth_unauthorized">Nombre de usuario o contraseña incorrectos</string> <string name="auth_oauth_error">Autorización fallida</string> <string name="auth_oauth_error_access_denied">Acceso denegado por el servidor de autorización</string> - <string name="auth_wtf_reenter_URL">Estado inesperado; por favor introduzca su dirección de correo de nuevo</string> + <string name="auth_wtf_reenter_URL">Estado inesperado; por favor, introduce de nuevo la dirección del servidor</string> <string name="auth_expired_oauth_token_toast">Su autorización ha expirado. Por favor, autorice de nuevo</string> <string name="auth_expired_basic_auth_toast">Por favor introduzca su contraseña actual</string> <string name="auth_expired_saml_sso_token_toast">Su sesión ha expirado. Por favor conéctese de nuevo</string> - <string name="auth_connecting_auth_server">Conectando al servidor de autentificación</string> + <string name="auth_connecting_auth_server">Conectando al servidor de autentificación...</string> <string name="auth_unsupported_auth_method">El servidor no soporta este método de autenticación</string> <string name="auth_unsupported_multiaccount">%1$s no soporta cuentas múltiples</string> <string name="auth_fail_get_user_name">Su servidor no está retornando una identificación de usuario correcta; contacte a un administrador </string> <string name="auth_can_not_auth_against_server">No puede autenticarse a este servidor</string> - <string name="auth_account_does_not_exist">Aún no existe la cuenta en el dispositivo</string> + <string name="auth_account_does_not_exist">La cuenta no existe todavía en el dispositivo</string> <string name="favorite">Marcar el modo disponible a desconectado</string> <string name="unfavorite">Desmarcar el modo disponible de desconectado</string> @@ -279,23 +283,23 @@ <string name="common_rename">Renombrar</string> <string name="common_remove">Borrar</string> <string name="confirmation_remove_file_alert">¿Está seguro que quiere eliminar %1$s?</string> - <string name="confirmation_remove_folder_alert">¿Realmente desea eliminar %1$s y todo su contenido?</string> + <string name="confirmation_remove_folder_alert">¿Realmente deseas eliminar %1$s y todo su contenido?</string> <string name="confirmation_remove_local">Sólo local</string> - <string name="remove_success_msg">Borrado correctamente</string> + <string name="remove_success_msg">Eliminado</string> <string name="remove_fail_msg">El borrado no se pudo completar</string> <string name="rename_dialog_title">Introduzca un nombre nuevo</string> - <string name="rename_local_fail_msg">No se pudo cambiar el nombre de la copia local, trate con un nombre differente</string> - <string name="rename_server_fail_msg">No se pudo cambiar el nombre</string> + <string name="rename_local_fail_msg">No se ha podido cambiar el nombre de la copia local, prueba un nombre diferente</string> + <string name="rename_server_fail_msg">No se ha podido dar un nombre nuevo al servidor</string> <string name="sync_file_fail_msg">No se ha podido comprobar el archivo remoto</string> <string name="sync_file_nothing_to_do_msg">Ya está sincronizado</string> - <string name="create_dir_fail_msg">No se pudo crear la carpeta</string> + <string name="create_dir_fail_msg">No se ha podido crear la carpeta</string> <string name="filename_forbidden_characters">Caracteres ilegales: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Nombre de archivo contiene al menos un carácter no válido</string> <string name="filename_empty">El nombre de archivo no puede estar vacío</string> - <string name="wait_a_moment">Espere un momento</string> + <string name="wait_a_moment">Espere un momento...</string> <string name="wait_checking_credentials">Comprobando las credenciales guardadas</string> - <string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, pruebe otra app para seleccionar el archivo</string> - <string name="filedisplay_no_file_selected">No hay archivos seleccionados.</string> + <string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, selecciona el archivo en una app diferente</string> + <string name="filedisplay_no_file_selected">No hay archivos seleccionados</string> <string name="activity_chooser_title">Enviar enlace a …</string> <string name="wait_for_tmp_copy_from_private_storage">Copiando el archivo desde el almacenamiento privado.</string> @@ -308,7 +312,7 @@ <string name="ssl_validator_reason_cert_not_yet_valid">- El certificado del servidor es de una fecha que aún no ha llegado</string> <string name="ssl_validator_reason_hostname_not_verified">- La URL no coincide con el nombre de dominio del certificado</string> <string name="ssl_validator_question">¿Confía de todas formas en este certificado?</string> - <string name="ssl_validator_not_saved">No se pudo guardar el certificado</string> + <string name="ssl_validator_not_saved">No se ha podido guardar el certificado</string> <string name="ssl_validator_btn_details_see">Detalles</string> <string name="ssl_validator_btn_details_hide">Ocultar</string> <string name="ssl_validator_label_subject">Emitido para:</string> @@ -337,11 +341,11 @@ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Subir únicamente por WiFi</string> - <string name="instant_upload_on_wifi">Subir fotos por wifi únicamente</string> - <string name="instant_video_upload_on_wifi">Subir archivos por wifi únicamente</string> - <string name="instant_video_upload_on_charging">Subir solo al cargar</string> - <string name="instant_upload_on_charging">Subir solo al cargar</string> + <string name="auto_upload_on_wifi">Subir solamente por Wi-Fi</string> + <string name="instant_upload_on_wifi">Subir fotos solamente por Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Subir vídeos solamente por Wi-Fi</string> + <string name="instant_video_upload_on_charging">Subir solamente al cargar</string> + <string name="instant_upload_on_charging">Subir solamente al cargar</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Conflicto con archivo</string> <string name="conflict_message">¿Qué archivos desea mantener? Si selecciona ambas versiones, el archivo local tendrá un número añadido a su nombre.</string> @@ -351,7 +355,7 @@ <string name="preview_sorry">¡Lo sentimos!</string> <string name="preview_image_description">Previsualización de imagen</string> - <string name="preview_image_error_unknown_format">La foto no puede ser mostrada.</string> + <string name="preview_image_error_unknown_format">No se puede mostrar la imagen</string> <string name="error__upload__local_file_not_copied">%1$s se pudo copiar a la carpeta local %2$s</string> <string name="prefs_instant_upload_path_title">Carpeta para subida instantánea</string> @@ -360,7 +364,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Usar subcarpetas</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Archivar en subcarpetas basadas en año y mes.</string> - <string name="share_link_no_support_share_api">Lo siento, la función compartir no está activada en su servidor. Contacte a su administrador.</string> + <string name="share_link_no_support_share_api">La función Compartir no está activada en su servidor. Contacte a su administrador.</string> <string name="share_link_file_no_exist">No se puede compartir. Revise si el archivo existe</string> <string name="share_link_file_error">Ocurrió un error al tratar de compartir este archivo o carpeta</string> <string name="unshare_link_file_no_exist">No se puede dejar de compartir. Revise si el archivo existe</string> @@ -378,28 +382,29 @@ <string name="clipboard_uxexpected_error">Error inesperado al copiar al portapapeles</string> <string name="clipboard_label">Texto copiado de %1$s</string> - <string name="error_cant_bind_to_operations_service">Error crítico: no es posible realizar operaciones</string> + <string name="error_cant_bind_to_operations_service">Error crítico: no se puede realizar operaciones</string> <string name="network_error_socket_exception">Ocurrió un error al conectarse con el servidor.</string> - <string name="network_error_socket_timeout_exception">Ocurrió un error al esperar la respuesta del servidor, la operación no se pudo realizar</string> - <string name="network_error_connect_timeout_exception">Ocurrió un error al esperar la respuesta del servidor, la operación no se pudo realizar</string> - <string name="network_host_not_available">La operación no se pudo completar; el servidor no está disponible</string> + <string name="network_error_socket_timeout_exception">Ha ocurrido un error al esperar la respuesta del servidor. La operación no se ha podido completar.</string> + <string name="network_error_connect_timeout_exception">Ha ocurrido un error al esperar la respuesta del servidor. La operación no se ha podido completar.</string> + <string name="network_host_not_available">La operación no se ha podido completar. El servidor no está disponible</string> + <string name="forbidden_permissions">No tiene permiso %s</string> <string name="forbidden_permissions_rename">para renombrar este archivo</string> <string name="forbidden_permissions_delete">para eliminar este archivo</string> <string name="share_link_forbidden_permissions">para compartir este archivo</string> <string name="unshare_link_forbidden_permissions">para descompartir este archivo</string> <string name="update_link_forbidden_permissions">para actualizar este comparto</string> - <string name="forbidden_permissions_create">para crear el archivo</string> + <string name="forbidden_permissions_create">para crear este archivo</string> <string name="uploader_upload_forbidden_permissions">para subir archivos a esta carpeta</string> <string name="downloader_download_file_not_found">Este archivo ya no se encuentra en el servidor</string> <string name="file_migration_dialog_title">Actualizando ruta de almacenamiento</string> <string name="file_migration_finish_button">Terminar</string> - <string name="file_migration_preparing">Preparando la migración…</string> + <string name="file_migration_preparing">Preparando la migración&@8230;</string> <string name="file_migration_checking_destination">Comprobando destino…</string> <string name="file_migration_saving_accounts_configuration">Guardando configuración de cuentas…</string> - <string name="file_migration_waiting_for_unfinished_sync">Esperando sincronizaciones no finalizadas…</string> + <string name="file_migration_waiting_for_unfinished_sync">Esperando que todas las sincronizaciones terminen…</string> <string name="file_migration_migrating">Moviendo datos…</string> <string name="file_migration_updating_index">Actualizando índice…</string> <string name="file_migration_cleaning">Limpiando…</string> @@ -409,21 +414,21 @@ <string name="file_migration_failed_not_writable">ERROR: El archivo no se puede escribir</string> <string name="file_migration_failed_not_readable">ERROR: El archivo no se puede leer</string> <string name="file_migration_failed_dir_already_exists">ERROR: El directorio de Nextcloud ya existe</string> - <string name="file_migration_failed_while_coping">ERROR: Al migrar</string> - <string name="file_migration_failed_while_updating_index">ERROR: Al actualizar el índice</string> + <string name="file_migration_failed_while_coping">ERROR: Fallo durante la migración</string> + <string name="file_migration_failed_while_updating_index">ERROR: Fallo al actualizar el índice</string> - <string name="file_migration_directory_already_exists">La carpeta de datos ya existe. ¿Qué hacer?</string> - <string name="file_migration_override_data_folder">Anular</string> - <string name="file_migration_use_data_folder">Usar existente</string> + <string name="file_migration_directory_already_exists">La carpeta de datos ya existe. Escoge una de las opciones:</string> + <string name="file_migration_override_data_folder">Reemplazar</string> + <string name="file_migration_use_data_folder">Usar</string> <string name="prefs_category_accounts">Cuentas</string> <string name="prefs_add_account">Agregar cuenta</string> <string name="drawer_manage_accounts">Administrar cuentas</string> - <string name="auth_redirect_non_secure_connection_title">La conexión segura está siendo redirigida por una ruta insegura.</string> + <string name="auth_redirect_non_secure_connection_title">La conexión segura está siendo redirigida a través de una ruta insegura.</string> <string name="actionbar_logger">Registros</string> <string name="log_send_history_button">Mandar historial.</string> - <string name="log_send_no_mail_app">Aplicación para enviar registros no fue encontrada. Por favor instale una aplicación de correo.</string> + <string name="log_send_no_mail_app">No se ha encontrado ningua app para enviar los registros. Por favor, instala un cliente de correo electrónico.</string> <string name="log_send_mail_subject">Se han encontrado %1$s aplicaciones de registros para Android</string> <string name="log_progress_dialog_text">Cargando datos …</string> @@ -431,26 +436,26 @@ <string name="saml_authentication_wrong_pass">Contraseña incorrecta</string> <string name="actionbar_move">Mover</string> <string name="actionbar_copy">Copiar</string> - <string name="file_list_empty_moving">Nada por aquí. ¡Puede agregar una carpeta!</string> + <string name="file_list_empty_moving">Nada por aquí. Puedes agregar una carpeta.</string> <string name="folder_picker_choose_button_text">Elegir</string> - <string name="move_file_not_found">No se puede mover. Revise si el archivo existe</string> - <string name="move_file_invalid_into_descendent">No se puede mover una carpeta dentro de una de sus subcarpetas.</string> + <string name="move_file_not_found">No se puede mover el archivo. Comprueba si existe</string> + <string name="move_file_invalid_into_descendent">No se puede mover una carpeta dentro de una de sus propias subcarpetas.</string> <string name="move_file_invalid_overwrite">El archivo ya existe en la carpeta de destino</string> <string name="move_file_error">Hubo un error al tratar de mover este archivo o carpeta</string> <string name="forbidden_permissions_move">mover este archivo</string> <string name="copy_file_not_found">No se puede copiar. Revise si existe el archivo</string> - <string name="copy_file_invalid_into_descendent">No se puede copiar una carpeta dentro de una de sus subcarpetas.</string> - <string name="copy_file_invalid_overwrite">El archivo ya existe en el directorio de destino</string> + <string name="copy_file_invalid_into_descendent">No se puede copiar una carpeta dentro de una de sus propias subcarpetas.</string> + <string name="copy_file_invalid_overwrite">El fichero ya existe en el directorio de destino</string> <string name="copy_file_error">Hubo un error al tratar de copiar este archivo o carpeta</string> <string name="forbidden_permissions_copy">copiar este archivo</string> <string name="prefs_category_instant_uploading">Subidas instantáneas</string> <string name="prefs_category_details">Detalles</string> - <string name="prefs_instant_video_upload_path_title">Carpeta para subida instantánea de vídeos</string> + <string name="prefs_instant_video_upload_path_title">Carpeta para subida instantáneo de vídeos</string> <string name="sync_folder_failed_content">La sincronización de la carpeta %1$s no se pudo completar</string> <string name="shared_subject_header">compartido</string> @@ -508,7 +513,7 @@ <string name="share_email_clarification">%1$s (correo electrónico)</string> <string name="share_known_remote_clarification">%1$s ( en %2$s )</string> - <string name="share_sharee_unavailable">Lo siento, su versión de servidor no permite compartir con usuarios desde los clientes.\nPor favor, contacte con su administrador</string> + <string name="share_sharee_unavailable">Actualiza la versión del servidor para permitir compartir entre usuarios desde sus clientes.\nPor favor, contacta con tu administrador</string> <string name="share_privilege_can_share">puede compartir</string> <string name="share_privilege_can_edit">puede editar</string> <string name="share_privilege_can_edit_create">crear</string> @@ -517,10 +522,10 @@ <string name="edit_share_unshare">Parar de compatir</string> <string name="edit_share_done">hecho</string> - <string name="action_retry_uploads">Reintento fallido</string> + <string name="action_retry_uploads">Nuevo intento fallido</string> <string name="action_clear_failed_uploads">Limpieza fallida</string> <string name="action_clear_successful_uploads">Limpieza exitosa</string> - <string name="action_clear_finished_uploads">Limpiar todo al finalizar</string> + <string name="action_clear_finished_uploads">Limpiar subidas finalizadas</string> <string name="action_switch_grid_view">Vista en cuadrícula</string> <string name="action_switch_list_view">Ver lista</string> @@ -530,8 +535,8 @@ <string name="manage_space_clear_data">Limpiar datos</string> <string name="manage_space_error">No se han podido eliminar algunos archivos</string> - <string name="permission_storage_access">Se requieren permisos adicionales para subir & y descargar archivos.</string> - <string name="local_file_not_found_toast">El archivo no se encuentra en el servidor local de archivos.</string> + <string name="permission_storage_access">Se necesitan permisos adicionales para subir y descargar archivos.</string> + <string name="local_file_not_found_toast">El archivo no se encuentra en el sistema de archivos local.</string> <string name="confirmation_remove_files_alert">¿Está seguro de que quiere eliminar los elementos seleccionados?</string> <string name="confirmation_remove_folders_alert">¿Está seguro de que quiere eliminar los elementos seleccionados y sus contenidos?</string> <string name="uploads_view_upload_status_waiting_for_charging">Esperando la carga del dispositivo</string> @@ -541,17 +546,18 @@ <string name="drawer_folder_sync">Subida automática</string> <string name="drawer_participate">Participar</string> <string name="participate_testing_headline">Ayúdanos a realizar pruebas</string> - <string name="participate_testing_bug_text">¿Encontró un error? ¿Algo está mal?</string> + <string name="participate_testing_bug_text">¿Encontraste un error? ¿Algo va mal?</string> <string name="participate_testing_report_text">Informar de un problema en Github</string> - <string name="participate_testing_version_text">¿Está interesado en ayudarnos a probar la próxima versión?</string> - <string name="participate_beta_text">Esto incluye todas las características por llegar y está muy avazado en lo último. Pueden ocurrir fallos y errores, que si sucede, por favor infórmanos.</string> + <string name="participate_testing_version_text">¿Estás interesado en ayudarnos a probar la próxima versión?</string> + <string name="participate_beta_headline">Probar la versión de desarrollo</string> + <string name="participate_beta_text">Esto incluye todas las características por llegar y está muy avazado en lo último. Pueden ocurrir fallos y errores y, si suceden infórmanos, por favor.</string> <string name="participate_release_candidate_headline">Versión a ser liberada</string> - <string name="participate_release_candidate_text">La versión a ser liberada (release candidate - RC) es una instantánea de la próxima versión y se espera que sea estable. Probar su configuración individual podría ayudar a asegurar esto. Regístrese para probarla en Play Store o busque manualmente en la sección \"versiones\" de F-Droid.</string> + <string name="participate_release_candidate_text">La versión a ser liberada (release candidate - RC) es una instantánea de la próxima versión y se espera que sea estable. Probar su configuración individual podría ayudar a asegurar esto. Regístrate para probarla en Play Store o busca manualmente en la sección \"versiones\" de F-Droid.</string> <string name="participate_contribute_headline">Colabore activamente</string> <string name="participate_contribute_irc_text">Únase a la conversación en IRC: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Ayude a otros en el foro <a href=\"%1$s\"></a>.</string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Traducen</a> la app</string> - <string name="participate_contribute_github_text">Contribuya como desarrollador, vea <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para más detalles</string> + <string name="participate_contribute_github_text">Revisa, corrige y escribe código, lee <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> para más detalles</string> <string name="move_to">Mover a…</string> <string name="copy_to">Copiar a…</string> <string name="choose_remote_folder">Elija carpeta…</string> @@ -559,7 +565,7 @@ <string name="folder_sync_no_results">No se han encnotrado carpetas de medios.</string> <string name="folder_sync_preferences">Preferencias de subida automática</string> <string name="folder_sync_settings">Configuración</string> - <string name="folder_sync_new_info">La subida instantánea ha sido completamente renovada. Por favor, vaya al menú principal y reconfigure sus subidas instantáneas. Disculpe las molestias.\n\n¡Disfrute las nuevas y extendidas capacidades de la subida automática!</string> + <string name="folder_sync_new_info">La subida instantánea ha sido completamente renovada. Reconfigura tus subidas instantáneas en el menú principal.\n\n¡Disfruta las nuevas y extendidas capacidades de la subida automática!</string> <string name="folder_sync_preferences_folder_path">Durante %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d seleccionado</item> @@ -569,7 +575,11 @@ <string name="activity_list_loading_activity">Cargando actividades…</string> <string name="activity_list_no_results">No se encontró actividad.</string> - <string name="upload_file_dialog_title">Ingrese nombre y tipo de archivo de subida</string> + <string name="notifications_loading_activity">Cargando notificaciones…</string> + <string name="notifications_no_results_headline">No hay notificaciones</string> + <string name="notifications_no_results_message">Por favor, comprúebalo más tarde.</string> + + <string name="upload_file_dialog_title">Introduce el nombre y tipo de archivo para subir</string> <string name="upload_file_dialog_filename">Nombre de archivo</string> <string name="upload_file_dialog_filetype">Tipo de archivo</string> <string name="upload_file_dialog_filetype_snippet_text">Archivo de texto recortado (.txt)</string> @@ -585,7 +595,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Un lugar seguro para tus datos</string> - <string name="welcome_feature_1_text">Acceda, comparta y proteja sus archivos en casa y en su empresa</string> + <string name="welcome_feature_1_text">Accede, comparte y protege tus archivos en casa y en el trabajo</string> <string name="welcome_feature_2_title">Múltiples cuentas</string> <string name="welcome_feature_2_text">Conectar con todas sus nubes</string> @@ -595,6 +605,9 @@ <string name="whats_new_skip">Omitir</string> + <string name="fingerprint_scan_finger">Por favor, escanea tu dedo</string> + <string name="fingerprint_unknown">Dedo no reconocido</string> + <!-- User information --> <string name="user_info_full_name">Nombre completo</string> <string name="user_info_email">Correo electrónico</string> @@ -607,5 +620,34 @@ <!-- Activities --> <string name="activities_no_results_headline">Aun no hay actividad</string> - <string name="activities_no_results_message">Esta secuencia le mostrará eventos como\nagregados, cambios& recursos compartidos</string> - </resources> + <string name="activities_no_results_message">Esta secuencia le mostrará eventos como\ninclusiones, cambios y archivos compartidos</string> + <string name="webview_error">Ha ocurrido un error</string> + <string name="prefs_category_about">Acerca de</string> + + <string name="actionbar_contacts">Copia de seguridad de los contactos</string> + <string name="actionbar_contacts_restore">Restaurar los contactos</string> + <string name="contacts_backup_button">Realizar la copia de seguridad ahora</string> + <string name="contacts_restore_button">Restaurar la última copia de seguridad</string> + <string name="contacts_header_restore">Restaurar</string> + <string name="contacts_header_backup">Copia de seguridad</string> + <string name="contacts_automatic_backup">Copia de seguridad de los contactos</string> + <string name="contacts_last_backup">Última copia de seguridad</string> + <string name="contacts_read_permission">Se necesita el permiso para leer la lista de contactos</string> + <string name="contacts_write_permission">SE necesita el permiso para cambiar la lista de contactos</string> + <string name="contactlist_title">Restaurar contactos</string> + <string name="contaclist_restore_selected">Restaurar los contactos seleccionados</string> + <string name="contactlist_account_chooser_title">Escoge la cuenta para importar</string> + <string name="contactlist_no_permission">No se han concedido permisos. ¡No se ha importado nada!</string> + <string name="contacts_preference_choose_date">Escoge fecha</string> + <string name="contacts_preference_backup_never">nunca</string> + <string name="contacts_preferences_no_file_found">No se ha encontrado ningún archivo</string> + <string name="contacts_preferences_something_strange_happened">¡No podemos encontrar tu última copia de seguridad!</string> + <string name="contacts_preferences_backup_scheduled">Copia de seguridad programada. Comenzará en breve</string> + <string name="contacts_preferences_import_scheduled">Importación programada. Comenzará en breve</string> + + <!-- Notifications --> + <string name="new_notification_received">Nueva notificación recibida</string> + <string name="drawer_logout">Desconectar</string> + + +</resources> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 3f309a4b9b..31764c2bd1 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -58,12 +58,16 @@ <string name="prefs_calendar_contacts">Configurer la synchronisation de l\'agenda et des contacts</string> <string name="prefs_calendar_contacts_summary">Configurer DAVdroid (v1.3.0+) pour le compte actuel</string> <string name="prefs_calendar_contacts_address_resolve_error">Une adresse de serveur pour le compte pourrait ne pas être résolue par DAVdroid</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Synchronisation de l\'agenda & des contacts configurée</string> + <string name="prefs_calendar_contacts_no_store_error">Aucune application Google Play store ou F-Droid installée</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Synchronisation de l\'agenda & des contacts configurée</string> <string name="prefs_help">Aide</string> <string name="prefs_recommend">Recommander à un ami</string> <string name="prefs_feedback">Nous contacter par mail</string> <string name="prefs_imprint">Mentions</string> - <string name="recommend_subject">Essayez %1$s sur votre smartphone !</string> + <string name="prefs_remember_last_share_location">Mémoriser l\'emplacement de partage</string> + <string name="prefs_remember_last_upload_location_summary">Mémoriser le dernier emplacement de téléversement</string> + + <string name="recommend_subject">Essayez %1$s sur votre smartphone !</string> <string name="recommend_text">J\'aimerais vous inviter à utiliser %1$s sur votre smartphone.\nTéléchargez-la ici : %2$s.</string> <string name="auth_check_server">Vérifier le serveur</string> @@ -95,7 +99,9 @@ <string name="file_list_empty">Déposez du contenu ou synchronisez vos appareils.</string> <string name="file_list_empty_favorites">Mettez certains fichiers en favoris ou synchronisez vos appareils.</string> <string name="file_list_empty_favorites_filter_list">Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici</string> + <string name="file_list_empty_favorites_filter">Auncun fichier mis en favori trouvé qui correspond à votre requête.</string> <string name="file_list_loading">Chargement…</string> + <string name="file_list_no_app_for_file_type">Aucune application trouvée pour ce type de fichier.</string> <string name="local_file_list_empty">Aucun fichier n\'est présent dans ce dossier.</string> <string name="file_list_empty_headline_search">Aucun résultat dans ce dossier</string> <string name="file_list_empty_headline_server_search">Aucun résultat</string> @@ -110,7 +116,9 @@ <string name="file_list_empty_recently_added">Aucun fichier ajouté récemment trouvé</string> <string name="file_list_empty_recently_added_filter">Votre recherche n\'a pas renvoyée de fichiers récement ajoutés.</string> <string name="file_list_empty_text_photos">Téléversez des photos ou activez le téléversement automatique.</string> + <string name="file_list_empty_text_photos_filter">Aucune photo trouvée qui correspond à votre requête.</string> <string name="file_list_empty_text_videos">Téléversez des vidéos ou activez le téléversement automatique.</string> + <string name="file_list_empty_text_videos_filter">Aucune vidéo trouvée qui correspond à votre requête.</string> <string name="upload_list_empty_headline">Aucun historique de téléversement</string> <string name="upload_list_empty_text">Téléversez du contenu ou activez le téléversement instantané.</string> <string name="upload_list_empty_text_auto_upload">Téléversez du contenu ou activez le téléversement automatique.</string> @@ -126,6 +134,7 @@ <string name="filedetails_download">Télécharger</string> <string name="filedetails_sync_file">Synchroniser</string> <string name="filedetails_renamed_in_upload_msg">Le fichier a été renommé en %1$s pendant le téléversement</string> + <string name="list_layout">Affichage en liste</string> <string name="action_share">Partager</string> <string name="common_yes">Oui</string> <string name="common_no">Non</string> @@ -194,12 +203,14 @@ <string name="sync_fail_in_favourites_content">Le contenu de %1$d fichiers n\'a pu être synchronisé (%2$d conflits)</string> <string name="sync_foreign_files_forgotten_ticker">Certains fichiers locaux ont été oubliés</string> <string name="sync_foreign_files_forgotten_content">%1$d fichiers du dossier %2$s n\'ont pas pu être copiés dans</string> + <string name="sync_foreign_files_forgotten_explanation">Depuis la version 1.3.16, les fichiers envoyés depuis cet appareil sont copiés dans le dossier local %1$s pour éviter une perte de données lorsqu\'un même fichier est synchronisé avec plusieurs comptes.\n\nEn raison de cette modification, tous les fichiers envoyés avec des versions antérieures de cette application ont été copiés dans le dossier %2$s. Cependant, une erreur a empêché l\'achèvement de cette opération pendant la synchronisation du compte. Vous pouvez soit laisser les fichiers tels quels et supprimer le lien vers %3$s, soit déplacer les fichiers dans le dossier %1$s et garder le lien vers %4$s.\n\nCi-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxquels ils étaient liés.</string> <string name="sync_current_folder_was_removed">Le dossier %1$s n\'existe plus</string> <string name="foreign_files_move">Tout déplacer</string> <string name="foreign_files_success">Tous les fichiers ont été déplacés</string> <string name="foreign_files_fail">Certains fichiers n\'ont pu être déplacés</string> <string name="foreign_files_local_text">Local : %1$s</string> <string name="foreign_files_remote_text">Distant : %1$s</string> + <string name="upload_query_move_foreign_files">Il n\'y a pas assez d\'espace pour copier les fichiers sélectionnés dans le dossier %1$s. Souhaitez-vous plutôt les déplacer ?</string> <string name="pass_code_enter_pass_code">Veuillez saisir votre code de sécurité</string> <string name="pass_code_configure_your_pass_code">Saisissez votre code de sécurité</string> @@ -221,7 +232,12 @@ <string name="media_err_unsupported">Le codec de ce média n\'est pas pris en charge </string> <string name="media_err_io">Impossible de lire le fichier média</string> <string name="media_err_malformed">Le fichier média n\'est pas correctement encodé</string> + <string name="media_err_timeout">Délai dépassé pour la lecture du morceau</string> <string name="media_err_invalid_progressive_playback">Le fichier média ne peut pas être diffusé</string> + <string name="media_err_unknown">Le fichier média ne peut être lu avec le lecteur intégré</string> + <string name="media_err_security_ex">Erreur de sécurité à la lecture de %1$s</string> + <string name="media_err_io_ex">Erreur d\'entrée à la lecture de %1$s</string> + <string name="media_err_unexpected">Erreur inattendue à la lecture de %1$s </string> <string name="media_rewind_description">Bouton de rembobinage</string> <string name="media_play_pause_description">Bouton de lecture ou de pause</string> <string name="media_forward_description">Bouton d\'avance rapide</string> @@ -233,21 +249,32 @@ <string name="auth_connection_established">Connexion établie</string> <string name="auth_testing_connection">Test de connexion en cours</string> <string name="auth_not_configured_title">Configuration du serveur erronée</string> + <string name="auth_account_not_new">Un compte pour les mêmes utilisateur et serveur existe déjà sur cet appareil</string> <string name="auth_account_not_the_same">L\'utilisateur saisi ne correspond pas à l\'utilisateur de ce compte</string> <string name="auth_unknown_error_title">Une erreur inconnue s\'est produite !</string> + <string name="auth_unknown_host_title">Impossible de trouver l\'hôte</string> + <string name="auth_incorrect_path_title">Aucune instance du serveur n\'a été trouvée</string> <string name="auth_timeout_title">Le serveur a pris trop de temps à répondre</string> + <string name="auth_incorrect_address_title">Adresse du serveur non valable</string> <string name="auth_ssl_general_error_title">Échec de l\'initialisation SSL</string> + <string name="auth_ssl_unverified_server_title">Impossible de vérifier l\'identité du serveur SSL</string> <string name="auth_bad_oc_version_title">La version du serveur n\'est pas reconnue</string> + <string name="auth_wrong_connection_title">Impossible d\'établir la connexion</string> <string name="auth_secure_connection">Connexion sécurisée établie</string> <string name="auth_unauthorized">Nom d\'utilisateur ou mot de passe incorrect</string> <string name="auth_oauth_error">Échec d\'autorisation</string> <string name="auth_oauth_error_access_denied">Accès refusé par le serveur d\'autorisation</string> + <string name="auth_wtf_reenter_URL">Problème inattendu ; veuillez saisir à nouveau l\'adresse du serveur</string> <string name="auth_expired_oauth_token_toast">Votre autorisation a expiré. Merci de vous authentifier à nouveau</string> <string name="auth_expired_basic_auth_toast">Veuillez saisir le mot de passe actuel</string> <string name="auth_expired_saml_sso_token_toast">Votre session a expiré. Merci de vous reconnecter</string> + <string name="auth_connecting_auth_server">Connexion au serveur d\'authentification…</string> <string name="auth_unsupported_auth_method">Le serveur ne prend pas en charge cette méthode d\'authentification</string> <string name="auth_unsupported_multiaccount">%1$s ne prend pas en charge les comptes multiples</string> + <string name="auth_fail_get_user_name">Votre serveur a retourné un identifiant d\'utilisateur incorrect. Veuillez contacter un administrateur</string> <string name="auth_can_not_auth_against_server">Impossible de s\'authentifier sur ce serveur</string> + <string name="auth_account_does_not_exist">Le compte n\'existe pas encore sur ce périphérique</string> + <string name="favorite">Rendre disponible hors-ligne</string> <string name="unfavorite">Ne plus rendre disponible hors-ligne</string> <string name="favorite_real">Mettre en favori</string> @@ -255,27 +282,36 @@ <string name="common_rename">Renommer</string> <string name="common_remove">Supprimer</string> <string name="confirmation_remove_file_alert">Voulez-vous vraiment supprimer %1$s ?</string> + <string name="confirmation_remove_folder_alert">Voulez-vous vraiment supprimer %1$s et ses contenus ?</string> <string name="confirmation_remove_local">Local seulement</string> <string name="remove_success_msg">Supprimé</string> <string name="remove_fail_msg">Échec de la suppression</string> <string name="rename_dialog_title">Entrez un nouveau nom</string> + <string name="rename_local_fail_msg">La version locale ne peut être renommée ; veuillez réessayer avec un nom différent</string> + <string name="rename_server_fail_msg">Échec du renommage</string> + <string name="sync_file_fail_msg">Le fichier distant n\'a pu être vérifié</string> <string name="sync_file_nothing_to_do_msg">Le contenu du fichier est déjà synchronisé</string> + <string name="create_dir_fail_msg">Le dossier n\'a pas pu être créé</string> <string name="filename_forbidden_characters">Caractères interdits : / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Le nom de fichier contient au moins un caractère invalide</string> <string name="filename_empty">Le nom du fichier ne peut pas être vide</string> <string name="wait_a_moment">Veuillez patienter...</string> <string name="wait_checking_credentials">Vérification des identifiants enregistrés</string> + <string name="filedisplay_unexpected_bad_get_content">Problème inattendu ; veuillez sélectionner le fichier depuis une autre application</string> <string name="filedisplay_no_file_selected">Aucun fichier sélectionné</string> <string name="activity_chooser_title">Envoyer le lien vers …</string> <string name="wait_for_tmp_copy_from_private_storage">Copie du fichier depuis le stockage privé</string> <string name="oauth_check_onoff">Connexion avec oAuth2</string> + <string name="oauth_login_connection">Connexion au serveur oAuth2…</string> + <string name="ssl_validator_header">L\'identité du site ne peut être vérifiée</string> <string name="ssl_validator_reason_cert_not_trusted">- Le certificat du serveur n\'est pas sûr</string> <string name="ssl_validator_reason_cert_expired">- Le certificat du serveur a expiré</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Le certificat du serveur n\'est pas encore valide</string> <string name="ssl_validator_reason_hostname_not_verified">- L\'URL ne correspond pas au nom d\'hôte du certificat</string> <string name="ssl_validator_question">Voulez-vous tout de même faire confiance à ce certificat ?</string> + <string name="ssl_validator_not_saved">Impossible de sauvegarder le certificat</string> <string name="ssl_validator_btn_details_see">Détails</string> <string name="ssl_validator_btn_details_hide">Masquer</string> <string name="ssl_validator_label_subject">Délivré à :</string> @@ -304,14 +340,22 @@ <string name="placeholder_timestamp">18/05/2012 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> + <string name="auto_upload_on_wifi">Téléverse par wifi uniquement</string> + <string name="instant_upload_on_wifi">Téléverser les images via une connexion WiFi uniquement</string> + <string name="instant_video_upload_on_wifi">Téléverser les images via une connexion WiFi uniquement</string> + <string name="instant_video_upload_on_charging">Téléverser les images uniquement si le chargeur est branché</string> + <string name="instant_upload_on_charging">Téléverser les images uniquement si le chargeur est branché</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Conflit de fichiers</string> + <string name="conflict_message">Quels fichiers voulez-vous conserver ? Si vous sélectionnez les deux, un chiffre sera ajouté au nom du fichier local.</string> <string name="conflict_keep_both">Conserver les deux</string> <string name="conflict_use_local_version">version locale</string> <string name="conflict_use_server_version">version serveur</string> <string name="preview_sorry">Désolé.</string> <string name="preview_image_description">Prévisualisation de l\'image</string> + <string name="preview_image_error_unknown_format">L\'image ne peut pas être affichée</string> + <string name="error__upload__local_file_not_copied">%1$s n\'a pas pu être copié dans le dossier local %2$s</string> <string name="prefs_instant_upload_path_title">Téléversement immédiat du dossier</string> <string name="prefs_folder_sync_local_path_title">Dossier local</string> @@ -319,6 +363,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Utiliser des sous-dossiers</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Stocker dans des sous-dossiers basés sur années et mois</string> + <string name="share_link_no_support_share_api">Désolé, le partage n\'est pas disponible sur votre serveur. Veuillez contacter votre administrateur.</string> <string name="share_link_file_no_exist">Impossible de partager. Vérifiez que le fichier est bien présent</string> <string name="share_link_file_error">Une erreur est survenue lors de la tentative de partage de ce fichier ou répertoire</string> <string name="unshare_link_file_no_exist">Impossible de supprimer le partage. Vérifiez que le fichier est bien présent</string> @@ -332,29 +377,57 @@ <string name="copy_link">Copier le lien</string> <string name="clipboard_text_copied">Copié dans le presse-papier</string> + <string name="clipboard_no_text_to_copy">Aucun texte n\'a été reçu pour copier dans le presse-papier</string> <string name="clipboard_uxexpected_error">Erreur inattendue lors de la copie vers le presse-papiers</string> <string name="clipboard_label">Texte copié depuis %1$s</string> + <string name="error_cant_bind_to_operations_service">Erreur critique : Impossible de réaliser les opérations</string> + + <string name="network_error_socket_exception">Une erreur est survenue pendant la connexion au serveur.</string> + <string name="network_error_socket_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string> + <string name="network_error_connect_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string> + <string name="network_host_not_available">Impossible de réaliser l\'opération. Le serveur n\'est pas accessible</string> + + <string name="forbidden_permissions">Vous n\'avez pas la permission %s</string> <string name="forbidden_permissions_rename">de renommer ce fichier</string> <string name="forbidden_permissions_delete">de supprimer ce fichier</string> <string name="share_link_forbidden_permissions">de partager ce fichier</string> <string name="unshare_link_forbidden_permissions">de cesser le partage de ce fichier</string> <string name="update_link_forbidden_permissions">de modifier ce partage</string> + <string name="forbidden_permissions_create">de créer ce fichier</string> + <string name="uploader_upload_forbidden_permissions">de téléverser dans ce dossier</string> <string name="downloader_download_file_not_found">Ce fichier n’est plus disponible sur le serveur</string> <string name="file_migration_dialog_title">Mise à jour du chemin de stockage</string> <string name="file_migration_finish_button">Terminer</string> + <string name="file_migration_preparing">Préparation pour la migration…</string> <string name="file_migration_checking_destination">Vérification de la destination…</string> + <string name="file_migration_saving_accounts_configuration">Enregistrement de la configuration des comptes…</string> + <string name="file_migration_waiting_for_unfinished_sync">En attente des synchronisations non terminées…</string> <string name="file_migration_migrating">Déplacement des données…</string> <string name="file_migration_updating_index">Mise à jour des indexes…</string> <string name="file_migration_cleaning">Nettoyage…</string> + <string name="file_migration_restoring_accounts_configuration">Restauration de la configuration des comptes…</string> <string name="file_migration_ok_finished">Terminé</string> + <string name="file_migration_failed_not_enough_space">ERREUR : Espace insuffisant</string> + <string name="file_migration_failed_not_writable">ERREUR : Le fichier n\'est pas modifiable</string> + <string name="file_migration_failed_not_readable">ERREUR : Le fichier n\'est pas lisible</string> <string name="file_migration_failed_dir_already_exists">ERREUR : Le dossier Nextcloud existe déjà</string> + <string name="file_migration_failed_while_coping">ERREUR : Echec lors de la migration</string> + <string name="file_migration_failed_while_updating_index">ERREUR : Echec lors de la mise à jour de l\'index</string> + + <string name="file_migration_directory_already_exists">Le dossier de données existe déjà. Choisissez une des options suivantes :</string> + <string name="file_migration_override_data_folder">Remplacer</string> + <string name="file_migration_use_data_folder">Conserver le dossier actuel</string> + <string name="prefs_category_accounts">Comptes</string> <string name="prefs_add_account">Ajouter un compte</string> <string name="drawer_manage_accounts">Gérer les comptes</string> - <string name="actionbar_logger">Journaux</string> + <string name="auth_redirect_non_secure_connection_title">Le connexion sécurisée est redirigée vers une route non-sécurisée.</string> + + <string name="actionbar_logger">Journaux</string> <string name="log_send_history_button">Envoyer le journal</string> + <string name="log_send_no_mail_app">Aucune application n\'a été trouvée pour envoyer les journaux. Merci d\'installer une application de messagerie.</string> <string name="log_send_mail_subject">Journaux de l\'application Android %1$s</string> <string name="log_progress_dialog_text">Chargement des données …</string> @@ -362,20 +435,27 @@ <string name="saml_authentication_wrong_pass">Mot de passe incorrect</string> <string name="actionbar_move">Déplacer</string> <string name="actionbar_copy">Copier</string> + <string name="file_list_empty_moving">Il n\'y a rien ici. Vous pouvez ajouter un dossier.</string> <string name="folder_picker_choose_button_text">Valider</string> + <string name="move_file_not_found">Impossible de déplacer le fichier. Vérifiez que le fichier existe</string> + <string name="move_file_invalid_into_descendent">Il n\'est pas possible de déplacer un dossier vers un de ses descendants</string> + <string name="move_file_invalid_overwrite">Le fichier existe déjà dans le dossier de destination</string> <string name="move_file_error">Une erreur est survenue lors de la tentative de déplacement de ce fichier ou dossier</string> <string name="forbidden_permissions_move">de déplacer ce fichier</string> <string name="copy_file_not_found">Impossible de copier. Vérifiez que le fichier existe</string> + <string name="copy_file_invalid_into_descendent">Il n\'est pas possible de copier un dossier vers un de ses descendants</string> + <string name="copy_file_invalid_overwrite">Le fichier existe déjà dans le dossier de destination</string> <string name="copy_file_error">Une erreur est survenue lors de la copie de ce fichier ou dossier</string> <string name="forbidden_permissions_copy">de copier ce fichier</string> <string name="prefs_category_instant_uploading">Téléversement immédiat</string> <string name="prefs_category_details">Propriétés</string> - <string name="sync_folder_failed_content">La synchronisation du dossier %1$s n\'a pas pu être terminée</string> + <string name="prefs_instant_video_upload_path_title">Téléversement immédiat du dossier vidéos</string> + <string name="sync_folder_failed_content">La synchronisation du dossier %1$s n\'a pas pu être terminée</string> <string name="shared_subject_header">a partagé</string> <string name="with_you_subject_header">avec vous</string> @@ -416,6 +496,7 @@ <string name="share_add_user_or_group">Ajouter un Utilisateur ou un Groupe</string> <string name="share_via_link_section_title">Partager par lien public</string> <string name="share_via_link_expiration_date_label">Indiquer une date d\'expiration</string> + <string name="share_via_link_password_label">Protéger avec un mot de passe</string> <string name="share_via_link_password_title">Sécurisé</string> <string name="share_via_link_edit_permission_label">Permettre la modification</string> <string name="share_via_link_hide_file_listing_permission_label">Masquer la liste des fichiers</string> @@ -431,6 +512,7 @@ <string name="share_email_clarification">%1$s (courriel)</string> <string name="share_known_remote_clarification">%1$s (sur %2$s)</string> + <string name="share_sharee_unavailable">Désolé, la version de votre serveur ne permet pas aux applications d\'initier des partages avec d\'autres utilisateurs.\nVeuillez contacter votre administrateur</string> <string name="share_privilege_can_share">peut partager</string> <string name="share_privilege_can_edit">peut modifier</string> <string name="share_privilege_can_edit_create">création</string> @@ -439,34 +521,50 @@ <string name="edit_share_unshare">Terminer le partage</string> <string name="edit_share_done">Terminé</string> + <string name="action_retry_uploads">Réessayer les téléversements échoués</string> <string name="action_clear_failed_uploads">Effacer les échoués</string> + <string name="action_clear_successful_uploads">Effacé</string> + <string name="action_clear_finished_uploads">Effacer tous les téléversements terminés</string> + <string name="action_switch_grid_view">Affichage Mosaïque</string> <string name="action_switch_list_view">Affichage Liste</string> <string name="manage_space_title">Gestion de l\'espace</string> + <string name="manage_space_description">Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \n\nLes fichiers téléchargés ne seront pas impactés.\n\nCette opération peut prendre du temps.</string> <string name="manage_space_clear_data">Effacer les données</string> <string name="manage_space_error">Certains fichiers n\'ont pu être supprimés.</string> + <string name="permission_storage_access">Des permissions supplémentaires sont exigées pour téléverser et télécharger des fichiers.</string> + <string name="local_file_not_found_toast">Le fichier n\'a pas été trouvé sur le système de fichier local</string> <string name="confirmation_remove_files_alert">Voulez-vous vraiment supprimer les éléments sélectionnés ?</string> <string name="confirmation_remove_folders_alert">Voulez-vous vraiment supprimer les éléments sélectionnés et leurs contenus ?</string> + <string name="uploads_view_upload_status_waiting_for_charging">En attente de recharge de l\'appareil</string> <string name="actionbar_search">Rechercher</string> <string name="files_drop_not_supported">Il s\'agit d\'une fonctionnalité de Nextcloud ; veuillez mettre à jour..</string> <string name="learn_more">En apprendre plus</string> <string name="drawer_folder_sync">Téléversement automatique</string> <string name="drawer_participate">Participer</string> + <string name="participate_testing_headline">Aidez nous en le testant</string> + <string name="participate_testing_bug_text">Vous avez trouvé un bug ? Quelque chose vous semble étrange ?</string> <string name="participate_testing_report_text">Signaler un problème sur Github</string> + <string name="participate_testing_version_text">Vous avez envie de nous aider en testant les futures versions ?</string> <string name="participate_beta_headline">Testez la version Bêta</string> + <string name="participate_beta_text">La version Beta inclut les dernières fonctionnalités qui sont encore toutes fraîches. Des erreurs peuvent se produire et si c\'est le cas, merci de nous les signaler.</string> <string name="participate_release_candidate_headline">Testez la version Release Candidate</string> + <string name="participate_release_candidate_text">La version « release candidate » (RC) est un instantanné de la prochaine version et est supposée stable. Le test de votre configuration pourrait nous aider à nous assurer que cette version est entièrement stable. Inscrivez vous pour être testeur sur le Play store ou allez jeter un œil dans la section \"versions\" de F-Droid.</string> <string name="participate_contribute_headline">Participez activement</string> <string name="participate_contribute_irc_text">Rejoignez la discussion sur IRC <a href=\"%1$s\">#nextcloud-mobile</a>.</string> <string name="participate_contribute_forum_text">Aidez les autres sur le <a href=\"%1$s\">forum</a>.</string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Traduisez</a> l\'application.</string> + <string name="participate_contribute_github_text">Vous êtes développeur ? Consultez <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> pour plus d\'informations</string> <string name="move_to">Déplacer vers…</string> <string name="copy_to">Copier vers…</string> <string name="choose_remote_folder">Sélectionner le dossier…</string> <string name="folder_sync_loading_folders">Chargement des dossiers…</string> <string name="folder_sync_no_results">Aucun dossier média trouvé.</string> + <string name="folder_sync_preferences">Préférences pour le téléversement automatique</string> <string name="folder_sync_settings">Paramètres</string> + <string name="folder_sync_new_info">Le téléversement immédiat a été complètement réorganisé. Merci de bien vouloir accéder au menu principal et de reconfigurer votre téléversement automatique.\n\nProfitez des nouvelles capacités étendues du téléversement automatique.</string> <string name="folder_sync_preferences_folder_path">Pour %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d sélectionné</item> @@ -480,6 +578,7 @@ <string name="notifications_no_results_headline">Aucune notification</string> <string name="notifications_no_results_message">Veuillez revenir plus tard.</string> + <string name="upload_file_dialog_title">Spécifiez le nom et le type du fichier téléversé</string> <string name="upload_file_dialog_filename">Nom de fichier</string> <string name="upload_file_dialog_filetype">Type de fichier</string> <string name="upload_file_dialog_filetype_snippet_text">Extrait du fichier texte (.txt)</string> @@ -495,6 +594,8 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Un endroit sûr pour toutes vos données</string> + <string name="welcome_feature_1_text">Accédez, partagez et protégez vos fichiers personnels et professionnels</string> + <string name="welcome_feature_2_title">Multi-compte</string> <string name="welcome_feature_2_text">Connectez-vous avec plusieurs comptes clouds</string> @@ -518,19 +619,28 @@ <!-- Activities --> <string name="activities_no_results_headline">Aucune activité pour le moment</string> + <string name="activities_no_results_message">Ce flux liste les événements tels que\nles ajouts, les modifications et les partages</string> <string name="webview_error">Une erreur est survenue</string> <string name="prefs_category_about">À propos</string> + <string name="actionbar_contacts">Copie de sauvegarde des contacts</string> + <string name="actionbar_contacts_restore">Restaurer les contacts</string> + <string name="contacts_backup_button">Sauvegarder maintenant</string> <string name="contacts_restore_button">Restaurer la dernière copie de sauvegarde</string> <string name="contacts_header_restore">Restaurer</string> <string name="contacts_header_backup">Copie de sauvegarde</string> <string name="contacts_automatic_backup">Sauvegarde des contacts</string> <string name="contacts_last_backup">Dernière copie de sauvegarde</string> + <string name="contacts_read_permission">L\'autorisation de lecture des contacts est nécessaire</string> + <string name="contacts_write_permission">L\'autorisation d\'écriture des contacts est nécessaire</string> <string name="contactlist_title">Restaurer les contacts</string> <string name="contaclist_restore_selected">Restaurer les contacts sélectionnés</string> + <string name="contactlist_account_chooser_title">Choisissez un compte pour importer</string> + <string name="contactlist_no_permission">Aucune autorisation, rien d\'importé !</string> <string name="contacts_preference_choose_date">Choisir la date</string> <string name="contacts_preference_backup_never">jamais</string> <string name="contacts_preferences_no_file_found">Aucun fichier trouvé</string> + <string name="contacts_preferences_something_strange_happened">Nous ne trouvons pas votre dernière copie de sauvegarde !</string> <string name="contacts_preferences_backup_scheduled">Sauvegarde planifiée et va commencer prochainement</string> <string name="contacts_preferences_import_scheduled">Importation planifiée et va commencer prochainement</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index f485a16070..9256bbf842 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -90,6 +90,7 @@ Kies er eentje van een provider.</string> <string name="uploader_error_title_file_cannot_be_uploaded">Dit bestand kan niet worden geüpload</string> <string name="uploader_error_message_read_permission_not_granted">%1$s heeft geen toestemming om een ontvangen bestand te lezen</string> <string name="uploader_error_message_source_file_not_found">Voor upload geselecteerde bestand niet gevonden. Controleer of het bestaat.</string> + <string name="uploader_error_message_source_file_not_copied">Er trad een fout op bij het kopiëren van het bestand naar een tijdelijke map. Probeer het opnieuw te versturen.</string> <string name="uploader_upload_files_behaviour">Uploadoptie:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Verplaats bestand naar Nextcloud-map</string> <string name="uploader_upload_files_behaviour_only_upload">Bewaar het bestand in de bronmap</string> @@ -97,7 +98,10 @@ Kies er eentje van een provider.</string> <string name="file_list_seconds_ago">seconden geleden</string> <string name="file_list_empty_headline">Hier geen bestanden</string> <string name="file_list_empty">Upload je inhoud of synchroniseer met je apparaten.</string> - <string name="file_list_loading">Laden …</string> + <string name="file_list_empty_favorites">Maak enkele bestanden favoriet of synchroniseer met je apparaten!</string> + <string name="file_list_empty_favorites_filter_list">Bestanden en mappen gemarkeerd als favoriet worden hier getoond</string> + <string name="file_list_empty_favorites_filter">Geen favoriete bestanden gevonden voor je zoekopdracht!</string> + <string name="file_list_loading">Laden…</string> <string name="file_list_no_app_for_file_type">Er is geen app ingesteld om dit bestandformaat te behandelen.</string> <string name="local_file_list_empty">Er staan geen bestanden in deze map.</string> <string name="file_list_empty_headline_search">Geen resultaten in deze map</string> @@ -132,6 +136,7 @@ Kies er eentje van een provider.</string> <string name="filedetails_download">Downloaden</string> <string name="filedetails_sync_file">Synchroniseren</string> <string name="filedetails_renamed_in_upload_msg">Bestand hernoemd naar %1$s tijdens de upload</string> + <string name="list_layout">Lijstoverzicht</string> <string name="action_share">Delen</string> <string name="common_yes">Ja</string> <string name="common_no">Nee</string> @@ -207,6 +212,7 @@ Kies er eentje van een provider.</string> <string name="foreign_files_fail">Een paar bestanden konden niet worden verplaatst</string> <string name="foreign_files_local_text">Lokaal: %1$s</string> <string name="foreign_files_remote_text">Extern: %1$s</string> + <string name="upload_query_move_foreign_files">Er is niet genoeg ruimte om de geselecteerde bestanden te kopieren naar %1$s. Wilt u ze in plaats daarvan verplaatsen?</string> <string name="pass_code_enter_pass_code">Voer je toegangscode in</string> <string name="pass_code_configure_your_pass_code">Toegangscode invoeren</string> @@ -307,6 +313,7 @@ Kies er eentje van een provider.</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Het servercertificaat is nog niet geldig</string> <string name="ssl_validator_reason_hostname_not_verified">- De URL komt niet overeen met de hostname in het certificaat</string> <string name="ssl_validator_question">Wil je dit certificaat alsnog vertrouwen?</string> + <string name="ssl_validator_not_saved">Het certificaat kon niet worden opgeslagen</string> <string name="ssl_validator_btn_details_see">Details</string> <string name="ssl_validator_btn_details_hide">Verbergen</string> <string name="ssl_validator_label_subject">Uitgegeven aan:</string> @@ -342,6 +349,7 @@ Kies er eentje van een provider.</string> <string name="instant_upload_on_charging">Alleen uploaden bij opladen</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Bestandsconflict</string> + <string name="conflict_message">Welke bestanden wil je bewaren? Als je beide versies selecteert zal het lokale bestand een volgnummer aan de naam toegevoegd krijgen.</string> <string name="conflict_keep_both">Beide bewaren</string> <string name="conflict_use_local_version">lokale versie</string> <string name="conflict_use_server_version">serverversie</string> @@ -357,6 +365,7 @@ Kies er eentje van een provider.</string> <string name="prefs_instant_upload_path_use_subfolders_title">Gebruik submappen</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Opslaan in submappen, gebaseerd op jaar en maand</string> + <string name="share_link_no_support_share_api">Sorry, delen is niet ingeschakeld op jouw server. Neem contact op met je beheerder.</string> <string name="share_link_file_no_exist">Kan dit niet delen. Controleer of dit bestand wel bestaat</string> <string name="share_link_file_error">Er trad een fout op bij je poging dit bestand of deze map te delen</string> <string name="unshare_link_file_no_exist">Kan delen niet beëindigen. Ga na of het bestand bestaat</string> @@ -370,32 +379,57 @@ Kies er eentje van een provider.</string> <string name="copy_link">Link kopiëren</string> <string name="clipboard_text_copied">Gekopieerd naar het klembord</string> + <string name="clipboard_no_text_to_copy">Geen tekst ontvangen om te kopiëren naar het klembord</string> <string name="clipboard_uxexpected_error">Onverwachte fout bij het kopiëren naar het klembord</string> <string name="clipboard_label">Tekst gekopieerd uit %1$s</string> + <string name="error_cant_bind_to_operations_service">Kritieke fout: kan de acties niet uitvoeren</string> + + <string name="network_error_socket_exception">Er trad een fout op bij het verbinden met de server.</string> + <string name="network_error_socket_timeout_exception">Er trad een fout op bij het wachten op de server, de verwerking kon niet plaatsvinden</string> + <string name="network_error_connect_timeout_exception">Er trad een fout op bij het wachten op de server, de verwerking kon niet plaatsvinden</string> + <string name="network_host_not_available">De verwerking kon niet plaatsvinden, de server is niet beschikbaar</string> + + <string name="forbidden_permissions">Je mist autorisatie %s</string> <string name="forbidden_permissions_rename">om dit bestand te hernoemen</string> <string name="forbidden_permissions_delete">om dit bestand te verwijderen</string> <string name="share_link_forbidden_permissions">om dit bestand te delen</string> <string name="unshare_link_forbidden_permissions">om dit bestand niet meer te delen</string> <string name="update_link_forbidden_permissions">om deze share bij te werken</string> + <string name="forbidden_permissions_create">om dit bestand te creëren</string> + <string name="uploader_upload_forbidden_permissions">om dit bestand in deze map te uploaden</string> <string name="downloader_download_file_not_found">Dit bestand is niet langer beschikbaar op de server</string> <string name="file_migration_dialog_title">Opslagpad bijwerken</string> <string name="file_migration_finish_button">Afronden</string> + <string name="file_migration_preparing">Voorbereiden van migratie…</string> <string name="file_migration_checking_destination">Doelmap controleren …</string> + <string name="file_migration_saving_accounts_configuration">Accountconfiguratie opslaan…</string> + <string name="file_migration_waiting_for_unfinished_sync">Wachten op onvoltooide synchronisaties…</string> <string name="file_migration_migrating">Gegevens verplaatsen …</string> <string name="file_migration_updating_index">Index bijwerken …</string> <string name="file_migration_cleaning">Opruimen …</string> + <string name="file_migration_restoring_accounts_configuration">Accountconfiguratie herstellen…</string> <string name="file_migration_ok_finished">Afgerond</string> + <string name="file_migration_failed_not_enough_space">FOUT: Niet genoeg ruimte</string> + <string name="file_migration_failed_not_writable">FOUT: Bestand niet beschrijfbaar</string> + <string name="file_migration_failed_not_readable">FOUT: Bestand niet leesbaar</string> <string name="file_migration_failed_dir_already_exists">FOUT: Nextcloudmap bestaat al</string> + <string name="file_migration_failed_while_coping">FOUT: Tijdens migratie</string> + <string name="file_migration_failed_while_updating_index">FOUT: Tijdens bijwerken index</string> + + <string name="file_migration_directory_already_exists">Gegevensmap bestaat al, wat te doen?</string> <string name="file_migration_override_data_folder">Vervangen</string> <string name="file_migration_use_data_folder">Gebruiken</string> <string name="prefs_category_accounts">Accounts</string> <string name="prefs_add_account">Account toevoegen</string> <string name="drawer_manage_accounts">Accounts beheren </string> - <string name="actionbar_logger">Logs</string> + <string name="auth_redirect_non_secure_connection_title">De beveiligde verbinding is omgeleid via een onveilige route.</string> + + <string name="actionbar_logger">Logs</string> <string name="log_send_history_button">Geschiedenis versturen</string> + <string name="log_send_no_mail_app">Geen applicatie gevonden voor het versturen van de logs. Installeer een e-mailapplicatie.</string> <string name="log_send_mail_subject">%1$s-Android-app-logs</string> <string name="log_progress_dialog_text">Gegevens laden …</string> @@ -403,20 +437,27 @@ Kies er eentje van een provider.</string> <string name="saml_authentication_wrong_pass">Onjuist wachtwoord</string> <string name="actionbar_move">Verplaatsen</string> <string name="actionbar_copy">Kopiëren</string> + <string name="file_list_empty_moving">Het is hier leeg. Je kan een map toevoegen!</string> <string name="folder_picker_choose_button_text">Kiezen</string> + <string name="move_file_not_found">Kan niet verplaatsen. Ga na of het bestand wel bestaat</string> + <string name="move_file_invalid_into_descendent">De map kan niet naar een onderliggende map worden verplaatst</string> + <string name="move_file_invalid_overwrite">Het bestand bestaat al in de doelmap</string> <string name="move_file_error">Er trad een fout op bij het verplaatsen van dit bestand of deze map</string> <string name="forbidden_permissions_move">om dit bestand te verplaatsen</string> <string name="copy_file_not_found">Kan niet kopiëren. Ga na of het bestand wel bestaat</string> + <string name="copy_file_invalid_into_descendent">Een map kan niet naar een onderliggende map worden gekopieerd</string> + <string name="copy_file_invalid_overwrite">Het bestand bestaat al in de doelmap</string> <string name="copy_file_error">Er trad een fout op bij het kopiëren van dit bestand of deze map</string> <string name="forbidden_permissions_copy">om dit bestand te kopiëren</string> <string name="prefs_category_instant_uploading">Direct uploaden</string> <string name="prefs_category_details">Details</string> - <string name="sync_folder_failed_content">Synchronisatie van map %1$s kon niet worden voltooid</string> + <string name="prefs_instant_video_upload_path_title">Directe-uploadmap voor video\'s</string> + <string name="sync_folder_failed_content">Synchronisatie van map %1$s kon niet worden voltooid</string> <string name="shared_subject_header">gedeeld</string> <string name="with_you_subject_header">met jou</string> @@ -457,6 +498,7 @@ Kies er eentje van een provider.</string> <string name="share_add_user_or_group">Voeg gebruiker of groep toe</string> <string name="share_via_link_section_title">Deel link</string> <string name="share_via_link_expiration_date_label">Stel vervaldatum in</string> + <string name="share_via_link_password_label">Beveilig met wachtwoord</string> <string name="share_via_link_password_title">Beveiligd</string> <string name="share_via_link_edit_permission_label">Bewerken toestaan</string> <string name="share_via_link_hide_file_listing_permission_label">Verberg bestandsoverzicht</string> @@ -472,6 +514,7 @@ Kies er eentje van een provider.</string> <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( op %2$s )</string> + <string name="share_sharee_unavailable">Helaas, je serverversie staat niet toe om binnen clients te delen met gebruikers.\nNeem contact op met je beheerder</string> <string name="share_privilege_can_share">kan delen</string> <string name="share_privilege_can_edit">kan bewerken</string> <string name="share_privilege_can_edit_create">creëer</string> @@ -480,16 +523,24 @@ Kies er eentje van een provider.</string> <string name="edit_share_unshare">Stop met delen</string> <string name="edit_share_done">gedaan</string> + <string name="action_retry_uploads">Mislukte opnieuw proberen</string> <string name="action_clear_failed_uploads">Mislukte opschonen</string> + <string name="action_clear_successful_uploads">Gelukte opschonen</string> + <string name="action_clear_finished_uploads">Alle voltoooide opschonen</string> + <string name="action_switch_grid_view">Rasterindeling </string> <string name="action_switch_list_view">Lijstindeling</string> <string name="manage_space_title">Beheer ruimte</string> + <string name="manage_space_description">Instellingen, database en servercertificaten van de data van %1$s zullen permanent worden verwijderd. \n\nGedownloade bestanden blijven onaangeroerd.\n\nDit proces kan even duren.</string> <string name="manage_space_clear_data">Gegevens verwijderen</string> <string name="manage_space_error">Sommige bestanden konden niet worden verwijderd</string> + <string name="permission_storage_access">Aanvullende permessies vereist voor het uploaden en downloaden van bestanden.</string> + <string name="local_file_not_found_toast">Het bestand is niet te vinden binnen het lokale bestandssysteem.</string> <string name="confirmation_remove_files_alert">Wil je de geselecteerde objecten echt verwijderen?</string> <string name="confirmation_remove_folders_alert">Wil je de geselecteerde objecten en hun inhoud echt verwijderen?</string> + <string name="uploads_view_upload_status_waiting_for_charging">Wachten to apparaat wordt opgeladen</string> <string name="actionbar_search">Zoeken</string> <string name="files_drop_not_supported">Dit is een Nextcloud-optie, gelieve te updaten.</string> <string name="learn_more">Meer weten</string> @@ -498,8 +549,11 @@ Kies er eentje van een provider.</string> <string name="participate_testing_headline">Help bij testen</string> <string name="participate_testing_bug_text">Bug gevonden? Rare dingen?</string> <string name="participate_testing_report_text">Meld het op Github</string> + <string name="participate_testing_version_text">Geïnteresseerd om ons te helpen de volgende versie te testen?</string> <string name="participate_beta_headline">Test de dev versie</string> + <string name="participate_beta_text">Dit omvat alle komende opties en is zeer \'bleeding edge\'. Bugs/fouten kunnen voorkomen en in dat geval vragen we je die aan ons te melden.</string> <string name="participate_release_candidate_headline">Release candidate</string> + <string name="participate_release_candidate_text">De Release Candidate (RC) is een kopie van de komende release en zou stabiel moeten zijn. Testen van jouw installatie kan ons helpen om dit te bevestigen. Meld je aan om te testen op de Play Store of bekijk handmatig de \"versies\"-sectie op F-Droid.</string> <string name="participate_contribute_headline">Actief meedoen</string> <string name="participate_contribute_irc_text">Doe mee met de chat op IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Help andere gebruikers in de <a href="%1$s">forums</a></string> @@ -510,7 +564,9 @@ Kies er eentje van een provider.</string> <string name="choose_remote_folder">Kies map …</string> <string name="folder_sync_loading_folders">Mappen laden …</string> <string name="folder_sync_no_results">Geen mediamappen gevonden.</string> + <string name="folder_sync_preferences">Voorkeuren voor automatisch uploaden</string> <string name="folder_sync_settings">Instellingen</string> + <string name="folder_sync_new_info">Direct uploaden is helemaal herzien. Bekijk het hoofdmenu en herconfigureer je auto-uploadfunctie. Onze excuses voor het ongemak.\n\nVeel plezier met de nieuwe en meer uitgebreide auto-upload-mogelijkheden!</string> <string name="folder_sync_preferences_folder_path">Voor %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d geselecteerd</item> @@ -524,6 +580,7 @@ Kies er eentje van een provider.</string> <string name="notifications_no_results_headline">Geen meldingen</string> <string name="notifications_no_results_message">Controleer later opnieuw.</string> + <string name="upload_file_dialog_title">Opgeven upload bestandsnaam en bestandstype</string> <string name="upload_file_dialog_filename">Bestandsnaam</string> <string name="upload_file_dialog_filetype">Bestandstype</string> <string name="upload_file_dialog_filetype_snippet_text">Snippet tekstbestand(.txt)</string> @@ -539,6 +596,8 @@ Kies er eentje van een provider.</string> <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Een veilige plek voor al je gegevens</string> + <string name="welcome_feature_1_text">Benader, deel & beveilig je gegevens thuis en binnen je organisatie</string> + <string name="welcome_feature_2_title">Meerdere accounts</string> <string name="welcome_feature_2_text">Verbind met al je clouds</string> @@ -562,17 +621,23 @@ Kies er eentje van een provider.</string> <!-- Activities --> <string name="activities_no_results_headline">Nog geen activiteit</string> + <string name="activities_no_results_message">Deze stream laat gebeurtenissen zoals\ntoevoegingen, veranderingen & gedeelde bestanden zien</string> <string name="webview_error">Er heeft zich een fout voorgedaan</string> <string name="prefs_category_about">Over</string> + <string name="actionbar_contacts">Contactpersonen backup</string> + <string name="contacts_backup_button">Nu backupppen</string> <string name="contacts_restore_button">Herstel de laatste backup</string> <string name="contacts_header_restore">Herstellen</string> <string name="contacts_header_backup">Backuppen</string> <string name="contacts_automatic_backup">Contactpersonen backup</string> <string name="contacts_last_backup">Laatsts backup</string> + <string name="contacts_read_permission">Leesrechten voor contactpersonen vereist</string> + <string name="contacts_write_permission">Schrijfrechten voor contactpersonen vereist</string> <string name="contactlist_title">Herstellen contactpersonen</string> <string name="contaclist_restore_selected">Herstel de geselecteerde contactpersonen</string> <string name="contactlist_account_chooser_title">Kies een account voor import</string> + <string name="contactlist_no_permission">Geen permissies, niets geïnporteerd!</string> <string name="contacts_preference_choose_date">Kies datum</string> <string name="contacts_preference_backup_never">nooit</string> <string name="contacts_preferences_no_file_found">Geen bestand gevonden</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 41a82e3dbb..6c9788f4eb 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -43,11 +43,11 @@ <string name="prefs_accounts">Konta</string> <string name="prefs_manage_accounts">Zarządzaj kontami</string> <string name="prefs_passcode">Blokada hasłem</string> + <string name="prefs_fingerprint">Blokada odciskiem palca</string> + <string name="prefs_fingerprint_notsetup">Brak skonfigurowanych odcisków palców</string> <string name="prefs_show_hidden_files">Pokaż ukryte pliki</string> - <string name="prefs_instant_upload">Natychmiastowa wysyłka obrazów</string> - <string name="prefs_instant_upload_summary">Wysyłaj od razu zdjęcia zrobione aparatem</string> - <string name="prefs_instant_video_upload">Natychmiastowa wysyłka wideo</string> - <string name="prefs_instant_video_upload_summary">Wysyłaj od razu filmy nagrane aparatem</string> + <string name="prefs_instant_upload">Natychmiastowe wysyłanie zdjęć</string> + <string name="prefs_instant_video_upload">Natychmiastowe wysyłanie wideo</string> <string name="prefs_log_title">Włącz logowanie</string> <string name="prefs_log_summary">To jest używane do logowania problemów</string> <string name="prefs_log_title_history">Historia logowania</string> @@ -56,19 +56,13 @@ <string name="prefs_calendar_contacts">Synchronizuj kalendarz i kontakty</string> <string name="prefs_calendar_contacts_summary">Skonfiguruj DAVdroid (v1.3.0+) dla obecnego konta</string> <string name="prefs_calendar_contacts_address_resolve_error">Adres serwera dla konta nie mógł został przekonwertowany do DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">Brak aplikacji Google Play lub F-Droida</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Synchronizacja kontaktów i kalendarza została skonfigurowana pomyślnie</string> <string name="prefs_help">Pomoc</string> <string name="prefs_recommend">Poleć znajomemu</string> <string name="prefs_feedback">Opinie</string> <string name="prefs_imprint">Stopka</string> - <string name="prefs_remember_last_share_location">Zapamiętaj lokalizację udostępnienia</string> - <string name="prefs_remember_last_upload_location_summary">Zapamiętaj ostatnią lokalizację wysyłania</string> - - <string name="recommend_subject">Wypróbuj %1$s na swoim smartfonie!</string> - <string name="recommend_text">Zapraszam do użycia %1$s na swoim smartfonie!\nŚciągnij tutaj: %2$s</string> - - <string name="auth_check_server">Sprawdź serwer</string> + <string name="prefs_remember_last_share_location">Zapamiętaj położenie udostępnienia</string> + <string name="recommend_subject">Wypróbuj %1$s na swoim smartfonie!</string> + <string name="auth_check_server">Sprawdź serwer</string> <string name="auth_host_url">Adres serwera https://...</string> <string name="auth_username">Nazwa użytkownika</string> <string name="auth_password">Hasło</string> @@ -84,42 +78,35 @@ <string name="uploader_error_title_no_file_to_upload">Brak plików do przesłania</string> <string name="uploader_error_message_received_piece_of_text">%1$s nie można przesłać części tekstu jako pliku.</string> <string name="uploader_error_message_no_file_to_upload">Odebrane dane nie zawierają prawidłowego pliku.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Plik nie może być przesłany</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Ten plik nie może być wysłany</string> <string name="uploader_error_message_read_permission_not_granted">%1$s nie jest autoryzowany do odczytu odebranego pliku</string> - <string name="uploader_error_message_source_file_not_found">Plik do wysłania nie został znaleziony w swojej lokalizacji. Proszę sprawdzić czy w ogóle istnieje.</string> - <string name="uploader_error_message_source_file_not_copied">Wystąpił błąd podczas kopiowania pliku do folderu tymczasowego. Proszę spróbować przesłać go ponownie.</string> + <string name="uploader_error_message_source_file_not_found">Wybrany plik nie został znaleziony. Proszę sprawdzić czy plik istnieje.</string> + <string name="uploader_error_message_source_file_not_copied">Nie udało się skopiować pliku do folderu tymczasowego. Spróbuj ponownie.</string> <string name="uploader_upload_files_behaviour">Opcja wysłania:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Przenieś plik do folderu Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Zachowaj plik w katalogu źródłowym</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Skasuj plik z katalogu źródłowego</string> <string name="file_list_seconds_ago">sekund temu</string> - <string name="file_list_empty_headline">Nie ma tu plików</string> - <string name="file_list_empty">Wyślij pliki lub zsynchronizuj z twoimi urządzeniami!</string> - <string name="file_list_empty_favorites">Oznacz pliki jako ulubione lub synchrozniuj ze swoimi urządzeniami!</string> - <string name="file_list_empty_favorites_filter_list">Pliki i foldery oznaczone jako ulubione pokażą się tutaj</string> - <string name="file_list_empty_favorites_filter">Nie znaleziono ulbionych plików dla twojego zapytania!</string> + <string name="file_list_empty_headline">Brak plików</string> + <string name="file_list_empty">Wyślij zawartość lub synchronizuj ją ze swoimi urządzeniami</string> + <string name="file_list_empty_favorites">Dodaj pliki do ulubionych lub synchronizuj je ze swoimi urządzeniami</string> + <string name="file_list_empty_favorites_filter_list">Tutaj znajdziesz pliki i foldery oznaczone jako ulubione</string> <string name="file_list_loading">Wczytywanie…</string> - <string name="file_list_no_app_for_file_type">Brak aplikacji dla tego typu plików!</string> <string name="local_file_list_empty">Nie ma plików w tym folderze.</string> <string name="file_list_empty_headline_search">Brak wyników w tym folderze</string> <string name="file_list_empty_headline_server_search">Brak wyników</string> + <string name="file_list_empty_favorite_headline">Brak ulubionych</string> <string name="file_list_empty_shared_headline">Nic nie jest jeszcze współdzielone</string> <string name="file_list_empty_shared">Pliki i foldery, które współdzielisz pokażą się tutaj</string> <string name="file_list_empty_headline_server_search_videos">Brak plików wideo</string> <string name="file_list_empty_headline_server_search_photos">Brak zdjęć</string> - <string name="file_list_empty_search">Spróbować szukać w innym folderze?</string> - <string name="file_list_empty_recently_modified">Nie znaleziono plików zmodyfikowanych w ostatnich 7 dniach</string> - <string name="file_list_empty_recently_modified_filter">Żadne pliki z twojego zapytania, które zostały zmodyfikowane - w ostatnich 7 dniach nie zostały znalezione!</string> - <string name="file_list_empty_recently_added">Nie znaleziono żadnych ostatnio dodanych plików</string> - <string name="file_list_empty_recently_added_filter">Nie znaleziono żadnych ostatnio dodanych plików dla twojego zapytania!</string> - <string name="file_list_empty_text_photos">Wyślij zdjęcia lub aktywuj automatyczne wysyłanie!</string> - <string name="file_list_empty_text_photos_filter">Żadnych zdjęć nie znaleziono dla twojego zapytania!</string> - <string name="file_list_empty_text_videos">Wyślij wideo lub aktywuj automatycznze wysyłanie!</string> - <string name="file_list_empty_text_videos_filter">Żadnych plików wideo nie znaleziono dla twojego zapytania!</string> + <string name="file_list_empty_recently_added">NIe znaleziono żadnych ostatnio dodanych plików</string> + <string name="file_list_empty_recently_added_filter">Twoje wyszukiwanie nie zwróciło żadnych ostatnio dodanych plików</string> + <string name="file_list_empty_text_photos">Wyślij zdjęcia lub włącz automatyczne wysyłanie</string> + <string name="file_list_empty_text_photos_filter">Twoje wyszukiwanie nie zwróciło żadnych zdjęć</string> + <string name="file_list_empty_text_videos">Wyślij pliki wideo lub włącz automatyczne wysyłanie</string> + <string name="file_list_empty_text_videos_filter">Twoje wyszukiwanie nie zwróciło żadnych plików wideo</string> <string name="upload_list_empty_headline">Brak dostępnych danych do wysłania</string> - <string name="upload_list_empty_text">Wyślij jakieś dane lub włącz wysyłanie natychmiastowe!</string> - <string name="upload_list_empty_text_auto_upload">Wyślij jakąś zawartość lub aktywuj automatyczne wysyłanie!</string> <string name="file_list_folder">folder</string> <string name="file_list_folders">foldery</string> <string name="file_list_file">plik</string> @@ -131,14 +118,12 @@ <string name="filedetails_modified">Zmodyfikowano:</string> <string name="filedetails_download">Pobierz</string> <string name="filedetails_sync_file">Synchronizuj</string> - <string name="filedetails_renamed_in_upload_msg">Podczas wysyłania nazwa pliku została zmieniona na %1$s</string> - <string name="list_layout">Wygląd listy</string> <string name="action_share">Udostępnij</string> <string name="common_yes">Tak</string> <string name="common_no">Nie</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Usuń</string> - <string name="common_retry_upload">Spróbuj przesłać jeszcze raz</string> + <string name="common_retry_upload">Ponów wysyłanie</string> <string name="common_cancel_sync">Anuluj synchronizację</string> <string name="common_cancel">Anuluj</string> <string name="common_back">Wróć</string> @@ -158,10 +143,10 @@ <string name="uploader_info_dirname">Nazwa folderu</string> <string name="uploader_upload_in_progress_ticker">Wysyłam …</string> <string name="uploader_upload_in_progress_content">%1$d%% Wysyłanie %2$s</string> - <string name="uploader_upload_succeeded_ticker">Wysyłanie zakończone powodzeniem</string> + <string name="uploader_upload_succeeded_ticker">Wysłano</string> <string name="uploader_upload_succeeded_content_single">Wysłano %1$s</string> <string name="uploader_upload_failed_ticker">Wysyłanie nie powiodło się</string> - <string name="uploader_upload_failed_content_single">Wysyłanie %1$s nie powiodło się</string> + <string name="uploader_upload_failed_content_single">Nie udało się wysłać %1$s</string> <string name="uploader_upload_failed_credentials_error">Błąd przy wysyłaniu zaloguj się ponownie</string> <string name="uploads_view_title">Wysłane</string> <string name="uploads_view_group_current_uploads">Obecny</string> @@ -178,37 +163,35 @@ <string name="uploads_view_upload_status_failed_localfile_error">Nie odnaleziono pliku lokalnego</string> <string name="uploads_view_upload_status_failed_permission_error">Błąd uprawnień</string> <string name="uploads_view_upload_status_conflict">Konflikt</string> - <string name="uploads_view_upload_status_service_interrupted">Program został zatrzymany</string> + <string name="uploads_view_upload_status_service_interrupted">Aplikacja została zatrzymana</string> <string name="uploads_view_upload_status_unknown_fail">Nieznany błąd</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Oczekiwanie na połączenie bezprzewodowe</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Oczekiwanie na połączenie Wi-Fi</string> <string name="uploads_view_later_waiting_to_upload">Oczekuję na przesyłanie</string> <string name="downloader_download_in_progress_ticker">Pobieranie …</string> <string name="downloader_download_in_progress_content">%1$d%% Pobieranie %2$s</string> - <string name="downloader_download_succeeded_ticker">Pobieranie zakończone</string> + <string name="downloader_download_succeeded_ticker">Pobrano</string> <string name="downloader_download_succeeded_content">%1$s pobrano</string> <string name="downloader_download_failed_ticker">Pobieranie nieudane</string> - <string name="downloader_download_failed_content">Pobieranie %1$s nie powiodło się</string> + <string name="downloader_download_failed_content">Nie udało się pobrać %1$s</string> <string name="downloader_not_downloaded_yet">Jeszcze nie pobrane</string> <string name="downloader_download_failed_credentials_error">Błąd podczas pobierania, zaloguj się ponownie</string> <string name="common_choose_account">Wybierz konto</string> <string name="sync_fail_ticker">Nieudana synchronizacja </string> - <string name="sync_fail_ticker_unauthorized">Nieudana synchronizacja, zaloguj się ponownie</string> - <string name="sync_fail_content">Nie udało się zakończyć synchronizacji %1$s</string> - <string name="sync_fail_content_unauthorized">Niepoprawne hasło dla %1$s</string> + <string name="sync_fail_ticker_unauthorized">Synchronizacja nieudana, zaloguj się ponownie</string> + <string name="sync_fail_content">Nie udało się zsynchronizować %1$s</string> + <string name="sync_fail_content_unauthorized">Błędne hasło dla %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Znaleziono konflikty</string> <string name="sync_conflicts_in_favourites_content">%1$d synchronizowanych plików nie może zostać zsynchronizowanych</string> <string name="sync_fail_in_favourites_ticker">Synchronizacja plików nie powiodła się</string> <string name="sync_fail_in_favourites_content">Zawartość %1$d plików nie może zostać synchronizowana (%2$d konfliktów)</string> <string name="sync_foreign_files_forgotten_ticker">Niektóre lokalne pliki zostały zgubione.</string> <string name="sync_foreign_files_forgotten_content">%1$d plików z folderu %2$s nie udało się się przekopiować</string> - <string name="sync_foreign_files_forgotten_explanation">Od wersji 1.3.16, pliki wysyłane z tego urządzenia są kopiowane do lokalnego folderu %1$s aby zapobiec utracie danych gdy pojedynczy plik jest synchronizowany z wieloma kontami.\n\nZ powodu tej zmiany, wszystkie pliki wysłane za pomocą poprzedniej wersji tej aplikacji były kopiowane do folderu %2$s. Jednakże, błąd uniemożliwiał dokończenie tej operacji podczas synchronizacji konta. Możesz albo pozostawić plik(i) tak jak jest i usunąć link do %3$s lub przenieść plik(i) do folderu %1$s i pozostawić link do %4$s.\n\nPoniżej plik(i) lokalny i plik(i) zdalny w %5$s, do którego zostały zlinkowane.</string> - <string name="sync_current_folder_was_removed">Folder %1$s nie istnieje.</string> + <string name="sync_current_folder_was_removed">Folder %1$s nie istnieje</string> <string name="foreign_files_move">Przenieś wszystko</string> <string name="foreign_files_success">Wszystkie pliki zostały przeniesione</string> <string name="foreign_files_fail">Niektóre pliki nie mogły być przeniesione</string> <string name="foreign_files_local_text">Lokalnie: %1$s</string> <string name="foreign_files_remote_text">Zdalnie: %1$s</string> - <string name="upload_query_move_foreign_files">Nie ma wystarczającego miejsca, aby skopiować wybrane pliki do folderu %1$s. Czy w zamian chciałbyś je tam przenieść?</string> <string name="pass_code_enter_pass_code">Wymyśl kod PIN.</string> <string name="pass_code_configure_your_pass_code">Wpisz kod PIN.</string> @@ -226,16 +209,8 @@ <string name="media_event_done">%1$s odtwarzanie zakończone</string> <string name="media_err_nothing_to_play">Nie znaleziono plików multimedialnych</string> <string name="media_err_no_account">Nie znaleziono konta</string> - <string name="media_err_not_in_owncloud">Plik na nieprawidłowym koncie</string> <string name="media_err_unsupported">Nieobsługiwany kodek multimediów</string> - <string name="media_err_io">Błąd odczytu pliku multimedialnego</string> - <string name="media_err_malformed">Błąd kodowania pliku multimedialnego</string> - <string name="media_err_timeout">Upłynął limit czasu podczas próby odtwarzania</string> - <string name="media_err_invalid_progressive_playback">Plik mediów nie może być przesyłany strumieniowo</string> - <string name="media_err_unknown">Plik multimediów nie może być odtworzony we wbudowanym odtwarzaczu</string> - <string name="media_err_security_ex">Błąd zabezpieczeń podczas próby odtworzenia %1$s</string> - <string name="media_err_io_ex">Błąd wprowadzania podczas próby odtworzenia %1$s</string> - <string name="media_err_unexpected">Nieoczekiwany błąd podczas próby odtworzenia %1$s</string> + <string name="media_err_io">NIe można odczytać pliku</string> <string name="media_rewind_description">Przycisk przewijania do tyłu</string> <string name="media_play_pause_description">Przycisk odtwarzania / pauzowania</string> <string name="media_forward_description">Przycisk przewijania do przodu</string> @@ -247,32 +222,27 @@ <string name="auth_connection_established">Połączenie nawiązane</string> <string name="auth_testing_connection">Testowanie połączenia</string> <string name="auth_not_configured_title">Uszkodzona konfiguracja serwera</string> - <string name="auth_account_not_new">Konto tego samego użytkownika i serwera już istnieje na tym urządzeniu</string> <string name="auth_account_not_the_same">Podany login nie pasuje do użytkowników </string> <string name="auth_unknown_error_title">Wystąpił nieznany błąd!</string> - <string name="auth_unknown_host_title">Nie mogę znaleźć hosta</string> - <string name="auth_incorrect_path_title">Nie znaleziono instancji serwer</string> + <string name="auth_unknown_host_title">Nie znaleziono hosta</string> + <string name="auth_incorrect_path_title">Nie znaleziono serwera</string> <string name="auth_timeout_title">Serwer zbyt długo nie odpowiadał</string> - <string name="auth_incorrect_address_title">Nieprawidłowy format adresu serwera</string> + <string name="auth_incorrect_address_title">Błędny format adresu serwera</string> <string name="auth_ssl_general_error_title">Inicjowanie SSL nie powiodło się</string> - <string name="auth_ssl_unverified_server_title">Nie można zweryfikować tożsamości SSL serwera</string> + <string name="auth_ssl_unverified_server_title">Nie udało się zweryfikować tożsamości serwera SSL</string> <string name="auth_bad_oc_version_title">Nie rozpoznano wersji serwera</string> - <string name="auth_wrong_connection_title">Nie można ustanowić połączenia</string> + <string name="auth_wrong_connection_title">Nie udało się ustanowić połączenia</string> <string name="auth_secure_connection">Nawiązano bezpieczne połączenie</string> <string name="auth_unauthorized">Zła nazwa użytkownika lub hasło</string> <string name="auth_oauth_error">Nieudana autoryzacja</string> <string name="auth_oauth_error_access_denied">Dostęp zabroniony przez serwer autoryzacji</string> - <string name="auth_wtf_reenter_URL">Nieoczekiwany stan. Podaj ponownie adres serwera</string> <string name="auth_expired_oauth_token_toast">Twoja sesja wygasła. Proszę zaloguj się ponownie</string> <string name="auth_expired_basic_auth_toast">Podaj aktualne hasło</string> <string name="auth_expired_saml_sso_token_toast">Twoja sesja wygasła. Proszę zaloguj się ponownie</string> - <string name="auth_connecting_auth_server">Łączenie z serwerem poświadczeń...</string> + <string name="auth_connecting_auth_server">Łączenie z serwerem uwierzytelniania...</string> <string name="auth_unsupported_auth_method">Serwer nie obsługuje tej metody autoryzacji</string> <string name="auth_unsupported_multiaccount">%1$s nie wspiera wielu kont</string> - <string name="auth_fail_get_user_name">Twój serwer nie zwraca poprawnego identyfikatora użytkownika. Proszę skontaktuj się z administratorem.</string> <string name="auth_can_not_auth_against_server">Błąd autoryzacji na tym serwerze</string> - <string name="auth_account_does_not_exist">Konto jeszcze nie istnieje na tym urządzeniu.</string> - <string name="favorite">Udostępnij w trybie offline</string> <string name="unfavorite">Wyłącz udostępnianie w trybie offline</string> <string name="favorite_real">Ustaw jako ulubione</string> @@ -280,28 +250,25 @@ <string name="common_rename">Zmień nazwę</string> <string name="common_remove">Usuń</string> <string name="confirmation_remove_file_alert">Czy naprawdę chcesz usunąć %1$s?</string> - <string name="confirmation_remove_folder_alert">Czy naprawdę chcesz usunąć %1$s i jego zawartość?</string> <string name="confirmation_remove_local">Tylko lokalnie</string> <string name="remove_success_msg">Usunięto</string> <string name="remove_fail_msg">Nie można usunąć</string> <string name="rename_dialog_title">Wprowadź nową nazwę</string> - <string name="rename_local_fail_msg">Nie można zmienić nazwy kopii lokalnej; spróbuj wybrać inną nazwę </string> - <string name="rename_server_fail_msg">Zmiana nazwy nie powiodła się</string> - <string name="sync_file_fail_msg">Nie można sprawdzić zdalnego pliku</string> + <string name="rename_server_fail_msg">Nie udało się nadać serwerowi nowej nazwy</string> + <string name="sync_file_fail_msg">Nie udało się sprawdzić zdalnego pliku</string> <string name="sync_file_nothing_to_do_msg">Zawartość pliku została już synchronizowana</string> - <string name="create_dir_fail_msg">Folder nie może zostać utworzony</string> + <string name="create_dir_fail_msg">Nie udało się utworzyć folderu</string> <string name="filename_forbidden_characters">Znaki zabronione: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak</string> <string name="filename_empty">Nazwa pliku nie może być pusta.</string> - <string name="wait_a_moment">Poczekaj chwilę</string> + <string name="wait_a_moment">Proszę czekać...</string> <string name="wait_checking_credentials">Sprawdzanie danych</string> - <string name="filedisplay_unexpected_bad_get_content">Nieoczekiwany problem; spróbuj wybrać plik z innej aplikacji</string> - <string name="filedisplay_no_file_selected">Nie wybrano żadnych plików</string> + <string name="filedisplay_no_file_selected">Nie wybrano żadnego pliku</string> <string name="activity_chooser_title">Wyślij link do …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopiowanie pliku z prywatnego zasobu</string> <string name="oauth_check_onoff">Loguj przez oAuth2</string> - <string name="oauth_login_connection">Łączenie z serwerem oAuth2...</string> + <string name="oauth_login_connection">Łączenie z serwerem OAuth 2...</string> <string name="ssl_validator_header">Nie można zweryfikować tożsamości strony</string> <string name="ssl_validator_reason_cert_not_trusted">- Certyfikat serwera jest niezaufany</string> @@ -309,7 +276,7 @@ <string name="ssl_validator_reason_cert_not_yet_valid">- Certyfikat serwera jest wystawiony w przyszłości</string> <string name="ssl_validator_reason_hostname_not_verified">- URL nie pasuje do nazwy hosta w certyfikacie</string> <string name="ssl_validator_question">Zaakceptować certyfikat mimo wszystko?</string> - <string name="ssl_validator_not_saved">Nie można zapisać certyfikatu</string> + <string name="ssl_validator_not_saved">Nie udało się zapisac certyfikatu</string> <string name="ssl_validator_btn_details_see">Szczegóły</string> <string name="ssl_validator_btn_details_hide">Ukryj</string> <string name="ssl_validator_label_subject">Wydany dla:</string> @@ -333,26 +300,25 @@ <string name="placeholder_sentence">Tekst zastępczy</string> <string name="placeholder_filename">placeholder.txt</string> - <string name="placeholder_filetype">Obraz PNG</string> + <string name="placeholder_filetype">obraz PNG</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Wysyłaj tylko przez WiFi</string> - <string name="instant_upload_on_wifi">Wysyłaj zdjęcia tylko przez WiFi</string> - <string name="instant_video_upload_on_wifi">Wysyłaj filmy tylko przez WiFi</string> + <string name="auto_upload_on_wifi">Wysyłaj tylko przez Wi-Fi</string> + <string name="instant_upload_on_wifi">Wysyłaj zdjęcia tylko przez Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Wysyłaj pliki wideo tylko przez Wi-Fi</string> <string name="instant_video_upload_on_charging">Wysyłaj tylko podczas ładowania</string> <string name="instant_upload_on_charging">Wysyłaj tylko podczas ładowania</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Konflikt pliku</string> - <string name="conflict_message">Które pliki chcesz zachować? Jeśli wybierzesz obie wersje, do nazwy pliku lokalnego zostanie dodana liczba.</string> <string name="conflict_keep_both">Zatrzymaj oba</string> <string name="conflict_use_local_version">wersja lokalna</string> <string name="conflict_use_server_version">wersja zdalna</string> - <string name="preview_sorry">Przykro mi z tego powodu!</string> + <string name="preview_sorry">Przykro nam.</string> <string name="preview_image_description">Podgląd</string> - <string name="preview_image_error_unknown_format">Obraz nie może być pokazany</string> + <string name="preview_image_error_unknown_format">Nie można wyświetlić obrazu</string> <string name="error__upload__local_file_not_copied">%1$s nie może zostać skopiowany do lokalnego folderu %2$s</string> <string name="prefs_instant_upload_path_title">Wysyłka obrazów do folderu</string> @@ -361,7 +327,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Używaj podfolderów</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Zapisz w podfolderach opartych na roku oraz miesiącu</string> - <string name="share_link_no_support_share_api">Przepraszam, ale współdzielenie nie jest dostępne na twoim serwerze. Prosze skontaktuj się z administratorem.</string> + <string name="share_link_no_support_share_api">Współdzielenie nie jest włączone na serwerze. Skontaktuj się z administratorem.</string> <string name="share_link_file_no_exist">Nie można udostępnić. Proszę sprawdzić, czy plik istnieje</string> <string name="share_link_file_error">Wystąpił błąd podczas udostępniania tego pliku lub folderu.</string> <string name="unshare_link_file_no_exist">Nie można wyłączyć udostępniania. Proszę sprawdzić, czy plik istnieje</string> @@ -375,56 +341,53 @@ <string name="copy_link">Skopiuj link</string> <string name="clipboard_text_copied">Skopiuj do schowka</string> - <string name="clipboard_no_text_to_copy">Nie odebrano tekstu, by skopiować go do schowka</string> <string name="clipboard_uxexpected_error">Wystąpił błąd podczas kopiowania do schowka</string> <string name="clipboard_label">Skopiowano tekst z %1$s</string> - <string name="error_cant_bind_to_operations_service">Błąd krytyczny: nie można wykonać operacji</string> + <string name="error_cant_bind_to_operations_service">Błąd krytyczny: Nie można wykonać operacji</string> - <string name="network_error_socket_exception">Pojawił się błąd podczas łączenia z serwerem.</string> - <string name="network_error_socket_timeout_exception">Pojawił się błąd podczas oczekiwania na serwer, operacja nie mogła zostać wykonana</string> - <string name="network_error_connect_timeout_exception">Pojawił się błąd podczas oczekiwania na serwer, operacja nie mogła zostać wykonana</string> - <string name="network_host_not_available">Nie można dokończyć operacji, serwer jest niedostępny</string> - <string name="forbidden_permissions">Nie masz uprawnień %s</string> + <string name="network_error_socket_exception">Wystąpił błąd podczas łączenia z serwerem.</string> + <string name="network_error_socket_timeout_exception">Wystąpił błąd podczas oczekiwania na serwer. Operacja nie mogła zostać wykonana.</string> + <string name="network_error_connect_timeout_exception">Wystąpił błąd podczas oczekiwania na serwer. Operacja nie mogła zostać wykonana.</string> + <string name="network_host_not_available">Nie można ukończyć operacji. Serwer jest niedostępny.</string> + + <string name="forbidden_permissions">%s nie masz uprawnień</string> <string name="forbidden_permissions_rename">do zmiany nazwy tego pliku</string> <string name="forbidden_permissions_delete">do usuwania tego pliku</string> <string name="share_link_forbidden_permissions">do współdzielenia tego pliku</string> <string name="unshare_link_forbidden_permissions">do zniesienia współdzielenia tego pliku</string> <string name="update_link_forbidden_permissions">aby uaktualnić ten udział</string> - <string name="forbidden_permissions_create">do utworzenia tego pliku</string> - <string name="uploader_upload_forbidden_permissions">do wgrania tego folderu</string> + <string name="forbidden_permissions_create">do stworzenia tego pliku</string> + <string name="uploader_upload_forbidden_permissions">do wysyłania do tego folderu</string> <string name="downloader_download_file_not_found">Ten plik nie jest już dostępny na serwerze</string> <string name="file_migration_dialog_title">Ścieżka przechowywania aktualizacji</string> <string name="file_migration_finish_button">Koniec</string> - <string name="file_migration_preparing">Przygotowanie do migracji…</string> + <string name="file_migration_preparing">Przygotowywanie migracji…</string> <string name="file_migration_checking_destination">Sprawdzanie docelowe…</string> <string name="file_migration_saving_accounts_configuration">Zapisywanie konfiguracji konta…</string> - <string name="file_migration_waiting_for_unfinished_sync">Oczekiwanie na niedokończone synchronizacje…</string> + <string name="file_migration_waiting_for_unfinished_sync">Oczekiwanie na zakończenie synchronizacji…</string> <string name="file_migration_migrating">Przenoszenie danych…</string> <string name="file_migration_updating_index">Aktualizacja indeksa…</string> <string name="file_migration_cleaning">Czyszczenie…</string> <string name="file_migration_restoring_accounts_configuration">Przywracanie konfiguracji konta…</string> <string name="file_migration_ok_finished">Skończone</string> - <string name="file_migration_failed_not_enough_space">BŁĄD: Za mało miejsca</string> - <string name="file_migration_failed_not_writable">BŁĄD: Plik nie jest zapisywalny</string> - <string name="file_migration_failed_not_readable">BŁĄD: Nie można odczytać pliku</string> + <string name="file_migration_failed_not_enough_space">BŁĄD: Brak miejsca</string> + <string name="file_migration_failed_not_writable">BŁĄD: Plik nie do zapisu</string> + <string name="file_migration_failed_not_readable">BŁĄD: Plik nie do odczytu </string> <string name="file_migration_failed_dir_already_exists">BŁĄD: Katalog Nextcloud już istnieje</string> - <string name="file_migration_failed_while_coping">BŁĄD: Podczas migracji</string> - <string name="file_migration_failed_while_updating_index">BŁĄD: Podczas aktualizacji indeksu</string> + <string name="file_migration_failed_while_coping">BŁĄD: Nieudana migracja</string> + <string name="file_migration_failed_while_updating_index">BŁĄD: Nieudana aktualizacja indeksu</string> - <string name="file_migration_directory_already_exists">Folder danych już istnieje, co zrobić?</string> - <string name="file_migration_override_data_folder">Nadpisanie</string> - <string name="file_migration_use_data_folder">Użyj istniejącego</string> + <string name="file_migration_directory_already_exists">Folder z danymi już istnieje. Wybierz jedną z następujących czynności:</string> + <string name="file_migration_override_data_folder">Zamień</string> + <string name="file_migration_use_data_folder">Użyj</string> <string name="prefs_category_accounts">Konta</string> <string name="prefs_add_account">Dodaj konto</string> <string name="drawer_manage_accounts">Zarządzaj kontami</string> - <string name="auth_redirect_non_secure_connection_title">Bezpieczne połączenie jest przekierowywane przez niezabezpieczone trasy.</string> - - <string name="actionbar_logger">Logi</string> + <string name="actionbar_logger">Logi</string> <string name="log_send_history_button">Wyślij historię</string> - <string name="log_send_no_mail_app">Brak aplikacji do wysyłania logów. Zainstaluj klienta poczty.</string> <string name="log_send_mail_subject">%1$s Logi aplikacji Android</string> <string name="log_progress_dialog_text">Ładowanie danych …</string> @@ -432,27 +395,24 @@ <string name="saml_authentication_wrong_pass">Złe hasło</string> <string name="actionbar_move">Przenieś</string> <string name="actionbar_copy">Skopiuj</string> - <string name="file_list_empty_moving">Nic tu nie ma. Możesz dodać folder!</string> + <string name="file_list_empty_moving">Pusto. Możesz dodać folder.</string> <string name="folder_picker_choose_button_text">Wybierz</string> - <string name="move_file_not_found">Nie można przenieść. Proszę sprawdzić, czy plik istnieje</string> - <string name="move_file_invalid_into_descendent">Nie jest możliwe przeniesienie folderu do potomka</string> - <string name="move_file_invalid_overwrite">Plik istnieje już w folderze docelowym</string> + <string name="move_file_not_found">Nie można przenieść pliku. Sprawdź, czy plik istnieje.</string> + <string name="move_file_invalid_overwrite">Plik już istnieje w folderze docelowym</string> <string name="move_file_error">Pojawił się błąd podczas próby przeniesienia tego pliku lub folderu</string> <string name="forbidden_permissions_move">aby przenieść ten plik</string> <string name="copy_file_not_found">Nie można skopiować. Sprawdź, czy plik istnieje</string> - <string name="copy_file_invalid_into_descendent">Nie można skopiować katalogu do jego podkatalogu</string> - <string name="copy_file_invalid_overwrite">Plik istnieje już w folderze docelowym</string> + <string name="copy_file_invalid_overwrite">Plik już istnieje w folderze docelowym</string> <string name="copy_file_error">Wystąpił błąd podczas próby kopiowania tego pliku lub folderu</string> <string name="forbidden_permissions_copy">by skopiować ten plik</string> <string name="prefs_category_instant_uploading">Automatyczne wysyłanie</string> <string name="prefs_category_details">Szczegóły</string> - <string name="prefs_instant_video_upload_path_title">Wysyłka wideo do folderu</string> - <string name="sync_folder_failed_content">Synchronizacja folderu %1$s nie może zostać zakończona</string> + <string name="sync_folder_failed_content">Synchronizacja folderu %1$s nie może zostać zakończona</string> <string name="shared_subject_header">udostępniony</string> <string name="with_you_subject_header">z tobą</string> @@ -493,7 +453,7 @@ <string name="share_add_user_or_group">Dodaj użytkownika lub grupę</string> <string name="share_via_link_section_title">Udostępnij link</string> <string name="share_via_link_expiration_date_label">Ustaw datę wygaśnięcia</string> - <string name="share_via_link_password_label">Zabezpieczone hasłem</string> + <string name="share_via_link_password_label">Zabezpiecz hasłem</string> <string name="share_via_link_password_title">Zabezpieczone</string> <string name="share_via_link_edit_permission_label">Pozwól na edycję</string> <string name="share_via_link_hide_file_listing_permission_label">Schowaj listę plików</string> @@ -509,7 +469,6 @@ <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( w %2$s )</string> - <string name="share_sharee_unavailable">Przepraszam, ale wersja twojego serwera nie pozwala na współdzielenie z użytkownikami poprzez klienta. \nProszę skontaktuj się z administratorem.</string> <string name="share_privilege_can_share">może współdzielić</string> <string name="share_privilege_can_edit">może edytować</string> <string name="share_privilege_can_edit_create">utwórz</string> @@ -518,49 +477,34 @@ <string name="edit_share_unshare">Cofnij udostępnianie</string> <string name="edit_share_done">zakończono</string> - <string name="action_retry_uploads">Wysyłanie ponowne się nie udało</string> <string name="action_clear_failed_uploads">Wyczyść nieudane</string> - <string name="action_clear_successful_uploads">Wyczyść udane</string> - <string name="action_clear_finished_uploads">Wyszyczść wszystkie zakończone</string> - <string name="action_switch_grid_view">Widok siatki</string> <string name="action_switch_list_view">Widok listy</string> <string name="manage_space_title">Zarządzaj przestrzenią</string> - <string name="manage_space_description">Ustawienia, baza danych i certyfikaty serwera %1$s zostaną trwale skasowane.\n\nPobrane pliki pozostaną na swoich miejscach.\n\nTen proces zajmie trochę czasu.</string> <string name="manage_space_clear_data">Wyczyść dane</string> <string name="manage_space_error">Nie udało się usunąć niektórych plików.</string> - <string name="permission_storage_access">Dodatkowe uprawnienia do wysyłania i ściągania plików.</string> - <string name="local_file_not_found_toast">Plik nie został znaleziony w lokalnym systemie plików</string> <string name="confirmation_remove_files_alert">Czy naprawdę chcesz usunąć zaznaczone elementy?</string> <string name="confirmation_remove_folders_alert">Czy naprawdę chcesz usunąć zaznaczone elementy oraz ich zawartość?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Oczekiwanie na ładowanie urządzenia</string> <string name="actionbar_search">Wyszukaj</string> <string name="files_drop_not_supported">Ta funkcja jest dostępna w Nextcloud, prosimy wykonać aktualizację</string> <string name="learn_more">Dowiedz się więcej</string> <string name="drawer_folder_sync">Automatyczne przesyłanie</string> <string name="drawer_participate">Wspieraj</string> - <string name="participate_testing_headline">Pomóż nam testować</string> - <string name="participate_testing_bug_text">Znaleziono błąd? Jest coś dziwnego?</string> <string name="participate_testing_report_text">Zgłoś błąd na GitHubie</string> - <string name="participate_testing_version_text">Chcesz pomóc nam testować następną wersję?</string> - <string name="participate_beta_text">Zawiera to w sobie wszystkie nadchodzące funkcjonalności i jest bardzo ryzykowne. Mogą się pojawiać błędy. Jeśli będą proszę je do nas zgłosić.</string> + <string name="participate_beta_headline">Sprawdź wersję rozwojową</string> <string name="participate_release_candidate_headline">Wydanie kandydujące</string> - <string name="participate_release_candidate_text">Release Candidate (RC) jest zarysem nadchodzącego wydania i oczekujemy że będzie stabilne. Testowanie indywidualnej konfiguracji może pomóc, aby to zapewnić. Zapisz się do testowania w sklepie Play lub ręcznie szukaj w sekcji \"wersje\" na F-Droid.</string> <string name="participate_contribute_headline">Aktywni członkowie projektu</string> <string name="participate_contribute_irc_text">Dołącz do chatu (IRC): <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Pomóż innym na <a href="%1$s">forum</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Tłumacz</a> aplikację</string> - <string name="participate_contribute_github_text">Wspomóż nas jako programista, po więcej szczegółów odwiedź <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> </string> <string name="move_to">Przenieś do…</string> <string name="copy_to">Skopiuj do…</string> <string name="choose_remote_folder">Wybierz folder…</string> <string name="folder_sync_loading_folders">Ładowanie folderów…</string> <string name="folder_sync_no_results">Nie znaleziono folderów multimedialnych.</string> - <string name="folder_sync_preferences">Preferencje automatycznego przesyłania</string> <string name="folder_sync_settings">Ustawienia</string> - <string name="folder_sync_new_info">Natychmiastowe wysyłanie zostało kompletnie zmienione. Proszę sprawdzić główne menu i zrekonfigurować automatyczne wysyłanie. Przepraszamy za niedogodności.\n\nCiesz się z nowych i rozbudowanych możliwości automatycznego wysyłania!</string> <string name="folder_sync_preferences_folder_path">Dla %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d zaznaczony</item> @@ -576,7 +520,7 @@ <string name="notifications_no_results_headline">Brak powiadomień</string> <string name="notifications_no_results_message">Proszę sprawdź później</string> - <string name="upload_file_dialog_title">Wprowadź nazwę i typ wysyłanego pliku</string> + <string name="upload_file_dialog_title">Wprowadź nazwę i typ pliku do wysłania</string> <string name="upload_file_dialog_filename">Nazwa pliku</string> <string name="upload_file_dialog_filetype">Typ pliku</string> <string name="upload_file_dialog_filetype_snippet_text">Wstawka tekstowa file(.txt)</string> @@ -592,7 +536,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Bezpieczny dom dla wszystkich danych</string> - <string name="welcome_feature_1_text">Przechowuj, współdziel i chroń swoje prywatne i służbowe dane</string> + <string name="welcome_feature_1_text">Dostęp do, współdzielenie i ochrona twoich plików w domu i w pracy</string> <string name="welcome_feature_2_title">Wiele kont</string> <string name="welcome_feature_2_text">Podłączenie się do wszystkich chmur</string> @@ -614,9 +558,25 @@ <!-- Activities --> <string name="activities_no_results_headline">Brak aktywności</string> - <string name="activities_no_results_message">Ten strumień pokaże zdarzenia jak\ndodatki, zmiany & udziały</string> + <string name="webview_error">Wystąpił błąd</string> + <string name="prefs_category_about">O aplikacji</string> + + <string name="actionbar_contacts">Utwórz kopię zapasową kontaktów</string> + <string name="actionbar_contacts_restore">Przywróć kontakty</string> + <string name="contacts_restore_button">Przywróć ostatnią kopię zapasową</string> + <string name="contacts_automatic_backup">Kopia zapasowa kontaktów</string> + <string name="contacts_last_backup">Ostatnia kopia zapasowa</string> + <string name="contacts_read_permission">Potrzebne uprawnienia do odczytu kontaktów</string> + <string name="contacts_write_permission">Potrzebne uprawnienia do modyfikacji kontaktów</string> + <string name="contactlist_title">Przywróć kontakty</string> + <string name="contaclist_restore_selected">Przywróć wybrane kontakty</string> + <string name="contactlist_account_chooser_title">Wybierz konto do zaimportiwania</string> + <string name="contacts_preference_choose_date">Wybierz datę</string> + <string name="contacts_preference_backup_never">nigdy</string> + <string name="contacts_preferences_no_file_found">Nie znaleziono żadnych plików</string> <!-- Notifications --> <string name="new_notification_received">Otrzymano nowe powiadomienie</string> + <string name="drawer_logout">Wyloguj</string> </resources> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 9495d69ae4..c06d316826 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -625,6 +625,8 @@ <string name="prefs_category_about">Sobre</string> <string name="actionbar_contacts">Fazer backup dos contatos</string> + <string name="actionbar_contacts_restore">Restaurar contatos</string> + <string name="contacts_backup_button">Fazer backup agora</string> <string name="contacts_restore_button">Retornar último backup</string> <string name="contacts_header_restore">Retornar</string> <string name="contacts_header_backup">Backup</string> @@ -639,6 +641,7 @@ <string name="contacts_preference_choose_date">Escolha a data</string> <string name="contacts_preference_backup_never">nunca</string> <string name="contacts_preferences_no_file_found">Nenhum arquivo encontrado</string> + <string name="contacts_preferences_something_strange_happened">Não foi possível encontrar seu último backup!</string> <string name="contacts_preferences_backup_scheduled">Backup agendado e irá iniciar em breve</string> <string name="contacts_preferences_import_scheduled">Backup importado e irá iniciar em breve</string> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index 59218e18ba..24d9b4e1ec 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">Parmak izi kilidi</string> <string name="prefs_fingerprint_notsetup">Henüz bir parmak izi ayarlanmamış.</string> <string name="prefs_show_hidden_files">Gizli dosyaları görüntüle</string> - <string name="prefs_instant_upload">Fotoğraflar anında yüklensin</string> - <string name="prefs_instant_upload_summary">Kamera ile çekilen fotoğraflar anında yüklensin</string> - <string name="prefs_instant_video_upload">Görüntüler anında yüklensin</string> - <string name="prefs_instant_video_upload_summary">Kamera ile çekilen görüntüler anında yüklensin</string> + <string name="prefs_instant_upload">Anında fotoğraf yükleme</string> + <string name="prefs_instant_upload_summary">Kamera ile çekilen fotoğraflar anında yüklenir</string> + <string name="prefs_instant_video_upload">Anında görüntü yükleme</string> + <string name="prefs_instant_video_upload_summary">Kamera ile çekilen görüntüler anında yüklenir</string> <string name="prefs_log_title">Günlük kullanılsın</string> <string name="prefs_log_summary">Etkinleştirildiğinde sorunlar günlük dosyasına kaydedilir</string> <string name="prefs_log_title_history">Günlük geçmişi</string> @@ -58,14 +58,14 @@ <string name="prefs_calendar_contacts">Takvim ve kişiler eşitlensin</string> <string name="prefs_calendar_contacts_summary">Geçerli hesap için DAVdroid (v1.3.0+) kurulumu</string> <string name="prefs_calendar_contacts_address_resolve_error">Hesabın sunucu adresi DAVdroid tarafından çözümlenemedi</string> - <string name="prefs_calendar_contacts_no_store_error">Google Play mağazası yok ya da F-Droid uygulaması kurulmamış</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Takvim ve kişi eşitlemesi ayarlandı</string> + <string name="prefs_calendar_contacts_no_store_error">F-droid ya da Google Play kurulmamış</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Takvim ve kişi eşitlemesi ayarları</string> <string name="prefs_help">Yardım</string> - <string name="prefs_recommend">Arkadaşınıza önerin</string> + <string name="prefs_recommend">Arkadaşına öner</string> <string name="prefs_feedback">Geri bildirim</string> <string name="prefs_imprint">İzlenim</string> - <string name="prefs_remember_last_share_location">Konum paylaşma hatırlansın</string> - <string name="prefs_remember_last_upload_location_summary">Son paylaşma yükleme konumu hatırlansın</string> + <string name="prefs_remember_last_share_location">Paylaşılacak konum hatırlansın</string> + <string name="prefs_remember_last_upload_location_summary">Son kullanılan konumlar paylaşılmak üzere hatırlanır</string> <string name="recommend_subject">%1$s uygulamasını akıllı telefonunuzda deneyin!</string> <string name="recommend_text">Akıllı telefonunda %1$s kullanmanı öneriyorum!\nBuradan indirebilirsin: %2$s</string> @@ -74,7 +74,7 @@ <string name="auth_host_url">Sunucu adresi https://…</string> <string name="auth_username">Kullanıcı Adı</string> <string name="auth_password">Parola</string> - <string name="auth_register">Henüz bir sunucunuz yok mu?\nBuraya tıklayarak bir hizmet sağlayıcıdan sunucu edinebilirsiniz</string> + <string name="auth_register">Henüz bir sunucunuz yok mu?\Hizmet sağlayıcılardan yararlanabilirsiniz</string> <string name="sync_string_files">Dosyalar</string> <string name="setup_btn_connect">Bağlan</string> <string name="uploader_btn_upload_text">Yükle</string> @@ -86,9 +86,9 @@ <string name="uploader_error_title_no_file_to_upload">Yüklenecek bir dosya yok</string> <string name="uploader_error_message_received_piece_of_text">%1$s bir metin parçasını dosya olarak yükleyemez.</string> <string name="uploader_error_message_no_file_to_upload">Alınan verilerde geçerli bir dosya bulunamadı.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Dosya yüklenemedi</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Bu dosya yüklenemez</string> <string name="uploader_error_message_read_permission_not_granted">%1$s alınan bir dosyayı okumaya yetkili değil</string> - <string name="uploader_error_message_source_file_not_found">Karşıya yüklenecek dosya konumunda bulunamadı. Lütfen dosyanın var olduğundan emin olun.</string> + <string name="uploader_error_message_source_file_not_found">Yüklenmek üzere seçilmiş dosya bulunamadı. Lütfen dosyanın var olup olmadığını denetleyin.</string> <string name="uploader_error_message_source_file_not_copied">Dosya geçici bir klasöre kopyalanırken bir sorun çıktı. Lütfen yeniden göndermeyi deneyin.</string> <string name="uploader_upload_files_behaviour">Yükleme seçeneği:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Dosya Nextcloud klasörüne taşınsın</string> @@ -96,31 +96,33 @@ <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Dosya kaynak klasörden silinsin</string> <string name="file_list_seconds_ago">saniye önce</string> <string name="file_list_empty_headline">Burada herhangi bir dosya yok</string> - <string name="file_list_empty">Bazı içerikler yükleyin ya da aygıtlarınızla eşitleyin!</string> - <string name="file_list_empty_favorites">Bazı dosyaları sık kullanılanlara ekleyin ya da aygıtlarınızla paylaşın!</string> + <string name="file_list_empty">Bazı içerikler yükleyin ya da aygıtlarınızla eşitleyin.</string> + <string name="file_list_empty_favorites">Bazı dosyaları sık kullanılanlara ekleyin ya da aygıtlarınızla paylaşın.</string> <string name="file_list_empty_favorites_filter_list">Sık kullanılanlara eklediğiniz dosya ve klasörler burada görüntülenir</string> - <string name="file_list_empty_favorites_filter">Arama sonucunda sık kullanılan bir dosya bulunamadı!</string> + <string name="file_list_empty_favorites_filter">Arama sonucunda sık kullanılan bir dosya bulunamadı.</string> <string name="file_list_loading">Yükleniyor…</string> - <string name="file_list_no_app_for_file_type">Bu dosya türü için uygulama bulunamadı!</string> + <string name="file_list_no_app_for_file_type">Bu dosya türü için uygulama bulunamadı.</string> <string name="local_file_list_empty">Bu klasörde herhangi bir dosya yok.</string> <string name="file_list_empty_headline_search">Bu klasörde herhangi bir sonuç yok</string> <string name="file_list_empty_headline_server_search">Herhangi bir sonuç bulunamadı</string> + <string name="file_list_empty_favorite_headline">Henüz sık kullanılan bir öge yok</string> <string name="file_list_empty_shared_headline">Henüz hiçbir şey paylaşılmamış</string> <string name="file_list_empty_shared">Paylaştığınız dosya ve klasörler burada görüntülenir</string> <string name="file_list_empty_headline_server_search_videos">Herhangi bir görüntü bulunamadı</string> <string name="file_list_empty_headline_server_search_photos">Herhangi bir fotoğraf bulunamadı</string> <string name="file_list_empty_search">Başka bir klasöre bakılmasını ister misiniz?</string> <string name="file_list_empty_recently_modified">Son 7 gün içinde değiştirilmiş herhangi bir dosya bulunamadı</string> - <string name="file_list_empty_recently_modified_filter">Son 7 gün içinde değiştirilmiş herhangi bir dosya bulunamadı!</string> + <string name="file_list_empty_recently_modified_filter">Arama sonucunda son 7 gün içinde düzenlenmiş + bir dosya bulunamadı.</string> <string name="file_list_empty_recently_added">Geçenlerde eklenmiş herhangi bir dosya bulunamadı</string> - <string name="file_list_empty_recently_added_filter">Arama sonucunda geçenlerde eklenmiş bir dosya bulunamadı!</string> - <string name="file_list_empty_text_photos">Bazı fotoğraflar yükleyin ya da otomatik yüklemeyi etkinleştirin!</string> - <string name="file_list_empty_text_photos_filter">Arama sonucunda herhangi bir fotoğraf bulunamadı!</string> - <string name="file_list_empty_text_videos">Bazı görüntüler yükleyin ya da otomatik yüklemeyi etkinleştirin!</string> - <string name="file_list_empty_text_videos_filter">Arama sonucunda herhangi bir görüntü bulunamadı!</string> + <string name="file_list_empty_recently_added_filter">Arama sonucunda geçenlerde eklenmiş bir dosya bulunamadı.</string> + <string name="file_list_empty_text_photos">Bazı fotoğraflar yükleyin ya da otomatik yüklemeyi etkinleştirin.</string> + <string name="file_list_empty_text_photos_filter">Arama sonucunda herhangi bir fotoğraf bulunamadı.</string> + <string name="file_list_empty_text_videos">Bazı görüntüler yükleyin ya da otomatik yüklemeyi etkinleştirin.</string> + <string name="file_list_empty_text_videos_filter">Arama sonucunda herhangi bir görüntü bulunamadı.</string> <string name="upload_list_empty_headline">Herhangi bir yükleme yok</string> - <string name="upload_list_empty_text">Buraya bazı içerikler yükleyin ya da anında yüklemeyi etkinleştirin!</string> - <string name="upload_list_empty_text_auto_upload">Bazı içerikler yükleyin ya da otomatik yüklemeyi etkinleştirin!</string> + <string name="upload_list_empty_text">Bazı içerikler yükleyin ya da anında yüklemeyi etkinleştirin.</string> + <string name="upload_list_empty_text_auto_upload">Bazı içerikler yükleyin ya da otomatik yüklemeyi etkinleştirin.</string> <string name="file_list_folder">klasör</string> <string name="file_list_folders">klasör</string> <string name="file_list_file">dosya</string> @@ -202,7 +204,7 @@ <string name="sync_fail_in_favourites_content">%1$d dosya eşitlenemedi (%2$d çakışma)</string> <string name="sync_foreign_files_forgotten_ticker">Bazı yerel dosyalar unutulmuş</string> <string name="sync_foreign_files_forgotten_content">%2$s klasöründeki %1$d dosya şuraya kopyalanamadı</string> - <string name="sync_foreign_files_forgotten_explanation">1.3.16 sürümünden sonra, veri kaybının önlenebilmesi için bu aygıttan yüklenen dosyalar, bir dosya birden fazla hesapla eşitlendiğinde %1$s yerel klasörüne kopyalanır.\n\nBu değişiklikten dolayı, bu uygulamanın yüklenmiş tüm önceki sürümündeki dosyalar %2$s klasörüne kopyalandı. Ancak hesap eşitlemesi sırasında bu işlemin tamamlanmasını engelleyen bir hata oluştu. Dosyaları olduğu gibi bırakabilir ve %3$s bağlantısını kaldırabilir ya da dosyaları %1$s klasörüne taşıyıp %4$s bağlantısını koruyabilirsiniz.\n\nYerel dosyaları ve bağlı oldukları %5$s içindeki uzak dosyaların listesini aşağıda görebilirsiniz.</string> + <string name="sync_foreign_files_forgotten_explanation">1.3.16 sürümünden sonra, veri kaybının önlenebilmesi için bu aygıttan yüklenen dosyalar, bir dosya birden fazla hesapla eşitlendiğinde %1$s yerel klasörüne kopyalanır.\n\nBu değişiklikten dolayı, bu uygulamanın yüklenmiş tüm önceki sürümündeki dosyalar %2$s klasörüne kopyalandı. Ancak hesap eşitlemesi sırasında bu işlemin tamamlanmasını engelleyen bir sorun çıktı. Dosyaları olduğu gibi bırakabilir ve %3$s bağlantısını kaldırabilir ya da dosyaları %1$s klasörüne taşıyıp %4$s bağlantısını koruyabilirsiniz.\n\nYerel dosyaları ve bağlı oldukları %5$s içindeki uzak dosyaların listesini aşağıda görebilirsiniz.</string> <string name="sync_current_folder_was_removed">%1$s klasörü artık yok</string> <string name="foreign_files_move">Tümünü taşı</string> <string name="foreign_files_success">Tüm dosyalar taşındı</string> @@ -251,8 +253,8 @@ <string name="auth_account_not_new">Aygıt üzerinde aynı kullanıcı adı ve sunucu için bir hesap zaten var</string> <string name="auth_account_not_the_same">Yazdığınız kullanıcı adı bu hesabın kullanıcı adı ile eşleşmiyor</string> <string name="auth_unknown_error_title">Bilinmeyen bir sorun çıktı!</string> - <string name="auth_unknown_host_title">Sunucu bulunamadı</string> - <string name="auth_incorrect_path_title">Sunucu kopyası bulunamadı</string> + <string name="auth_unknown_host_title">Sunucu adı bulunamadı</string> + <string name="auth_incorrect_path_title">Sunucu bulunamadı</string> <string name="auth_timeout_title">Sunucu çok geç yanıt veriyor</string> <string name="auth_incorrect_address_title">Sunucu adresi biçimi hatalı</string> <string name="auth_ssl_general_error_title">SSL başlatılamadı</string> @@ -287,22 +289,22 @@ <string name="remove_fail_msg">Silinemedi</string> <string name="rename_dialog_title">Yeni bir ad yazın</string> <string name="rename_local_fail_msg">Yerel kopya yeniden adlandırılamadı; farklı bir ad deneyin</string> - <string name="rename_server_fail_msg">Yeniden adlandırma tamamlanamadı</string> + <string name="rename_server_fail_msg">Sunucu yeniden adlandırılamadı</string> <string name="sync_file_fail_msg">Uzak dosya denetlenemedi</string> <string name="sync_file_nothing_to_do_msg">Dosya içerikleri zaten eşitlenmiş</string> <string name="create_dir_fail_msg">Klasör oluşturulamadı</string> <string name="filename_forbidden_characters">İzin verilmeyen karakterler: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Dosya adında en az bir geçersiz karakter var</string> <string name="filename_empty">Dosya adı boş olamaz</string> - <string name="wait_a_moment">Biraz bekleyin</string> + <string name="wait_a_moment">Biraz bekleyin...</string> <string name="wait_checking_credentials">Kayıtlı kimlik bilgileri denetleniyor</string> - <string name="filedisplay_unexpected_bad_get_content">Beklenmedik bir sorun çıktı; Lütfen başka bir uygulamadan dosya seçin</string> - <string name="filedisplay_no_file_selected">Herhangi bir dosya seçilmedi</string> + <string name="filedisplay_unexpected_bad_get_content">Beklenmedik bir sorun çıktı, lütfen başka bir uygulamadan dosya seçin</string> + <string name="filedisplay_no_file_selected">Herhangi bir dosya seçilmemiş</string> <string name="activity_chooser_title">Bağlantıyı gönder…</string> <string name="wait_for_tmp_copy_from_private_storage">Dosya kişisel depolamadan kopyalanıyor</string> <string name="oauth_check_onoff">oAuth2 ile oturum açın</string> - <string name="oauth_login_connection">oAuth2 sunucusuna bağlanılıyor…</string> + <string name="oauth_login_connection">OAuth2 sunucusuna bağlanılıyor…</string> <string name="ssl_validator_header">Sitenin kimliği doğrulanamadı</string> <string name="ssl_validator_reason_cert_not_trusted">- Sunucu sertifikasına güvenilmiyor</string> @@ -339,7 +341,7 @@ <string name="placeholder_timestamp">2012/05/18 12:23 ÖS</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Yalnız kablosuz ağ bağlıyken yüklensin</string> + <string name="auto_upload_on_wifi">Yalnız kablosuz ağ üzerinden yüklensin</string> <string name="instant_upload_on_wifi">Fotoğraflar yalnız kablosuz ağ üzerinden yüklensin</string> <string name="instant_video_upload_on_wifi">Görüntüler yalnız kablosuz ağ üzerinden yüklensin</string> <string name="instant_video_upload_on_charging">Yalnız şarj edilirken yüklensin</string> @@ -351,7 +353,7 @@ <string name="conflict_use_local_version">yerel sürümü</string> <string name="conflict_use_server_version">sunucu sürümünü</string> - <string name="preview_sorry">Bundan dolayı üzgünüz!</string> + <string name="preview_sorry">Maalesef.</string> <string name="preview_image_description">Görsel önizleme</string> <string name="preview_image_error_unknown_format">Görsel görüntülenemedi</string> @@ -362,7 +364,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Alt klasörler kullanılsın</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Yıla ve aya göre alt klasörlere kaydedilsin</string> - <string name="share_link_no_support_share_api">Maalesef, sunucunuzda paylaşım etkin değil. Lütfen yöneticinizle görüşün.</string> + <string name="share_link_no_support_share_api">Sunucunuzda paylaşım etkin değil. Lütfen yöneticinizle görüşün.</string> <string name="share_link_file_no_exist">Paylaşılamadı. Lütfen dosyanın var olup olmadığını denetleyin</string> <string name="share_link_file_error">Bu dosya ya da klasör paylaşılmaya çalışılırken bir sorun çıktı</string> <string name="unshare_link_file_no_exist">Paylaşımı kaldırılamadı. Lütfen dosyanın var olup olmadığını denetleyin</string> @@ -380,28 +382,29 @@ <string name="clipboard_uxexpected_error">Panoya kopyalama sırasında beklenmeyen bir sorun çıktı</string> <string name="clipboard_label">Metin %1$s kaynağından kopyalandı</string> - <string name="error_cant_bind_to_operations_service">Ciddi hata: İşlemler gerçekleştirilemiyor</string> + <string name="error_cant_bind_to_operations_service">Ciddi sorun: İşlemler gerçekleştirilemiyor</string> <string name="network_error_socket_exception">Sunucuya bağlanılırken bir sorun çıktı.</string> - <string name="network_error_socket_timeout_exception">Sunucu beklenirken bir sorun çıktı, işlem tamamlanamadı</string> - <string name="network_error_connect_timeout_exception">Sunucu beklenirken bir sorun çıktı; işlem tamamlanamadı</string> - <string name="network_host_not_available">İşlem tamamlanamadı; sunucu kullanılamıyor</string> + <string name="network_error_socket_timeout_exception">Sunucu beklenirken bir sorun çıktı, işlem tamamlanamadı.</string> + <string name="network_error_connect_timeout_exception">Sunucu beklenirken bir sorun çıktı, işlem tamamlanamadı.</string> + <string name="network_host_not_available">İşlem tamamlanamadı, sunucu kullanılamıyor</string> + <string name="forbidden_permissions">%s izniniz yok</string> <string name="forbidden_permissions_rename">bu dosyayı yeniden adlandırın</string> <string name="forbidden_permissions_delete">bu dosyayı silin</string> <string name="share_link_forbidden_permissions">bu dosyayı paylaşın</string> <string name="unshare_link_forbidden_permissions">bu dosyanın paylaşımını kaldırın</string> <string name="update_link_forbidden_permissions">bu paylaşımı güncelleyin</string> - <string name="forbidden_permissions_create">dosya oluşturun</string> - <string name="uploader_upload_forbidden_permissions">bu klasöre yükleyin</string> + <string name="forbidden_permissions_create">bu dosyayı oluşturamazsınız</string> + <string name="uploader_upload_forbidden_permissions">bu klasöre yükleyemezsiniz</string> <string name="downloader_download_file_not_found">Bu dosya artık sunucuda yok</string> <string name="file_migration_dialog_title">Depolama yolu güncelleniyor</string> <string name="file_migration_finish_button">Bitti</string> - <string name="file_migration_preparing">Aktarıma hazırlanıyor…</string> + <string name="file_migration_preparing">Aktarıma hazırlanılıyor…</string> <string name="file_migration_checking_destination">Hedef denetleniyor…</string> <string name="file_migration_saving_accounts_configuration">Hesap ayarları kaydediliyor…</string> - <string name="file_migration_waiting_for_unfinished_sync">Eşitlemelerin tamamlanması bekleniyor…</string> + <string name="file_migration_waiting_for_unfinished_sync">Tüm eşitlemelerin tamamlanması bekleniyor…</string> <string name="file_migration_migrating">Veriler taşınıyor…</string> <string name="file_migration_updating_index">Dizin güncelleniyor…</string> <string name="file_migration_cleaning">Temizleniyor…</string> @@ -411,12 +414,12 @@ <string name="file_migration_failed_not_writable">HATA: Dosya yazılabilir değil</string> <string name="file_migration_failed_not_readable">HATA: Dosya okunabilir değil</string> <string name="file_migration_failed_dir_already_exists">HATA: Nextcloud klasörü zaten var</string> - <string name="file_migration_failed_while_coping">HATA: Aktarımda bir sorun çıktı</string> - <string name="file_migration_failed_while_updating_index">HATA: Dizin güncellenirken bir sorun çıktı</string> + <string name="file_migration_failed_while_coping">HATA: Aktarımda sorun çıktı</string> + <string name="file_migration_failed_while_updating_index">HATA: Dizin güncellenirken sorun çıktı</string> - <string name="file_migration_directory_already_exists">Veri klasörü zaten var, ne yapmak istersiniz?</string> - <string name="file_migration_override_data_folder">Üzerine yazılsın</string> - <string name="file_migration_use_data_folder">Varolan kullanılsın</string> + <string name="file_migration_directory_already_exists">Veri klasörü zaten var, yapılacak işlemi seçin:</string> + <string name="file_migration_override_data_folder">Değiştirilsin</string> + <string name="file_migration_use_data_folder">Kullanılsın</string> <string name="prefs_category_accounts">Hesaplar</string> <string name="prefs_add_account">Hesap ekle</string> @@ -436,15 +439,15 @@ <string name="file_list_empty_moving">Burada bir şey yok. Bir klasör ekleyebilirsiniz!</string> <string name="folder_picker_choose_button_text">Seçin</string> - <string name="move_file_not_found">Taşınamadı. Lütfen dosyanın var olup olmadığını denetleyin</string> - <string name="move_file_invalid_into_descendent">Bir klasör kendi alt klasörüne taşınamaz</string> + <string name="move_file_not_found">Dosya taşınamadı. Lütfen dosyanın var olup olmadığını denetleyin</string> + <string name="move_file_invalid_into_descendent">Bir klasör kendi alt klasörü olarak taşınamaz</string> <string name="move_file_invalid_overwrite">Dosya hedef klasörde zaten var</string> <string name="move_file_error">Bu dosya ya da klasör taşınmaya çalışılırken bir sorun çıktı</string> <string name="forbidden_permissions_move">bu dosyayı taşıyın</string> <string name="copy_file_not_found">Kopyalanamadı. Lütfen dosyanın var olup olmadığını denetleyin</string> - <string name="copy_file_invalid_into_descendent">Bir klasör kendi alt klasörüne kopyalanamaz</string> + <string name="copy_file_invalid_into_descendent">Bir klasör kendi alt klasörü olarak kopyalanamaz</string> <string name="copy_file_invalid_overwrite">Dosya hedef klasörde zaten var</string> <string name="copy_file_error">Bu dosya ya da klasör kopyalanmaya çalışılırken bir sorun çıktı</string> <string name="forbidden_permissions_copy">bu dosyayı kopyalayın</string> @@ -452,7 +455,7 @@ <string name="prefs_category_instant_uploading">Anında yüklemeler</string> <string name="prefs_category_details">Ayrıntılar</string> - <string name="prefs_instant_video_upload_path_title">Anında yükleme görüntü klasörü</string> + <string name="prefs_instant_video_upload_path_title">Anında görüntü yükleme klasörü</string> <string name="sync_folder_failed_content">%1$s klasörünün eşitlemesi tamamlanamadı</string> <string name="shared_subject_header">sizinle</string> @@ -494,7 +497,7 @@ <string name="share_add_user_or_group">Kullanıcı ya da grup ekle</string> <string name="share_via_link_section_title">Paylaşım bağlantısı</string> <string name="share_via_link_expiration_date_label">Son kullanma tarihini ayarla</string> - <string name="share_via_link_password_label">Parola koruması</string> + <string name="share_via_link_password_label">Parola ile korunsun</string> <string name="share_via_link_password_title">Güvenli</string> <string name="share_via_link_edit_permission_label">Düzenlenebilsin</string> <string name="share_via_link_hide_file_listing_permission_label">Dosya listeleme gizlensin</string> @@ -510,7 +513,7 @@ <string name="share_email_clarification">%1$s (E-posta)</string> <string name="share_known_remote_clarification">%1$s (%2$s üzerinde)</string> - <string name="share_sharee_unavailable">Maalesef sunucu sürümünüz istemciler içindeki kullanıcılar ile paylaşıma izin vermiyor.\nLütfen yöneticinizle görüşün</string> + <string name="share_sharee_unavailable">Kullanıcıların istemcileri içinden paylaşım yapabilmesini sağlamak için sunucu sürümünüzü yükseltin.\nLütfen yöneticinizle görüşün</string> <string name="share_privilege_can_share">paylaşabilir</string> <string name="share_privilege_can_edit">düzenleyebilir</string> <string name="share_privilege_can_edit_create">oluştur</string> @@ -519,16 +522,16 @@ <string name="edit_share_unshare">Paylaşımı durdur</string> <string name="edit_share_done">bitti</string> - <string name="action_retry_uploads">Yeniden denenemedi</string> + <string name="action_retry_uploads">Yeni girişim başarısız oldu</string> <string name="action_clear_failed_uploads">Temizlenemedi</string> <string name="action_clear_successful_uploads">Temizlendi</string> - <string name="action_clear_finished_uploads">Tümü temizlendi</string> + <string name="action_clear_finished_uploads">Tamamlanmış yüklemeleri temizle</string> <string name="action_switch_grid_view">Tablo görünümü</string> <string name="action_switch_list_view">Liste görünümü</string> <string name="manage_space_title">Alan yönetimi</string> - <string name="manage_space_description">%1$s verilerinden ayarlar, veritabanı ve sunucu sertifikaları kalıcı olarak silinecek. \n\nİndirilen dosyalara dokunulmayacak.\n\nBu işlem biraz vakit alabilir.</string> + <string name="manage_space_description">%1$s verilerinden ayarlar, veritabanı ve sunucu sertifikaları kalıcı olarak silinecek. \n\nİndirilen dosyalara dokunulmayacak.\n\nBu işlem biraz zaman alabilir.</string> <string name="manage_space_clear_data">Verileri temizle</string> <string name="manage_space_error">Bazı dosyalar silinemedi.</string> @@ -545,16 +548,16 @@ <string name="participate_testing_headline">Denememize yardımcı olun</string> <string name="participate_testing_bug_text">Bir hata mı buldunuz? Bir gariplik mi var?</string> <string name="participate_testing_report_text">Github üzerinden bir sorun bildirin</string> - <string name="participate_testing_version_text">Gelecek sürümler için bize yardımcı olmak ister misiniz?</string> + <string name="participate_testing_version_text">Sonraki sürümü deneyerek bize yardımcı olmak ister misiniz?</string> <string name="participate_beta_headline">Geliştirici sürümünü deneyin</string> <string name="participate_beta_text">Bu sürümde tüm yeni özellikler bulunur ve çok taze olduğundan hata ve sorunlar olabilir. Bir hata ya da soruna rastlarsanız bize iletin.</string> <string name="participate_release_candidate_headline">Yayın adayı</string> - <string name="participate_release_candidate_text">Yayın adayı (Release Candidate, RC) yayınlanacak sürümün bir kopyasıdır ve kararlı olması beklenir. Kişisel olarak kullanmanız kararlı olduğundan emin olmamızı sağlar. Denemek için Play Store üzerinden kayıt olun ya da el ile F-Droid üzerindeki \"sürümlere\" bakın.</string> + <string name="participate_release_candidate_text">Yayın adayı (Release Candidate, RC) yayınlanacak sürümün bir kopyasıdır ve kararlı olması beklenir. Kişisel olarak kullanmanız kararlı olduğundan emin olmamızı sağlar. Denemek için Play Store üzerinden kayıt olun ya da el ile F-Droid üzerindeki \"sürümler\" bölümüne bakın.</string> <string name="participate_contribute_headline">Etkin Katkıda Bulunun</string> <string name="participate_contribute_irc_text">IRC sohbetine katılın: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text"><a href=\"%1$s\">forum</a> üzerinde diğer kişilere yardımcı olun</string> <string name="participate_contribute_translate_text">Uygulamayı <a href="%1$s">çevirin</a> </string> - <string name="participate_contribute_github_text">Yazılımcı olarak katkıda bulunun! Ayrıntılı bilgi almak için <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">KATKIDA BULUNMA</a> sayfasına bakın</string> + <string name="participate_contribute_github_text">Yazılımcı olarak katkıda bulunun! Ayrıntılı bilgi almak için <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">KATKIDA BULUNMA.md</a> sayfasına bakın</string> <string name="move_to">Taşı…</string> <string name="copy_to">Kopyala…</string> <string name="choose_remote_folder">Klasör seçin…</string> @@ -562,7 +565,7 @@ <string name="folder_sync_no_results">Herhangi bir ortam klasörü bulunamadı.</string> <string name="folder_sync_preferences">Otomatik yükleme ayarları</string> <string name="folder_sync_settings">Ayarlar</string> - <string name="folder_sync_new_info">Anında yükleme tamamen elden geçirildi. Lütfen ama menüye giderek otomatik yükleme ayarlarınızı yeniden yapın. Verdiğimiz rahatsızlık için özür dileriz.\n\nYeni ve geliştirilmiş otomatik yükleme özellklerinin tadını çıkarın!</string> + <string name="folder_sync_new_info">Anında yükleme tamamen elden geçirildi. Lütfen ama menüye giderek otomatik yükleme ayarlarınızı yeniden yapın.\n\nYeni ve geliştirilmiş otomatik yükleme özellklerinin tadını çıkarın.</string> <string name="folder_sync_preferences_folder_path">%1$s için</string> <plurals name="items_selected_count"> <item quantity="one">%d seçili</item> @@ -592,7 +595,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Verileriniz için güvenli bir yer!</string> - <string name="welcome_feature_1_text">Ev ya da iş yerinizdeki dosyalarınıza erişmek, paylaşmak ve korumak için kullanabilirsiniz</string> + <string name="welcome_feature_1_text">Ev ya da iş yerinizdeki dosyalarınıza erişin, paylaşın ve koruyun</string> <string name="welcome_feature_2_title">Birden çok hesap</string> <string name="welcome_feature_2_text">Tüm bulut hesaplarınıza bağlanın</string> @@ -622,26 +625,29 @@ <string name="prefs_category_about">Hakkında</string> <string name="actionbar_contacts">Kişileri Yedekle</string> - <string name="contacts_backup_button">Şimdi yedekle</string> + <string name="actionbar_contacts_restore">Kişileri Geri Yükle</string> + <string name="contacts_backup_button">Yedekle</string> <string name="contacts_restore_button">Son Yedeği Geri Yükle</string> <string name="contacts_header_restore">Geri Yükle</string> <string name="contacts_header_backup">Yedekle</string> <string name="contacts_automatic_backup">Kişileri Yedekle</string> <string name="contacts_last_backup">Son Yedek</string> - <string name="contacts_read_permission">Kişileri okuma izni gerekiyor</string> - <string name="contacts_write_permission">Kişilere yazma izni gerekiyor</string> + <string name="contacts_read_permission">Kişi listesini okuma izni gerekiyor</string> + <string name="contacts_write_permission">Kişi listesini düzenleme izni gerekiyor</string> <string name="contactlist_title">Kişileri geri yükle</string> <string name="contaclist_restore_selected">Seçilmiş kişileri geri yükle</string> <string name="contactlist_account_chooser_title">Alınacak hesabı seçin</string> - <string name="contactlist_no_permission">İzin verilmemiş olduğundan hiçbir şey alınamadı!</string> + <string name="contactlist_no_permission">Herhangi bir izin verilmemiş olduğundan hiçbir şey alınamadı!</string> <string name="contacts_preference_choose_date">Tarih seçin</string> <string name="contacts_preference_backup_never">asla</string> <string name="contacts_preferences_no_file_found">Herhangi bir dosya bulunamadı</string> + <string name="contacts_preferences_something_strange_happened">Son yedeğiniz bulunamadı!</string> <string name="contacts_preferences_backup_scheduled">Yedekleme zamanlandı ve kısa süre sonra başlatılacak</string> <string name="contacts_preferences_import_scheduled">Alma işlemi zamanlandı ve kısa süre sonra başlatılacak</string> <!-- Notifications --> <string name="new_notification_received">Yeni bir bildirim var</string> + <string name="drawer_logout">Oturumu Kapat</string> </resources> From c9a53cb0422426e90b3ecd43445a1add0ff0661f Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Tue, 2 May 2017 06:46:46 +0000 Subject: [PATCH 834/881] [tx-robot] updated from transifex --- src/main/res/values-cs-rCZ/strings.xml | 2 +- src/main/res/values-es/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/res/values-cs-rCZ/strings.xml b/src/main/res/values-cs-rCZ/strings.xml index 0f2a756694..f6d06fb9dd 100644 --- a/src/main/res/values-cs-rCZ/strings.xml +++ b/src/main/res/values-cs-rCZ/strings.xml @@ -513,7 +513,7 @@ <string name="manage_space_clear_data">Vyčistit data</string> <string name="manage_space_error">Některé soubory nebylo možno smazat.</string> - <string name="permission_storage_access">Vyžadována dodatečná oprávnění pro nahrávání & stahování souborů.</string> + <string name="permission_storage_access">Vyžadována dodatečná oprávnění pro nahrávání & stahování souborů.</string> <string name="local_file_not_found_toast">Soubor nebyl nalezen v místním souborovém systému</string> <string name="confirmation_remove_files_alert">Opravdu chcete odstranit vybrané položky?</string> <string name="confirmation_remove_folders_alert">Opravdu chcete odstranit vybrané položky a jejich obsah?</string> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 67d4c3b87b..5175f47e0b 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -401,7 +401,7 @@ <string name="file_migration_dialog_title">Actualizando ruta de almacenamiento</string> <string name="file_migration_finish_button">Terminar</string> - <string name="file_migration_preparing">Preparando la migración&@8230;</string> + <string name="file_migration_preparing">Preparando la migración…</string> <string name="file_migration_checking_destination">Comprobando destino…</string> <string name="file_migration_saving_accounts_configuration">Guardando configuración de cuentas…</string> <string name="file_migration_waiting_for_unfinished_sync">Esperando que todas las sincronizaciones terminen…</string> From 9f7ccae575b155026fe466aa4c9c3ef568f2d62c Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 2 May 2017 09:41:04 +0200 Subject: [PATCH 835/881] do the same for Notification --- .../android/ui/activity/NotificationsActivity.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index e46d52bcb5..b09d41b185 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -52,8 +52,8 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.GetRemoteNotificationsOperation; import com.owncloud.android.lib.resources.notifications.models.Notification; import com.owncloud.android.ui.adapter.NotificationListAdapter; -import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.AnalyticsUtils; +import com.owncloud.android.utils.DisplayUtils; import java.io.IOException; import java.util.List; @@ -74,10 +74,8 @@ public class NotificationsActivity extends FileActivity { @BindView(R.id.empty_list_view) public LinearLayout emptyContentContainer; - @BindView(R.id.swipe_containing_list) public SwipeRefreshLayout swipeListRefreshLayout; - @BindView(R.id.swipe_containing_empty) public SwipeRefreshLayout swipeEmptyListRefreshLayout; @BindView(R.id.empty_list_view_text) @@ -116,6 +114,9 @@ public class NotificationsActivity extends FileActivity { // setup toolbar setupToolbar(); + swipeEmptyListRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_containing_empty); + swipeListRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_containing_list); + // setup drawer setupDrawer(R.id.nav_notifications); getSupportActionBar().setTitle(getString(R.string.drawer_item_notifications)); @@ -296,7 +297,7 @@ public class NotificationsActivity extends FileActivity { } @Override - public void onResume(){ + public void onResume() { super.onResume(); AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG); } From 19c031f7227d282187bba89e02e66f87d90d73dd Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 2 May 2017 12:18:06 +0200 Subject: [PATCH 836/881] do not create a new adapter while rotating --- .../owncloud/android/ui/fragment/OCFileListFragment.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index f5bee75bfa..0b92ae6988 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -654,13 +654,6 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi super.onViewStateRestored(savedInstanceState); if (savedInstanceState != null) { - mAdapter = new FileListListAdapter( - mJustFolders, - getActivity(), - mContainerActivity, - this, - mContainerActivity.getStorageManager()); - searchEvent = Parcels.unwrap(savedInstanceState.getParcelable(SEARCH_EVENT)); } From 7f1739f5f763d67721bac9a4e0f70c8e7f4fdde9 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Fri, 28 Apr 2017 22:21:40 +0200 Subject: [PATCH 837/881] Improve push / remove push registration --- build.gradle | 4 +- .../firebase/NCFirebaseInstanceIDService.java | 2 - .../activity/ModifiedFileDisplayActivity.java | 10 ++ .../com/owncloud/android/utils/PushUtils.java | 135 ++++++++++++++---- .../datamodel/ArbitraryDataProvider.java | 14 +- .../android/datamodel/PushArbitraryData.java | 81 +++++++++++ .../android/db/PreferenceManager.java | 26 +--- .../android/ui/activity/FileActivity.java | 12 -- .../android/ui/activity/UserInfoActivity.java | 20 +++ 9 files changed, 237 insertions(+), 67 deletions(-) create mode 100644 src/main/java/com/owncloud/android/datamodel/PushArbitraryData.java diff --git a/build.gradle b/build.gradle index 3490f070fb..cf7b8dd07a 100644 --- a/build.gradle +++ b/build.gradle @@ -197,8 +197,8 @@ dependencies { compile 'org.greenrobot:eventbus:3.0.0' compile 'com.googlecode.ez-vcard:ez-vcard:0.10.2' -// uncomment for gplay, modified -// compile 'com.google.android.gms:play-services:10.2.1' + // uncomment for gplay, modified + //compile 'com.google.android.gms:play-services:10.2.4' compile 'org.parceler:parceler-api:1.1.6' annotationProcessor 'org.parceler:parceler:1.1.6' diff --git a/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index a5ab4d409a..c5f39a5070 100644 --- a/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -36,8 +36,6 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { //You can implement this method to store the token on your server if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { PreferenceManager.setPushToken(MainApp.getAppContext(), FirebaseInstanceId.getInstance().getToken()); - PreferenceManager.setPushTokenUpdateTime(MainApp.getAppContext(), System.currentTimeMillis()); - PushUtils.pushRegistrationToServer(); } } diff --git a/src/gplay/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java b/src/gplay/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java index a2d17ca8ab..71ecfaf958 100644 --- a/src/gplay/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java +++ b/src/gplay/java/com/owncloud/android/ui/activity/ModifiedFileDisplayActivity.java @@ -20,9 +20,12 @@ package com.owncloud.android.ui.activity; +import android.os.Bundle; + import com.owncloud.android.ui.events.TokenPushEvent; import com.owncloud.android.utils.PushUtils; +import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -33,4 +36,11 @@ public class ModifiedFileDisplayActivity extends FileDisplayActivity { PushUtils.pushRegistrationToServer(); } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // see if there's stuff to push every time we start the app + EventBus.getDefault().post(new TokenPushEvent()); + } + } diff --git a/src/gplay/java/com/owncloud/android/utils/PushUtils.java b/src/gplay/java/com/owncloud/android/utils/PushUtils.java index dd689c1d2a..7336c55ec8 100644 --- a/src/gplay/java/com/owncloud/android/utils/PushUtils.java +++ b/src/gplay/java/com/owncloud/android/utils/PushUtils.java @@ -27,9 +27,12 @@ import android.content.Context; import android.text.TextUtils; import android.util.Base64; +import com.google.gson.Gson; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.ArbitraryDataProvider; +import com.owncloud.android.datamodel.PushArbitraryData; import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClient; @@ -39,8 +42,12 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; +import com.owncloud.android.lib.resources.notifications.UnregisterAccountDeviceForNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.UnregisterAccountDeviceForProxyOperation; import com.owncloud.android.lib.resources.notifications.models.PushResponse; +import org.apache.commons.httpclient.HttpStatus; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -65,7 +72,11 @@ public class PushUtils { private static final String KEYPAIR_PRIV_EXTENSION = ".priv"; private static final String KEYPAIR_PUB_EXTENSION = ".pub"; - public static String generateSHA512Hash(String pushToken) { + public static final String KEY_PUSH = "push"; + + private static ArbitraryDataProvider arbitraryDataProvider; + + private static String generateSHA512Hash(String pushToken) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("SHA-512"); @@ -86,7 +97,7 @@ public class PushUtils { return result.toString(); } - public static int generateRsa2048KeyPair() { + private static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER; @@ -124,8 +135,58 @@ public class PushUtils { return -2; } + private static void deleteRegistrationForAccount(Account account) { + Context context = MainApp.getAppContext(); + OwnCloudAccount ocAccount = null; + arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext().getContentResolver()); + + try { + ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); + + RemoteOperation unregisterAccountDeviceForNotificationsOperation = new + UnregisterAccountDeviceForNotificationsOperation(); + + RemoteOperationResult remoteOperationResult = unregisterAccountDeviceForNotificationsOperation. + execute(mClient); + + if (remoteOperationResult.getHttpCode() == HttpStatus.SC_ACCEPTED) { + String arbitraryValue; + if (!TextUtils.isEmpty(arbitraryValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { + Gson gson = new Gson(); + PushArbitraryData pushArbitraryData = gson.fromJson(arbitraryValue, PushArbitraryData.class); + RemoteOperation unregisterAccountDeviceForProxyOperation = + new UnregisterAccountDeviceForProxyOperation(context.getResources(). + getString(R.string.push_server_url), + pushArbitraryData.getDeviceIdentifier(), + pushArbitraryData.getDeviceIdentifierSignature(), + pushArbitraryData.getUserPublicKey()); + + remoteOperationResult = unregisterAccountDeviceForProxyOperation.execute(mClient); + + if (remoteOperationResult.isSuccess()) { + arbitraryDataProvider.deleteKeyForAccount(account, KEY_PUSH); + } + } + } + + + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + } + public static void pushRegistrationToServer() { String token = PreferenceManager.getPushToken(MainApp.getAppContext()); + arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext().getContentResolver()); + if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && !TextUtils.isEmpty(token)) { PushUtils.generateRsa2048KeyPair(); @@ -139,42 +200,56 @@ public class PushUtils { publicKey = "-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-----END PUBLIC KEY-----\n"; Context context = MainApp.getAppContext(); + String providerValue; + Gson gson = new Gson(); for (Account account : AccountUtils.getAccounts(context)) { - try { - OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); - OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). - getClientFor(ocAccount, context); + if (!TextUtils.isEmpty(providerValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { + PushArbitraryData accountPushData = gson.fromJson(providerValue, PushArbitraryData.class); + if (!accountPushData.getPushToken().equals(token) && !accountPushData.isShouldBeDeleted()) { + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); - RemoteOperation registerAccountDeviceForNotificationsOperation = - new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, - publicKey, - context.getResources().getString(R.string.push_server_url)); + RemoteOperation registerAccountDeviceForNotificationsOperation = + new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, + publicKey, + context.getResources().getString(R.string.push_server_url)); - RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. - execute(mClient); + RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. + execute(mClient); - if (remoteOperationResult.isSuccess()) { - PushResponse pushResponse = remoteOperationResult.getPushResponseData(); + if (remoteOperationResult.isSuccess()) { + PushResponse pushResponse = remoteOperationResult.getPushResponseData(); - RemoteOperation registerAccountDeviceForProxyOperation = new - RegisterAccountDeviceForProxyOperation( - context.getResources().getString(R.string.push_server_url), - token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), - pushResponse.getPublicKey()); + RemoteOperation registerAccountDeviceForProxyOperation = new + RegisterAccountDeviceForProxyOperation( + context.getResources().getString(R.string.push_server_url), + token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey()); - remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); - PreferenceManager.setPushTokenLastSentTime(MainApp.getAppContext(), - System.currentTimeMillis()); + remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); + if (remoteOperationResult.isSuccess()) { + PushArbitraryData pushArbitraryData = new PushArbitraryData(token, + pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey(), false); + arbitraryDataProvider.storeOrUpdateKeyValue(account, KEY_PUSH, + gson.toJson(pushArbitraryData)); + } + } + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + } else if (accountPushData.isShouldBeDeleted()) { + deleteRegistrationForAccount(account); } - } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { - Log_OC.d(TAG, "Failed to find an account"); - } catch (AuthenticatorException e) { - Log_OC.d(TAG, "Failed via AuthenticatorException"); - } catch (IOException e) { - Log_OC.d(TAG, "Failed via IOException"); - } catch (OperationCanceledException e) { - Log_OC.d(TAG, "Failed via OperationCanceledException"); } } } diff --git a/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java index 9ea88704dc..7f12e445da 100644 --- a/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java +++ b/src/main/java/com/owncloud/android/datamodel/ArbitraryDataProvider.java @@ -47,9 +47,19 @@ public class ArbitraryDataProvider { this.contentResolver = contentResolver; } + public int deleteKeyForAccount(Account account, String key) { + int result = contentResolver.delete( + ProviderMeta.ProviderTableMeta.CONTENT_URI_ARBITRARY_DATA, + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_CLOUD_ID + " = ? AND " + + ProviderMeta.ProviderTableMeta.ARBITRARY_DATA_KEY + "= ?", + new String[]{account.name, key} + ); + + return result; + } + + public void storeOrUpdateKeyValue(Account account, String key, String newValue) { - - ArbitraryDataSet data = getArbitraryDataSet(account, key); if (data == null) { Log_OC.v(TAG, "Adding arbitrary data with cloud id: " + account.name + " key: " + key diff --git a/src/main/java/com/owncloud/android/datamodel/PushArbitraryData.java b/src/main/java/com/owncloud/android/datamodel/PushArbitraryData.java new file mode 100644 index 0000000000..fa5c86b78c --- /dev/null +++ b/src/main/java/com/owncloud/android/datamodel/PushArbitraryData.java @@ -0,0 +1,81 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.datamodel; + +public class PushArbitraryData { + public String pushToken; + public String deviceIdentifier; + public String deviceIdentifierSignature; + public String userPublicKey; + public boolean shouldBeDeleted; + + public PushArbitraryData() { + } + + public PushArbitraryData(String pushToken, String deviceIdentifier, String deviceIdentifierSignature, + String userPublicKey, boolean shouldBeDeleted) { + this.pushToken = pushToken; + this.deviceIdentifier = deviceIdentifier; + this.deviceIdentifierSignature = deviceIdentifierSignature; + this.userPublicKey = userPublicKey; + this.shouldBeDeleted = shouldBeDeleted; + } + + public String getPushToken() { + return pushToken; + } + + public void setPushToken(String pushToken) { + this.pushToken = pushToken; + } + + public String getDeviceIdentifier() { + return deviceIdentifier; + } + + public void setDeviceIdentifier(String deviceIdentifier) { + this.deviceIdentifier = deviceIdentifier; + } + + public String getDeviceIdentifierSignature() { + return deviceIdentifierSignature; + } + + public void setDeviceIdentifierSignature(String deviceIdentifierSignature) { + this.deviceIdentifierSignature = deviceIdentifierSignature; + } + + public String getUserPublicKey() { + return userPublicKey; + } + + public void setUserPublicKey(String userPublicKey) { + this.userPublicKey = userPublicKey; + } + + public boolean isShouldBeDeleted() { + return shouldBeDeleted; + } + + public void setShouldBeDeleted(boolean shouldBeDeleted) { + this.shouldBeDeleted = shouldBeDeleted; + } +} diff --git a/src/main/java/com/owncloud/android/db/PreferenceManager.java b/src/main/java/com/owncloud/android/db/PreferenceManager.java index 182ef0a708..78c6402b3c 100644 --- a/src/main/java/com/owncloud/android/db/PreferenceManager.java +++ b/src/main/java/com/owncloud/android/db/PreferenceManager.java @@ -47,33 +47,15 @@ public abstract class PreferenceManager { private static final String PREF__LEGACY_CLEAN = "legacyClean"; private static final String PREF__AUTO_UPLOAD_UPDATE_PATH = "autoUploadPathUpdate"; private static final String PREF__PUSH_TOKEN = "pushToken"; - private static final String PREF__PUSH_TOKEN_UPDATE_TIME = "pushTokenLastUpdated"; - private static final String PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME = "pushTokenLastSent"; - - public static void setPushTokenLastSentTime(Context context, long time) { - saveLongPreference(context, PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME, time); - } - - public static long getPushTokenLastSentTime(Context context) { - return getDefaultSharedPreferences(context).getLong(PREF__PUSH_TOKEN_LAST_REGISTRATION_TIME, -1); - } public static void setPushToken(Context context, String pushToken) { - saveStringPreference(context, PREF__PUSH_TOKEN, pushToken); + saveStringPreferenceNow(context, PREF__PUSH_TOKEN, pushToken); } public static String getPushToken(Context context) { return getDefaultSharedPreferences(context).getString(PREF__PUSH_TOKEN, ""); } - public static void setPushTokenUpdateTime(Context context, long time) { - saveLongPreference(context, PREF__PUSH_TOKEN_UPDATE_TIME, time); - } - - public static long getPushTokenUpdateTime(Context context) { - return getDefaultSharedPreferences(context).getLong(PREF__PUSH_TOKEN_UPDATE_TIME, -1); - } - public static boolean instantPictureUploadEnabled(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_UPLOADING, false); } @@ -289,6 +271,12 @@ public abstract class PreferenceManager { appPreferences.apply(); } + private static void saveStringPreferenceNow(Context context, String key, String value) { + SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit(); + appPreferences.putString(key, value); + appPreferences.commit(); + } + private static void saveIntPreference(Context context, String key, int value) { SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit(); appPreferences.putInt(key, value); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 14d77fe7db..7d181d7772 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -162,8 +162,6 @@ public abstract class FileActivity extends DrawerActivity setAccount(account, savedInstanceState != null); - checkContactsBackupJob(); - mOperationsServiceConnection = new OperationsServiceConnection(); bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection, Context.BIND_AUTO_CREATE); @@ -243,16 +241,6 @@ public abstract class FileActivity extends DrawerActivity } } - private void checkContactsBackupJob() { - ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(getContentResolver()); - - if (getAccount() != null && arbitraryDataProvider.getBooleanValue(getAccount(), - ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP)) { - ContactsPreferenceActivity.startContactBackupJob(getAccount()); - } - } - - /** * Getter for the main {@link OCFile} handled by the activity. * diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index a00c56007a..8075cf37b6 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -47,17 +47,22 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import com.google.gson.Gson; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.ArbitraryDataProvider; +import com.owncloud.android.datamodel.PushArbitraryData; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation; +import com.owncloud.android.ui.events.TokenPushEvent; import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.PushUtils; +import org.greenrobot.eventbus.EventBus; import org.parceler.Parcels; import butterknife.BindString; @@ -349,6 +354,21 @@ public class UserInfoActivity extends FileActivity { ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, "false"); + + String arbitraryDataPushString; + + if (!TextUtils.isEmpty(arbitraryDataPushString = arbitraryDataProvider.getValue( + account, PushUtils.KEY_PUSH))) { + Gson gson = new Gson(); + PushArbitraryData pushArbitraryData = gson.fromJson(arbitraryDataPushString, + PushArbitraryData.class); + pushArbitraryData.setShouldBeDeleted(true); + arbitraryDataProvider.storeOrUpdateKeyValue(account, PushUtils.KEY_PUSH, + gson.toJson(pushArbitraryData)); + EventBus.getDefault().post(new TokenPushEvent()); + } + + if (getActivity() != null && !removeDirectly) { Bundle bundle = new Bundle(); bundle.putParcelable(KEY_ACCOUNT, Parcels.wrap(account)); From 1effc4d23e3a46695d4e285b3f0431e545e4cb6d Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Tue, 2 May 2017 14:15:36 +0200 Subject: [PATCH 838/881] Fix build --- .../com/owncloud/android/utils/PushUtils.java | 25 +++++++++++++++++++ .../android/ui/activity/UserInfoActivity.java | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/generic/java/com/owncloud/android/utils/PushUtils.java diff --git a/src/generic/java/com/owncloud/android/utils/PushUtils.java b/src/generic/java/com/owncloud/android/utils/PushUtils.java new file mode 100644 index 0000000000..08f795f7a1 --- /dev/null +++ b/src/generic/java/com/owncloud/android/utils/PushUtils.java @@ -0,0 +1,25 @@ +/** + * Nextcloud Android client application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.owncloud.android.utils; + +public class PushUtils { + public static final String KEY_PUSH = "push"; +} diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 8075cf37b6..19f3d075cd 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -358,7 +358,8 @@ public class UserInfoActivity extends FileActivity { String arbitraryDataPushString; if (!TextUtils.isEmpty(arbitraryDataPushString = arbitraryDataProvider.getValue( - account, PushUtils.KEY_PUSH))) { + account, PushUtils.KEY_PUSH)) && + !TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { Gson gson = new Gson(); PushArbitraryData pushArbitraryData = gson.fromJson(arbitraryDataPushString, PushArbitraryData.class); From 7a117ce1f7e741575b39a1a1a55b2e34cb2ba60b Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Tue, 2 May 2017 16:49:39 +0200 Subject: [PATCH 839/881] prevent crashing if fingerprint is not supported --- .../ui/activity/FingerprintActivity.java | 7 +- .../android/ui/activity/Preferences.java | 68 +++++++++++-------- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java b/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java index 815fb476aa..41df82b8b1 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java @@ -36,6 +36,7 @@ import android.os.CancellationSignal; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyPermanentlyInvalidatedException; import android.security.keystore.KeyProperties; +import android.support.annotation.RequiresApi; import android.support.v4.app.ActivityCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.app.AppCompatActivity; @@ -256,7 +257,8 @@ public class FingerprintActivity extends AppCompatActivity { Toast.makeText(this, errorSeq, Toast.LENGTH_LONG).show(); } - final static public boolean isFingerprintCapable(Context context) { + @RequiresApi(api = Build.VERSION_CODES.M) + static public boolean isFingerprintCapable(Context context) { try { FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); @@ -274,7 +276,8 @@ public class FingerprintActivity extends AppCompatActivity { return false; } - final static public boolean isFingerprintReady(Context context) { + @RequiresApi(api = Build.VERSION_CODES.M) + static public boolean isFingerprintReady(Context context) { try { FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); diff --git a/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/src/main/java/com/owncloud/android/ui/activity/Preferences.java index c730c7c1f1..657ea9a322 100644 --- a/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -189,41 +189,49 @@ public class Preferences extends PreferenceActivity boolean fPrintEnabled = getResources().getBoolean(R.bool.fingerprint_enabled); fPrint = (CheckBoxPreference) findPreference(FingerprintActivity.PREFERENCE_USE_FINGERPRINT); if (fPrint != null) { - if(FingerprintActivity.isFingerprintCapable(MainApp.getAppContext()) && fPrintEnabled) { - fPrint.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - Boolean incoming = (Boolean) newValue; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (FingerprintActivity.isFingerprintCapable(MainApp.getAppContext()) && fPrintEnabled) { + fPrint.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + Boolean incoming = (Boolean) newValue; - if(FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) { - SharedPreferences appPrefs = - PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - SharedPreferences.Editor editor = appPrefs.edit(); - editor.putBoolean("use_fingerprint", incoming); - editor.commit(); - return true; - } else { - if(incoming) { - Toast.makeText( - MainApp.getAppContext(), - R.string.prefs_fingerprint_notsetup, - Toast.LENGTH_LONG) - .show(); - fPrint.setChecked(false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) { + SharedPreferences appPrefs = + PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor editor = appPrefs.edit(); + editor.putBoolean("use_fingerprint", incoming); + editor.apply(); + return true; + } else { + if (incoming) { + Toast.makeText( + MainApp.getAppContext(), + R.string.prefs_fingerprint_notsetup, + Toast.LENGTH_LONG) + .show(); + fPrint.setChecked(false); + } + SharedPreferences appPrefs = + PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor editor = appPrefs.edit(); + editor.putBoolean("use_fingerprint", false); + editor.apply(); + return false; + } + } else { + return false; } - SharedPreferences appPrefs = - PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - SharedPreferences.Editor editor = appPrefs.edit(); - editor.putBoolean("use_fingerprint", false); - editor.commit(); - return false; } + }); + if (!FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) { + fPrint.setChecked(false); } - }); - if(!FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) { - fPrint.setChecked(false); - } + } else { + preferenceCategoryDetails.removePreference(fPrint); + } } else { preferenceCategoryDetails.removePreference(fPrint); } From 9ebb7b582dea07f0f220ad737e946f1210c162b8 Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Tue, 2 May 2017 11:42:48 -0500 Subject: [PATCH 840/881] Issue #888 was fixed --- .../com/owncloud/android/ui/activity/FileDisplayActivity.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index ab56e8fa2b..8f2b796ccc 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -466,9 +466,7 @@ public class FileDisplayActivity extends HookActivity private Fragment chooseInitialSecondFragment(OCFile file) { Fragment secondFragment = null; if (file != null && !file.isFolder()) { - if (file.isDown() && PreviewMediaFragment.canBePreviewed(file) - && file.getLastSyncDateForProperties() > 0 // temporal fix - ) { + if (file.isDown() && PreviewMediaFragment.canBePreviewed(file)) { int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0); boolean autoplay = From 39433884e8126724c1853f983a64580c85c51830 Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Tue, 2 May 2017 11:56:16 -0500 Subject: [PATCH 841/881] This code was removed because canceled the filter task --- .../com/owncloud/android/ui/fragment/OCFileListFragment.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index f5bee75bfa..720b417adb 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -250,10 +250,6 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi public void onResume() { super.onResume(); - if (remoteOperationAsyncTask != null) { - remoteOperationAsyncTask.cancel(true); - } - if (getActivity() != null) { AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } From 1246675b0ef2791507b23af1c9962cc78f81bd2d Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Wed, 3 May 2017 00:21:39 +0000 Subject: [PATCH 842/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 11 +++++- src/main/res/values-es-rMX/strings.xml | 4 ++ src/main/res/values-pl/strings.xml | 53 ++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 61e8a5021b..8457464dcd 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -150,6 +150,7 @@ <string name="uploads_view_upload_status_failed_permission_error">Σφάλμα δικαιωμάτων</string> <string name="uploads_view_upload_status_conflict">Διένεξη</string> <string name="uploads_view_upload_status_unknown_fail">Άγνωστο σφάλμα</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Αναμονή σύνδεσης Wi-Fi</string> <string name="uploads_view_later_waiting_to_upload">Αναμονή για μεταφόρτωση</string> <string name="downloader_download_in_progress_ticker">Λαμβάνονται …</string> <string name="downloader_download_in_progress_content">%1$d%% Λαμβάνονται %2$s</string> @@ -189,6 +190,7 @@ <string name="media_event_done">%1$s αναπαραγωγή τελείωσε</string> <string name="media_err_nothing_to_play">Δεν βρέθηκαν αρχεία πολυμέσων</string> <string name="media_err_no_account">Δεν δόθηκε λογαριασμός</string> + <string name="media_err_not_in_owncloud">Το αρχείο δεν είναι έγκυρος λογαριασμός</string> <string name="media_err_unsupported">Δεν υποστηρίζεται η μορφή κωδικοποιήσης πολυμέσων</string> <string name="media_err_io">Αδυναμία ανάγνωσης αρχείου πολυμέσων</string> <string name="media_err_timeout">Λήξη χρόνου κατά την προσπάθεια αναπαραγωγής</string> @@ -501,6 +503,7 @@ <!-- User information --> <string name="user_info_full_name">Πλήρες όνομα</string> + <string name="user_info_email">E-mail</string> <string name="user_info_phone">Αριθμός τηλεφώνου</string> <string name="user_info_address">Διεύθυνση</string> <string name="user_info_website">Ιστοσελίδα</string> @@ -513,6 +516,9 @@ <string name="webview_error">Παρουσιάστηκε σφάλμα</string> <string name="prefs_category_about">Περί</string> + <string name="actionbar_contacts">Αντίγραφο ασφαλείας επαφών</string> + <string name="actionbar_contacts_restore">Ανάκτηση επαφών</string> + <string name="contacts_backup_button">Αντίγραφο ασφαλείας τώρα</string> <string name="contacts_restore_button">Επαναφορά τελευταίου αντιγράφου ασφαλείας</string> <string name="contacts_header_restore">Επαναφορά</string> <string name="contacts_header_backup">Αντίγραφο ασφαλείας</string> @@ -528,4 +534,7 @@ <!-- Notifications --> <string name="new_notification_received">Νέα ενημέρωση ελήφθη </string> - </resources> + <string name="drawer_logout">Έξοδος</string> + + +</resources> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index f4e2520ff4..720ed0f44c 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -283,6 +283,7 @@ en los últimos 7 días. </string> <string name="common_rename">Renombrar</string> <string name="common_remove">Eliminar</string> <string name="confirmation_remove_file_alert">¿Realmente desea eliminar %1$s?</string> + <string name="confirmation_remove_folder_alert">¿Realmente quiere eliminar %1$s y sus contenidos?</string> <string name="confirmation_remove_local">Sólo local</string> <string name="remove_success_msg">Eliminado</string> <string name="remove_fail_msg">Falla al eliminar</string> @@ -624,6 +625,8 @@ en los últimos 7 días. </string> <string name="prefs_category_about">Acerca de</string> <string name="actionbar_contacts">Respaldar contactos</string> + <string name="actionbar_contacts_restore">Restaurar contactos</string> + <string name="contacts_backup_button">Respaldar ahora</string> <string name="contacts_restore_button">Restaurar el último respaldo</string> <string name="contacts_header_restore">Restaurar</string> <string name="contacts_header_backup">Respaldar</string> @@ -638,6 +641,7 @@ en los últimos 7 días. </string> <string name="contacts_preference_choose_date">Seleccione una fecha</string> <string name="contacts_preference_backup_never">nunca</string> <string name="contacts_preferences_no_file_found">No se encontraron archivos</string> + <string name="contacts_preferences_something_strange_happened">¡Su último respaldo no fue encontrado!</string> <string name="contacts_preferences_backup_scheduled">El respaldo está calendarizado y deberá iniciar en breve</string> <string name="contacts_preferences_import_scheduled">La importación está calendarizada y deberá iniciar en breve</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 6c9788f4eb..32e7c2b4ae 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -47,7 +47,9 @@ <string name="prefs_fingerprint_notsetup">Brak skonfigurowanych odcisków palców</string> <string name="prefs_show_hidden_files">Pokaż ukryte pliki</string> <string name="prefs_instant_upload">Natychmiastowe wysyłanie zdjęć</string> + <string name="prefs_instant_upload_summary">Wyślij zdjęcia z aparatu</string> <string name="prefs_instant_video_upload">Natychmiastowe wysyłanie wideo</string> + <string name="prefs_instant_video_upload_summary">Wyślij filmy nagrane aparatem</string> <string name="prefs_log_title">Włącz logowanie</string> <string name="prefs_log_summary">To jest używane do logowania problemów</string> <string name="prefs_log_title_history">Historia logowania</string> @@ -56,6 +58,7 @@ <string name="prefs_calendar_contacts">Synchronizuj kalendarz i kontakty</string> <string name="prefs_calendar_contacts_summary">Skonfiguruj DAVdroid (v1.3.0+) dla obecnego konta</string> <string name="prefs_calendar_contacts_address_resolve_error">Adres serwera dla konta nie mógł został przekonwertowany do DAVdroid</string> + <string name="prefs_calendar_contacts_no_store_error">F-droid i Google Play nie są zainstalowane</string> <string name="prefs_help">Pomoc</string> <string name="prefs_recommend">Poleć znajomemu</string> <string name="prefs_feedback">Opinie</string> @@ -91,7 +94,9 @@ <string name="file_list_empty">Wyślij zawartość lub synchronizuj ją ze swoimi urządzeniami</string> <string name="file_list_empty_favorites">Dodaj pliki do ulubionych lub synchronizuj je ze swoimi urządzeniami</string> <string name="file_list_empty_favorites_filter_list">Tutaj znajdziesz pliki i foldery oznaczone jako ulubione</string> + <string name="file_list_empty_favorites_filter">Twoje wyszukiwanie nie zwróciło żadnych ulubionych plików</string> <string name="file_list_loading">Wczytywanie…</string> + <string name="file_list_no_app_for_file_type">Brak aplikacji dla tego typu plików.</string> <string name="local_file_list_empty">Nie ma plików w tym folderze.</string> <string name="file_list_empty_headline_search">Brak wyników w tym folderze</string> <string name="file_list_empty_headline_server_search">Brak wyników</string> @@ -100,6 +105,8 @@ <string name="file_list_empty_shared">Pliki i foldery, które współdzielisz pokażą się tutaj</string> <string name="file_list_empty_headline_server_search_videos">Brak plików wideo</string> <string name="file_list_empty_headline_server_search_photos">Brak zdjęć</string> + <string name="file_list_empty_recently_modified">Nie znaleziono żadnych plików zmodyfikowanych w ciągu ostatnich 7 dni</string> + <string name="file_list_empty_recently_modified_filter">Twoje wyszukiwanie nie zwróciło żądnych plików zmodyfikowanych w ciągu ostatnich 7 dni </string> <string name="file_list_empty_recently_added">NIe znaleziono żadnych ostatnio dodanych plików</string> <string name="file_list_empty_recently_added_filter">Twoje wyszukiwanie nie zwróciło żadnych ostatnio dodanych plików</string> <string name="file_list_empty_text_photos">Wyślij zdjęcia lub włącz automatyczne wysyłanie</string> @@ -107,6 +114,8 @@ <string name="file_list_empty_text_videos">Wyślij pliki wideo lub włącz automatyczne wysyłanie</string> <string name="file_list_empty_text_videos_filter">Twoje wyszukiwanie nie zwróciło żadnych plików wideo</string> <string name="upload_list_empty_headline">Brak dostępnych danych do wysłania</string> + <string name="upload_list_empty_text">Wyślij zawartość lub włącz wysyłanie natychmiastowe.</string> + <string name="upload_list_empty_text_auto_upload">Wyślij zawartość lub włącz wysyłanie automatyczne.</string> <string name="file_list_folder">folder</string> <string name="file_list_folders">foldery</string> <string name="file_list_file">plik</string> @@ -118,6 +127,7 @@ <string name="filedetails_modified">Zmodyfikowano:</string> <string name="filedetails_download">Pobierz</string> <string name="filedetails_sync_file">Synchronizuj</string> + <string name="filedetails_renamed_in_upload_msg">Podczas wysyłania zmieniono nazwę pliku na %1$s</string> <string name="action_share">Udostępnij</string> <string name="common_yes">Tak</string> <string name="common_no">Nie</string> @@ -192,6 +202,7 @@ <string name="foreign_files_fail">Niektóre pliki nie mogły być przeniesione</string> <string name="foreign_files_local_text">Lokalnie: %1$s</string> <string name="foreign_files_remote_text">Zdalnie: %1$s</string> + <string name="upload_query_move_foreign_files">Brak wystarczającego miejsca, aby skopiować wybrane pliki do folderu %1$s. Czy w zamian chcesz je tam przenieść?</string> <string name="pass_code_enter_pass_code">Wymyśl kod PIN.</string> <string name="pass_code_configure_your_pass_code">Wpisz kod PIN.</string> @@ -211,6 +222,13 @@ <string name="media_err_no_account">Nie znaleziono konta</string> <string name="media_err_unsupported">Nieobsługiwany kodek multimediów</string> <string name="media_err_io">NIe można odczytać pliku</string> + <string name="media_err_malformed">Nieprawidłowe kodowanie pliku multimedialnego</string> + <string name="media_err_timeout">Upłynął limit czasu podczas próby odtwarzania pliku</string> + <string name="media_err_invalid_progressive_playback">Plik multimedialny nie może być przesyłany strumieniowo</string> + <string name="media_err_unknown">Wbudowany odtwarzacz multimediów nie może odtworzyć pliku</string> + <string name="media_err_security_ex">Napotkano błąd zabezpieczeń podczas próby odtwarzania %1$s</string> + <string name="media_err_io_ex">Błąd danych wejściowych podczas próby odtwarzania %1$s</string> + <string name="media_err_unexpected">Nieoczekiwany błąd podczas próby odtworzenia %1$s</string> <string name="media_rewind_description">Przycisk przewijania do tyłu</string> <string name="media_play_pause_description">Przycisk odtwarzania / pauzowania</string> <string name="media_forward_description">Przycisk przewijania do przodu</string> @@ -243,6 +261,8 @@ <string name="auth_unsupported_auth_method">Serwer nie obsługuje tej metody autoryzacji</string> <string name="auth_unsupported_multiaccount">%1$s nie wspiera wielu kont</string> <string name="auth_can_not_auth_against_server">Błąd autoryzacji na tym serwerze</string> + <string name="auth_account_does_not_exist">Konto jeszcze nie istnieje na tym urządzeniu</string> + <string name="favorite">Udostępnij w trybie offline</string> <string name="unfavorite">Wyłącz udostępnianie w trybie offline</string> <string name="favorite_real">Ustaw jako ulubione</string> @@ -250,10 +270,12 @@ <string name="common_rename">Zmień nazwę</string> <string name="common_remove">Usuń</string> <string name="confirmation_remove_file_alert">Czy naprawdę chcesz usunąć %1$s?</string> + <string name="confirmation_remove_folder_alert">Czy na pewno chcesz usunąć %1$s wraz z zawartością?</string> <string name="confirmation_remove_local">Tylko lokalnie</string> <string name="remove_success_msg">Usunięto</string> <string name="remove_fail_msg">Nie można usunąć</string> <string name="rename_dialog_title">Wprowadź nową nazwę</string> + <string name="rename_local_fail_msg">Nie można zmienić nazwy kopii lokalne, użyj innej nazwy</string> <string name="rename_server_fail_msg">Nie udało się nadać serwerowi nowej nazwy</string> <string name="sync_file_fail_msg">Nie udało się sprawdzić zdalnego pliku</string> <string name="sync_file_nothing_to_do_msg">Zawartość pliku została już synchronizowana</string> @@ -263,6 +285,7 @@ <string name="filename_empty">Nazwa pliku nie może być pusta.</string> <string name="wait_a_moment">Proszę czekać...</string> <string name="wait_checking_credentials">Sprawdzanie danych</string> + <string name="filedisplay_unexpected_bad_get_content">Nieoczekiwany błąd, prosze wybrać plik z innej aplikacji</string> <string name="filedisplay_no_file_selected">Nie wybrano żadnego pliku</string> <string name="activity_chooser_title">Wyślij link do …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopiowanie pliku z prywatnego zasobu</string> @@ -312,6 +335,7 @@ <string name="instant_upload_on_charging">Wysyłaj tylko podczas ładowania</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Konflikt pliku</string> + <string name="conflict_message">Które pliki chcesz zachować? Jeżeli wybierzesz obie wersje, do nazwy pliku lokalnego zostanie dodana liczba.</string> <string name="conflict_keep_both">Zatrzymaj oba</string> <string name="conflict_use_local_version">wersja lokalna</string> <string name="conflict_use_server_version">wersja zdalna</string> @@ -321,7 +345,7 @@ <string name="preview_image_error_unknown_format">Nie można wyświetlić obrazu</string> <string name="error__upload__local_file_not_copied">%1$s nie może zostać skopiowany do lokalnego folderu %2$s</string> - <string name="prefs_instant_upload_path_title">Wysyłka obrazów do folderu</string> + <string name="prefs_instant_upload_path_title">Folder natychmiastowego wysyłania</string> <string name="prefs_folder_sync_local_path_title">Folder lokalny</string> <string name="prefs_folder_sync_remote_path_title">Folder zdalny</string> <string name="prefs_instant_upload_path_use_subfolders_title">Używaj podfolderów</string> @@ -388,6 +412,7 @@ <string name="drawer_manage_accounts">Zarządzaj kontami</string> <string name="actionbar_logger">Logi</string> <string name="log_send_history_button">Wyślij historię</string> + <string name="log_send_no_mail_app">Brak aplikacji do wysyłania logów. Zainstaluj klienta poczty e-mail.</string> <string name="log_send_mail_subject">%1$s Logi aplikacji Android</string> <string name="log_progress_dialog_text">Ładowanie danych …</string> @@ -399,20 +424,23 @@ <string name="folder_picker_choose_button_text">Wybierz</string> <string name="move_file_not_found">Nie można przenieść pliku. Sprawdź, czy plik istnieje.</string> + <string name="move_file_invalid_into_descendent">Nie można przenieść folderu do jednego z jego podfolderów</string> <string name="move_file_invalid_overwrite">Plik już istnieje w folderze docelowym</string> <string name="move_file_error">Pojawił się błąd podczas próby przeniesienia tego pliku lub folderu</string> <string name="forbidden_permissions_move">aby przenieść ten plik</string> <string name="copy_file_not_found">Nie można skopiować. Sprawdź, czy plik istnieje</string> + <string name="copy_file_invalid_into_descendent">Nie można skopiować folderu do jednego z jego podfolderów</string> <string name="copy_file_invalid_overwrite">Plik już istnieje w folderze docelowym</string> <string name="copy_file_error">Wystąpił błąd podczas próby kopiowania tego pliku lub folderu</string> <string name="forbidden_permissions_copy">by skopiować ten plik</string> - <string name="prefs_category_instant_uploading">Automatyczne wysyłanie</string> + <string name="prefs_category_instant_uploading">Natychmiastowo wysłane</string> <string name="prefs_category_details">Szczegóły</string> - <string name="sync_folder_failed_content">Synchronizacja folderu %1$s nie może zostać zakończona</string> + <string name="prefs_instant_video_upload_path_title">Folder wideo do natychmiastowego wysyłania</string> + <string name="sync_folder_failed_content">Synchronizacja folderu %1$s nie może zostać zakończona</string> <string name="shared_subject_header">udostępniony</string> <string name="with_you_subject_header">z tobą</string> @@ -477,7 +505,11 @@ <string name="edit_share_unshare">Cofnij udostępnianie</string> <string name="edit_share_done">zakończono</string> + <string name="action_retry_uploads">Próba nieudana</string> <string name="action_clear_failed_uploads">Wyczyść nieudane</string> + <string name="action_clear_successful_uploads">Wyczyszczono</string> + <string name="action_clear_finished_uploads">Wyczyść zakończone wysyłania</string> + <string name="action_switch_grid_view">Widok siatki</string> <string name="action_switch_list_view">Widok listy</string> @@ -485,8 +517,11 @@ <string name="manage_space_clear_data">Wyczyść dane</string> <string name="manage_space_error">Nie udało się usunąć niektórych plików.</string> + <string name="permission_storage_access">Wymagane są dodatkowe uprawnienia do pobierania i wysyłania plików.</string> + <string name="local_file_not_found_toast">Plik nie został znaleziony w lokalnym systemie plików</string> <string name="confirmation_remove_files_alert">Czy naprawdę chcesz usunąć zaznaczone elementy?</string> <string name="confirmation_remove_folders_alert">Czy naprawdę chcesz usunąć zaznaczone elementy oraz ich zawartość?</string> + <string name="uploads_view_upload_status_waiting_for_charging">Oczekiwanie na ładowanie urządzenia</string> <string name="actionbar_search">Wyszukaj</string> <string name="files_drop_not_supported">Ta funkcja jest dostępna w Nextcloud, prosimy wykonać aktualizację</string> <string name="learn_more">Dowiedz się więcej</string> @@ -504,6 +539,7 @@ <string name="choose_remote_folder">Wybierz folder…</string> <string name="folder_sync_loading_folders">Ładowanie folderów…</string> <string name="folder_sync_no_results">Nie znaleziono folderów multimedialnych.</string> + <string name="folder_sync_preferences">Preferencje automatycznego wysyłania</string> <string name="folder_sync_settings">Ustawienia</string> <string name="folder_sync_preferences_folder_path">Dla %1$s</string> <plurals name="items_selected_count"> @@ -546,6 +582,9 @@ <string name="whats_new_skip">Pominąć</string> + <string name="fingerprint_scan_finger">Umieść palec na czytniku odcisku palca</string> + <string name="fingerprint_unknown">Nie rozpoznano odcisku palca</string> + <!-- User information --> <string name="user_info_full_name">Pełna nazwa</string> <string name="user_info_email">E-mail</string> @@ -563,7 +602,10 @@ <string name="actionbar_contacts">Utwórz kopię zapasową kontaktów</string> <string name="actionbar_contacts_restore">Przywróć kontakty</string> + <string name="contacts_backup_button">Utwórz kopię zapasową</string> <string name="contacts_restore_button">Przywróć ostatnią kopię zapasową</string> + <string name="contacts_header_restore">Przywróć</string> + <string name="contacts_header_backup">Kopia zapasowa</string> <string name="contacts_automatic_backup">Kopia zapasowa kontaktów</string> <string name="contacts_last_backup">Ostatnia kopia zapasowa</string> <string name="contacts_read_permission">Potrzebne uprawnienia do odczytu kontaktów</string> @@ -571,9 +613,14 @@ <string name="contactlist_title">Przywróć kontakty</string> <string name="contaclist_restore_selected">Przywróć wybrane kontakty</string> <string name="contactlist_account_chooser_title">Wybierz konto do zaimportiwania</string> + <string name="contactlist_no_permission">Nie nadano uprawnień, nic nie zostało zaimportowane!</string> <string name="contacts_preference_choose_date">Wybierz datę</string> <string name="contacts_preference_backup_never">nigdy</string> <string name="contacts_preferences_no_file_found">Nie znaleziono żadnych plików</string> + <string name="contacts_preferences_something_strange_happened">Nie odnaleziono twojej ostatniej kopii zapasowej!</string> + <string name="contacts_preferences_backup_scheduled">Kopia zapasowa została zaplanowana i wkrótce zostanie uruchomiona</string> + <string name="contacts_preferences_import_scheduled">Importowanie zostało zaplanowane i wkrótce zostanie uruchomione</string> + <!-- Notifications --> <string name="new_notification_received">Otrzymano nowe powiadomienie</string> <string name="drawer_logout">Wyloguj</string> From c1eeea1dcb3a9f782f2afa5d175ae9f6fc25379d Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 05:21:17 +0200 Subject: [PATCH 843/881] Change name as requested --- .../{PushArbitraryData.java => PushConfigurationState.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/com/owncloud/android/datamodel/{PushArbitraryData.java => PushConfigurationState.java} (100%) diff --git a/src/main/java/com/owncloud/android/datamodel/PushArbitraryData.java b/src/main/java/com/owncloud/android/datamodel/PushConfigurationState.java similarity index 100% rename from src/main/java/com/owncloud/android/datamodel/PushArbitraryData.java rename to src/main/java/com/owncloud/android/datamodel/PushConfigurationState.java From 9186839048806c7b3e684edd34b6746b8bbf3f5c Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 05:30:37 +0200 Subject: [PATCH 844/881] Fix stuff --- .../com/owncloud/android/utils/PushUtils.java | 10 +- .../datamodel/PushConfigurationState.java | 6 +- .../android/ui/activity/UserInfoActivity.java | 6 +- .../com/owncloud/android/utils/PushUtils.java | 139 ++++++++++++++---- 4 files changed, 120 insertions(+), 41 deletions(-) diff --git a/src/gplay/java/com/owncloud/android/utils/PushUtils.java b/src/gplay/java/com/owncloud/android/utils/PushUtils.java index 7336c55ec8..cbbaacea6d 100644 --- a/src/gplay/java/com/owncloud/android/utils/PushUtils.java +++ b/src/gplay/java/com/owncloud/android/utils/PushUtils.java @@ -32,7 +32,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.ArbitraryDataProvider; -import com.owncloud.android.datamodel.PushArbitraryData; +import com.owncloud.android.datamodel.PushConfigurationState; import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClient; @@ -155,7 +155,8 @@ public class PushUtils { String arbitraryValue; if (!TextUtils.isEmpty(arbitraryValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { Gson gson = new Gson(); - PushArbitraryData pushArbitraryData = gson.fromJson(arbitraryValue, PushArbitraryData.class); + PushConfigurationState pushArbitraryData = gson.fromJson(arbitraryValue, + PushArbitraryData.class); RemoteOperation unregisterAccountDeviceForProxyOperation = new UnregisterAccountDeviceForProxyOperation(context.getResources(). getString(R.string.push_server_url), @@ -204,7 +205,8 @@ public class PushUtils { Gson gson = new Gson(); for (Account account : AccountUtils.getAccounts(context)) { if (!TextUtils.isEmpty(providerValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { - PushArbitraryData accountPushData = gson.fromJson(providerValue, PushArbitraryData.class); + PushConfigurationState accountPushData = gson.fromJson(providerValue, + PushConfigurationState.class); if (!accountPushData.getPushToken().equals(token) && !accountPushData.isShouldBeDeleted()) { try { OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); @@ -231,7 +233,7 @@ public class PushUtils { remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); if (remoteOperationResult.isSuccess()) { - PushArbitraryData pushArbitraryData = new PushArbitraryData(token, + PushConfigurationState pushArbitraryData = new PushConfigurationState(token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), pushResponse.getPublicKey(), false); arbitraryDataProvider.storeOrUpdateKeyValue(account, KEY_PUSH, diff --git a/src/main/java/com/owncloud/android/datamodel/PushConfigurationState.java b/src/main/java/com/owncloud/android/datamodel/PushConfigurationState.java index fa5c86b78c..8fffec9584 100644 --- a/src/main/java/com/owncloud/android/datamodel/PushConfigurationState.java +++ b/src/main/java/com/owncloud/android/datamodel/PushConfigurationState.java @@ -20,17 +20,17 @@ package com.owncloud.android.datamodel; -public class PushArbitraryData { +public class PushConfigurationState { public String pushToken; public String deviceIdentifier; public String deviceIdentifierSignature; public String userPublicKey; public boolean shouldBeDeleted; - public PushArbitraryData() { + public PushConfigurationState() { } - public PushArbitraryData(String pushToken, String deviceIdentifier, String deviceIdentifierSignature, + public PushConfigurationState(String pushToken, String deviceIdentifier, String deviceIdentifierSignature, String userPublicKey, boolean shouldBeDeleted) { this.pushToken = pushToken; this.deviceIdentifier = deviceIdentifier; diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 19f3d075cd..380dfab126 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -52,7 +52,7 @@ import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.ArbitraryDataProvider; -import com.owncloud.android.datamodel.PushArbitraryData; +import com.owncloud.android.datamodel.PushConfigurationState; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -361,8 +361,8 @@ public class UserInfoActivity extends FileActivity { account, PushUtils.KEY_PUSH)) && !TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { Gson gson = new Gson(); - PushArbitraryData pushArbitraryData = gson.fromJson(arbitraryDataPushString, - PushArbitraryData.class); + PushConfigurationState pushArbitraryData = gson.fromJson(arbitraryDataPushString, + PushConfigurationState.class); pushArbitraryData.setShouldBeDeleted(true); arbitraryDataProvider.storeOrUpdateKeyValue(account, PushUtils.KEY_PUSH, gson.toJson(pushArbitraryData)); diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index efa8305161..6d9090b27c 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -27,9 +27,12 @@ import android.content.Context; import android.text.TextUtils; import android.util.Base64; +import com.google.gson.Gson; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.ArbitraryDataProvider; +import com.owncloud.android.datamodel.PushConfigurationState; import com.owncloud.android.db.PreferenceManager; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClient; @@ -39,8 +42,12 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation; import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForProxyOperation; +import com.owncloud.android.lib.resources.notifications.UnregisterAccountDeviceForNotificationsOperation; +import com.owncloud.android.lib.resources.notifications.UnregisterAccountDeviceForProxyOperation; import com.owncloud.android.lib.resources.notifications.models.PushResponse; +import org.apache.commons.httpclient.HttpStatus; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -65,7 +72,11 @@ public class PushUtils { private static final String KEYPAIR_PRIV_EXTENSION = ".priv"; private static final String KEYPAIR_PUB_EXTENSION = ".pub"; - public static String generateSHA512Hash(String pushToken) { + public static final String KEY_PUSH = "push"; + + private static ArbitraryDataProvider arbitraryDataProvider; + + private static String generateSHA512Hash(String pushToken) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("SHA-512"); @@ -86,7 +97,7 @@ public class PushUtils { return result.toString(); } - public static int generateRsa2048KeyPair() { + private static int generateRsa2048KeyPair() { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER; @@ -124,8 +135,59 @@ public class PushUtils { return -2; } + private static void deleteRegistrationForAccount(Account account) { + Context context = MainApp.getAppContext(); + OwnCloudAccount ocAccount = null; + arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext().getContentResolver()); + + try { + ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); + + RemoteOperation unregisterAccountDeviceForNotificationsOperation = new + UnregisterAccountDeviceForNotificationsOperation(); + + RemoteOperationResult remoteOperationResult = unregisterAccountDeviceForNotificationsOperation. + execute(mClient); + + if (remoteOperationResult.getHttpCode() == HttpStatus.SC_ACCEPTED) { + String arbitraryValue; + if (!TextUtils.isEmpty(arbitraryValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { + Gson gson = new Gson(); + PushConfigurationState pushArbitraryData = gson.fromJson(arbitraryValue, + PushArbitraryData.class); + RemoteOperation unregisterAccountDeviceForProxyOperation = + new UnregisterAccountDeviceForProxyOperation(context.getResources(). + getString(R.string.push_server_url), + pushArbitraryData.getDeviceIdentifier(), + pushArbitraryData.getDeviceIdentifierSignature(), + pushArbitraryData.getUserPublicKey()); + + remoteOperationResult = unregisterAccountDeviceForProxyOperation.execute(mClient); + + if (remoteOperationResult.isSuccess()) { + arbitraryDataProvider.deleteKeyForAccount(account, KEY_PUSH); + } + } + } + + + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + } + public static void pushRegistrationToServer() { String token = PreferenceManager.getPushToken(MainApp.getAppContext()); + arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext().getContentResolver()); + if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && !TextUtils.isEmpty(token)) { PushUtils.generateRsa2048KeyPair(); @@ -139,42 +201,57 @@ public class PushUtils { publicKey = "-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-----END PUBLIC KEY-----\n"; Context context = MainApp.getAppContext(); + String providerValue; + Gson gson = new Gson(); for (Account account : AccountUtils.getAccounts(context)) { - try { - OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); - OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). - getClientFor(ocAccount, context); + if (!TextUtils.isEmpty(providerValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { + PushConfigurationState accountPushData = gson.fromJson(providerValue, + PushConfigurationState.class); + if (!accountPushData.getPushToken().equals(token) && !accountPushData.isShouldBeDeleted()) { + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, context); - RemoteOperation registerAccountDeviceForNotificationsOperation = - new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, - publicKey, - context.getResources().getString(R.string.push_server_url)); + RemoteOperation registerAccountDeviceForNotificationsOperation = + new RegisterAccountDeviceForNotificationsOperation(pushTokenHash, + publicKey, + context.getResources().getString(R.string.push_server_url)); - RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. - execute(mClient); + RemoteOperationResult remoteOperationResult = registerAccountDeviceForNotificationsOperation. + execute(mClient); - if (remoteOperationResult.isSuccess()) { - PushResponse pushResponse = remoteOperationResult.getPushResponseData(); + if (remoteOperationResult.isSuccess()) { + PushResponse pushResponse = remoteOperationResult.getPushResponseData(); - RemoteOperation registerAccountDeviceForProxyOperation = new - RegisterAccountDeviceForProxyOperation( - context.getResources().getString(R.string.push_server_url), - token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), - pushResponse.getPublicKey()); + RemoteOperation registerAccountDeviceForProxyOperation = new + RegisterAccountDeviceForProxyOperation( + context.getResources().getString(R.string.push_server_url), + token, pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey()); - remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); - PreferenceManager.setPushTokenLastSentTime(MainApp.getAppContext(), - System.currentTimeMillis()); + remoteOperationResult = registerAccountDeviceForProxyOperation.execute(mClient); + if (remoteOperationResult.isSuccess()) { + PushConfigurationState pushArbitraryData = new PushConfigurationState(token, + pushResponse.getDeviceIdentifier(), pushResponse.getSignature(), + pushResponse.getPublicKey(), false); + arbitraryDataProvider.storeOrUpdateKeyValue(account, KEY_PUSH, + gson.toJson(pushArbitraryData)); + } + } + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.d(TAG, "Failed to find an account"); + } catch (AuthenticatorException e) { + Log_OC.d(TAG, "Failed via AuthenticatorException"); + } catch (IOException e) { + Log_OC.d(TAG, "Failed via IOException"); + } catch (OperationCanceledException e) { + Log_OC.d(TAG, "Failed via OperationCanceledException"); + } + } else if (accountPushData.isShouldBeDeleted()) { + deleteRegistrationForAccount(account); } - } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { - Log_OC.d(TAG, "Failed to find an account"); - } catch (AuthenticatorException e) { - Log_OC.d(TAG, "Failed via AuthenticatorException"); - } catch (IOException e) { - Log_OC.d(TAG, "Failed via IOException"); - } catch (OperationCanceledException e) { - Log_OC.d(TAG, "Failed via OperationCanceledException"); } } } @@ -184,7 +261,7 @@ public class PushUtils { public static Key readKeyFromFile(boolean readPublicKey) { String keyPath = MainApp.getStoragePath() + File.separator + MainApp.getDataFolder() + File.separator + KEYPAIR_FOLDER; - ; + String privateKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PRIV_EXTENSION; String publicKeyPath = keyPath + File.separator + KEYPAIR_FILE_NAME + KEYPAIR_PUB_EXTENSION; From ec5b97f07a56379330ebed5a3be91ea07857d4b1 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 05:49:41 +0200 Subject: [PATCH 845/881] Fix leftover --- src/modified/java/com/owncloud/android/utils/PushUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modified/java/com/owncloud/android/utils/PushUtils.java b/src/modified/java/com/owncloud/android/utils/PushUtils.java index 6d9090b27c..8f34d08394 100644 --- a/src/modified/java/com/owncloud/android/utils/PushUtils.java +++ b/src/modified/java/com/owncloud/android/utils/PushUtils.java @@ -156,7 +156,7 @@ public class PushUtils { if (!TextUtils.isEmpty(arbitraryValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { Gson gson = new Gson(); PushConfigurationState pushArbitraryData = gson.fromJson(arbitraryValue, - PushArbitraryData.class); + PushConfigurationState.class); RemoteOperation unregisterAccountDeviceForProxyOperation = new UnregisterAccountDeviceForProxyOperation(context.getResources(). getString(R.string.push_server_url), From 5711f6f0b42610eaad37688a06a4f3c0ef9da67b Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 05:59:34 +0200 Subject: [PATCH 846/881] Simplify gplay flavour --- src/gplay/res/values/setup.xml | 130 --------------------------------- 1 file changed, 130 deletions(-) diff --git a/src/gplay/res/values/setup.xml b/src/gplay/res/values/setup.xml index 5f3582a9d6..f2ce5f20ff 100644 --- a/src/gplay/res/values/setup.xml +++ b/src/gplay/res/values/setup.xml @@ -1,135 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <!-- Beta indicator --> - <bool name="is_beta">false</bool> - - <!-- App name and other strings--> - <string name="app_name">Nextcloud</string> - <string name="account_type">nextcloud</string> <!-- better if was a domain name; but changing it now would require migrate accounts when the app is updated --> - <string name="authority">org.nextcloud</string> <!-- better if was the app package with ".provider" appended ; it identifies the provider --> - <string name="users_and_groups_search_authority">com.nextcloud.android.providers.UsersAndGroupsSearchProvider</string> - <string name="users_and_groups_share_with">com.nextcloud.android.providers.UsersAndGroupsSearchProvider.action.SHARE_WITH</string> - <string name="document_provider_authority">org.nextcloud.documents</string> - <string name="file_provider_authority">org.nextcloud.files</string> - <string name ="db_file">nextcloud.db</string> - <string name ="db_name">nextcloud</string> - <string name ="data_folder">nextcloud</string> - <string name ="log_name">nextcloud</string> - <string name ="default_display_name_for_root_folder">Nextcloud</string> - <string name ="user_agent">Mozilla/5.0 (Android) ownCloud-android/%1$s</string> - - <!-- URLs and flags related --> - <string name="server_url"></string> - <bool name="show_server_url_input">true</bool> - <!-- Can be regular (full input), prefix (subdomain input) and suffix (directory input) --> - <!-- Requires server url to be set --> - <string name="server_input_type">regular</string> - <bool name="show_welcome_link">true</bool> - <string name="welcome_link_url">"https://nextcloud.com/providers"</string> - <string name="share_api_link"></string> - - <!-- Flags to setup the authentication methods available in the app --> - <string name="auth_method_oauth2">off</string> - <string name="auth_method_saml_web_sso">off</string> - - <!-- Flags to enable/disable some features --> - <string name = "send_files_to_other_apps">on</string> - <bool name = "share_via_link_feature">true</bool> - <bool name = "share_with_users_feature">true</bool> - <bool name="show_whats_new">true</bool> - <bool name="show_external_links">true</bool> - - <!-- Contacts backup --> - <bool name="contacts_backup">true</bool> - <string name="contacts_backup_folder">/Contacts-Backup</string> - <integer name="contacts_backup_expire">-1</integer> - - <!-- To fill if you want to show webviews instead of regular welcome views --> - <array name="whatsnew_urls"></array> - - <!-- Colors --> - <color name="primary">@color/nc_blue</color> - <color name="primary_dark">#006AA3</color> - <color name="color_accent">@color/nc_blue_accent</color> - <color name="login_text_color">@color/white</color> - <color name="login_text_hint_color">#7fC0E3</color> - <color name="login_background_color">#FFFFFF</color> <!-- Not used at the moment --> - <color name="login_logo_background_color">#FFFFFF</color> <!-- Not used at the moment --> - <color name="background_color">#FFFFFF</color> - <color name="navigation_bar_start_color">#0082c9</color> - <color name="navigation_bar_end_color">#0082c9</color> - <color name="primary_button_background_color">@color/nc_blue_accent</color> - <color name="primary_button_text_color">@color/white</color> - <color name="secondary_button_background_color">#D6D7D7</color> - <color name="secondary_button_text_color">@color/black</color> - - <!-- special transparent action bar colors for image preview --> - <color name="color_transparent">#201D2D44</color> - <color name="color_dark_transparent">#40162233</color> - - <!-- Button --> - <color name="button_text_color">#000000</color> - - <!-- Multiselect backgrounds --> - <color name="action_mode_background">#757575</color> - <color name="action_mode_status_bar_background">#616161</color> - <color name="selected_item_background">#ECECEC</color> - - <!-- Multiaccount support --> - <bool name="multiaccount_support">true</bool> - - <!-- Drawer options --> - <bool name="recently_added_enabled">false</bool> - <bool name="recently_modified_enabled">false</bool> - <bool name="shared_enabled">true</bool> - <bool name="videos_enabled">false</bool> - - <!-- Bottom toolbar --> - <bool name="bottom_toolbar_enabled">false</bool> - - <!-- Help, imprint and feedback, and other things --> - <bool name="fingerprint_enabled">true</bool> - <bool name="davdroid_integration_enabled">true</bool> - <bool name="help_enabled">true</bool> - <bool name="imprint_enabled">false</bool> - <bool name="recommend_enabled">true</bool> - <bool name="feedback_enabled">true</bool> - <bool name="logger_enabled">false</bool> - <string name="url_help">https://help.nextcloud.com/c/feature</string> - <string name="url_imprint"></string> - <string name="mail_recommend">"mailto:"</string> - <string name="mail_feedback">"mailto:android@nextcloud.com"</string> - <string name="url_app_download">"https://play.google.com/store/apps/details?id=com.nextcloud.client"</string> - <string name="url_server_install">https://nextcloud.com/install</string> - - <!--Destination mail for sending log files --> - <string name="mail_logger"></string> - - <!-- Determine is participate enabled --> - <bool name="participate_enabled">true</bool> - <!-- Participate links --> - <string name="fdroid_beta_link" translatable="false">https://f-droid.org/repository/browse/?fdid=com.nextcloud.android.beta</string> - <string name="beta_apk_link" translatable="false">https://download.nextcloud.com/android/dev/latest.apk</string> - <string name="play_store_register_beta" translatable="false">https://play.google.com/apps/testing/com.nextcloud.client</string> - <string name="fdroid_link" translatable="false">https://f-droid.org/repository/browse/?fdid=com.nextcloud.client</string> - <string name="irc_weblink" translatable="false">http://webchat.freenode.net?channels=nextcloud-mobile</string> - <string name="help_link" translatable="false">https://help.nextcloud.com/c/clients/android</string> - <string name="translation_link" translatable="false">https://www.transifex.com/nextcloud/nextcloud/android/</string> - <string name="contributing_link" translatable="false">https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md</string> - <string name="report_issue_link" translatable="false">https://github.com/nextcloud/android/issues</string> - - <!-- login data links --> - <string name="login_data_own_scheme" translatable="false">nc</string> - <!-- url for webview login, with the protocol prefix - If set, will replace all other login methods available --> - <string name="webview_login_url" translatable="false"></string> - - <!-- analytics enabled --> - <bool name="analytics_enabled">false</bool> - - <!-- Files becomes Home --> - <bool name="use_home">false</bool> - <!-- Push server url --> <string name="push_server_url" translatable="false">https://push-notifications.nextcloud.com</string> </resources> From 12f53eaf85075426718a3615b798dcf62745779d Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 06:14:34 +0200 Subject: [PATCH 847/881] Fix fab stuff --- .../ui/fragment/ExtendedListFragment.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java index a3b4f10d97..2192c7d636 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -601,11 +601,18 @@ public class ExtendedListFragment extends Fragment * * @param enabled Desired visibility for the FAB. */ - public void setFabEnabled(boolean enabled) { - if (enabled) { - mFabMain.setVisibility(View.VISIBLE); - } else { - mFabMain.setVisibility(View.GONE); + public void setFabEnabled(final boolean enabled) { + if (getActivity() != null) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (enabled) { + mFabMain.setVisibility(View.VISIBLE); + } else { + mFabMain.setVisibility(View.GONE); + } + } + }); } } From c6268a609a43e56c16a849bcb8cf3ab0bc6f6e57 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 3 May 2017 08:52:25 +0200 Subject: [PATCH 848/881] remove suppressLint Checkerboard on PNG files is only shown in >= M and thus toggle Background is also used in >= M only --- .../ReceiveExternalFilesActivity.java | 4 +- .../android/ui/preview/ImageViewCustom.java | 6 +-- .../ui/preview/PreviewImageActivity.java | 9 ++--- .../ui/preview/PreviewImageFragment.java | 37 ++++++++++--------- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index 3b0f23f5a6..6949b5569c 100755 --- a/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -26,7 +26,6 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; -import android.annotation.SuppressLint; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -609,7 +608,7 @@ public class ReceiveExternalFilesActivity extends FileActivity @Nullable private File createTempFile(String filename, String text) { - File file = new File(((ReceiveExternalFilesActivity)getActivity()).getCacheDir(), filename); + File file = new File(getActivity().getCacheDir(), filename); FileWriter fw = null; try { fw = new FileWriter(file); @@ -862,7 +861,6 @@ public class ReceiveExternalFilesActivity extends FileActivity finish(); } - @SuppressLint("NewApi") public void uploadFiles() { UriUploader uploader = new UriUploader( diff --git a/src/main/java/com/owncloud/android/ui/preview/ImageViewCustom.java b/src/main/java/com/owncloud/android/ui/preview/ImageViewCustom.java index 167ae59b88..97be7039ef 100644 --- a/src/main/java/com/owncloud/android/ui/preview/ImageViewCustom.java +++ b/src/main/java/com/owncloud/android/ui/preview/ImageViewCustom.java @@ -1,6 +1,5 @@ package com.owncloud.android.ui.preview; -import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -45,7 +44,6 @@ public class ImageViewCustom extends ImageView { super(context, attrs, defStyle); } - @SuppressLint("NewApi") @Override protected void onDraw(Canvas canvas) { if(IS_ICS_OR_HIGHER && checkIfMaximumBitmapExceed(canvas) || IS_VERSION_BUGGY_ON_RECYCLES ) { @@ -109,10 +107,8 @@ public class ImageViewCustom extends ImageView { * @param canvas Canvas where the view will be drawn into. * @return boolean True means that the bitmap is too big for the canvas. */ - @SuppressLint("NewApi") private boolean checkIfMaximumBitmapExceed(Canvas canvas) { - return mBitmapWidth > canvas.getMaximumBitmapWidth() - || mBitmapHeight > canvas.getMaximumBitmapHeight(); + return mBitmapWidth > canvas.getMaximumBitmapWidth() || mBitmapHeight > canvas.getMaximumBitmapHeight(); } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java index 3d4676ce4c..b1bf94f7b6 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -106,7 +106,6 @@ public class PreviewImageActivity extends FileActivity implements // to keep our UI controls visibility in line with system bars visibility mFullScreenAnchorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() { - @SuppressLint("InlinedApi") @Override public void onSystemUiVisibilityChange(int flags) { boolean visible = (flags & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; @@ -230,9 +229,9 @@ public class PreviewImageActivity extends FileActivity implements mUploaderBinder = null; } } - }; - - + } + + @Override public void onStop() { super.onStop(); @@ -427,9 +426,7 @@ public class PreviewImageActivity extends FileActivity implements return true; } - @SuppressLint("InlinedApi") public void toggleFullScreen() { - boolean visible = (mFullScreenAnchorView.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index 59617f349e..d1f983831c 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -19,7 +19,6 @@ package com.owncloud.android.ui.preview; import android.accounts.Account; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.res.Resources; @@ -31,6 +30,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.PictureDrawable; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; @@ -549,7 +549,6 @@ public class PreviewImageFragment extends FileFragment { } } - @SuppressLint("InlinedApi") private void showLoadedImage(LoadImage result) { final ImageViewCustom imageView = mImageViewRef.get(); Bitmap bitmap = result.bitmap; @@ -575,20 +574,23 @@ public class PreviewImageFragment extends FileFragment { } layers[1] = bitmapDrawable; LayerDrawable layerDrawable = new LayerDrawable(layers); - if (result.ocFile.getMimetype().equalsIgnoreCase("image/png") ) { - layerDrawable.setLayerHeight(0, convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerHeight(1, convertDpToPixel(bitmap.getHeight(), getActivity())); - layerDrawable.setLayerWidth(0, convertDpToPixel(bitmap.getWidth(), getActivity())); - layerDrawable.setLayerWidth(1, convertDpToPixel(bitmap.getWidth(), getActivity())); - } else { - layerDrawable.setLayerHeight(0, convertDpToPixel(bitmapDrawable.getIntrinsicHeight(), - getActivity())); - layerDrawable.setLayerHeight(1, convertDpToPixel(bitmapDrawable.getIntrinsicHeight(), - getActivity())); - layerDrawable.setLayerWidth(0, convertDpToPixel(bitmapDrawable.getIntrinsicWidth(), - getActivity())); - layerDrawable.setLayerWidth(1, convertDpToPixel(bitmapDrawable.getIntrinsicWidth(), - getActivity())); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (result.ocFile.getMimetype().equalsIgnoreCase("image/png")) { + layerDrawable.setLayerHeight(0, convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerHeight(1, convertDpToPixel(bitmap.getHeight(), getActivity())); + layerDrawable.setLayerWidth(0, convertDpToPixel(bitmap.getWidth(), getActivity())); + layerDrawable.setLayerWidth(1, convertDpToPixel(bitmap.getWidth(), getActivity())); + } else { + layerDrawable.setLayerHeight(0, convertDpToPixel(bitmapDrawable.getIntrinsicHeight(), + getActivity())); + layerDrawable.setLayerHeight(1, convertDpToPixel(bitmapDrawable.getIntrinsicHeight(), + getActivity())); + layerDrawable.setLayerWidth(0, convertDpToPixel(bitmapDrawable.getIntrinsicWidth(), + getActivity())); + layerDrawable.setLayerWidth(1, convertDpToPixel(bitmapDrawable.getIntrinsicWidth(), + getActivity())); + } } imageView.setImageDrawable(layerDrawable); } else { @@ -664,7 +666,8 @@ public class PreviewImageFragment extends FileFragment { } private void toggleImageBackground() { - if (getFile() != null && (getFile().getMimetype().equalsIgnoreCase("image/png") || + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && getFile() != null + && (getFile().getMimetype().equalsIgnoreCase("image/png") || getFile().getMimetype().equalsIgnoreCase("image/svg+xml")) && getActivity() != null && getActivity() instanceof PreviewImageActivity && getResources() != null) { PreviewImageActivity previewImageActivity = (PreviewImageActivity) getActivity(); From ed1f05173d2f66dd69007b51f80cdfa5b445770f Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 11:49:20 +0200 Subject: [PATCH 849/881] Fix an issue --- .../datamodel/SyncedFolderProvider.java | 18 ++++++++++++++++++ .../android/ui/activity/UserInfoActivity.java | 6 ++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java b/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java index 98d4b12b9f..ee3b1762c7 100644 --- a/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java +++ b/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java @@ -19,6 +19,7 @@ */ package com.owncloud.android.datamodel; +import android.accounts.Account; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; @@ -189,6 +190,22 @@ public class SyncedFolderProvider extends Observable { } + /** + * Delete all synced folders for an account + * + * @param account whose synced folders should be deleted + */ + public int deleteSyncFoldersForAccount(Account account) { + int result = mContentResolver.delete( + ProviderMeta.ProviderTableMeta.CONTENT_URI_SYNCED_FOLDERS, + ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ACCOUNT + " = ?", + new String[]{String.valueOf(account.name)} + ); + + return result; + + } + /** * Delete a synced folder from the db * @@ -205,6 +222,7 @@ public class SyncedFolderProvider extends Observable { return result; } + /** * Try to figure out if a path exists for synced folder, and if not, go one folder back * Otherwise, delete the entry diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 380dfab126..31724c100e 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -53,6 +53,7 @@ import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.PushConfigurationState; +import com.owncloud.android.datamodel.SyncedFolderProvider; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -346,6 +347,11 @@ public class UserInfoActivity extends FileActivity { // remove contact backup job ContactsPreferenceActivity.cancelContactBackupJobForAccount(getActivity(), account); + // delete all synced folder for an account + SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider( + getActivity().getContentResolver()); + syncedFolderProvider.deleteSyncFoldersForAccount(account); + // disable daily backup ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider( getActivity().getContentResolver()); From 3786d46cf3c05b8e8c6c617d9901d3086800d516 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 11:50:59 +0200 Subject: [PATCH 850/881] Simplify code --- .../com/owncloud/android/ui/activity/UserInfoActivity.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 31724c100e..b85771131f 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -29,6 +29,7 @@ import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; +import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -347,14 +348,15 @@ public class UserInfoActivity extends FileActivity { // remove contact backup job ContactsPreferenceActivity.cancelContactBackupJobForAccount(getActivity(), account); + ContentResolver contentResolver = getActivity().getContentResolver(); // delete all synced folder for an account SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider( - getActivity().getContentResolver()); + contentResolver); syncedFolderProvider.deleteSyncFoldersForAccount(account); // disable daily backup ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider( - getActivity().getContentResolver()); + contentResolver); arbitraryDataProvider.storeOrUpdateKeyValue(account, ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP, From ff3dcb8910d3a9eb2c2cf61f793e4e4496e4fc3e Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 12:05:18 +0200 Subject: [PATCH 851/881] Cancel all auto upload jobs --- .../android/datamodel/UploadsStorageManager.java | 10 ++++++++++ .../owncloud/android/ui/activity/UserInfoActivity.java | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java b/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java index 86c7680c69..480f70a552 100644 --- a/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -20,6 +20,7 @@ */ package com.owncloud.android.datamodel; +import android.accounts.Account; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; @@ -413,6 +414,15 @@ public class UploadsStorageManager extends Observable { return list; } + public void cancelPendingAutoUploadJobsForAccount(Account account) { + JobManager jobManager = JobManager.create(mContext); + for (JobRequest ji: jobManager.getAllJobRequestsForTag(AutoUploadJob.TAG)) { + if (ji.getExtras().getString(AutoUploadJob.ACCOUNT, "").equalsIgnoreCase(account.name)) { + jobManager.cancel(ji.getJobId()); + } + } + } + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) public void cancelPendingJob(String accountName, String remotePath){ JobManager jobManager = JobManager.create(mContext); diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index b85771131f..e6bc420faf 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -55,6 +55,7 @@ import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.PushConfigurationState; import com.owncloud.android.datamodel.SyncedFolderProvider; +import com.owncloud.android.datamodel.UploadsStorageManager; import com.owncloud.android.lib.common.UserInfo; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -354,6 +355,10 @@ public class UserInfoActivity extends FileActivity { contentResolver); syncedFolderProvider.deleteSyncFoldersForAccount(account); + UploadsStorageManager uploadsStorageManager = new UploadsStorageManager( + contentResolver, getActivity()); + uploadsStorageManager.cancelPendingAutoUploadJobsForAccount(account); + // disable daily backup ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider( contentResolver); From 2e517f7b33dc0c054173600bd87b5498e74752ad Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 3 May 2017 14:03:23 +0200 Subject: [PATCH 852/881] hide search icon on FileDetailFragment --- .../owncloud/android/ui/fragment/FileDetailFragment.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index fbfd62f4ac..a13acd3767 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -241,6 +241,13 @@ public class FileDetailFragment extends FileFragment implements OnClickListener item.setEnabled(false); } + // additional restriction for this fragment + item = menu.findItem(R.id.action_search); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + Boolean dualPane = getResources().getBoolean(R.bool.large_land_layout); From e68e8f6d32a4b1ba98ea57ad1da624b71a347d71 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 3 May 2017 16:07:52 +0200 Subject: [PATCH 853/881] - use externalMediaDir to allow downloaded files to be scanned again - do not show "unknown" storage path, instead show complete path --- .../datastorage/DataStorageProvider.java | 6 +++--- .../SystemDefaultStoragePointProvider.java | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/owncloud/android/datastorage/DataStorageProvider.java b/src/main/java/com/owncloud/android/datastorage/DataStorageProvider.java index 3a7cca3260..0ee3d23e2f 100644 --- a/src/main/java/com/owncloud/android/datastorage/DataStorageProvider.java +++ b/src/main/java/com/owncloud/android/datastorage/DataStorageProvider.java @@ -24,7 +24,6 @@ package com.owncloud.android.datastorage; import android.os.Build; import com.owncloud.android.MainApp; -import com.owncloud.android.R; import com.owncloud.android.datastorage.providers.EnvironmentStoragePointProvider; import com.owncloud.android.datastorage.providers.HardcodedStoragePointProvider; import com.owncloud.android.datastorage.providers.IStoragePointProvider; @@ -65,7 +64,7 @@ public class DataStorageProvider { } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - for (File f : MainApp.getAppContext().getExternalFilesDirs(null)) { + for (File f : MainApp.getAppContext().getExternalMediaDirs()) { if (f != null) { mCachedStoragePoints.add(new StoragePoint(f.getAbsolutePath(), f.getAbsolutePath())); } @@ -87,7 +86,8 @@ public class DataStorageProvider { return s.getDescription(); } } - return MainApp.getAppContext().getString(R.string.storage_description_unknown); + // Fallback to just display complete path + return path; } public void addStoragePointProvider(IStoragePointProvider provider) { diff --git a/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java b/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java index 2e2c04932d..739a699e32 100644 --- a/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java +++ b/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java @@ -21,14 +21,15 @@ package com.owncloud.android.datastorage.providers; -import android.os.Environment; - import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datastorage.StoragePoint; +import java.io.File; import java.util.Vector; +import static android.os.Environment.getExternalStorageDirectory; + /** * @author Bartosz Przybylski */ @@ -44,8 +45,16 @@ public class SystemDefaultStoragePointProvider extends AbstractStoragePointProvi final String defaultStringDesc = MainApp.getAppContext().getString(R.string.storage_description_default); - final String path = Environment.getExternalStorageDirectory().getAbsolutePath(); - result.add(new StoragePoint(defaultStringDesc, path)); + File path; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + path = MainApp.getAppContext().getExternalMediaDirs()[0]; + } else { + path = getExternalStorageDirectory(); + } + + if (path != null) { + result.add(new StoragePoint(defaultStringDesc, path.getAbsolutePath())); + } return result; } From 8ccff5637010ee1295914867767ce2b7b3bac01a Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Wed, 3 May 2017 17:21:02 +0200 Subject: [PATCH 854/881] if source folder does not exist, still allow to move to new folder --- .../operations/DownloadFileOperation.java | 8 +++-- .../android/ui/activity/StorageMigration.java | 33 +++++++++++++++++-- src/main/res/values/strings.xml | 4 +-- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java b/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java index a3ab47aa05..b45cbac855 100644 --- a/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java +++ b/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java @@ -81,9 +81,11 @@ public class DownloadFileOperation extends RemoteOperation { } public String getSavePath() { - String path = mFile.getStoragePath(); // re-downloads should be done over the original file - if (path != null && path.length() > 0) { - return path; + if (mFile.getStoragePath() != null) { + File path = new File(mFile.getStoragePath()); // re-downloads should be done over the original file + if (path.canWrite()) { + return path.getAbsolutePath(); + } } return FileStorageUtils.getDefaultSavePathFor(mAccount.name, mFile); } diff --git a/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java b/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java index 8d63138c06..82bb61ca45 100644 --- a/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java +++ b/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java @@ -205,8 +205,14 @@ public class StorageMigration { if (succeed) { mProgressDialog.hide(); } else { - mProgressDialog.getButton(ProgressDialog.BUTTON_POSITIVE).setVisibility(View.VISIBLE); - mProgressDialog.setIndeterminateDrawable(mContext.getResources().getDrawable(R.drawable.image_fail)); + + if (code == R.string.file_migration_failed_not_readable) { + mProgressDialog.hide(); + askToStillMove(); + } else { + mProgressDialog.getButton(ProgressDialog.BUTTON_POSITIVE).setVisibility(View.VISIBLE); + mProgressDialog.setIndeterminateDrawable(mContext.getResources().getDrawable(R.drawable.image_fail)); + } } if (mListener != null) { @@ -214,6 +220,29 @@ public class StorageMigration { } } + private void askToStillMove() { + + new AlertDialog.Builder(mContext) + .setMessage("Source directory not readable. Do you still want to change the storage path to " + + mStorageTarget + "? Note: all data will have to be downloaded again.") + .setNegativeButton(R.string.common_no, new OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogInterface.dismiss(); + } + }) + .setPositiveButton(R.string.common_yes, new OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (mListener != null) { + mListener.onStorageMigrationFinished(mStorageTarget, true); + } + } + }) + .create() + .show(); + } + protected boolean[] saveAccountsSyncStatus() { boolean[] syncs = new boolean[mOcAccounts.length]; for (int i = 0; i < mOcAccounts.length; ++i) { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 9b91220f2e..b63bde879f 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -412,8 +412,8 @@ <string name="file_migration_restoring_accounts_configuration">Restoring configuration of accounts…</string> <string name="file_migration_ok_finished">Finished</string> <string name="file_migration_failed_not_enough_space">ERROR: Insufficient space</string> - <string name="file_migration_failed_not_writable">ERROR: File not writable</string> - <string name="file_migration_failed_not_readable">ERROR: File not readable</string> + <string name="file_migration_failed_not_writable">ERROR: Destination file not writable</string> + <string name="file_migration_failed_not_readable">ERROR: Source file not readable</string> <string name="file_migration_failed_dir_already_exists">ERROR: Nextcloud directory already exists</string> <string name="file_migration_failed_while_coping">ERROR: Failed during migration</string> <string name="file_migration_failed_while_updating_index">ERROR: Failed to updating index</string> From 107f80afaa59426ffdfc05dc5c9904a6faf4fef7 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 3 May 2017 22:40:22 +0200 Subject: [PATCH 855/881] Delete all accounts on first run Signed-off-by: Mario Danic <mario@lovelyhq.com> --- .../owncloud/android/ui/activity/WhatsNewActivity.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java index b7c125ee59..ee3a428bf6 100644 --- a/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java @@ -22,6 +22,8 @@ package com.owncloud.android.ui.activity; +import android.accounts.Account; +import android.accounts.AccountManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -79,6 +81,12 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa final boolean isBeta = getResources().getBoolean(R.bool.is_beta); String[] urls = getResources().getStringArray(R.array.whatsnew_urls); + // Sometimes, accounts are not deleted when you uninstall the application so we'll do it now + AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); + for (Account account : AccountUtils.getAccounts(this)) { + am.removeAccount(account, null, null); + } + boolean showWebView = urls.length > 0; if (showWebView) { From bfa1f060c0f9cb01701b31522de08eb088dca271 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Thu, 4 May 2017 00:21:28 +0000 Subject: [PATCH 856/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 118 ++++++++++++++++- src/main/res/values-ja-rJP/strings.xml | 173 ++----------------------- src/main/res/values-nb-rNO/strings.xml | 130 ++++++++++++++++++- src/main/res/values-pl/strings.xml | 31 ++++- src/main/res/values-sq/strings.xml | 14 +- 5 files changed, 286 insertions(+), 180 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 8457464dcd..254c9d7633 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -59,15 +59,22 @@ <string name="prefs_calendar_contacts_summary">Ρυθμίστε το DAVdroid (v1.3.0+) για τον τρέχον λογαριασμό</string> <string name="prefs_calendar_contacts_address_resolve_error">Η διεύθυνση του διακομιστή για τον λογαριασμό δεν μπορεί να καθοριστεί για το DAVdroid</string> <string name="prefs_calendar_contacts_no_store_error">Δεν είναι εγκατεστημένο το F-droid αλλά ούτε και το Google Play</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Επιτυχής ρύθμιση συγχρονισμού ημερολογίου & επαφών</string> <string name="prefs_help">Βοήθεια</string> <string name="prefs_recommend">Προτείνετε σε φίλο</string> <string name="prefs_feedback">Aνάδραση</string> <string name="prefs_imprint">Αποτύπωμα</string> - <string name="recommend_subject">Δοκιμή %1$s στο κινητό σας!</string> - <string name="auth_check_server">Έλεγχος διακομιστή</string> + <string name="prefs_remember_last_share_location">Απομνημόνευση θέσης διαμοιρασμού</string> + <string name="prefs_remember_last_upload_location_summary">Απομνημόνευση τελευταιας τοποθεσίας διαμοιρασμού μεταφορτώσεων</string> + + <string name="recommend_subject">Δοκιμή %1$s στο κινητό σας!</string> + <string name="recommend_text">Θα ήθελα να σε προσκαλέσω να χρησιμοποιήσεις το %1$s στο κινητό σου!\nΛήψη από εδώ: %2$s</string> + + <string name="auth_check_server">Έλεγχος διακομιστή</string> <string name="auth_host_url">Διεύθυνση διακομιστή https://…</string> <string name="auth_username">Όνομα χρήστη</string> <string name="auth_password">Συνθηματικό</string> + <string name="auth_register">Δεν έχετε ακόμα διακομιστή;\nΚάντε κλικ εδώ για να πάρετε έναν από ένα πάροχο</string> <string name="sync_string_files">Αρχεία</string> <string name="setup_btn_connect">Σύνδεση</string> <string name="uploader_btn_upload_text">Μεταφόρτωση</string> @@ -81,20 +88,40 @@ <string name="uploader_error_message_no_file_to_upload">Τα ληφθέντα δεδομένα δεν περιλαμβάνουν έγκυρο αρχείο.</string> <string name="uploader_error_title_file_cannot_be_uploaded">Το αρχείο δεν μπορεί να μεταφορτωθεί</string> <string name="uploader_error_message_read_permission_not_granted">Ο %1$s δεν επιτρέπεται να αναγνώσει ένα ληφθέν αρχείο</string> + <string name="uploader_error_message_source_file_not_found">Το αρχείο προς αποστολή δεν βρέθηκε στην τοποθεσία. Παρακαλώ ελέγξτε εάν υπάρχει το αρχείο.</string> + <string name="uploader_error_message_source_file_not_copied">Παρουσιάστηκε σφάλμα κατά την αντιγραφή του αρχείου στον προσωρινό φάκελο. Παρακαλούμε δοκιμάστε να στείλετε ξανά.</string> <string name="uploader_upload_files_behaviour">Επιλογή μεταφόρτωσης:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Μετακίνηση αρχείου στον φάκελο Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Διατήρηση του αρχείου στον πηγαίο φάκελο</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Διαγραφή αρχείου από τον πηγαίο φάκελο</string> <string name="file_list_seconds_ago">δευτερόλεπτα πριν</string> + <string name="file_list_empty_headline">Δεν υπάρχουν αρχεία</string> + <string name="file_list_empty">Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας.</string> + <string name="file_list_empty_favorites">Σημειώστε ως αγαπημένα ορισμένα αρχεία ή συγχρονίστε τα με τις συσκευές σας.</string> + <string name="file_list_empty_favorites_filter_list">Τα αρχεία ή οι φάκελοι που σημειώσατε ως αγαπημένα θα εμφανιστούν εδώ</string> + <string name="file_list_empty_favorites_filter">Δεν βρέθηκαν αρχεία σημειωμένα ως αγαπημένα για το ερώτημά σας.</string> <string name="file_list_loading">Φόρτωση…</string> + <string name="file_list_no_app_for_file_type">Δεν βρέθηκε εφαρμογή για τον τύπο αρχείου.</string> <string name="local_file_list_empty">Δεν υπάρχουν αρχεία σε αυτό τον φάκελο.</string> <string name="file_list_empty_headline_search">Κανενα αποτέλεσμα σε αυτον τον φάκελο</string> <string name="file_list_empty_headline_server_search">Κανένα αποτέλεσμα</string> + <string name="file_list_empty_favorite_headline">Κανένα αγαπημένο</string> <string name="file_list_empty_shared_headline">Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής</string> <string name="file_list_empty_shared">Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανίζονται εδώ</string> <string name="file_list_empty_headline_server_search_videos">Κανένα βίντεο</string> <string name="file_list_empty_headline_server_search_photos">Καμιά φωτογραφία</string> + <string name="file_list_empty_search">Θα δοκιμάστε αναζήτηση και σε άλλο φάκελο;</string> + <string name="file_list_empty_recently_modified">Δεν βρέθηκαν αρχεία που να έχουν τροποποιηθεί τις τελευταίες 7 ημέρες</string> + <string name="file_list_empty_recently_modified_filter">Δεν βρέθηκαν αρχεία για το αίτημά σας που να έχουν τροποποιηθεί τις τελευταίες 7 ημέρες.</string> + <string name="file_list_empty_recently_added">Δεν βρέθηκαν πρόσφατα προστεθημένα αρχεία</string> + <string name="file_list_empty_recently_added_filter">Δεν βρέθηκαν πρόσφατα προστεθημένα αρχεία για το αίτημά σας.</string> + <string name="file_list_empty_text_photos">Μεταφόρτωση μερικών φωτογραφιών ή ενεργοποιήστε την αυτόματη μεταφόρτωση.</string> + <string name="file_list_empty_text_photos_filter">Δεν βρέθηκαν φωτογραφίες για το αίτημά σας.</string> + <string name="file_list_empty_text_videos">Μεταφορτώστε μερικά βίντεο ή ενεργοποιήστε την αυτόματη μεταφόρτωση.</string> + <string name="file_list_empty_text_videos_filter">Δεν βρέθηκε βίντεο για το αίτημά σας.</string> <string name="upload_list_empty_headline">Μη διαθέσιμες μεταφορτώσεις</string> + <string name="upload_list_empty_text">Μεταφορτώστε περιεχόμενο ή ενεργοποιήστε την άμεση μεταφόρτωση.</string> + <string name="upload_list_empty_text_auto_upload">Μεταφορτώστε περιεχόμενο ή ενεργοποιήστε την αυτόματη μεταφόρτωση.</string> <string name="file_list_folder">φάκελος</string> <string name="file_list_folders">φάκελοι</string> <string name="file_list_file">αρχείο</string> @@ -106,11 +133,14 @@ <string name="filedetails_modified">Τροποποιήθηκε:</string> <string name="filedetails_download">Λήψη</string> <string name="filedetails_sync_file">Συγχρονισμός</string> + <string name="filedetails_renamed_in_upload_msg">Το αρχείο μετονομάστηκε σε %1$s κατά τη μεταφόρτωση</string> + <string name="list_layout">Διάταξη λίστας</string> <string name="action_share">Διαμοιρασμός</string> <string name="common_yes">Ναι</string> <string name="common_no">Όχι</string> <string name="common_ok">Εντάξει</string> <string name="common_remove_upload">Αφαίρεση μεταφόρτωσης</string> + <string name="common_retry_upload">Επανάληψη μεταφόρτωσης</string> <string name="common_cancel_sync">Ακύρωση συγχρονισμού</string> <string name="common_cancel">Ακύρωση</string> <string name="common_back">Επιστροφή</string> @@ -133,6 +163,7 @@ <string name="uploader_upload_succeeded_ticker">Μεταφορτώθηκε</string> <string name="uploader_upload_succeeded_content_single">Το %1$s μεταφορτώθηκε</string> <string name="uploader_upload_failed_ticker">Η μεταφόρτωση απέτυχε</string> + <string name="uploader_upload_failed_content_single">Η μεταφόρτωση του %1$s δεν ήταν δυνατόν να ολοκληρωθεί</string> <string name="uploader_upload_failed_credentials_error">Η μεταφόρτωση απέτυχε, πρέπει να επανασυνδεθείτε</string> <string name="uploads_view_title">Μεταφορτώσεις</string> <string name="uploads_view_group_current_uploads">Τρέχουσα</string> @@ -149,6 +180,7 @@ <string name="uploads_view_upload_status_failed_localfile_error">Δεν βρέθηκε το τοπικό αρχείο</string> <string name="uploads_view_upload_status_failed_permission_error">Σφάλμα δικαιωμάτων</string> <string name="uploads_view_upload_status_conflict">Διένεξη</string> + <string name="uploads_view_upload_status_service_interrupted">Η εφαρμογή τερματίστηκε</string> <string name="uploads_view_upload_status_unknown_fail">Άγνωστο σφάλμα</string> <string name="uploads_view_upload_status_waiting_for_wifi">Αναμονή σύνδεσης Wi-Fi</string> <string name="uploads_view_later_waiting_to_upload">Αναμονή για μεταφόρτωση</string> @@ -157,10 +189,13 @@ <string name="downloader_download_succeeded_ticker">Ληφθέντα</string> <string name="downloader_download_succeeded_content">%1$s ελήφθησαν</string> <string name="downloader_download_failed_ticker">Αποτυχημένη λήψη</string> + <string name="downloader_download_failed_content">Η λήψη του %1$s δεν μπόρεσε να ολοκληρωθεί</string> <string name="downloader_not_downloaded_yet">Δεν έχει ληφθεί ακόμα</string> <string name="downloader_download_failed_credentials_error">Αποτυχία λήψης, πρέπει να εισέλθετε ξανά</string> <string name="common_choose_account">Επιλογή λογαριασμού</string> <string name="sync_fail_ticker">Αποτυχία συγχρονισμού</string> + <string name="sync_fail_ticker_unauthorized">Αποτυχία συγχρονισμού, χρειάζεται να εισέλθετε ξανά</string> + <string name="sync_fail_content">Ο συγχρονισμός του %1$s δεν μπόρεσε να ολοκληρωθεί</string> <string name="sync_fail_content_unauthorized">Εσφαλμένο συνθηματικό για τον %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Βρέθηκαν διενέξεις</string> <string name="sync_conflicts_in_favourites_content">%1$d αρχεία σε αναμονή προς συγχρονισμό δεν μπόρεσαν να συγχρονιστούν</string> @@ -168,11 +203,14 @@ <string name="sync_fail_in_favourites_content">Τα περιεχόμενα των %1$d αρχείων δεν μπόρεσαν να συγχρονιστούν (%2$d διενέξεις)</string> <string name="sync_foreign_files_forgotten_ticker">Ορισμένα τοπικά αρχεία ξεχάστηκαν</string> <string name="sync_foreign_files_forgotten_content">%1$d αρχεία από τον %2$s φάκελο δεν ήταν δυνατό να αντιγραφούν σε</string> + <string name="sync_foreign_files_forgotten_explanation">Από την έκδοση 1.3.16, τα αρχεία που μεταφορτώθηκαν από αυτήν τη συσκευή αντιγράφηκαν στον τοπικό φάκελο %1$s για να αποτραπεί η απώλεια δεδομένων όταν ένα αρχείο είναι συγχρονισμένο με πολλαπλούς λογαριασμούς. \n\nΛόγω αυτής της αλλαγής, όλα τα αρχεία που μεταφορτώθηκαν με προηγούμενες εκδόσεις αυτής της εφαρμογής αντιγράφηκαν στον φάκελο %2$s. Ωστόσο, ένα σφάλμα εμπόδισε την ολοκλήρωση αυτής της λειτουργίας κατά το συγχρονισμό του λογαριασμού. Μπορείτε είτε να αφήσετε το(α) αρχείο(α) όπως είναι και να καταργήσετε τη σύνδεση με το %3$s ή να μετακινήσετε τα αρχεία στο φάκελο %1$s και να διατηρήσετε τη σύνδεση με το %4$s. \n\nΑπαριθμημένα πιο κάτω είναι τα τοπικά αρχεία(ο) και τα απομακρυσμένα αρχεία(ο) στο %5$s με τα οποία συνδέονταν.</string> + <string name="sync_current_folder_was_removed">Ο φάκελος %1$s δεν υπάρχει πια</string> <string name="foreign_files_move">Μετακίνηση όλων</string> <string name="foreign_files_success">Όλα τα αρχεία μετακινήθηκαν</string> <string name="foreign_files_fail">Μερικά αρχεία δεν μπόρεσαν να μετακινηθούν</string> <string name="foreign_files_local_text">Τοπικά: %1$s</string> <string name="foreign_files_remote_text">Απομακρυσμένα: %1$s</string> + <string name="upload_query_move_foreign_files">Δεν υπάρχει αρκετός διαθέσιμος αποθηκευτικός χώρος για να αντιγραφούν τα επιλεγμένα αρχεία στον φάκελο %1$s. Θα θέλατε να τα μετακινήσετε αντί αυτού;</string> <string name="pass_code_enter_pass_code">Παρακαλούμε εισάγετε τον κωδικό πρόσβασης</string> <string name="pass_code_configure_your_pass_code">Εισάγετε τον κωδικό πρόσβασης</string> @@ -193,7 +231,13 @@ <string name="media_err_not_in_owncloud">Το αρχείο δεν είναι έγκυρος λογαριασμός</string> <string name="media_err_unsupported">Δεν υποστηρίζεται η μορφή κωδικοποιήσης πολυμέσων</string> <string name="media_err_io">Αδυναμία ανάγνωσης αρχείου πολυμέσων</string> + <string name="media_err_malformed">Εσφαλμένη κωδικοποίηση αρχείου πολυμέσων</string> <string name="media_err_timeout">Λήξη χρόνου κατά την προσπάθεια αναπαραγωγής</string> + <string name="media_err_invalid_progressive_playback">Το αρχείο πολυμέσων δεν μπορεί να μεταδοθεί</string> + <string name="media_err_unknown">Το αρχείο πολυμέσων δεν μπορεί να αναπαραχθεί με την παρεχόμενη εφαρμογή αναπαραγωγής πολυμέσων</string> + <string name="media_err_security_ex">Σφάλμα ασφαλείας κατά την προσπάθεια αναπαραγωγής του %1$s</string> + <string name="media_err_io_ex">Σφάλμα εισόδου κατά την προσπάθεια αναπαραγωγής του %1$s</string> + <string name="media_err_unexpected">Απροσδόκητο σφάλμα κατά την προσπάθεια αναπαραγωγής του %1$s</string> <string name="media_rewind_description">Κουμπί ταχείας κίνησης πίσω</string> <string name="media_play_pause_description">Κουμπί αναπαραγωγής ή παύσης</string> <string name="media_forward_description">Κουμπί γρήγορης προώθησης</string> @@ -205,6 +249,7 @@ <string name="auth_connection_established">Εδραίωση σύνδεσης</string> <string name="auth_testing_connection">Έλεγχος σύνδεσης</string> <string name="auth_not_configured_title">Εσφαλμένες ρυθμίσεις διακομιστή</string> + <string name="auth_account_not_new">Ένας λογαριασμός για τον ίδιο χρήστη και διακομιστή υπάρχει ήδη στη συσκευή</string> <string name="auth_account_not_the_same">Ο χρήστης που εισάγατε δεν ταιριάζει με το χρήστη αυτού του λογαριασμού</string> <string name="auth_unknown_error_title">Παρουσιάστηκε άγνωστο σφάλμα!</string> <string name="auth_unknown_host_title">Αδυναμία εύρεσης κεντρικού υπολογιστή</string> @@ -212,17 +257,24 @@ <string name="auth_timeout_title">Ο διακομιστής αργεί πολύ να απαντήσει</string> <string name="auth_incorrect_address_title">Εσφαλμένη μορφή διεύθυνσης διακομιστή</string> <string name="auth_ssl_general_error_title">Η αρχικοποίηση του SSL απέτυχε</string> + <string name="auth_ssl_unverified_server_title">Αδυναμία επιβεβαίωσης της ταυτότητας του διακομιστή SSL </string> <string name="auth_bad_oc_version_title">Μη αναγνωρίσιμη έκδοση διακομιστή</string> + <string name="auth_wrong_connection_title">Αδυναμία δημιουργίας σύνδεσης</string> <string name="auth_secure_connection">Επιτεύχθηκε ασφαλής σύνδεση</string> <string name="auth_unauthorized">Εσφαλμένο όνομα χρήστη ή συνθηματικό</string> <string name="auth_oauth_error">Ανεπιτυχής πιστοποίηση</string> <string name="auth_oauth_error_access_denied">Άρνηση πρόσβασης από τον διακομιστή πιστοποίησης</string> + <string name="auth_wtf_reenter_URL">Απροσδόκητη κατάσταση, παρακαλoύμε εισάγετε ξανά τη διεύθυνση του διακομιστή</string> <string name="auth_expired_oauth_token_toast">Η πιστοποιίησή σας έληξε. Παρακαλούμε εξουσιοδοτήστε ξανά</string> <string name="auth_expired_basic_auth_toast">Παρακαλούμε εισάγετε το τρέχον συνθηματικό</string> <string name="auth_expired_saml_sso_token_toast">Η συνεδρία σας έληξε. Παρακαλούμε συνδεθείτε ξανά</string> + <string name="auth_connecting_auth_server">Σύνδεση με το διακομιστή πιστοποίησης ...</string> <string name="auth_unsupported_auth_method">Ο διακομιστής δεν υποστηρίζει αυτή τη μέθοδο πιστοποίησης</string> <string name="auth_unsupported_multiaccount">Ο %1$s δεν υποστηρίζει πολλαπλούς λογαριασμούς</string> + <string name="auth_fail_get_user_name">Ο διακομιστής σας δεν επιστρέφει το σωστό αναγνωριστικό χρήστη, παρακαλούμε επικοινωνήστε τον διαχειριστή</string> <string name="auth_can_not_auth_against_server">Αδυαμία πιστοποίησης με αυτόν το διακομιστή</string> + <string name="auth_account_does_not_exist">Ο λογαριασμός δεν υπάρχει ακόμα στη συσκευή</string> + <string name="favorite">Ορισμός ως διαθέσιμο εκτός σύνδεσης</string> <string name="unfavorite">Αναίρεση ορισμού ως διαθέσιμο εκτός σύνδεσης</string> <string name="favorite_real">Ορισμός ως αγαπημένο</string> @@ -230,10 +282,14 @@ <string name="common_rename">Μετονομασία</string> <string name="common_remove">Αφαίρεση</string> <string name="confirmation_remove_file_alert">Θέλετε να αφαιρέσετε το %1$s;</string> + <string name="confirmation_remove_folder_alert">Θέλετε να αφαιρέσετε το %1$s και τα περιεχόμενά του;</string> <string name="confirmation_remove_local">Μόνο τοπικά</string> <string name="remove_success_msg">Αφαιρέθηκε</string> <string name="remove_fail_msg">Αποτυχημένη αφαίρεση</string> <string name="rename_dialog_title">Εισάγετε νέο όνομα</string> + <string name="rename_local_fail_msg">Το τοπικό αντίγραφο δεν ήταν δυνατόν να μετονομαστεί. Παρακαλούμε επιλέξτε ένα διαφορετικό όνομα.</string> + <string name="rename_server_fail_msg">Η μετονομασία δεν μπόρεσε να ολοκληρωθεί</string> + <string name="sync_file_fail_msg">Αδυναμία ελέγχου του απομακρυσμένου αρχείου</string> <string name="sync_file_nothing_to_do_msg">Τα περιεχόμενα του αρχείου έχουν ήδη συγχρονιστεί</string> <string name="create_dir_fail_msg">Αδυναμία δημιουργίας φακέλου</string> <string name="filename_forbidden_characters">Απαγορευμένοι χαρακτήρες: / \\ < > : \" | ? *</string> @@ -241,11 +297,14 @@ <string name="filename_empty">Το όνομα αρχείου δεν μπορεί να είναι κενό</string> <string name="wait_a_moment">Παρακαλούμε περιμένετε...</string> <string name="wait_checking_credentials">Γίνεται έλεγχος αποθηκευμένων διαπιστευτηρίων</string> + <string name="filedisplay_unexpected_bad_get_content">Μη αναμενόμενο πρόβλημα, παρακαλώ ελέγξτε το αρχείο από διαφορετική εφαρμογή</string> <string name="filedisplay_no_file_selected">Δεν επιλέχθηκε αρχείο</string> <string name="activity_chooser_title">Αποστολή συνδέσμου σε …</string> <string name="wait_for_tmp_copy_from_private_storage">Γίνεται αντιγραφή αρχείου από ιδιωτικό αποθηκευτικό χώρο</string> <string name="oauth_check_onoff">Σύνδεση με oAuth2</string> + <string name="oauth_login_connection">Γίνεται σύνδεση στο διακομιστή oAuth2...</string> + <string name="ssl_validator_header">Η ταυτότητα της σελίδας δεν μπορεί να επληθευτεί</string> <string name="ssl_validator_reason_cert_not_trusted">- Το πιστοποιητικό του διακομιστή δεν είναι έμπιστο</string> <string name="ssl_validator_reason_cert_expired">- Το πιστοποιητικό του διακομιστή έχει λήξει</string> @@ -288,6 +347,7 @@ <string name="instant_upload_on_charging">Μεταφόρτωση μόνο κατά τη διάρκεια φόρτισης</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">Διένεξη αρχείων</string> + <string name="conflict_message">Ποια αρχεία θέλετε να διατηρήσετε; Αν επιλέξετε και τις δύο εκδόσεις, θα προστεθεί ένας αριθμός στο όνομα του τοπικού αρχείου.</string> <string name="conflict_keep_both">Διατήρηση και των δύο</string> <string name="conflict_use_local_version">τοπική έκδοση</string> <string name="conflict_use_server_version">έκδοση διακομιστή</string> @@ -303,6 +363,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Χρήση υποφακέλων</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Αποθήκευση σε υποφακέλους με βάση το χρόνο και μήνα</string> + <string name="share_link_no_support_share_api">Λυπούμαστε, ο διαμοιρασμός δεν είναι διαθέσιμος στο διακομιστή σας. Παρακαλούμε επικοινωνήστε με τον διαχειριστή.</string> <string name="share_link_file_no_exist">Αδυναμία διαμοιρασμού. Παρακαλούμε ελέγξτε αν υπάρχει ο φάκελος</string> <string name="share_link_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια διαμοιρασμού αυτού του αρχείου ή φακέλου</string> <string name="unshare_link_file_no_exist">Αδυναμία αναίρεσης κοινής χρήσης. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> @@ -316,9 +377,18 @@ <string name="copy_link">Αντιγραφή συνδέσμου</string> <string name="clipboard_text_copied">Αντιγράφηκε στο πρόχειρο</string> + <string name="clipboard_no_text_to_copy">Δεν ελήφθη κείμενο για αντιγραφή στο πρόχειρο</string> <string name="clipboard_uxexpected_error">Μη αναμενόμενο σφάλμα κατά την αντιγραφή στο πρόχειρο</string> <string name="clipboard_label">Κείμενο που αντιγράφηκε από τον %1$s</string> + <string name="error_cant_bind_to_operations_service">Κρίσιμο σφάλμα: αδύνατη η εκτέλεση λειτουργιών</string> + + <string name="network_error_socket_exception">Παρουσιάστηκε σφάλμα κατά τη σύνδεση με το διακομιστή.</string> + <string name="network_error_socket_timeout_exception">Παρουσιάστηκε σφάλμα κατά την αναμονή για τον διακομιστή. Η λειτουργία δεν μπορεί να ολοκληρωθεί</string> + <string name="network_error_connect_timeout_exception">Παρουσιάστηκε σφάλμα κατά την αναμονή για τον διακομιστή. Η λειτουργία δεν μπορεί να ολοκληρωθεί</string> + <string name="network_host_not_available">Η λειτουργία δεν μπορεί να ολοκληρωθεί. Ο διακομιστής δεν είναι διαθέσιμος</string> + + <string name="forbidden_permissions">Δεν έχετε δικαιώματα %s</string> <string name="forbidden_permissions_rename">για να μετονομάσετε αυτό το αρχείο</string> <string name="forbidden_permissions_delete">για να διαγράψετε αυτό το αρχείο</string> <string name="share_link_forbidden_permissions">για να διαμοιραστείτε αυτό το αρχείο</string> @@ -330,25 +400,34 @@ <string name="file_migration_dialog_title">Ενημέρωση διαδρομής αποθηκευτικού χώρου</string> <string name="file_migration_finish_button">Ολοκλήρωση</string> + <string name="file_migration_preparing">Προετοιμασία για μεταφορά…</string> <string name="file_migration_checking_destination">Γίνεται έλεγχος προορισμού…</string> + <string name="file_migration_saving_accounts_configuration">Γίνεται αποθήκευση ρυθμίσεων λογαριασμών…</string> + <string name="file_migration_waiting_for_unfinished_sync">Αναμονή για τους μη ολοκληρωμένους συγχρονισμούς…</string> <string name="file_migration_migrating">Γίνεται μετακίνηση δεδομένων…</string> <string name="file_migration_updating_index">Γίνεται ενημέρωση ευρετηρίου…</string> <string name="file_migration_cleaning">Γίνεται εκκαθάριση…</string> + <string name="file_migration_restoring_accounts_configuration">Γίνεται επαναφορά ρυθμίσεων λογαριασμών…</string> <string name="file_migration_ok_finished">Ολοκληρώθηκε</string> <string name="file_migration_failed_not_enough_space">ΣΦΑΛΜΑ: Ανεπαρκής αποθηκευτικός χώρος</string> <string name="file_migration_failed_not_writable">ΣΦΑΛΜΑ: Το αρχείο δεν είναι εγγράψιμο</string> <string name="file_migration_failed_not_readable">ΣΦΑΛΜΑ: Το αρχείο δεν είναι αναγνώσιμο</string> <string name="file_migration_failed_dir_already_exists">ΣΦΑΛΜΑ: Υπάρχει ήδη ο κατάλογος Nextcloud</string> + <string name="file_migration_failed_while_coping">ΣΦΑΛΜΑ: Κατά την μεταφορά</string> <string name="file_migration_failed_while_updating_index">ΣΦΑΛΜΑ: Κατά την ενημέρωση ευρετηρίου</string> + <string name="file_migration_directory_already_exists">Ο φάκελος των δεδομένων υπάρχει ήδη, τι να κάνω;</string> <string name="file_migration_override_data_folder">Αντικατάσταση</string> <string name="file_migration_use_data_folder">Χρήση</string> <string name="prefs_category_accounts">Λογαριασμοί</string> <string name="prefs_add_account">Προσθήκη λογαριασμού</string> <string name="drawer_manage_accounts">Διαχείριση λογαριασμών</string> - <string name="actionbar_logger">Αρχεία καταγραφών</string> + <string name="auth_redirect_non_secure_connection_title">Η ασφαλής σύνδεση ανακατευθύνεται μέσω μιας μη ασφαλούς διαδρομής.</string> + + <string name="actionbar_logger">Αρχεία καταγραφών</string> <string name="log_send_history_button">Αποστολή ιστορικού</string> + <string name="log_send_no_mail_app">Δεν εντοπίστηκε εφαρμογή αποστολής ιστορικού συστήματος. Παρακαλούμε εγκαταστήστε μια εφαρμογή ηλεκτρονικού ταχυδρομείου.</string> <string name="log_send_mail_subject">%1$s ιστορικό της εφαρμογής Android</string> <string name="log_progress_dialog_text">Φόρτωση δεδομένων …</string> @@ -356,20 +435,27 @@ <string name="saml_authentication_wrong_pass">Εσφαλμένο συνθηματικό</string> <string name="actionbar_move">Μετακίνηση</string> <string name="actionbar_copy">Αντιγραφή</string> + <string name="file_list_empty_moving">Δεν υπάρχει τίποτα εδώ. Μπορείτε να προσθέσετε ένα φάκελο!</string> <string name="folder_picker_choose_button_text">Επιλέξτε</string> + <string name="move_file_not_found">Αδύνατη η μετακίνηση. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει</string> + <string name="move_file_invalid_into_descendent">Δεν είναι δυνατό να μετακινηθεί ο φάκελος σε έναν απογονικό</string> + <string name="move_file_invalid_overwrite">Το αρχείο υπάρχει ήδη στο φάκελο προορισμού</string> <string name="move_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια μετακίνησης αυτού του αρχείου ή φακέλου</string> <string name="forbidden_permissions_move">για μετακίνηση αυτού του αρχείου</string> <string name="copy_file_not_found">Αδυναμία αντιγραφής. Παρακαλούμε ελέγξτε αν το αρχείο υπάρχει</string> + <string name="copy_file_invalid_into_descendent">Δεν είναι δυνατό να αντιγραφεί ο φάκελος σε απογονικό</string> + <string name="copy_file_invalid_overwrite">Το αρχείο υπάρχει ήδη στο φάκελο προορισμού</string> <string name="copy_file_error">Παρουσιάστηκε σφάλμα κατά την προσπάθεια αντιγραφής αυτού του αρχείου ή φακέλου</string> <string name="forbidden_permissions_copy">για αντιγραφή αυτού του αρχείου</string> <string name="prefs_category_instant_uploading">Άμεσες μεταφορτώσεις</string> <string name="prefs_category_details">Λεπτομέρειες</string> - <string name="sync_folder_failed_content">Ο συγχρονισμός του φακέλου %1$s δεν μπόρεσε να ολοκληρωθεί</string> + <string name="prefs_instant_video_upload_path_title">Φάκελος άμεσης μεταφόρτωσης βίντεο</string> + <string name="sync_folder_failed_content">Ο συγχρονισμός του φακέλου %1$s δεν μπόρεσε να ολοκληρωθεί</string> <string name="shared_subject_header">διαμοιρασμένα</string> <string name="with_you_subject_header">με εσάς</string> @@ -426,6 +512,7 @@ <string name="share_email_clarification">%1$s (ηλ. ταχυδρομείο)</string> <string name="share_known_remote_clarification">%1$s ( στο %2$s )</string> + <string name="share_sharee_unavailable">Δεν επιτρέπεται ο διαμοιρασμός μεταξύ χρηστών μέσω πελατών, σε αυτή την έκδοση διακομιστή. \nΕπικοινωνήστε με το διαχειριστή</string> <string name="share_privilege_can_share">δυνατότητα διαμοιρασμού</string> <string name="share_privilege_can_edit">δυνατότητα επεξεργασίας</string> <string name="share_privilege_can_edit_create">δημιουργία</string> @@ -434,34 +521,50 @@ <string name="edit_share_unshare">Διακοπή διαμοιρασμού</string> <string name="edit_share_done">ολοκληρώθηκε</string> + <string name="action_retry_uploads">Αποτυχία επανάληψης</string> <string name="action_clear_failed_uploads">Αποτυχία εκκαθάρισης</string> + <string name="action_clear_successful_uploads">Επιτυχία εκκαθάρισης</string> + <string name="action_clear_finished_uploads">Ολοκλήρωση εκκαθάρισης όλων</string> + <string name="action_switch_grid_view">Προβολή πλέγματος</string> <string name="action_switch_list_view">Προβολή λίστας</string> <string name="manage_space_title">Διαχείριση χώρου</string> + <string name="manage_space_description">Τα πιστοποιητικά ρυθμίσεων, βάσης δεδομένων και διακομιστή από τα δεδομένα %1$s\'s θα διαγραφούν μόνιμα.\n\nΤα ληφθέντα αρχεία θα παραμείνουν ανέπαφα.\n\nΑυτή η διαδικασία ενδεχομένως να διαρκέσει αρκετά.</string> <string name="manage_space_clear_data">Εκκαθάριση δεδομένων</string> <string name="manage_space_error">Μερικά αρχεία δεν μπορούν να διαγραφούν.</string> + <string name="permission_storage_access">Επιπλέον διακαιώματα απαιτούνται για μεταφόρτωση & λήψη αρχείων.</string> + <string name="local_file_not_found_toast">Το αρχείο δεν βρέθηκε στο τοπικό σύστημα αρχείων</string> <string name="confirmation_remove_files_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα;</string> <string name="confirmation_remove_folders_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα με τα περιεχόμενά τους;</string> + <string name="uploads_view_upload_status_waiting_for_charging">Αναμονή για φόρτιση συσκευής</string> <string name="actionbar_search">Αναζήτηση</string> <string name="files_drop_not_supported">Αυτό είναι χαρακτηριστικό του Nextcloud, παρακαλούμε ενημερώστε.</string> <string name="learn_more">Μάθετε περισσότερα</string> <string name="drawer_folder_sync">Αυτόματη μεταφόρτωση</string> <string name="drawer_participate">Συμμετοχή</string> + <string name="participate_testing_headline">Βοηθήστε μας στις δοκιμές</string> + <string name="participate_testing_bug_text">Βρήκατε σφάλμα; Κάτι σας φαίνεται παράξενο;</string> <string name="participate_testing_report_text">Αναφέρετε σφάλμα στο Github</string> + <string name="participate_testing_version_text">Σας ενδιαφέρει να μας βοηθήσετε να δοκιμάσουμε την επόμενη έκδοση;</string> <string name="participate_beta_headline">Δοκιμή της εκδοσης προς ανάπτυξη</string> + <string name="participate_beta_text">Αυτή περιέχει όλες τις επερχόμενες λειτουργίες και δαθέτει ότι τελευταίο έχει ενσωματωθεί. Σφάλματα/λάθη μπορεί να προκύψουν. Σας παρακαλούμε να μας τα αναφέρετε.</string> <string name="participate_release_candidate_headline">Release candidate</string> + <string name="participate_release_candidate_text">Η υποψήφια κυκλοφορία (RC) είναι ένα στιγμιότυπο της επερχόμενης έκδοσης και αναμένεται να είναι σταθερή. Η δοκιμή της μεμονωμένης εγκατάστασής σας θα βοηθήσει στην εξασφάλιση αυτού. Εγγραφείτε για δοκιμές στο Play store ή χειροκίνητα αναζητείστε στο τμήμα \"εκδόσεις\" στο F-Droid.</string> <string name="participate_contribute_headline">Ενεργή συνεισφορά</string> <string name="participate_contribute_irc_text">Συμμετέχετε στη συνομιλία στο IRC: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Βοηθήστε χρήστες στο <a href=\"%1$s\">forum</a></string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Μεταφράστε</a> την εφαρμογή</string> + <string name="participate_contribute_github_text">Συνεισφέρετε ως προγραμματιστής, για περισσότερες λεπτομέρειες δείτε <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a></string> <string name="move_to">Μετακίνηση σε…</string> <string name="copy_to">Αντιγραφή σε…</string> <string name="choose_remote_folder">Επιλογή φακέλου…</string> <string name="folder_sync_loading_folders">Φόρτωση φακέλων…</string> <string name="folder_sync_no_results">Δεν βρέθηκαν φάκελοι πολυμέσων.</string> + <string name="folder_sync_preferences">Προτιμήσεις αυτόματης μεταφόρτωσης</string> <string name="folder_sync_settings">Ρυθμίσεις</string> + <string name="folder_sync_new_info">Η άμεση μεταφόρτωση έχει ανανεωθεί τελείως. Παρακαλούμε δείτε το κυρίως μενού και ρυθμίστε ξανά την αυτόματη μεταφόρτωση. Σας ζητούμε συγγνώμη για την ενόχληση\n\nΑπολαύστε τις νέες και εκτεταμένες δυνατότητες της αυτόματης μεταφόρτωσης!</string> <string name="folder_sync_preferences_folder_path">Για %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d επιλέχθηκε</item> @@ -475,6 +578,7 @@ <string name="notifications_no_results_headline">Καμία ειδοποίηση</string> <string name="notifications_no_results_message">Παρακαλούμε ελέγξτε ξανά αργότερα. </string> + <string name="upload_file_dialog_title">Εισαγωγή ονόματος και τύπου αρχείου μεταφόρτωσης</string> <string name="upload_file_dialog_filename">Όνομα αρχείου</string> <string name="upload_file_dialog_filetype">Τύπος αρχείου</string> <string name="upload_file_dialog_filetype_snippet_text">Απόσπασμα αρχείου κειμένου(.txt)</string> @@ -490,6 +594,8 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Μια ασφαλής τοποθεσία για όλα σας τα δεδομένα</string> + <string name="welcome_feature_1_text">Πρόσβαση, διαμοιρασμός & προστασία των αρχείων σας στο σπίτι και στην εταιρία σας</string> + <string name="welcome_feature_2_title">Πολλαπλός λογαριασμός</string> <string name="welcome_feature_2_text">Σύνδεση με όλα τα clouds σας</string> @@ -513,6 +619,7 @@ <!-- Activities --> <string name="activities_no_results_headline">Καμία δραστηριότητα ακόμα</string> + <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές & κοινόχρηστα</string> <string name="webview_error">Παρουσιάστηκε σφάλμα</string> <string name="prefs_category_about">Περί</string> @@ -524,8 +631,11 @@ <string name="contacts_header_backup">Αντίγραφο ασφαλείας</string> <string name="contacts_automatic_backup">Αντίγραφο ασφαλείας επαφών</string> <string name="contacts_last_backup">Τελευταίο αντίγραφο ασφαλείας</string> + <string name="contacts_read_permission">Απαιτείτούνται δικαιώματα ανάγνωσης για τις επαφές</string> + <string name="contacts_write_permission">Απαιτείτούνται δικαιώματα εγγραφής για τις επαφές</string> <string name="contactlist_title">Επαναφορά επαφών</string> <string name="contaclist_restore_selected">Επαναφορά επιλεγμένων επαφών</string> + <string name="contactlist_account_chooser_title">Επιλογή λογαριασμού για εισαγωγή</string> <string name="contacts_preference_choose_date">Επιλογή ημερομηνίας</string> <string name="contacts_preference_backup_never">ποτέ</string> <string name="contacts_preferences_no_file_found">Δεν βρέθηκε αρχείο</string> diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index 6af1428d3c..b5d9de0a51 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -46,10 +46,10 @@ <string name="prefs_fingerprint">指紋ロック</string> <string name="prefs_fingerprint_notsetup">指紋は設定されていません。</string> <string name="prefs_show_hidden_files">隠しファイルを表示</string> - <string name="prefs_instant_upload">自動画像アップロード</string> - <string name="prefs_instant_upload_summary">カメラで撮影した画像を自動アップロード</string> - <string name="prefs_instant_video_upload">自動動画アップロード</string> - <string name="prefs_instant_video_upload_summary">カメラで撮影した動画を自動アップロード</string> + <string name="prefs_instant_upload">写真の自動アップロード</string> + <string name="prefs_instant_upload_summary">カメラで撮影した写真を自動アップロードします</string> + <string name="prefs_instant_video_upload">ビデオの自動アップロード</string> + <string name="prefs_instant_video_upload_summary">カメラで撮影したビデオを自動アップロードします</string> <string name="prefs_log_title">ログの有効化</string> <string name="prefs_log_summary">これは問題をログに記録するのに使用します。</string> <string name="prefs_log_title_history">ログの履歴</string> @@ -58,24 +58,20 @@ <string name="prefs_calendar_contacts">コンタクト & カレンダーを同期</string> <string name="prefs_calendar_contacts_summary">DAVdroid (v1.3.0以上) を現在のアカウントで使う</string> <string name="prefs_calendar_contacts_address_resolve_error">DAVdroid でアカウントのサーバーアドレスが解決できませんでした。</string> - <string name="prefs_calendar_contacts_no_store_error">Google playストアかF-droidアプリがインストールされていません。</string> - <string name="prefs_calendar_contacts_sync_setup_successful">コンタクト & カレンダーを同期設定しました</string> + <string name="prefs_calendar_contacts_no_store_error">F-droid または Google Play がインストールされていません</string> + <string name="prefs_calendar_contacts_sync_setup_successful">カレンダー & 連絡先の同期設定しました</string> <string name="prefs_help">ヘルプ</string> - <string name="prefs_recommend">友達に推薦</string> + <string name="prefs_recommend">友達に推奨</string> <string name="prefs_feedback">フィードバック</string> <string name="prefs_imprint">インプリント</string> <string name="prefs_remember_last_share_location">共有場所を記憶する</string> - <string name="prefs_remember_last_upload_location_summary">最後に共有アップロードした場所を記憶する</string> + <string name="prefs_remember_last_upload_location_summary">最後に使用した共有場所を記憶する</string> <string name="recommend_subject">スマートフォンで %1$s を試してください!</string> - <string name="recommend_text">スマートフォンで %1$s を利用してみませんか!\n -ここからダウンロードしてください: %2$s</string> - - <string name="auth_check_server">サーバーのチェック</string> + <string name="auth_check_server">サーバーのチェック</string> <string name="auth_host_url">サーバーアドレス https://…</string> <string name="auth_username">ユーザー名</string> <string name="auth_password">パスワード</string> - <string name="auth_register">まだサーバーがありませんか?\nここをクリックして、プロバイダーから取得してください</string> <string name="sync_string_files">ファイル</string> <string name="setup_btn_connect">接続</string> <string name="uploader_btn_upload_text">アップロード</string> @@ -87,22 +83,13 @@ <string name="uploader_error_title_no_file_to_upload">アップロードするファイルはありません</string> <string name="uploader_error_message_received_piece_of_text">%1$s でテキストをファイルとしてアップロードできませんでした。</string> <string name="uploader_error_message_no_file_to_upload">受信したデータには有効なファイルが含まれませんでした。</string> - <string name="uploader_error_title_file_cannot_be_uploaded">アップロードできません</string> <string name="uploader_error_message_read_permission_not_granted">%1$s で受信ファイルを読み込む権限がありません</string> - <string name="uploader_error_message_source_file_not_found">アップロードするファイルが指定の場所にありません。ファイルがあるかどうか確認してください。</string> - <string name="uploader_error_message_source_file_not_copied">ファイルを一時フォルダーにコピーする際にエラーが発生しました。再送してください。</string> <string name="uploader_upload_files_behaviour">アップロードオプション:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">ファイルをNextcloudのフォルダーに移動</string> <string name="uploader_upload_files_behaviour_only_upload">ファイルをソースフォルダに保持する</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">ファイルをソースフォルダから削除する</string> <string name="file_list_seconds_ago">数秒前</string> - <string name="file_list_empty_headline">ファイルがありません。</string> - <string name="file_list_empty">何かコンテンツをアップロードするか、デバイスからファイルを同期してください!</string> - <string name="file_list_empty_favorites">ファイルをお気に入りに登録するか、デバイスとファイルを同期してください!</string> - <string name="file_list_empty_favorites_filter_list">お気に入りに登録されたファイルやフォルダーは、ここに表示されます</string> - <string name="file_list_empty_favorites_filter">お気に入りのファイルが見つかりませんでした!</string> <string name="file_list_loading">読込中…</string> - <string name="file_list_no_app_for_file_type">ファイルタイプ に対応するアプリはありません!</string> <string name="local_file_list_empty">このフォルダーにはファイルがありません。</string> <string name="file_list_empty_headline_search">このフォルダーの結果はありません</string> <string name="file_list_empty_headline_server_search">結果なし</string> @@ -110,19 +97,7 @@ <string name="file_list_empty_shared">共有したファイルやフォルダーは、ここに表示されます。</string> <string name="file_list_empty_headline_server_search_videos">ビデオなし</string> <string name="file_list_empty_headline_server_search_photos">写真なし</string> - <string name="file_list_empty_search">別のフォルダーを見てみますか?</string> - <string name="file_list_empty_recently_modified">過去 7 日間に更新されたファイルはありません</string> - <string name="file_list_empty_recently_modified_filter">過去 7 日間に更新されたファイルは -見つかりませんでした!</string> - <string name="file_list_empty_recently_added">最近追加したファイルはありません</string> - <string name="file_list_empty_recently_added_filter">最近追加したファイルが見つかりませんでした!</string> - <string name="file_list_empty_text_photos">何か写真をアップロードするか、自動アップロードを有効にしてください!</string> - <string name="file_list_empty_text_photos_filter">写真は見つかりませんでした!</string> - <string name="file_list_empty_text_videos">何かビデオをアップロードするか、自動アップロードを有効にしてください!</string> - <string name="file_list_empty_text_videos_filter">ビデオは見つかりませんでした!</string> <string name="upload_list_empty_headline">アップロードは利用できません</string> - <string name="upload_list_empty_text">何かコンテンツをアップロードするか、自動アップロードを有効にしてください!</string> - <string name="upload_list_empty_text_auto_upload">何かコンテンツをアップロードするか、自動アップロードを有効にしてください!</string> <string name="file_list_folder">フォルダー</string> <string name="file_list_folders">フォルダー</string> <string name="file_list_file">ファイル</string> @@ -134,14 +109,11 @@ <string name="filedetails_modified">更新:</string> <string name="filedetails_download">ダウンロード</string> <string name="filedetails_sync_file">ファイルを同期</string> - <string name="filedetails_renamed_in_upload_msg">アップロード中にファイル名を %1$s に変更しました</string> - <string name="list_layout">リストレイアウト</string> <string name="action_share">共有</string> <string name="common_yes">はい</string> <string name="common_no">いいえ</string> <string name="common_ok">OK</string> <string name="common_remove_upload">アップロードを削除</string> - <string name="common_retry_upload">アップロード再実行</string> <string name="common_cancel_sync">同期のキャンセル</string> <string name="common_cancel">キャンセル</string> <string name="common_back">戻る</string> @@ -161,10 +133,8 @@ <string name="uploader_info_dirname">フォルダー名</string> <string name="uploader_upload_in_progress_ticker">アップロード中…</string> <string name="uploader_upload_in_progress_content">%1$d%% アップロード中 %2$s</string> - <string name="uploader_upload_succeeded_ticker">アップロード完了</string> <string name="uploader_upload_succeeded_content_single">%1$s は正常にアップロードされました</string> <string name="uploader_upload_failed_ticker">アップロードに失敗</string> - <string name="uploader_upload_failed_content_single">%1$s のアップロードが完了しませんでした</string> <string name="uploader_upload_failed_credentials_error">アップロードに失敗しました,ログインし直す必要があります</string> <string name="uploads_view_title">アップロード</string> <string name="uploads_view_group_current_uploads">現在</string> @@ -181,37 +151,27 @@ <string name="uploads_view_upload_status_failed_localfile_error">ローカルファイルがありません</string> <string name="uploads_view_upload_status_failed_permission_error">権限エラー</string> <string name="uploads_view_upload_status_conflict">競合</string> - <string name="uploads_view_upload_status_service_interrupted">強制終了されました</string> <string name="uploads_view_upload_status_unknown_fail">不明なエラー</string> - <string name="uploads_view_upload_status_waiting_for_wifi">WiFiの接続を待っています</string> <string name="uploads_view_later_waiting_to_upload">アップロード待ち</string> <string name="downloader_download_in_progress_ticker">ダウンロード中 …</string> <string name="downloader_download_in_progress_content">%1$d%% ダウンロード中 %2$s</string> - <string name="downloader_download_succeeded_ticker">ダウンロードに成功</string> <string name="downloader_download_succeeded_content">%1$s は正常にダウンロードされました</string> <string name="downloader_download_failed_ticker">ダウンロードに失敗</string> - <string name="downloader_download_failed_content">%1$s のダウンロードは完了しませんでした</string> <string name="downloader_not_downloaded_yet">未ダウンロード</string> <string name="downloader_download_failed_credentials_error">ダウンロードに失敗しました,ログインし直す必要があります</string> <string name="common_choose_account">アカウントを選択</string> <string name="sync_fail_ticker">同期の失敗</string> - <string name="sync_fail_ticker_unauthorized">同期失敗;もう一度ログインしてください。</string> - <string name="sync_fail_content">%1$s の同期が完了しませんでした。</string> - <string name="sync_fail_content_unauthorized">1$sの無効なパスワード</string> <string name="sync_conflicts_in_favourites_ticker">競合が見つかりました</string> <string name="sync_conflicts_in_favourites_content">%1$d 同期ファイルを同期できませんでした</string> <string name="sync_fail_in_favourites_ticker">ファイルの同期に失敗しました</string> <string name="sync_fail_in_favourites_content">%1$d ファイルのコンテンツを同期できませんでした(%2$d の競合)</string> <string name="sync_foreign_files_forgotten_ticker">一部のローカルファイルが忘れられています</string> <string name="sync_foreign_files_forgotten_content"> %2$s フォルダー内の %1$d ファイルはコピーできませんでした。</string> - <string name="sync_foreign_files_forgotten_explanation">バージョン 1.3.16以降、このデバイスからアップロードされたファイルは、単独のファイルが複数のアカウントと同期する際にデータの損失を防ぐため、ローカルの%1$sフォルダーにコピーされます。 この変更により、このアプリの以前のバージョンでアップロードされたすべてのファイルは%2$sフォルダーにコピーされます。しかしながら、アカウント同期中にはエラーが発生してこの操作が完了しないようになっています。ファイルをこのままにして%3$sへのリンクを削除するか、あるいは%1$sフォルダーにファイルを移動して%4$sへのリンクを維持することができます。 以下のリストにあるのは、ローカルのファイル及びそれらにリンクしている %5$s内のリモートファイルです。</string> - <string name="sync_current_folder_was_removed">フォルダー %1$s はもう存在しません</string> <string name="foreign_files_move">すべて移動</string> <string name="foreign_files_success">すべてのファイルを移動しました</string> <string name="foreign_files_fail">一部のファイルは移動できませんでした</string> <string name="foreign_files_local_text">ローカル: %1$s</string> <string name="foreign_files_remote_text">リモート: %1$s</string> - <string name="upload_query_move_foreign_files">%1$s フォルダに選択されたファイルをコピーするのに十分な空き領域がありません。コピーする代わりに移動にしますか?</string> <string name="pass_code_enter_pass_code">パスコードを入力してください</string> <string name="pass_code_configure_your_pass_code">パスコードを入力</string> @@ -229,16 +189,7 @@ <string name="media_event_done">%1$s プレイバック終了</string> <string name="media_err_nothing_to_play">メディアファイルが見つかりませんでした</string> <string name="media_err_no_account">アカウントが提供されていません</string> - <string name="media_err_not_in_owncloud">ファイルが有効なアカウントにありません</string> <string name="media_err_unsupported">サポートされていないメディアコーデック</string> - <string name="media_err_io">メディアファイルを読み込めませんでした</string> - <string name="media_err_malformed">メディアファイルが正確にエンコードされていません</string> - <string name="media_err_timeout">再生中にタイムアウトが発生しました</string> - <string name="media_err_invalid_progressive_playback">メディアファイルをストリーミングできません</string> - <string name="media_err_unknown">メディアファイルをStock Media Playerで再生できません</string> - <string name="media_err_security_ex">再生時にセキュリティエラー %1$s</string> - <string name="media_err_io_ex">再生時に入力エラー %1$s</string> - <string name="media_err_unexpected">再生時に予期しないエラー %1$s</string> <string name="media_rewind_description">巻き戻しボタン</string> <string name="media_play_pause_description">再生/一時停止ボタン</string> <string name="media_forward_description">早送りボタン</string> @@ -250,32 +201,21 @@ <string name="auth_connection_established">接続が確立しました</string> <string name="auth_testing_connection">接続のテスト中</string> <string name="auth_not_configured_title">サーバー設定が間違っています</string> - <string name="auth_account_not_new">同じユーザーとサーバーのアカウントがデバイス上にすでに存在します</string> <string name="auth_account_not_the_same">入力されたユーザーはこのアカウントのユーザーと一致しません</string> <string name="auth_unknown_error_title">不明なエラーに発生しました</string> - <string name="auth_unknown_host_title">ホストが見つかりませんでした</string> - <string name="auth_incorrect_path_title">サーバーのインスタンスが見つかりません</string> <string name="auth_timeout_title">サーバーからの反応がありません</string> - <string name="auth_incorrect_address_title">サーバーアドレス形式が不正です</string> <string name="auth_ssl_general_error_title">SSLの初期化に失敗しました</string> - <string name="auth_ssl_unverified_server_title">SSLサーバー識別子を確認できませんでした</string> <string name="auth_bad_oc_version_title">認識できないサーバーのバージョンです</string> - <string name="auth_wrong_connection_title">接続を確立できませんでした</string> <string name="auth_secure_connection">暗号化通信を確立しました</string> <string name="auth_unauthorized">ユーザー名もしくはパスワードが間違っています</string> <string name="auth_oauth_error">認証失敗</string> <string name="auth_oauth_error_access_denied">認証サーバーによってアクセスが拒否されました</string> - <string name="auth_wtf_reenter_URL">予期せぬ状態;別のサーバーアドレスを入力してみてください</string> <string name="auth_expired_oauth_token_toast">認証情報は有効期限切れです。再度認証を行ってください。</string> <string name="auth_expired_basic_auth_toast">現在のパスワードを入力してください</string> <string name="auth_expired_saml_sso_token_toast">セッションの有効期限切れです。再度接続してください。</string> - <string name="auth_connecting_auth_server">認証サーバーに接続中...</string> <string name="auth_unsupported_auth_method">サーバーはこの認証方式をサポートしていません</string> <string name="auth_unsupported_multiaccount">%1$s は複数アカウントをサポートしていません</string> - <string name="auth_fail_get_user_name">サーバーが正しいユーザーIDを返しませんでした。管理者に問い合わせてください。 </string> <string name="auth_can_not_auth_against_server">認証サーバーに接続できません</string> - <string name="auth_account_does_not_exist">デバイス上にまだアカウントが存在しません</string> - <string name="favorite">オフラインで利用可能に設定</string> <string name="unfavorite">オフラインで利用不可に設定</string> <string name="favorite_real">お気に入りとして登録</string> @@ -283,36 +223,24 @@ <string name="common_rename">名前を変更</string> <string name="common_remove">削除</string> <string name="confirmation_remove_file_alert">本当に %1$s を削除しますか?</string> - <string name="confirmation_remove_folder_alert">本当に %1$s およびそのコンテンツを削除してもよろしいですか?</string> <string name="confirmation_remove_local">ローカルのみ</string> - <string name="remove_success_msg">削除に成功しました</string> <string name="remove_fail_msg">削除を完了できませんでした</string> <string name="rename_dialog_title">新しい名前を入力</string> - <string name="rename_local_fail_msg">ローカルコピーの名前の変更ができませんでした。別の名前で試してみてください</string> - <string name="rename_server_fail_msg">名前の変更ができませんでした</string> - <string name="sync_file_fail_msg">リモートファイルをチェックできませんでした</string> <string name="sync_file_nothing_to_do_msg">ファイルコンテンツはすでに同期されています</string> - <string name="create_dir_fail_msg">フォルダーを作成できませんでした</string> <string name="filename_forbidden_characters">使用できない文字: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">ファイル名に1文字以上の無効な文字が含まれています</string> <string name="filename_empty">ファイル名を空にすることはできません。</string> - <string name="wait_a_moment">しばらくお待ちください</string> <string name="wait_checking_credentials">保存された資格情報をチェック</string> - <string name="filedisplay_unexpected_bad_get_content">予期しない問題 ; 違うアプリからファイルを選択してください。</string> - <string name="filedisplay_no_file_selected">ファイルは選択されていません</string> <string name="activity_chooser_title">リンクを送信…</string> <string name="wait_for_tmp_copy_from_private_storage">プライベートストレージからファイルをコピー中</string> <string name="oauth_check_onoff">oAuth2でログイン</string> - <string name="oauth_login_connection">oAuth2サーバーに接続中...</string> - <string name="ssl_validator_header">サイトの識別子を確認できませんでした</string> <string name="ssl_validator_reason_cert_not_trusted">- サーバー証明書は信頼されていません</string> <string name="ssl_validator_reason_cert_expired">- サーバー証明書は有効期限切れです</string> <string name="ssl_validator_reason_cert_not_yet_valid">- サーバー証明書の有効期限は未来のものです</string> <string name="ssl_validator_reason_hostname_not_verified">- URLは証明書内のホスト名と一致しません</string> <string name="ssl_validator_question">この証明書を信頼してもよろしいですか?</string> - <string name="ssl_validator_not_saved">証明書は保存できませんでした</string> <string name="ssl_validator_btn_details_see">詳細</string> <string name="ssl_validator_btn_details_hide">非表示</string> <string name="ssl_validator_label_subject">発行先:</string> @@ -336,27 +264,17 @@ <string name="placeholder_sentence">これはプレースホルダです</string> <string name="placeholder_filename">placeholder.txt</string> - <string name="placeholder_filetype">PNG 画像</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">WiFi経由でのみアップロード</string> - <string name="instant_upload_on_wifi">WiFi経由でのみ画像をアップロード</string> - <string name="instant_video_upload_on_wifi">WiFi経由でのみ動画をアップロード</string> - <string name="instant_video_upload_on_charging">充電中のみアップロード</string> - <string name="instant_upload_on_charging">充電中のみアップロード</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">ファイルが競合</string> - <string name="conflict_message">どちらのファイルを保存したいですか?両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。</string> <string name="conflict_keep_both">両方を保持</string> <string name="conflict_use_local_version">ローカルのもの</string> <string name="conflict_use_server_version">サーバーのもの</string> - <string name="preview_sorry">申し訳ありません!</string> <string name="preview_image_description">イメージプレビュー</string> - <string name="preview_image_error_unknown_format">画像を表示できません</string> - <string name="error__upload__local_file_not_copied">%1$s は、ローカルフォルダー %2$s にコピーできませんでした。</string> <string name="prefs_instant_upload_path_title">自動アップロードフォルダー</string> <string name="prefs_folder_sync_local_path_title">ローカルフォルダー</string> @@ -364,7 +282,6 @@ <string name="prefs_instant_upload_path_use_subfolders_title">サブフォルダーを利用</string> <string name="prefs_instant_upload_path_use_subfolders_summary">年と月を元にしたサブフォルダーに保存</string> - <string name="share_link_no_support_share_api">すみませんが、サーバーで共有が有効になっていません。 管理者に問い合わせてください。</string> <string name="share_link_file_no_exist">共有できません。ファイルがあるか確認してください。</string> <string name="share_link_file_error">このファイルまたはフォルダーを共有する際にエラーが発生しました</string> <string name="unshare_link_file_no_exist">共有を解除できません。ファイルがあるか確認してください。</string> @@ -378,56 +295,29 @@ <string name="copy_link">リンクをコピー</string> <string name="clipboard_text_copied">クリップボードにコピー</string> - <string name="clipboard_no_text_to_copy">クリップボードにテキストはコピーされませんでした</string> <string name="clipboard_uxexpected_error">クリップボードにテキストをコピーするときにエラーが発生しました。</string> <string name="clipboard_label">%1$s からテキストをコピー</string> - <string name="error_cant_bind_to_operations_service">致命的なエラー:操作を実行できません</string> - - <string name="network_error_socket_exception">サーバーへの接続中にエラーが発生しました。</string> - <string name="network_error_socket_timeout_exception">サーバーからの応答を待っている間にエラーが発生しました。操作を完了することができませんでした。</string> - <string name="network_error_connect_timeout_exception">サーバーからの応答を待っている間にエラーが発生しました。操作を完了することができません。</string> - <string name="network_host_not_available">操作を完了することができません。サーバーが利用できません。</string> - <string name="forbidden_permissions">権限 %s がありません</string> <string name="forbidden_permissions_rename">ファイル名の変更</string> <string name="forbidden_permissions_delete">ファイルを削除</string> <string name="share_link_forbidden_permissions">ファイルを共有</string> <string name="unshare_link_forbidden_permissions">ファイルの共有を解除</string> <string name="update_link_forbidden_permissions">共有を更新</string> - <string name="forbidden_permissions_create">ファイルを作成</string> - <string name="uploader_upload_forbidden_permissions">フォルダーをアップロード</string> <string name="downloader_download_file_not_found">ファイルはサーバー上で利用できません</string> <string name="file_migration_dialog_title">ストレージの場所を更新中</string> <string name="file_migration_finish_button">完了</string> - <string name="file_migration_preparing">移行の準備中…</string> <string name="file_migration_checking_destination">宛先の確認中…</string> - <string name="file_migration_saving_accounts_configuration">アカウント設定を保存中…</string> - <string name="file_migration_waiting_for_unfinished_sync">未完了の同期を待機中…</string> <string name="file_migration_migrating">データの移動中…</string> <string name="file_migration_updating_index">インデックスの更新中…</string> <string name="file_migration_cleaning">クリーニング中…</string> - <string name="file_migration_restoring_accounts_configuration">アカウント設定を復元中…</string> <string name="file_migration_ok_finished">完了</string> - <string name="file_migration_failed_not_enough_space">十分な空き容量がありません</string> - <string name="file_migration_failed_not_writable">ファイルが書き込み可能ではありません。</string> - <string name="file_migration_failed_not_readable">ファイルが読み取り可能ではありません。</string> <string name="file_migration_failed_dir_already_exists">Nextcloudのディレクトリはすでに存在します。</string> - <string name="file_migration_failed_while_coping">エラー: 移行中</string> - <string name="file_migration_failed_while_updating_index">エラー: インデックスの更新中</string> - - <string name="file_migration_directory_already_exists">データフォルダはすでに存在します。どうしますか?</string> - <string name="file_migration_override_data_folder">上書き</string> - <string name="file_migration_use_data_folder">既存を使用する</string> - <string name="prefs_category_accounts">アカウント</string> <string name="prefs_add_account">アカウントを追加</string> <string name="drawer_manage_accounts">アカウント管理</string> - <string name="auth_redirect_non_secure_connection_title">暗号化されていない接続を経て、暗号化接続へリダイレクトされました。</string> - - <string name="actionbar_logger">ログ</string> + <string name="actionbar_logger">ログ</string> <string name="log_send_history_button">履歴を送信</string> - <string name="log_send_no_mail_app">ログを送信するアプリが見つかりませんでした。メールアプリをインストールしてください。</string> <string name="log_send_mail_subject">%1$s アンドロイドアプリログ</string> <string name="log_progress_dialog_text">データの読込中 …</string> @@ -435,27 +325,20 @@ <string name="saml_authentication_wrong_pass">パスワードが間違っています</string> <string name="actionbar_move">移動</string> <string name="actionbar_copy">コピー</string> - <string name="file_list_empty_moving">何もありません。フォルダーを追加してください。</string> <string name="folder_picker_choose_button_text">選択</string> - <string name="move_file_not_found">移動できません。ファイルがあるか確認してください。</string> - <string name="move_file_invalid_into_descendent">フォルダーを子フォルダーへ移動することはできません。</string> - <string name="move_file_invalid_overwrite">そのファイルは宛先フォルダーにすでに存在します。</string> <string name="move_file_error">このファイルまたはフォルダーを移動する際にエラーが発生しました</string> <string name="forbidden_permissions_move">このファイルを移動</string> <string name="copy_file_not_found">コピーできません。ファイルがあるか確認してください。</string> - <string name="copy_file_invalid_into_descendent">フォルダーを子フォルダーへコピーすることはできません。</string> - <string name="copy_file_invalid_overwrite">そのファイルは宛先フォルダーにすでに存在します。</string> <string name="copy_file_error">このファイルまたはフォルダーをコピーする際にエラーが発生しました</string> <string name="forbidden_permissions_copy">このファイルをコピー</string> <string name="prefs_category_instant_uploading">自動アップロード</string> <string name="prefs_category_details">詳細</string> - <string name="prefs_instant_video_upload_path_title">自動アップロード動画フォルダー</string> - <string name="sync_folder_failed_content">%1$s フォルダーの同期が完了しませんでした。</string> + <string name="sync_folder_failed_content">%1$s フォルダーの同期が完了しませんでした。</string> <string name="shared_subject_header">共有中</string> <string name="with_you_subject_header">あなたと</string> @@ -496,7 +379,6 @@ <string name="share_add_user_or_group">ユーザーかグループを追加</string> <string name="share_via_link_section_title">URLで共有</string> <string name="share_via_link_expiration_date_label">有効期限を設定</string> - <string name="share_via_link_password_label">パスワード保護を有効化</string> <string name="share_via_link_password_title">セキュア</string> <string name="share_via_link_edit_permission_label">編集を許可</string> <string name="share_via_link_hide_file_listing_permission_label">ファイルリストを隠す</string> @@ -512,7 +394,6 @@ <string name="share_email_clarification">%1$s (メール)</string> <string name="share_known_remote_clarification">%1$s ( %2$s で)</string> - <string name="share_sharee_unavailable">申し訳ありませんが、このサーバーのバージョンではこのクライアントアプリ上で他のユーザーと共有することができません。 \n管理者に相談してしてください。</string> <string name="share_privilege_can_share">共有可</string> <string name="share_privilege_can_edit">編集を許可</string> <string name="share_privilege_can_edit_create">作成</string> @@ -521,50 +402,34 @@ <string name="edit_share_unshare">共有の停止</string> <string name="edit_share_done">完了</string> - <string name="action_retry_uploads">再試行に失敗</string> <string name="action_clear_failed_uploads">クリアに失敗</string> - <string name="action_clear_successful_uploads">クリアに成功</string> - <string name="action_clear_finished_uploads">終了済をクリア</string> - <string name="action_switch_grid_view">グリッド表示</string> <string name="action_switch_list_view">リスト表示</string> <string name="manage_space_title">管理領域</string> - <string name="manage_space_description">%1$s のデータから 設定、データベース、サーバー証明書が完全に削除されます。\n\n ダウンロードされたファイルはそのまま残ります。\n\n 実行中はしばらくお待ちください。</string> <string name="manage_space_clear_data">データのクリア</string> <string name="manage_space_error">いくつかのファイルがクリアできませんでした。</string> - <string name="permission_storage_access">ファイルをダウンロード & アップロードする追加の権限が必要です。</string> - <string name="local_file_not_found_toast">ローカルファイルにファイルがありません</string> <string name="confirmation_remove_files_alert">本当に選択したものを削除しますか?</string> <string name="confirmation_remove_folders_alert">本当に 洗濯したアイテム およびそのコンテンツを削除してもよろしいですか?</string> - <string name="uploads_view_upload_status_waiting_for_charging">デバイスの充電を待機中</string> <string name="actionbar_search">検索</string> <string name="files_drop_not_supported">これはNextCloudの機能です。更新してください。</string> <string name="learn_more">もっと見る</string> <string name="drawer_folder_sync">自動アップロード</string> <string name="drawer_participate">参加する</string> - <string name="participate_testing_headline">テストを手伝ってください</string> - <string name="participate_testing_bug_text">バグがありましたか? なにか問題がありますか?</string> <string name="participate_testing_report_text">Githubでエラーを報告する</string> - <string name="participate_testing_version_text">次のバージョンのテストに興味がありますか?</string> <string name="participate_beta_headline">開発バージョンをテスト</string> - <string name="participate_beta_text">これは、すべての最新の機能が含まれており、非常に最先端です。 バグ/エラーが発生する可能性があります。もしその場合は、私たちに報告してください。</string> <string name="participate_release_candidate_headline">リリース候補</string> - <string name="participate_release_candidate_text">リリース候補(RC)は、今後のリリースのスナップショット であり、安定性が期待されます。 個々の設定をテストすることで、これを確実にすることができます。 Playストアでのテストに登録するか、F-Droidの「バージョン」セクションを手動で参照してください。</string> <string name="participate_contribute_headline">積極的な貢献</string> <string name="participate_contribute_irc_text">IRCでチャットに参加してください: <a href=\"%1$s\">#nextcloud-モバイル</a></string> <string name="participate_contribute_forum_text"><a href=\"%1$s\">フォーラム</a> で他の人を助けてください</string> <string name="participate_contribute_translate_text">アプリを <a href=\"%1$s\">翻訳する</a></string> - <string name="participate_contribute_github_text">開発者として貢献には、 <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> をご覧ください。</string> <string name="move_to">…に移動</string> <string name="copy_to">…にコピー</string> <string name="choose_remote_folder">… フォルダーを選択</string> <string name="folder_sync_loading_folders">… フォルダを読み込み中</string> <string name="folder_sync_no_results">メディアフォルダが見つかりませんでした</string> - <string name="folder_sync_preferences">自動アップロードの設定</string> <string name="folder_sync_settings">設定</string> - <string name="folder_sync_new_info">インスタントアップロードは完全に刷新されました。 メインメニューから自動アップロードを再設定してください。 ご迷惑をおかけして申し訳ありません。\n\n新しく拡張された自動アップロード機能をお楽しみください!</string> <string name="folder_sync_preferences_folder_path">%1$s の</string> <plurals name="items_selected_count"> <item quantity="other">%d選択されています。</item> @@ -577,7 +442,6 @@ <string name="notifications_no_results_headline">通知なし</string> <string name="notifications_no_results_message">後で確認してください。</string> - <string name="upload_file_dialog_title">アップロードファイル名とファイルタイプを入力</string> <string name="upload_file_dialog_filename">ファイル名</string> <string name="upload_file_dialog_filetype">ファイルタイプ</string> <string name="upload_file_dialog_filetype_snippet_text">スニペットテキストファイル(.txt)</string> @@ -593,8 +457,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">すべてのデータの安全なホーム</string> - <string name="welcome_feature_1_text">アクセス、共有&amp; 自宅や企業でファイルを保護する</string> - <string name="welcome_feature_2_title">マルチアカウント</string> <string name="welcome_feature_2_text">すべてのクラウドへ接続する</string> @@ -608,7 +470,6 @@ <!-- User information --> <string name="user_info_full_name">氏名</string> - <string name="user_info_email">メール</string> <string name="user_info_phone">電話番号</string> <string name="user_info_address">住所</string> <string name="user_info_website">ウェブサイト</string> @@ -618,24 +479,16 @@ <!-- Activities --> <string name="activities_no_results_headline">まだアクティビティはありません</string> - <string name="activities_no_results_message">このタイムラインには、いいね\n -追加、変更、共有が表示されます</string> <string name="webview_error">エラーが発生しました</string> <string name="prefs_category_about">アプリについて</string> - <string name="actionbar_contacts">アドレス帳バックアップ</string> - <string name="contacts_backup_button">今すぐバックアップ</string> <string name="contacts_restore_button">前回のバックアップを復元</string> <string name="contacts_header_restore">復元</string> <string name="contacts_header_backup">バックアップ</string> <string name="contacts_automatic_backup">アドレス帳バックアップ</string> <string name="contacts_last_backup">前回のバックアップ</string> - <string name="contacts_read_permission">アドレス帳の読み取りアクセス許可が必要です</string> - <string name="contacts_write_permission">アドレス帳の書き込みアクセス許可が必要です</string> <string name="contactlist_title">アドレス帳を復元</string> <string name="contaclist_restore_selected">選択したアドレス帳を復元</string> - <string name="contactlist_account_chooser_title">インポートするアカウントを選択</string> - <string name="contactlist_no_permission">アクセス許可がありません。インポートできません!</string> <string name="contacts_preference_choose_date">日付を選択</string> <string name="contacts_preference_backup_never">しない</string> <string name="contacts_preferences_no_file_found">ファイルが見つかりません</string> @@ -644,6 +497,4 @@ <!-- Notifications --> <string name="new_notification_received">新しい通知を受け取りました</string> - - -</resources> + </resources> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index cca06b033f..0015c79eff 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -59,15 +59,22 @@ <string name="prefs_calendar_contacts_summary">Sett opp DAVdroid (v1.3.0+) for nåværende konto</string> <string name="prefs_calendar_contacts_address_resolve_error">Tjeneradressen for kontoen ble ikke funnet for DAVdroid</string> <string name="prefs_calendar_contacts_no_store_error">Hverken F-droid eller Google play er installert</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Kalender & kontaktsynkronisering ble satt opp</string> <string name="prefs_help">Hjelp</string> <string name="prefs_recommend">Anbefal til en venn</string> <string name="prefs_feedback">Tilbakemelding</string> <string name="prefs_imprint">Avtrykk</string> - <string name="recommend_subject">Prøv %1$s på smarttelefonen din!</string> - <string name="auth_check_server">Sjekk tjener</string> + <string name="prefs_remember_last_share_location">Husk delt plassering</string> + <string name="prefs_remember_last_upload_location_summary">Husk sist delt plassering for opplasting</string> + + <string name="recommend_subject">Prøv %1$s på smarttelefonen din!</string> + <string name="recommend_text">Jeg ønsker å invitere deg til å bruke %1$s på smarttelefonen din!\nLast ned her: %2$s</string> + + <string name="auth_check_server">Sjekk tjener</string> <string name="auth_host_url">Tjeneradresse https://...</string> <string name="auth_username">Brukernavn</string> <string name="auth_password">Passord</string> + <string name="auth_register">Har du ingen tjener enda?\nKlikk her for å opprette en hos en tilbyder</string> <string name="sync_string_files">Filer</string> <string name="setup_btn_connect">Koble til</string> <string name="uploader_btn_upload_text">Last opp</string> @@ -89,19 +96,33 @@ <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Slett filen fra kildemappen</string> <string name="file_list_seconds_ago">for få sekunder siden</string> <string name="file_list_empty_headline">Ingen filer her</string> + <string name="file_list_empty">Last opp innhold eller synkroniser med enhetene dine.</string> + <string name="file_list_empty_favorites">Marker noen filer som favoritter eller synkroniser enhetene dine.</string> + <string name="file_list_empty_favorites_filter_list">Filer og mapper du markerer som favoritter vil vises her</string> + <string name="file_list_empty_favorites_filter">Din spørring returnerte ingen filer markert som favoritter.</string> <string name="file_list_loading">Laster…</string> + <string name="file_list_no_app_for_file_type">Ingen applikasjon funnet for filtypen.</string> <string name="local_file_list_empty">Det er ingen filer i denne mappen.</string> <string name="file_list_empty_headline_search">Ingen resultater i denne mappen</string> <string name="file_list_empty_headline_server_search">Ingen resultater</string> + <string name="file_list_empty_favorite_headline">Ingen favoritter ennå</string> <string name="file_list_empty_shared_headline">Ingenting delt enda</string> <string name="file_list_empty_shared">Filer og mapper som du deler vil bli vist her</string> <string name="file_list_empty_headline_server_search_videos">Ingen videoer</string> <string name="file_list_empty_headline_server_search_photos">Ingen bilder</string> + <string name="file_list_empty_search">Vil du prøve i en annen mappe?</string> + <string name="file_list_empty_recently_modified">Fant ingen filer endret de siste syv dagene</string> + <string name="file_list_empty_recently_modified_filter">Spørringen din returnerte ingen filer endret + de siste syv dagene.</string> <string name="file_list_empty_recently_added">Fant ingen nylig tillagte filer</string> <string name="file_list_empty_recently_added_filter">Søket ditt frambragte ingen nylig tillagte filer.</string> <string name="file_list_empty_text_photos">Last opp noen bilder eller aktiver automatisk opplasting.</string> <string name="file_list_empty_text_photos_filter">Ditt søk frambragte ingen bilder.</string> + <string name="file_list_empty_text_videos">Last opp noen videoer eller skru på automatisk opplasting.</string> + <string name="file_list_empty_text_videos_filter">Din spørring returnerte ingen vidoer!</string> <string name="upload_list_empty_headline">Ingen opplastinger tilgjengelig</string> + <string name="upload_list_empty_text">Last opp innhold eller aktiver umiddelbar opplasting.</string> + <string name="upload_list_empty_text_auto_upload">Last opp noe innhold eller aktiver automatisk opplasting!</string> <string name="file_list_folder">mappe</string> <string name="file_list_folders">mapper</string> <string name="file_list_file">fil</string> @@ -113,11 +134,14 @@ <string name="filedetails_modified">Endret:</string> <string name="filedetails_download">Last ned</string> <string name="filedetails_sync_file">Synkroniser</string> + <string name="filedetails_renamed_in_upload_msg">Filnavnet ble endret til %1$s under opplasting</string> + <string name="list_layout">Listevisning</string> <string name="action_share">Delt ressurs</string> <string name="common_yes">Ja</string> <string name="common_no">Nei</string> <string name="common_ok">Ok</string> <string name="common_remove_upload">Fjern opplasting</string> + <string name="common_retry_upload">Prøv å laste opp igjen.</string> <string name="common_cancel_sync">Avbryt synkronisering</string> <string name="common_cancel">Avbryt</string> <string name="common_back">Tilbake</string> @@ -157,7 +181,9 @@ <string name="uploads_view_upload_status_failed_localfile_error">Finner ikke lokal fil</string> <string name="uploads_view_upload_status_failed_permission_error">Tillatelsesfeil</string> <string name="uploads_view_upload_status_conflict">Konflikt</string> + <string name="uploads_view_upload_status_service_interrupted">Applikasjonen ble avsluttet</string> <string name="uploads_view_upload_status_unknown_fail">Ukjent feil</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Venter på trådløstilkobling</string> <string name="uploads_view_later_waiting_to_upload">Venter på å laste opp</string> <string name="downloader_download_in_progress_ticker">Laster ned …</string> <string name="downloader_download_in_progress_content">%1$d%% Laster ned %2$s</string> @@ -169,6 +195,8 @@ <string name="downloader_download_failed_credentials_error">Nedlasting mislyktes, du må logge inn på nytt</string> <string name="common_choose_account">Velg konto</string> <string name="sync_fail_ticker">Synkronisering feilet</string> + <string name="sync_fail_ticker_unauthorized">Synkronisering feilet, du må logge inn på nytt</string> + <string name="sync_fail_content">Synkronisering av %1$s kunne ikke fullføres</string> <string name="sync_fail_content_unauthorized">Feil passord for %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Konflikter funnet</string> <string name="sync_conflicts_in_favourites_content">%1$d hold-i-synk filer kunne ikke synkroniseres</string> @@ -176,11 +204,14 @@ <string name="sync_fail_in_favourites_content">Innholdet av %1$d filer kunne ikke synkroniseres (%2$d konflikter)</string> <string name="sync_foreign_files_forgotten_ticker">Noen lokale filer ble glemt</string> <string name="sync_foreign_files_forgotten_content">%1$d filer fra %2$s mappen kunne ikke kopieres til</string> + <string name="sync_foreign_files_forgotten_explanation">Fra versjon 1.3.16 blir filer som lastes opp fra denne enheten kopiert inn i den lokale mappen %1$s for å forhindre tap av data når samme fil synkroniseres med flere kontoer.\n\nPga. denne endringen ble alle filer som er blitt lastet opp med tidligere versjoner av denne appen, kopiert til mappe %2$s. Imidlertid kunne ikke denne kopieringen fullføres under konto-synkroniseringen pga. en feil. Du kan enten la filen(e) ligge der de ligger og fjerne lenken til %3$s, eller flytte filene til mappe %1$s og beholde lenken til %4$s.\n\nNedenfor finner du en liste over de lokale filene og de eksterne filene i %5$s som de var lenket til.</string> + <string name="sync_current_folder_was_removed">Mappen %1$s finnes ikke lengre</string> <string name="foreign_files_move">Flytt alle</string> <string name="foreign_files_success">Alle filer ble flyttet</string> <string name="foreign_files_fail">Noen filer kunne ikke fjernes</string> <string name="foreign_files_local_text">Lokal: %1$s</string> <string name="foreign_files_remote_text">Ekstern: %1$s</string> + <string name="upload_query_move_foreign_files">Det er ikke nok plass til å kopiere de valgte filene inn i mappen %1$s. Vil du flytte dem i stedet? </string> <string name="pass_code_enter_pass_code">Sett inn passordet ditt</string> <string name="pass_code_configure_your_pass_code">Skriv inn passordet ditt</string> @@ -198,7 +229,16 @@ <string name="media_event_done">%1$s avspilling avsluttet</string> <string name="media_err_nothing_to_play">Ingen mediafil funnet</string> <string name="media_err_no_account">Ingen konto angitt</string> + <string name="media_err_not_in_owncloud">Filen er ikke i en gyldig konto</string> <string name="media_err_unsupported">Ustøttet mediakodek</string> + <string name="media_err_io">Mediafilen kunne ikke leses</string> + <string name="media_err_malformed">Mediafilen er ikke riktig kodet</string> + <string name="media_err_timeout">Tidsavbrudd under avspillingsforsøk</string> + <string name="media_err_invalid_progressive_playback">Mediafilen kan ikke strømmes</string> + <string name="media_err_unknown">Mediafilen kan ikke spilles med forvalgt mediaspiller</string> + <string name="media_err_security_ex">Sikkerhetsfeil under avspilling av %1$s</string> + <string name="media_err_io_ex">Inndatafeil under avspilling av %1$s</string> + <string name="media_err_unexpected">Uventet feil under avspilling av %1$s</string> <string name="media_rewind_description">Spol tilbake</string> <string name="media_play_pause_description">Spill eller pause</string> <string name="media_forward_description">Spol fremover</string> @@ -210,22 +250,32 @@ <string name="auth_connection_established">Tilkobling opprettet</string> <string name="auth_testing_connection">Tester forbindelsen</string> <string name="auth_not_configured_title">Feil i tjenerkonfigurasjon</string> + <string name="auth_account_not_new">En konto for samme bruker og tjener finnes allerede på enheten</string> <string name="auth_account_not_the_same">Den innskrevne brukeren samsvarer ikke med brukeren av denne kontoen</string> <string name="auth_unknown_error_title">Ukjent feil oppstod!</string> <string name="auth_unknown_host_title">Fant ikke vert</string> + <string name="auth_incorrect_path_title">Finner ikke tjenerinstans</string> <string name="auth_timeout_title">Tjeneren brukte for lang tid på å svare</string> + <string name="auth_incorrect_address_title">Feil format på tjeneradresse</string> <string name="auth_ssl_general_error_title">Oppstart av SSL mislyktes</string> + <string name="auth_ssl_unverified_server_title">Kunne ikke verifisere SSL-tjenerens identitet</string> <string name="auth_bad_oc_version_title">Ukjent tjenerversjon</string> + <string name="auth_wrong_connection_title">Klarte ikke å opprette tilkobling</string> <string name="auth_secure_connection">Sikker tilkobling opprettet</string> <string name="auth_unauthorized">Feil brukernavn eller passord</string> <string name="auth_oauth_error">Mislykket autorisasjon</string> <string name="auth_oauth_error_access_denied">Tilgang nektet av autorisasjonstjener</string> + <string name="auth_wtf_reenter_URL">Uventet tilstand. Legg inn tjeneradressen på nytt</string> <string name="auth_expired_oauth_token_toast">Autorisasjonen din har gått ut. Autoriser igjen</string> <string name="auth_expired_basic_auth_toast">Legg inn nåværende passord</string> <string name="auth_expired_saml_sso_token_toast">Økta di har gått ut. Koble til igjen</string> + <string name="auth_connecting_auth_server">Kobler til autentiseringstjener...</string> <string name="auth_unsupported_auth_method">Tjeneren støtter ikke denne autorisasjonsmetoden</string> <string name="auth_unsupported_multiaccount">%1$s støtter ikke flere kontoer</string> + <string name="auth_fail_get_user_name">Tjeneren din svarer ikke med korrekt bruker-ID, vennligst ta kontakt med en administrator </string> <string name="auth_can_not_auth_against_server">Kan ikke autentisere mot denne tjeneren</string> + <string name="auth_account_does_not_exist">Kontoen eksisterer ikke på enheten enda</string> + <string name="favorite">Sett som tilgjengelig frakoblet</string> <string name="unfavorite">Fjern som tilgjengelig frakoblet</string> <string name="favorite_real">Sett som favoritt</string> @@ -233,26 +283,36 @@ <string name="common_rename">Endre navn</string> <string name="common_remove">Fjern</string> <string name="confirmation_remove_file_alert">Vil du virkelig fjerne %1$s?</string> + <string name="confirmation_remove_folder_alert">Vil du virkelig fjerne %1$s inkludert innholdet?</string> <string name="confirmation_remove_local">Kun lokalt</string> <string name="remove_success_msg">"Fjernet"</string> <string name="remove_fail_msg">Fjerning mislyktes</string> <string name="rename_dialog_title">Skriv inn et nytt navn</string> + <string name="rename_local_fail_msg">Lokal kopi kunne ikke endre navn; prøv et annet navn</string> + <string name="rename_server_fail_msg">Klarte ikke å endre navn</string> + <string name="sync_file_fail_msg">Eksterne filer kunne ikke sjekkes</string> <string name="sync_file_nothing_to_do_msg">filinnhold er allerede synkronisert</string> + <string name="create_dir_fail_msg">Mappe kunne ikke opprettes</string> <string name="filename_forbidden_characters">Forbudte tegn: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Filnavnet inneholder minst ett ulovlig tegn</string> <string name="filename_empty">Filnavn kan ikke være tomt</string> <string name="wait_a_moment">Vent et øyeblikk…</string> <string name="wait_checking_credentials">Sjekker lagrede påloggingsdetaljer</string> + <string name="filedisplay_unexpected_bad_get_content">Uventet problem; vennligst velg filen fra en annen applikasjon</string> + <string name="filedisplay_no_file_selected">Ingen fil ble valgt</string> <string name="activity_chooser_title">Send lenke til …</string> <string name="wait_for_tmp_copy_from_private_storage">Kopierer fil fra privat lager</string> <string name="oauth_check_onoff">Logg inn med oAuth2</string> + <string name="oauth_login_connection">Kobler til oAuth2 tjener...</string> + <string name="ssl_validator_header">Identiteten til siden kunne ikke bekreftes</string> <string name="ssl_validator_reason_cert_not_trusted">- Tjenerens sertifikat er ikke til å stole på</string> <string name="ssl_validator_reason_cert_expired">- Tjenerens sertifikat er utløpt</string> <string name="ssl_validator_reason_cert_not_yet_valid">- Tjenersertifikatets gyldige datoer er i fremtiden</string> <string name="ssl_validator_reason_hostname_not_verified">- Nettadressen samsvarer ikke med vertsnavnet i sertifikatet</string> <string name="ssl_validator_question">Vil du stole på dette sertifikatet likevel?</string> + <string name="ssl_validator_not_saved">Sertifikatet kunne ikke lagres</string> <string name="ssl_validator_btn_details_see">Detaljer</string> <string name="ssl_validator_btn_details_hide">Skjul</string> <string name="ssl_validator_label_subject">Utstedt til:</string> @@ -283,8 +343,12 @@ <string name="auto_upload_on_wifi">Bare last opp på Wi-Fi</string> <string name="instant_upload_on_wifi">Bare last opp bilder på Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Last kun opp filmer via Wi-Fi</string> + <string name="instant_video_upload_on_charging">Last kun opp under lading</string> + <string name="instant_upload_on_charging">Last kun opp under lading</string> <string name="instant_upload_path">/Direkteopplasting</string> <string name="conflict_title">Filkonflikt</string> + <string name="conflict_message">Hvilke filer ønsker du å beholder? Hvis du velger begge versjonene, får den lokale filen lagt til et tall i navnet.</string> <string name="conflict_keep_both">Behold begge</string> <string name="conflict_use_local_version">lokal versjon</string> <string name="conflict_use_server_version">tjenerversjon</string> @@ -300,6 +364,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Bruk undermapper</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Lagre filer i undermapper basert på år og måned</string> + <string name="share_link_no_support_share_api">Beklager, deling er ikke skrudd på for din tjener. Ta kontakt med administratoren.</string> <string name="share_link_file_no_exist">Kan ikke dele. Sjekk om filen eksisterer.</string> <string name="share_link_file_error">Det skjedde en feil under deling av denne filen eller mappen</string> <string name="unshare_link_file_no_exist">Kan ikke fjerne deling. Sjekk om filen eksisterer.</string> @@ -313,32 +378,57 @@ <string name="copy_link">Kopier lenke</string> <string name="clipboard_text_copied">Kopiert til utklippstavlen</string> + <string name="clipboard_no_text_to_copy">Ingen tekst ble mottatt for kopi til utklippstavlen</string> <string name="clipboard_uxexpected_error">Uventet feil ved kopiering til utklippstavle</string> <string name="clipboard_label">Teksten ble kopiert fra %1$s</string> + <string name="error_cant_bind_to_operations_service">Kritisk feil: Kan ikke utføre operasjonene</string> + + <string name="network_error_socket_exception">En feil oppstod ved oppretting av forbindelse til tjeneren.</string> + <string name="network_error_socket_timeout_exception">En feil oppstod ved venting på svar fra tjeneren. Operasjonen kunne ikke utføres</string> + <string name="network_error_connect_timeout_exception">En feil oppstod ved venting på svar fra tjeneren. Operasjonen kunne ikke utføres</string> + <string name="network_host_not_available">Operasjonen kunne ikke fullføres. Tjeneren er utilgjengelig</string> + + <string name="forbidden_permissions">Du har ikke tillatelse til %s</string> <string name="forbidden_permissions_rename">å gi denne filen nytt navn</string> <string name="forbidden_permissions_delete">å slette denne filen</string> <string name="share_link_forbidden_permissions">å dele denne filen</string> <string name="unshare_link_forbidden_permissions">å avslutte deling av denne filen</string> <string name="update_link_forbidden_permissions">å oppdatere denne delingen</string> + <string name="forbidden_permissions_create">å opprette filen</string> + <string name="uploader_upload_forbidden_permissions">å laste opp i denne mappen</string> <string name="downloader_download_file_not_found">Filen finnes ikke på tjeneren lenger</string> <string name="file_migration_dialog_title">Oppdaterer sti for lagring</string> <string name="file_migration_finish_button">Fullfør</string> + <string name="file_migration_preparing">Forebereder migrering…</string> <string name="file_migration_checking_destination">Sjekker mål…</string> + <string name="file_migration_saving_accounts_configuration">Lagrer kontokonfigurasjon…</string> + <string name="file_migration_waiting_for_unfinished_sync">Venter på uferdig synkronisering…</string> <string name="file_migration_migrating">Flytter data…</string> <string name="file_migration_updating_index">Oppdaterer index…</string> <string name="file_migration_cleaning">Rydder…</string> + <string name="file_migration_restoring_accounts_configuration">Gjenoppretter kontokonfigurasjon…</string> <string name="file_migration_ok_finished">Fullført</string> + <string name="file_migration_failed_not_enough_space">FEIL: Ikke nok plass</string> + <string name="file_migration_failed_not_writable">FEIL: Filen er skrivebeskyttet</string> + <string name="file_migration_failed_not_readable">FEIL: er ikke lesbar</string> <string name="file_migration_failed_dir_already_exists">FEIL: Nextcloudmappen finnes allerede</string> + <string name="file_migration_failed_while_coping">FEIL: Under migrering</string> + <string name="file_migration_failed_while_updating_index">FEIL: Under oppdatering av indeks</string> + + <string name="file_migration_directory_already_exists">Datamappe finnes fra før, hva skal gjøres?</string> <string name="file_migration_override_data_folder">Erstatt</string> <string name="file_migration_use_data_folder">Bruk</string> <string name="prefs_category_accounts">Kontoer</string> <string name="prefs_add_account">Legg til en konto</string> <string name="drawer_manage_accounts">Håndter kontoer</string> - <string name="actionbar_logger">Logger</string> + <string name="auth_redirect_non_secure_connection_title">Sikker tilkobling videresendes gjennom en usikker rute.</string> + + <string name="actionbar_logger">Logger</string> <string name="log_send_history_button">Send historikk </string> + <string name="log_send_no_mail_app">Fant inget program til forsendelse av logger. Installer e-post-program.</string> <string name="log_send_mail_subject">%1$s Android applikasjons-logger</string> <string name="log_progress_dialog_text">Laster data …</string> @@ -346,20 +436,27 @@ <string name="saml_authentication_wrong_pass">Feil passord</string> <string name="actionbar_move">Flytt</string> <string name="actionbar_copy">Kopier</string> + <string name="file_list_empty_moving">Ingenting her. Du kan legge til en mappe!</string> <string name="folder_picker_choose_button_text">Velg</string> + <string name="move_file_not_found">Kan ikke flytte. Sjekk om filen eksisterer.</string> + <string name="move_file_invalid_into_descendent">Det er ikke mulig å flytte en mappe inn i sin egen undermappe</string> + <string name="move_file_invalid_overwrite">Filen finnes allerede i målmappen</string> <string name="move_file_error">En feil oppstod ved flytting av denne filen eller mappen</string> <string name="forbidden_permissions_move">å flytte denne filen</string> <string name="copy_file_not_found">Kan ikke kopiere. Sjekk om filen eksisterer</string> + <string name="copy_file_invalid_into_descendent">Det er ikke mulig å kopiere en mappe inn i sin egen undermappe</string> + <string name="copy_file_invalid_overwrite">Filen finnes allerede i målmappen</string> <string name="copy_file_error">En feil oppstod ved kopiering av denne filen eller mappen</string> <string name="forbidden_permissions_copy">å kopiere denne filen</string> <string name="prefs_category_instant_uploading">Umiddelbare opplastinger</string> <string name="prefs_category_details">Detaljer</string> - <string name="sync_folder_failed_content">Synkronisering av %1$s mappe kunne ikke fullføres</string> + <string name="prefs_instant_video_upload_path_title">Mappe for umiddelbar opplasting av filmer</string> + <string name="sync_folder_failed_content">Synkronisering av %1$s mappe kunne ikke fullføres</string> <string name="shared_subject_header">delt</string> <string name="with_you_subject_header">med deg</string> @@ -400,6 +497,7 @@ <string name="share_add_user_or_group">Legg til bruker eller gruppe</string> <string name="share_via_link_section_title">Del lenke</string> <string name="share_via_link_expiration_date_label">Sett utløpsdato</string> + <string name="share_via_link_password_label">Passordbeskyttet</string> <string name="share_via_link_password_title">Sikret</string> <string name="share_via_link_edit_permission_label">Tillat redigering</string> <string name="share_via_link_hide_file_listing_permission_label">Skjul filliste</string> @@ -415,6 +513,7 @@ <string name="share_email_clarification">%1$s (e-post)</string> <string name="share_known_remote_clarification">%1$s ( hos %2$s )</string> + <string name="share_sharee_unavailable">Beklager, tjenerversjonen din tillater ikke klienter å dele med brukere. \nKontakt systemadministratoren</string> <string name="share_privilege_can_share">kan dele</string> <string name="share_privilege_can_edit">kan endre</string> <string name="share_privilege_can_edit_create">opprette</string> @@ -425,23 +524,35 @@ <string name="action_retry_uploads">Nytt forsøk mislyktes</string> <string name="action_clear_failed_uploads">Sletting feilet</string> + <string name="action_clear_successful_uploads">Sletting vellykket</string> + <string name="action_clear_finished_uploads">Slett alle ferdige</string> + <string name="action_switch_grid_view">Rutenett-visning</string> <string name="action_switch_list_view">Listevisning</string> <string name="manage_space_title">Håndter plass</string> + <string name="manage_space_description">Innstillinger, database og tjenersertifikater fra %1$s\'s filer vil bli slettet. \n\nNedlastede filer blir urørt.\n\nDette kan ta noe tid.</string> <string name="manage_space_clear_data">Nullstill data</string> <string name="manage_space_error">Noen filer kunne ikke fjernes.</string> + <string name="permission_storage_access">Flere tillatelser trengs for å laste opp & ned filer.</string> + <string name="local_file_not_found_toast">Filen ble ikke funnet i lokalt filsystem</string> <string name="confirmation_remove_files_alert">Vil du virkelig fjerne de valgte elementene?</string> <string name="confirmation_remove_folders_alert">Vil du virkelig fjerne de valgte elementene og dets innhold?</string> + <string name="uploads_view_upload_status_waiting_for_charging">Venter på lading av enhet.</string> <string name="actionbar_search">Søk</string> <string name="files_drop_not_supported">Dette er en Nextcloud funksjon, vennligst oppdater.</string> <string name="learn_more">Lær mer</string> <string name="drawer_folder_sync">Auto-opplasting</string> <string name="drawer_participate">Delta</string> + <string name="participate_testing_headline">Hjelp oss å teste</string> + <string name="participate_testing_bug_text">Funnet en feil? Føles noe rart?</string> <string name="participate_testing_report_text">Meld en feil på Github</string> + <string name="participate_testing_version_text">Er du interessert i å hjelpe oss å teste ned neste versjonen?</string> <string name="participate_beta_headline">Test utvikler-versjonen</string> + <string name="participate_beta_text">Dette inkluderer alle kommende funksjoner og er helt på kanten. Feil/feilmeldinger kan oppstå og i sådant fall, meld fra om dem til oss.</string> <string name="participate_release_candidate_headline">Release candidate</string> + <string name="participate_release_candidate_text">Release candidate (RC) er en pakke av den kommende utgaven og er forventet å være stabil. Ved å teste denne med ditt oppsett vil kunne hjelpe oss å sikre dette. Meld deg på for testen i Play butikken eller se i versjonsseksjonen i F-Droid.</string> <string name="participate_contribute_headline">Bidra aktivt</string> <string name="participate_contribute_irc_text">Delta i chat på IRC: <a href="%1$s">#nextcloud-mobile</a> </string> <string name="participate_contribute_forum_text">Hjelp andre på <a href="%1$s">forumet</a></string> @@ -451,7 +562,9 @@ <string name="choose_remote_folder">Velg mappe…</string> <string name="folder_sync_loading_folders">Laster inn mapper…</string> <string name="folder_sync_no_results">Ingen mediamapper funnet.</string> + <string name="folder_sync_preferences">Innstillinger for auto-opplasting</string> <string name="folder_sync_settings">Innstillinger</string> + <string name="folder_sync_new_info">Umiddelbar opplasting er fullstendig omarbeidet. Se hovedmenyen og konfigurer auto-opplasting på nytt. Beklager uleiligheten.\n\nTa i bruk de nye og utvidede mulighetene i auto-opplasting.</string> <string name="folder_sync_preferences_folder_path">For %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d valgt</item> @@ -465,6 +578,7 @@ <string name="notifications_no_results_headline">Ingen varsler</string> <string name="notifications_no_results_message">Kom innom senere og ta en titt.</string> + <string name="upload_file_dialog_title">Legg inn filnavn og -type for opplasting</string> <string name="upload_file_dialog_filename">Filnavn</string> <string name="upload_file_dialog_filetype">Filtype</string> <string name="upload_file_dialog_filetype_snippet_text">Textfil-snutt(.txt)</string> @@ -480,6 +594,8 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Et trygt hjem for alle dine data</string> + <string name="welcome_feature_1_text">Benytt, del & beskytt filene dine hjemme og i din bedrift</string> + <string name="welcome_feature_2_title">Multi-konto</string> <string name="welcome_feature_2_text">Foren alle skyene dine</string> @@ -503,17 +619,23 @@ <!-- Activities --> <string name="activities_no_results_headline">Ingen aktivitet enda</string> + <string name="activities_no_results_message">Denne strømmen vil vise hendelser som\nf.eks. innlegging, endring og deling</string> <string name="webview_error">Feil oppstod</string> <string name="prefs_category_about">Om</string> + <string name="actionbar_contacts">Sikkerhetskopiering av kontakter</string> + <string name="contacts_backup_button">Sikkerhetskopier nå</string> <string name="contacts_restore_button">Gjenopprett fra siste sikkerhetskopiering</string> <string name="contacts_header_restore">Gjenopprett</string> <string name="contacts_header_backup">Sikkerhetskopier</string> <string name="contacts_automatic_backup">Sikkerhetskopi av kontakter</string> <string name="contacts_last_backup">Siste sikkerhetskopi</string> + <string name="contacts_read_permission">Lesetilgang til kontaktliste trengs</string> + <string name="contacts_write_permission">Skrivetilgang til kontaktliste trengs</string> <string name="contactlist_title">Gjenopprett kontakter</string> <string name="contaclist_restore_selected">Gjenopprett valgte kontakter</string> <string name="contactlist_account_chooser_title">Velg konto å importere</string> + <string name="contactlist_no_permission">Ingen tilgang, ingenting importert!</string> <string name="contacts_preference_choose_date">Velg dato</string> <string name="contacts_preference_backup_never">aldri</string> <string name="contacts_preferences_no_file_found">Ingen fil funnet</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 32e7c2b4ae..91b44da6a9 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -59,13 +59,18 @@ <string name="prefs_calendar_contacts_summary">Skonfiguruj DAVdroid (v1.3.0+) dla obecnego konta</string> <string name="prefs_calendar_contacts_address_resolve_error">Adres serwera dla konta nie mógł został przekonwertowany do DAVdroid</string> <string name="prefs_calendar_contacts_no_store_error">F-droid i Google Play nie są zainstalowane</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Synchronizacja kontaktów & kalendarza została skonfigurowana pomyślnie</string> <string name="prefs_help">Pomoc</string> <string name="prefs_recommend">Poleć znajomemu</string> <string name="prefs_feedback">Opinie</string> <string name="prefs_imprint">Stopka</string> <string name="prefs_remember_last_share_location">Zapamiętaj położenie udostępnienia</string> - <string name="recommend_subject">Wypróbuj %1$s na swoim smartfonie!</string> - <string name="auth_check_server">Sprawdź serwer</string> + <string name="prefs_remember_last_upload_location_summary">Zapamiętaj ostatnią lokalizację wysyłania</string> + + <string name="recommend_subject">Wypróbuj %1$s na swoim smartfonie!</string> + <string name="recommend_text">Zapraszam do użycia %1$s na swoim smartfonie!\nŚciągnij tutaj: %2$s</string> + + <string name="auth_check_server">Sprawdź serwer</string> <string name="auth_host_url">Adres serwera https://...</string> <string name="auth_username">Nazwa użytkownika</string> <string name="auth_password">Hasło</string> @@ -105,6 +110,7 @@ <string name="file_list_empty_shared">Pliki i foldery, które współdzielisz pokażą się tutaj</string> <string name="file_list_empty_headline_server_search_videos">Brak plików wideo</string> <string name="file_list_empty_headline_server_search_photos">Brak zdjęć</string> + <string name="file_list_empty_search">Spróbować szukać w innym folderze?</string> <string name="file_list_empty_recently_modified">Nie znaleziono żadnych plików zmodyfikowanych w ciągu ostatnich 7 dni</string> <string name="file_list_empty_recently_modified_filter">Twoje wyszukiwanie nie zwróciło żądnych plików zmodyfikowanych w ciągu ostatnich 7 dni </string> <string name="file_list_empty_recently_added">NIe znaleziono żadnych ostatnio dodanych plików</string> @@ -128,6 +134,7 @@ <string name="filedetails_download">Pobierz</string> <string name="filedetails_sync_file">Synchronizuj</string> <string name="filedetails_renamed_in_upload_msg">Podczas wysyłania zmieniono nazwę pliku na %1$s</string> + <string name="list_layout">Wygląd listy</string> <string name="action_share">Udostępnij</string> <string name="common_yes">Tak</string> <string name="common_no">Nie</string> @@ -196,6 +203,7 @@ <string name="sync_fail_in_favourites_content">Zawartość %1$d plików nie może zostać synchronizowana (%2$d konfliktów)</string> <string name="sync_foreign_files_forgotten_ticker">Niektóre lokalne pliki zostały zgubione.</string> <string name="sync_foreign_files_forgotten_content">%1$d plików z folderu %2$s nie udało się się przekopiować</string> + <string name="sync_foreign_files_forgotten_explanation">Od wersji 1.3.16, pliki wysyłane z tego urządzenia są kopiowane do lokalnego folderu %1$s aby zapobiec utracie danych gdy pojedynczy plik jest synchronizowany z wieloma kontami.\n\nZ powodu tej zmiany, wszystkie pliki wysłane za pomocą poprzedniej wersji tej aplikacji były kopiowane do folderu %2$s. Jednakże, błąd uniemożliwiał dokończenie tej operacji podczas synchronizacji konta. Możesz albo pozostawić plik(i) tak jak jest i usunąć link do %3$s lub przenieść plik(i) do folderu %1$s i pozostawić link do %4$s.\n\nPoniżej plik(i) lokalny i plik(i) zdalny w %5$s, do którego zostały zlinkowane.</string> <string name="sync_current_folder_was_removed">Folder %1$s nie istnieje</string> <string name="foreign_files_move">Przenieś wszystko</string> <string name="foreign_files_success">Wszystkie pliki zostały przeniesione</string> @@ -220,6 +228,7 @@ <string name="media_event_done">%1$s odtwarzanie zakończone</string> <string name="media_err_nothing_to_play">Nie znaleziono plików multimedialnych</string> <string name="media_err_no_account">Nie znaleziono konta</string> + <string name="media_err_not_in_owncloud">Plik na nieprawidłowym koncie</string> <string name="media_err_unsupported">Nieobsługiwany kodek multimediów</string> <string name="media_err_io">NIe można odczytać pliku</string> <string name="media_err_malformed">Nieprawidłowe kodowanie pliku multimedialnego</string> @@ -240,6 +249,7 @@ <string name="auth_connection_established">Połączenie nawiązane</string> <string name="auth_testing_connection">Testowanie połączenia</string> <string name="auth_not_configured_title">Uszkodzona konfiguracja serwera</string> + <string name="auth_account_not_new">Konto tego samego użytkownika i serwera już istnieje na tym urządzeniu</string> <string name="auth_account_not_the_same">Podany login nie pasuje do użytkowników </string> <string name="auth_unknown_error_title">Wystąpił nieznany błąd!</string> <string name="auth_unknown_host_title">Nie znaleziono hosta</string> @@ -254,12 +264,14 @@ <string name="auth_unauthorized">Zła nazwa użytkownika lub hasło</string> <string name="auth_oauth_error">Nieudana autoryzacja</string> <string name="auth_oauth_error_access_denied">Dostęp zabroniony przez serwer autoryzacji</string> + <string name="auth_wtf_reenter_URL">Nieoczekiwany stan. Podaj ponownie adres serwera</string> <string name="auth_expired_oauth_token_toast">Twoja sesja wygasła. Proszę zaloguj się ponownie</string> <string name="auth_expired_basic_auth_toast">Podaj aktualne hasło</string> <string name="auth_expired_saml_sso_token_toast">Twoja sesja wygasła. Proszę zaloguj się ponownie</string> <string name="auth_connecting_auth_server">Łączenie z serwerem uwierzytelniania...</string> <string name="auth_unsupported_auth_method">Serwer nie obsługuje tej metody autoryzacji</string> <string name="auth_unsupported_multiaccount">%1$s nie wspiera wielu kont</string> + <string name="auth_fail_get_user_name">Twój serwer nie zwraca poprawnego identyfikatora użytkownika. Proszę skontaktuj się z administratorem.</string> <string name="auth_can_not_auth_against_server">Błąd autoryzacji na tym serwerze</string> <string name="auth_account_does_not_exist">Konto jeszcze nie istnieje na tym urządzeniu</string> @@ -365,6 +377,7 @@ <string name="copy_link">Skopiuj link</string> <string name="clipboard_text_copied">Skopiuj do schowka</string> + <string name="clipboard_no_text_to_copy">Nie odebrano tekstu, by skopiować go do schowka</string> <string name="clipboard_uxexpected_error">Wystąpił błąd podczas kopiowania do schowka</string> <string name="clipboard_label">Skopiowano tekst z %1$s</string> @@ -410,7 +423,9 @@ <string name="prefs_category_accounts">Konta</string> <string name="prefs_add_account">Dodaj konto</string> <string name="drawer_manage_accounts">Zarządzaj kontami</string> - <string name="actionbar_logger">Logi</string> + <string name="auth_redirect_non_secure_connection_title">Bezpieczne połączenie jest przekierowywane przez niezabezpieczone trasy.</string> + + <string name="actionbar_logger">Logi</string> <string name="log_send_history_button">Wyślij historię</string> <string name="log_send_no_mail_app">Brak aplikacji do wysyłania logów. Zainstaluj klienta poczty e-mail.</string> <string name="log_send_mail_subject">%1$s Logi aplikacji Android</string> @@ -497,6 +512,7 @@ <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( w %2$s )</string> + <string name="share_sharee_unavailable">Przepraszam, ale wersja twojego serwera nie pozwala na współdzielenie z użytkownikami poprzez klienta. \nProszę skontaktuj się z administratorem.</string> <string name="share_privilege_can_share">może współdzielić</string> <string name="share_privilege_can_edit">może edytować</string> <string name="share_privilege_can_edit_create">utwórz</string> @@ -514,6 +530,7 @@ <string name="action_switch_list_view">Widok listy</string> <string name="manage_space_title">Zarządzaj przestrzenią</string> + <string name="manage_space_description">Ustawienia, baza danych i certyfikaty serwera %1$s zostaną trwale skasowane.\n\nPobrane pliki pozostaną na swoich miejscach.\n\nTen proces zajmie trochę czasu.</string> <string name="manage_space_clear_data">Wyczyść dane</string> <string name="manage_space_error">Nie udało się usunąć niektórych plików.</string> @@ -527,13 +544,19 @@ <string name="learn_more">Dowiedz się więcej</string> <string name="drawer_folder_sync">Automatyczne przesyłanie</string> <string name="drawer_participate">Wspieraj</string> + <string name="participate_testing_headline">Pomóż nam testować</string> + <string name="participate_testing_bug_text">Znaleziono błąd? Jest coś dziwnego?</string> <string name="participate_testing_report_text">Zgłoś błąd na GitHubie</string> + <string name="participate_testing_version_text">Chcesz pomóc nam testować następną wersję?</string> <string name="participate_beta_headline">Sprawdź wersję rozwojową</string> + <string name="participate_beta_text">Zawiera to w sobie wszystkie nadchodzące funkcjonalności i jest bardzo ryzykowne. Mogą się pojawiać błędy. Jeśli będą proszę je do nas zgłosić.</string> <string name="participate_release_candidate_headline">Wydanie kandydujące</string> + <string name="participate_release_candidate_text">Release Candidate (RC) jest zarysem nadchodzącego wydania i oczekujemy że będzie stabilne. Testowanie indywidualnej konfiguracji może pomóc, aby to zapewnić. Zapisz się do testowania w sklepie Play lub ręcznie szukaj w sekcji \"wersje\" na F-Droid.</string> <string name="participate_contribute_headline">Aktywni członkowie projektu</string> <string name="participate_contribute_irc_text">Dołącz do chatu (IRC): <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Pomóż innym na <a href="%1$s">forum</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Tłumacz</a> aplikację</string> + <string name="participate_contribute_github_text">Wspomóż nas jako programista, po więcej szczegółów odwiedź <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a></string> <string name="move_to">Przenieś do…</string> <string name="copy_to">Skopiuj do…</string> <string name="choose_remote_folder">Wybierz folder…</string> @@ -541,6 +564,7 @@ <string name="folder_sync_no_results">Nie znaleziono folderów multimedialnych.</string> <string name="folder_sync_preferences">Preferencje automatycznego wysyłania</string> <string name="folder_sync_settings">Ustawienia</string> + <string name="folder_sync_new_info">Natychmiastowe wysyłanie zostało kompletnie zmienione. Proszę sprawdzić główne menu i zrekonfigurować automatyczne wysyłanie. Przepraszamy za niedogodności.\n\nCiesz się z nowych i rozbudowanych możliwości automatycznego wysyłania!</string> <string name="folder_sync_preferences_folder_path">Dla %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d zaznaczony</item> @@ -597,6 +621,7 @@ <!-- Activities --> <string name="activities_no_results_headline">Brak aktywności</string> + <string name="activities_no_results_message">Ten strumień pokaże zdarzenia jak\ndodatki, zmiany & udziały</string> <string name="webview_error">Wystąpił błąd</string> <string name="prefs_category_about">O aplikacji</string> diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index cc8230367c..b212a90dfc 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -78,12 +78,10 @@ <string name="file_list_empty_headline">Këtu nuk ka asnjë skedar</string> <string name="file_list_empty">Ngarko disa të dhëna ose sinkronizo me pajisjet e tua!</string> <string name="file_list_loading">Po ngarkohet…</string> - <string name="file_list_no_app_for_file_type">S’u gjet aplikacion për llojin e kartelës!</string> <string name="local_file_list_empty">Në këtë dosje s’ka skedar.</string> <string name="file_list_empty_headline_search">Nuk ka rezultate në këtë dosje</string> <string name="file_list_empty_search">Përpiquni të shikoni në një dosje tjetër</string> <string name="upload_list_empty_headline">Nuk ka asnjë ngarkim në gjëndje</string> - <string name="upload_list_empty_text">Ngarko disa të dhëna ose aktivizo ngarkimin e menjëhershëm!</string> <string name="file_list_folder">dosje</string> <string name="file_list_folders">dosje</string> <string name="file_list_file">Skedar</string> @@ -313,6 +311,8 @@ <string name="conflict_use_server_version">versionin e shërbyesit</string> <string name="preview_image_description">Parapamje figure</string> + <string name="preview_image_error_unknown_format">Kjo figurë nuk mund të shfaqet</string> + <string name="error__upload__local_file_not_copied">%1$s s\’u kopjua dot te dosja vendore %2$s</string> <string name="prefs_instant_upload_path_title">Dosja e ngarkimit të çastit </string> <string name="prefs_folder_sync_local_path_title">Dosje vendore</string> @@ -344,6 +344,7 @@ <string name="network_error_socket_timeout_exception">Ndodhi një gabim teksa po pritej për serverin, veprimi s\’u krye dot</string> <string name="network_error_connect_timeout_exception">Ndodhi një gabim teksa po pritej për serverin, veprimi s\'u krye dot</string> <string name="network_host_not_available">Veprimi s\'u plotësua dot, serveri është i pakapshëm</string> + <string name="forbidden_permissions">Nuk keni leje %s</string> <string name="forbidden_permissions_rename">për riemërtim të këtij skedari</string> <string name="forbidden_permissions_delete">për fshirje të kësaj kartele</string> @@ -391,7 +392,7 @@ <string name="saml_authentication_wrong_pass">Fjalëkalim i gabuar</string> <string name="actionbar_move">Zhvendose</string> <string name="actionbar_copy">Kopjoni</string> - <string name="file_list_empty_moving">S\’ka gjë këtu. Mund të shtoni një dosje!</string> + <string name="file_list_empty_moving">S\’ka gjë këtu. Mund të shtoni një dosje.</string> <string name="folder_picker_choose_button_text">Zgjidhni</string> <string name="move_file_not_found">S\’arrin të zhvendosë. Ju lutemi, kontrolloni nëse ekziston apo jo skedari</string> @@ -490,7 +491,7 @@ <string name="manage_space_clear_data">Pastroji të dhënat</string> <string name="manage_space_error">Ca kartela s’u fshinë dot.</string> - <string name="permission_storage_access">Që të ngarkoni & shkarkoni skedar kërkohen leje shtesë.</string> + <string name="permission_storage_access">Që të ngarkoni & shkarkoni skedar kërkohen leje shtesë.</string> <string name="local_file_not_found_toast">Skedari s’u gjet te sistemi vendor i skedarëve</string> <string name="confirmation_remove_files_alert">Doni vërtetë të hiqni artikujt e zgjedhur?</string> <string name="confirmation_remove_folders_alert">Doni vërtet të hiqni artikujt e zgjedhur dhe përmbajtjen e tyre?</string> @@ -504,13 +505,13 @@ <string name="participate_testing_bug_text">Gjetet një defekt? Diçka është e çuditshme?</string> <string name="participate_testing_report_text">Raportoni një problem në Github</string> <string name="participate_testing_version_text">Jeni të interesuar për të na ndihmuar në testimin e versionit të ardhshëm?</string> + <string name="participate_beta_headline">Testoni versionin Beta</string> <string name="participate_release_candidate_headline">Lëshimi i kandidatit</string> <string name="participate_release_candidate_text">Lëshimi i kandidatit (RC) është një fragment i lëshimit të ardhshme dhe pritet të jetë i qëndrueshëm. Testimi i setup-it tuaj individuale mund të ndihmojë për ta siguruar këtë. Regjistrohuni për testimin në Play Store ose manualisht shikoni në seksionin \"versionet\" në F-Droid.</string> <string name="participate_contribute_headline">Kontribim aktiv</string> <string name="participate_contribute_irc_text">Bashkohu në bisedat në IRC: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Ndihmo të tjerët në <a href="%1$s">forum</a></string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Përktheni</a> aplikacionin</string> - <string name="participate_contribute_github_text">Kontriboni si një zhvillues, shih<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> për detaje</string> <string name="move_to">Levizni tek…</string> <string name="copy_to">Kopjojeni tek…</string> <string name="choose_remote_folder">Zgjidh dosjen…</string> @@ -525,7 +526,6 @@ <item quantity="other">%d të përzgjedhura</item> </plurals> - <string name="upload_file_dialog_title">Vendos emrin dhe tipin e dokumentit të aploduar </string> <string name="upload_file_dialog_filename">Emri dokumentit</string> <string name="upload_file_dialog_filetype">Tipi dokumentit</string> <string name="upload_file_dialog_filetype_snippet_text">Skedar elementi tekst(.txt)</string> @@ -541,8 +541,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Një shtëpi e sigurt për të gjitha të dhënat tuaja</string> - <string name="welcome_feature_1_text">Akseso, ndaj & mbro skedarët e tuaja në shtëpinë dhe organizatën tuaj.</string> - <string name="welcome_feature_2_title">Llogari e shumfishtë</string> <string name="welcome_feature_2_text">Lidhuni me të gjitha shërbimet cloud</string> From 9cf326d44ec7c31515fd7ef9018d545130351371 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Thu, 4 May 2017 08:47:51 +0000 Subject: [PATCH 857/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 4 +- src/main/res/values-nb-rNO/strings.xml | 4 +- src/main/res/values-pl/strings.xml | 2 +- src/main/res/values-ru/strings.xml | 136 ++++--------------------- src/main/res/values-sq/strings.xml | 2 +- 5 files changed, 24 insertions(+), 124 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 254c9d7633..ff2db1ea86 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -594,7 +594,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Μια ασφαλής τοποθεσία για όλα σας τα δεδομένα</string> - <string name="welcome_feature_1_text">Πρόσβαση, διαμοιρασμός & προστασία των αρχείων σας στο σπίτι και στην εταιρία σας</string> + <string name="welcome_feature_1_text">Πρόσβαση, διαμοιρασμός και προστασία των αρχείων σας στο σπίτι και στην εταιρία σας</string> <string name="welcome_feature_2_title">Πολλαπλός λογαριασμός</string> <string name="welcome_feature_2_text">Σύνδεση με όλα τα clouds σας</string> @@ -619,7 +619,7 @@ <!-- Activities --> <string name="activities_no_results_headline">Καμία δραστηριότητα ακόμα</string> - <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές & κοινόχρηστα</string> + <string name="activities_no_results_message">Σε αυτήν τη ροή θα εμφανιστούν γενονότα όπως\nπροσθήκες, αλλαγές και κοινόχρηστα</string> <string name="webview_error">Παρουσιάστηκε σφάλμα</string> <string name="prefs_category_about">Περί</string> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 0015c79eff..5122b3acac 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -535,7 +535,7 @@ <string name="manage_space_clear_data">Nullstill data</string> <string name="manage_space_error">Noen filer kunne ikke fjernes.</string> - <string name="permission_storage_access">Flere tillatelser trengs for å laste opp & ned filer.</string> + <string name="permission_storage_access">Flere tillatelser trengs for å laste opp og ned filer.</string> <string name="local_file_not_found_toast">Filen ble ikke funnet i lokalt filsystem</string> <string name="confirmation_remove_files_alert">Vil du virkelig fjerne de valgte elementene?</string> <string name="confirmation_remove_folders_alert">Vil du virkelig fjerne de valgte elementene og dets innhold?</string> @@ -594,7 +594,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Et trygt hjem for alle dine data</string> - <string name="welcome_feature_1_text">Benytt, del & beskytt filene dine hjemme og i din bedrift</string> + <string name="welcome_feature_1_text">Benytt, del og beskytt filene dine hjemme og i din bedrift</string> <string name="welcome_feature_2_title">Multi-konto</string> <string name="welcome_feature_2_text">Foren alle skyene dine</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 91b44da6a9..21aa3c2fe4 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -621,7 +621,7 @@ <!-- Activities --> <string name="activities_no_results_headline">Brak aktywności</string> - <string name="activities_no_results_message">Ten strumień pokaże zdarzenia jak\ndodatki, zmiany & udziały</string> + <string name="activities_no_results_message">Ten strumień pokaże zdarzenia jak\ndodatki, zmiany i udziały</string> <string name="webview_error">Wystąpił błąd</string> <string name="prefs_category_about">O aplikacji</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 2160b8de18..a9a18ed4f3 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -46,10 +46,6 @@ <string name="prefs_fingerprint">Блокировка отпечатком пальца</string> <string name="prefs_fingerprint_notsetup">Отпечатки не были настроены.</string> <string name="prefs_show_hidden_files">Показать скрытые файлы</string> - <string name="prefs_instant_upload">Моментальная загрузка изображений</string> - <string name="prefs_instant_upload_summary">Немедленно загружать изображения, сделанные камерой</string> - <string name="prefs_instant_video_upload">Моментальная загрузка видео</string> - <string name="prefs_instant_video_upload_summary">Немедленно загружать видео, сделанные камерой</string> <string name="prefs_log_title">Включить журналирование</string> <string name="prefs_log_summary">Используется для регистрации ошибок</string> <string name="prefs_log_title_history">История журналирования</string> @@ -58,25 +54,14 @@ <string name="prefs_calendar_contacts">Синхронизировать календарь и контакты</string> <string name="prefs_calendar_contacts_summary">Настроить DAVdroid (v1.3.0+) для текущего аккаунта</string> <string name="prefs_calendar_contacts_address_resolve_error">Не удается определить адрес сервера для DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">Не установлен магазин Google Play или приложение F-Droid</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Настройка синхронизации календаря и контактов выполнена успешно.</string> <string name="prefs_help">Помощь</string> - <string name="prefs_recommend">Рекомендовать другу</string> <string name="prefs_feedback">Обратная связь</string> <string name="prefs_imprint">Штамп</string> - <string name="prefs_remember_last_share_location">Запомнить расположение общего ресурса</string> - <string name="prefs_remember_last_upload_location_summary">Запомнить расположение последней загрузки</string> - - <string name="recommend_subject">Попробуйте %1$s на вашем смартфоне!</string> - <string name="recommend_text">Хочу предложить вам использовать %1$s на смартфоне!\nЗагрузить можно здесь: %2$s - </string> - - <string name="auth_check_server">Проверить сервер</string> + <string name="recommend_subject">Попробуйте %1$s на вашем смартфоне!</string> + <string name="auth_check_server">Проверить сервер</string> <string name="auth_host_url">Адрес сервера https://...</string> <string name="auth_username">Имя пользователя</string> <string name="auth_password">Пароль</string> - <string name="auth_register">Нет сервера? -Нажмите здесь чтобы получить от провайдера</string> <string name="sync_string_files">Файлы</string> <string name="setup_btn_connect">Подключиться</string> <string name="uploader_btn_upload_text">Загрузить</string> @@ -88,43 +73,21 @@ <string name="uploader_error_title_no_file_to_upload">Нет файла для загрузки</string> <string name="uploader_error_message_received_piece_of_text">%1$s не удается загрузить часть текста как файл.</string> <string name="uploader_error_message_no_file_to_upload">Принятые данные не содержат исправный файл.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">Файл не может быть загружен</string> <string name="uploader_error_message_read_permission_not_granted">%1$s не позволено читать принятый файл</string> - <string name="uploader_error_message_source_file_not_found">Файл для загрузки не был найден в положенном месте. Пожалуйста проверьте, существует ли файл.</string> - <string name="uploader_error_message_source_file_not_copied">Произошла ошибка во время копирования этого файла во временный каталог. Пожалуйста попробуйте отправить его заново.</string> <string name="uploader_upload_files_behaviour">Настройка загрузки:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Перемещать файл в папку Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Сохранять файл в исходном каталоге</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Удалять файл из исходного каталога</string> <string name="file_list_seconds_ago">несколько секунд назад</string> - <string name="file_list_empty_headline">Здесь нет файлов</string> - <string name="file_list_empty">Загрузите что-нибудь или синхронизируйте со своими устройствами!</string> - <string name="file_list_empty_favorites">Добавьте файлы в избранное или синхнонизируйте со своими устройствами!</string> - <string name="file_list_empty_favorites_filter_list">Здесь появятся файлы и каталоги, отмеченные как избранные</string> - <string name="file_list_empty_favorites_filter">По запросу избранных файлов не найдено</string> <string name="file_list_loading">Загрузка…</string> - <string name="file_list_no_app_for_file_type">Приложение для этого типа файла не найдено!</string> <string name="local_file_list_empty">В этом каталоге нет файлов.</string> <string name="file_list_empty_headline_search">В этой папке результатов не найдено</string> <string name="file_list_empty_headline_server_search">Результаты отсутствуют</string> - <string name="file_list_empty_favorite_headline">Избранного ещё нет</string> <string name="file_list_empty_shared_headline">Вы ещё ничем не поделились</string> <string name="file_list_empty_shared">Здесь появятся файлы и каталоги, которыми вы поделитесь</string> <string name="file_list_empty_headline_server_search_videos">Видео отсуствуют</string> <string name="file_list_empty_headline_server_search_photos">Фотографии отсутствуют</string> - <string name="file_list_empty_search">Искать в другом каталоге?</string> - <string name="file_list_empty_recently_modified">Не найдно файлов, изменённых за последние 7 дней</string> - <string name="file_list_empty_recently_modified_filter">По запросу не найдно файлов, -изменённых за последние 7 дней!</string> - <string name="file_list_empty_recently_added">Не найдено файлов, добавленных недавно</string> - <string name="file_list_empty_recently_added_filter">По запросу не найдено файлов, добавленных недавно!</string> - <string name="file_list_empty_text_photos">Загрузите фотографии или включите автоматическую загрузку!</string> - <string name="file_list_empty_text_photos_filter">По запросу фото не найдено!</string> - <string name="file_list_empty_text_videos">Загрузите видео или включите автоматическую загрузку!</string> - <string name="file_list_empty_text_videos_filter">По запросу видео–файлов не найдено!</string> <string name="upload_list_empty_headline">Нет доступных загрузок</string> - <string name="upload_list_empty_text">Загрузите что-нибудь или включите моментальную загрузку!</string> - <string name="upload_list_empty_text_auto_upload">Загрузите что-нибудь или включите автоматическую загрузку!</string> <string name="file_list_folder">каталог</string> <string name="file_list_folders">каталоги</string> <string name="file_list_file">файл</string> @@ -136,14 +99,11 @@ <string name="filedetails_modified">Изменён:</string> <string name="filedetails_download">Скачать</string> <string name="filedetails_sync_file">Синхронизировать</string> - <string name="filedetails_renamed_in_upload_msg">Файл был переименован в %1$s во время загрузки</string> - <string name="list_layout">Вид списка</string> <string name="action_share">Поделиться</string> <string name="common_yes">Да</string> <string name="common_no">Нет</string> <string name="common_ok">ОК</string> <string name="common_remove_upload">Удалить загрузку</string> - <string name="common_retry_upload">Повторить загрузку</string> <string name="common_cancel_sync">Отменить синхронизацию</string> <string name="common_cancel">Отменить</string> <string name="common_back">Назад</string> @@ -163,10 +123,8 @@ <string name="uploader_info_dirname">Имя каталога</string> <string name="uploader_upload_in_progress_ticker">Загружается …</string> <string name="uploader_upload_in_progress_content">%1$d%% Загружается %2$s</string> - <string name="uploader_upload_succeeded_ticker">Загрузка завершена</string> <string name="uploader_upload_succeeded_content_single">%1$s загружено</string> <string name="uploader_upload_failed_ticker">Сбой при загрузке</string> - <string name="uploader_upload_failed_content_single">Загрузка %1$s не может быть завершена</string> <string name="uploader_upload_failed_credentials_error">Загрузка не удалась, вам необходимо войти повторно.</string> <string name="uploads_view_title">Загрузки</string> <string name="uploads_view_group_current_uploads">Текущие</string> @@ -183,30 +141,22 @@ <string name="uploads_view_upload_status_failed_localfile_error">Локальный файл не найден</string> <string name="uploads_view_upload_status_failed_permission_error">Ошибка прав доступа</string> <string name="uploads_view_upload_status_conflict">Конфликт</string> - <string name="uploads_view_upload_status_service_interrupted">Работа приложения была прекращена</string> <string name="uploads_view_upload_status_unknown_fail">Неизвестная ошибка</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Ожидание WiFi-соединения</string> <string name="uploads_view_later_waiting_to_upload">Ожидание загрузки</string> <string name="downloader_download_in_progress_ticker">Скачивается …</string> <string name="downloader_download_in_progress_content">%1$d%% Скачивается %2$s</string> - <string name="downloader_download_succeeded_ticker">Скачивание завершено</string> <string name="downloader_download_succeeded_content">%1$s скачано</string> <string name="downloader_download_failed_ticker">Сбой при скачивании</string> - <string name="downloader_download_failed_content">Скачивание %1$s не может быть завершено</string> <string name="downloader_not_downloaded_yet">Ещё не скачано</string> <string name="downloader_download_failed_credentials_error">Сбой при скачивании, вам необходимо войти повторно</string> <string name="common_choose_account">Выберите аккаунт</string> <string name="sync_fail_ticker">Сбой при синхронизации</string> - <string name="sync_fail_ticker_unauthorized">Сбой при синхронизации не удалась, вам нужно войти повторно</string> - <string name="sync_fail_content">Синхронизация %1$s не может быть завершена</string> - <string name="sync_fail_content_unauthorized">Неверный пароль для %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Обнаружены конфликты</string> <string name="sync_conflicts_in_favourites_content">%1$d файлов не может быть синхронизировано</string> <string name="sync_fail_in_favourites_ticker">Не удалось синхронизировать файлы</string> <string name="sync_fail_in_favourites_content">Содержимое %1$d файлов не может быть синхронизировано (конфликтов: %2$d)</string> <string name="sync_foreign_files_forgotten_ticker">Некоторые загруженные файлы не были перенесены в локальную папку </string> <string name="sync_foreign_files_forgotten_content">Не удалось скопировать %1$d файлов из каталога %2$s в</string> - <string name="sync_foreign_files_forgotten_explanation">Начиная с версии 1.3.16, файлы, загружаемые с этого устройства, копируются в локальный каталог %1$s, чтобы предотвратить потерю данных при синхронизации файла с несколькими учётными записями.\n\nПоэтому все файлы, загруженные предыдущими версиями данного приложения, были скопированы в каталог %2$s. Однако, во время синхронизации что-то помешало завершить эту операцию. Можете оставить файлы как есть и удалить ссылку на %3$s, либо переместить их в %1$s и сохранить ссылку на %4$s.\n\nНиже перечислены локальные файлы, и соответствующие им удалённые файлы в %5$s, к которым они привязаны.</string> <string name="sync_current_folder_was_removed">Каталог %1$s больше не существует</string> <string name="foreign_files_move">Переместить всё</string> <string name="foreign_files_success">Все файлы были перемещены</string> @@ -260,7 +210,7 @@ <string name="auth_timeout_title">Сервер слишком долго не отвечает</string> <string name="auth_incorrect_address_title">Неправильный формат адреса сервера</string> <string name="auth_ssl_general_error_title">Ошибка инициализации SSL</string> - <string name="auth_ssl_unverified_server_title">Невозможно убедиться в SSL подлинности сервера</string> + <string name="auth_ssl_unverified_server_title">Невозможно проверить SSL подлинность сервера</string> <string name="auth_bad_oc_version_title">Неизвестная версия сервера</string> <string name="auth_wrong_connection_title">Не удается установить соединение</string> <string name="auth_secure_connection">Защищённое соединение установлено</string> @@ -287,26 +237,26 @@ <string name="confirmation_remove_file_alert">Вы действительно хотите удалить %1$s?</string> <string name="confirmation_remove_folder_alert">Вы действительно хотите удалить %1$s и его содержимое?</string> <string name="confirmation_remove_local">Только локально</string> - <string name="remove_success_msg">Удаление завершено</string> + <string name="remove_success_msg">«Удалено»</string> <string name="remove_fail_msg">Сбой удаления</string> <string name="rename_dialog_title">Введите новое имя</string> - <string name="rename_local_fail_msg">Локальная копия не может быть переименована; попробуйте другое имя</string> - <string name="rename_server_fail_msg">Переименование не может быть завершено</string> - <string name="sync_file_fail_msg">Удалённый файл не может быть проверен</string> + <string name="rename_local_fail_msg">«Локальная копия не может быть переименована; попробуйте другое имя»</string> + <string name="rename_server_fail_msg">«Не удалось переименовать сервер»</string> + <string name="sync_file_fail_msg">Файл на сервере не может быть проверен</string> <string name="sync_file_nothing_to_do_msg">Содержимое файла уже синхронизировано</string> <string name="create_dir_fail_msg">Не удалось создать каталог</string> <string name="filename_forbidden_characters">Недопустимые символы: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">Имя файла содержит по крайней мере один некорректный символ</string> <string name="filename_empty">Имя файла не может быть пустым</string> - <string name="wait_a_moment">Подождите немного</string> + <string name="wait_a_moment">Подождите немного…</string> <string name="wait_checking_credentials">Проверка сохранённых реквизитов учётных данных</string> - <string name="filedisplay_unexpected_bad_get_content">Неизвестная ошибка; выберите этот файл из другого приложения</string> + <string name="filedisplay_unexpected_bad_get_content">«Неизвестная ошибка. Выберите этот файл из другого приложения»</string> <string name="filedisplay_no_file_selected">Файлы не выбраны</string> <string name="activity_chooser_title">Отправить ссылку …</string> <string name="wait_for_tmp_copy_from_private_storage">Копирование файла из частного хранилища</string> <string name="oauth_check_onoff">Войти через oAuth2</string> - <string name="oauth_login_connection">Подключение к серверу oAuth2...</string> + <string name="oauth_login_connection">Подключение к серверу OAuth2…</string> <string name="ssl_validator_header">Подлинность сайта не может быть проверена</string> <string name="ssl_validator_reason_cert_not_trusted">- Сертификат сервера не является доверенным</string> @@ -343,14 +293,14 @@ <string name="placeholder_timestamp">2012/05/18 12:23</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Загружать только через wifi</string> + <string name="auto_upload_on_wifi">Загружать только через Wi-Fi</string> <string name="instant_upload_on_wifi">Загружать изображения только через Wi-Fi</string> <string name="instant_video_upload_on_wifi">Загружать видео только через Wi-Fi</string> <string name="instant_video_upload_on_charging">Загружать только при зарядке</string> <string name="instant_upload_on_charging">Загружать только при зарядке</string> <string name="instant_upload_path">/Автозагрузка</string> <string name="conflict_title">Конфликт файлов</string> - <string name="conflict_message">Какие файлы Вы хотите сохранить? При выборе обеих версий, к названию локального файла будет добавлена цифра.</string> + <string name="conflict_message">Какие файлы вы хотите сохранить? Если вы выберете обе версии, локальный файл будет иметь номер, добавленный к его имени.</string> <string name="conflict_keep_both">Сохранить оба</string> <string name="conflict_use_local_version">локальная версия</string> <string name="conflict_use_server_version">версия сервера</string> @@ -366,7 +316,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Использовать подкаталоги</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Хранить в них, учитывая год и месяц</string> - <string name="share_link_no_support_share_api">Механизм общего доступа не включен на данном сервере. Пожалуйста, свяжитесь с вашим администратором.</string> + <string name="share_link_no_support_share_api">Возможность предоставления общего доступа не включена на сервере. Пожалуйста, свяжитесь с вашим администратором.</string> <string name="share_link_file_no_exist">Невозможно поделиться. Убедитесь, что файл существует</string> <string name="share_link_file_error">При попытке поделиться этим файлом или каталогом произошла ошибка</string> <string name="unshare_link_file_no_exist">Невозможно закрыть доступ. Убедитесь что файл существует</string> @@ -380,16 +330,11 @@ <string name="copy_link">Копировать ссылку</string> <string name="clipboard_text_copied">Скопировано в буфер обмена</string> - <string name="clipboard_no_text_to_copy">Нет принятого текста для копирования в буфер обмена</string> <string name="clipboard_uxexpected_error">Неожиданная ошибка во время копирования в буфер обмена</string> <string name="clipboard_label">Текст скопирован из %1$s</string> <string name="error_cant_bind_to_operations_service">Критическая ошибка: невозможно выполнить действия</string> - <string name="network_error_socket_exception">При подключении к серверу возникла ошибка</string> - <string name="network_error_socket_timeout_exception">Во время ожидания сервера произошла ошибка, действие не может быть завершено</string> - <string name="network_error_connect_timeout_exception">Во время ожидания сервера произошла ошибка, действие не может быть завершено</string> - <string name="network_host_not_available">Действие не может быть завершено, сервер недоступен</string> <string name="forbidden_permissions">У вас нет права доступа %s</string> <string name="forbidden_permissions_rename">для переименования этого файла</string> <string name="forbidden_permissions_delete">для удаления этого файла</string> @@ -415,21 +360,14 @@ <string name="file_migration_failed_not_writable">ОШИБКА: Файл недоступен для записи</string> <string name="file_migration_failed_not_readable">ОШИБКА: Файл не доступен для чтения</string> <string name="file_migration_failed_dir_already_exists">ОШИБКА: Каталог Nextcloud уже существует</string> - <string name="file_migration_failed_while_coping">ОШИБКА: При миграции</string> - <string name="file_migration_failed_while_updating_index">ОШИБКА: При обновлении индекса</string> - - <string name="file_migration_directory_already_exists">Каталог с данными уже существует. Что делать?</string> - <string name="file_migration_override_data_folder">Перезаписать</string> - <string name="file_migration_use_data_folder">Использовать существующий</string> + <string name="file_migration_failed_while_coping">ОШИБКА: Ошибка при миграции</string> + <string name="file_migration_failed_while_updating_index">ОШИБКА: Ошибка при обновлении индекса</string> <string name="prefs_category_accounts">Аккаунты</string> <string name="prefs_add_account">Добавить аккаунт</string> <string name="drawer_manage_accounts">Управление аккаунтами</string> - <string name="auth_redirect_non_secure_connection_title">Безопасное соединение перенаправлено через небезопасный маршрут.</string> - - <string name="actionbar_logger">Журналы</string> + <string name="actionbar_logger">Журналы</string> <string name="log_send_history_button">Отправить историю</string> - <string name="log_send_no_mail_app">Программа для отправки журналов не найдена. Установите приложение для работы с почтой.</string> <string name="log_send_mail_subject">Журналы приложения %1$s для Android</string> <string name="log_progress_dialog_text">Загрузка данных …</string> @@ -437,27 +375,20 @@ <string name="saml_authentication_wrong_pass">Неправильный пароль</string> <string name="actionbar_move">Переместить</string> <string name="actionbar_copy">Копировать</string> - <string name="file_list_empty_moving">Здесь ничего нет. Вы можете создать каталог!</string> <string name="folder_picker_choose_button_text">Выбрать</string> - <string name="move_file_not_found">Невозможно переместить. Убедитесь, что файл существует</string> - <string name="move_file_invalid_into_descendent">Невозможно переместить каталог в его подкаталог</string> - <string name="move_file_invalid_overwrite">Файл уже существует в каталоге назначения</string> <string name="move_file_error">Произошла ошибка при попытке перемещения этого файла или каталога</string> <string name="forbidden_permissions_move">для перемещения этого файла</string> <string name="copy_file_not_found">Не удалось произвести копирование. Проверьте что файл существует</string> - <string name="copy_file_invalid_into_descendent">Невозможно копирование каталога в его подкаталог</string> - <string name="copy_file_invalid_overwrite">Файл уже существует в каталоге назначения</string> <string name="copy_file_error">Произошла ошибка при попытке копирования этого файла или каталога</string> <string name="forbidden_permissions_copy">для копирования этого файла</string> <string name="prefs_category_instant_uploading">Немедленная загрузка</string> <string name="prefs_category_details">Подробно</string> - <string name="prefs_instant_video_upload_path_title">Каталог для немедленной загрузки видео</string> - <string name="sync_folder_failed_content">Синхронизация каталога %1$s не может быть завершена</string> + <string name="sync_folder_failed_content">Синхронизация каталога %1$s не может быть завершена</string> <string name="shared_subject_header">поделился</string> <string name="with_you_subject_header">с вами</string> @@ -498,7 +429,6 @@ <string name="share_add_user_or_group">Добавить пользователя или группу</string> <string name="share_via_link_section_title">Поделиться ссылкой</string> <string name="share_via_link_expiration_date_label">Установить срок действия</string> - <string name="share_via_link_password_label">Защитить паролем</string> <string name="share_via_link_password_title">Безопасный</string> <string name="share_via_link_edit_permission_label">Разрешить редактирование</string> <string name="share_via_link_hide_file_listing_permission_label">Скрыть список файлов</string> @@ -514,7 +444,6 @@ <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( в %2$s )</string> - <string name="share_sharee_unavailable">Извините, версия вашего сервера не позволяет поделиться с пользователями через клиент. \nПожалуйста обратитесь к администратору</string> <string name="share_privilege_can_share">может делиться с другими</string> <string name="share_privilege_can_edit">может редактировать</string> <string name="share_privilege_can_edit_create">создать</string> @@ -523,50 +452,34 @@ <string name="edit_share_unshare">Закрыть общий доступ</string> <string name="edit_share_done">готово</string> - <string name="action_retry_uploads">Повторить неудавшиеся</string> <string name="action_clear_failed_uploads">Очистить неудавшиеся</string> - <string name="action_clear_successful_uploads">Очистить успешные</string> - <string name="action_clear_finished_uploads">Очистить все завершённые</string> - <string name="action_switch_grid_view">Вид сеткой</string> <string name="action_switch_list_view">Вид списком</string> <string name="manage_space_title">Управление свободным местом</string> - <string name="manage_space_description">Настройки, сертификаты базы данных и сервера из данных %1$s будут удалены навсегда. \n\nЗагруженные файлы будут сохранены нетронутыми. \n\nЭтот процесс может занять некоторое время.</string> <string name="manage_space_clear_data">Очистить данные</string> <string name="manage_space_error">Некоторые файлы не могут быть удалены.</string> - <string name="permission_storage_access">Для загрузки и скачивания файлов требуются дополнительные права доступа.</string> - <string name="local_file_not_found_toast">Файл не был найден в локальной файловой системе</string> <string name="confirmation_remove_files_alert">Вы действительно хотите удалить выбранные элементы?</string> <string name="confirmation_remove_folders_alert">Вы действительно хотите удалить выбранные элементы и их содержимое?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Ожидание зарядки устройства</string> <string name="actionbar_search">Поиск</string> <string name="files_drop_not_supported">Это есть в новой версии Nextcloud, пожалуйста обновитесь</string> <string name="learn_more">Узнать больше</string> <string name="drawer_folder_sync">Автоматическая загрузка</string> <string name="drawer_participate">Участие</string> - <string name="participate_testing_headline">Помогите нам в тестировании</string> - <string name="participate_testing_bug_text">Нашли ошибку? Заметили необычное поведение программы?</string> <string name="participate_testing_report_text">Сообщить о проблеме на Github</string> - <string name="participate_testing_version_text">Вам интересно участие в тестировании следующих версий?</string> <string name="participate_beta_headline">Протестируйте разрабатываемую версию</string> - <string name="participate_beta_text">Она включает в себя все готовящиеся возможности с самой передовой. Могут появляться баги, в таком случае, напишите о них нам</string> <string name="participate_release_candidate_headline">Кандидат в релизы</string> - <string name="participate_release_candidate_text">Релиз-кандидат (RC) - это текущее состояние готовящегося выпуска, и, ожидается, что он будет стабильным. Проверка с вашими индивидуальными настройками может помочь убедится в этом. Зарегистрируйтесь для тестирования в Google Play или используйте раздел \"версии\" в каталоге приложений F-Droid.</string> <string name="participate_contribute_headline">Активное участие</string> <string name="participate_contribute_irc_text">Присоединиться к IRC-чату: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Помогите другим на нашем <a href="%1$s">форуме</a></string> <string name="participate_contribute_translate_text">Участвовать в <a href=\"%1$s\">переводе</a> приложения</string> - <string name="participate_contribute_github_text">Участвовать в качестве разработчика: подробности по ссылке <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a>.</string> <string name="move_to">Переместить в…</string> <string name="copy_to">Копировать в…</string> <string name="choose_remote_folder">Выберите каталог …</string> <string name="folder_sync_loading_folders">Загрузка каталогов …</string> <string name="folder_sync_no_results">Не найдены каталоги с медиа(файлами).</string> - <string name="folder_sync_preferences">Настройки автозагрузки</string> <string name="folder_sync_settings">Настройки</string> - <string name="folder_sync_new_info">Моментальная загрузка была полностью переделана. Используйте главное меню для перенастройки автоматической загрузки. Извините за неудобства.\n\nВам понравятся новые расширенные возможности автоматической загрузки!</string> <string name="folder_sync_preferences_folder_path">Для %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d выбран</item> @@ -582,7 +495,6 @@ <string name="notifications_no_results_headline">Уведомлений нет</string> <string name="notifications_no_results_message">Проверьте позже.</string> - <string name="upload_file_dialog_title">Ввод имени и типа загружаемого файла </string> <string name="upload_file_dialog_filename">Имя файла</string> <string name="upload_file_dialog_filetype">Тип файла</string> <string name="upload_file_dialog_filetype_snippet_text">Текстовый файл заготовок(*.txt)</string> @@ -598,8 +510,6 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Надежный дом для всех ваших данных</string> - <string name="welcome_feature_1_text">Доступ, общий доступ и защита ваших файлов для дома и предприятия</string> - <string name="welcome_feature_2_title">Работа с несколькими аккаунтами</string> <string name="welcome_feature_2_text">Доступ ко всем вашим облакам</string> @@ -613,7 +523,6 @@ <!-- User information --> <string name="user_info_full_name">Полное имя</string> - <string name="user_info_email">Эл. почта</string> <string name="user_info_phone">Номер телефона</string> <string name="user_info_address">Адрес</string> <string name="user_info_website">Сайт</string> @@ -623,23 +532,16 @@ <!-- Activities --> <string name="activities_no_results_headline">Событий ещё нет</string> - <string name="activities_no_results_message">Этот поток будет отображать события вроде\nдобавления, изменения файлов или открытия доступа к ним</string> <string name="webview_error">Произошла ошибка</string> <string name="prefs_category_about">О программе</string> - <string name="actionbar_contacts">Резервное копирование контактов</string> - <string name="contacts_backup_button">Создать резервную копию сейчас</string> <string name="contacts_restore_button">Восстановить из резервной копии</string> <string name="contacts_header_restore">Восстановить</string> <string name="contacts_header_backup">Резервное копирование</string> <string name="contacts_automatic_backup">Резервное копирование контактов</string> <string name="contacts_last_backup">Последнее резервное копирование</string> - <string name="contacts_read_permission">Требуется разрешение на чтение контактов</string> - <string name="contacts_write_permission">Требуется разрешение на запись контактов</string> <string name="contactlist_title">Восстановить контакты</string> <string name="contaclist_restore_selected">Восстановить выбранные контакты</string> - <string name="contactlist_account_chooser_title">Выберите аккаунт для импорта</string> - <string name="contactlist_no_permission">Отсутствуют разрешения, ничего не импортировано!</string> <string name="contacts_preference_choose_date">Выберите дату</string> <string name="contacts_preference_backup_never">никогда</string> <string name="contacts_preferences_no_file_found">Файл не найден</string> @@ -648,6 +550,4 @@ <!-- Notifications --> <string name="new_notification_received">Получено новое уведомление</string> - - -</resources> + </resources> diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index b212a90dfc..4104406d11 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -491,7 +491,7 @@ <string name="manage_space_clear_data">Pastroji të dhënat</string> <string name="manage_space_error">Ca kartela s’u fshinë dot.</string> - <string name="permission_storage_access">Që të ngarkoni & shkarkoni skedar kërkohen leje shtesë.</string> + <string name="permission_storage_access">Që të ngarkoni dhe shkarkoni skedar kërkohen leje shtesë.</string> <string name="local_file_not_found_toast">Skedari s’u gjet te sistemi vendor i skedarëve</string> <string name="confirmation_remove_files_alert">Doni vërtetë të hiqni artikujt e zgjedhur?</string> <string name="confirmation_remove_folders_alert">Doni vërtet të hiqni artikujt e zgjedhur dhe përmbajtjen e tyre?</string> From 8a9ff494e232d9f76efe7e7b981f0f037182d4df Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Thu, 4 May 2017 09:04:46 +0000 Subject: [PATCH 858/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 2 +- src/main/res/values-ru/strings.xml | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index ff2db1ea86..c49535629c 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -534,7 +534,7 @@ <string name="manage_space_clear_data">Εκκαθάριση δεδομένων</string> <string name="manage_space_error">Μερικά αρχεία δεν μπορούν να διαγραφούν.</string> - <string name="permission_storage_access">Επιπλέον διακαιώματα απαιτούνται για μεταφόρτωση & λήψη αρχείων.</string> + <string name="permission_storage_access">Επιπλέον διακαιώματα απαιτούνται για μεταφόρτωση και λήψη αρχείων.</string> <string name="local_file_not_found_toast">Το αρχείο δεν βρέθηκε στο τοπικό σύστημα αρχείων</string> <string name="confirmation_remove_files_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα;</string> <string name="confirmation_remove_folders_alert">Θέλετε να αφαιρέσετε τα επιλεγμένα αντικείμενα με τα περιεχόμενά τους;</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index a9a18ed4f3..377a8f450f 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -363,11 +363,18 @@ <string name="file_migration_failed_while_coping">ОШИБКА: Ошибка при миграции</string> <string name="file_migration_failed_while_updating_index">ОШИБКА: Ошибка при обновлении индекса</string> + <string name="file_migration_directory_already_exists">Каталог с данными уже существует. Выберите одно из действий:</string> + <string name="file_migration_override_data_folder">Перезаписать</string> + <string name="file_migration_use_data_folder">Использовать существующий</string> + <string name="prefs_category_accounts">Аккаунты</string> <string name="prefs_add_account">Добавить аккаунт</string> <string name="drawer_manage_accounts">Управление аккаунтами</string> - <string name="actionbar_logger">Журналы</string> + <string name="auth_redirect_non_secure_connection_title">Безопасное соединение перенаправлено через небезопасный маршрут.</string> + + <string name="actionbar_logger">Журналы</string> <string name="log_send_history_button">Отправить историю</string> + <string name="log_send_no_mail_app">Программа для отправки журналов не найдена. Установите приложение для работы с почтой.</string> <string name="log_send_mail_subject">Журналы приложения %1$s для Android</string> <string name="log_progress_dialog_text">Загрузка данных …</string> @@ -375,8 +382,11 @@ <string name="saml_authentication_wrong_pass">Неправильный пароль</string> <string name="actionbar_move">Переместить</string> <string name="actionbar_copy">Копировать</string> + <string name="file_list_empty_moving">Здесь ничего нет. Вы можете создать каталог!</string> <string name="folder_picker_choose_button_text">Выбрать</string> + <string name="move_file_not_found">Невозможно переместить. Убедитесь, что файл существует</string> + <string name="move_file_invalid_into_descendent">Невозможно переместить каталог в его подкаталог</string> <string name="move_file_error">Произошла ошибка при попытке перемещения этого файла или каталога</string> <string name="forbidden_permissions_move">для перемещения этого файла</string> @@ -523,6 +533,7 @@ <!-- User information --> <string name="user_info_full_name">Полное имя</string> + <string name="user_info_email">Email</string> <string name="user_info_phone">Номер телефона</string> <string name="user_info_address">Адрес</string> <string name="user_info_website">Сайт</string> @@ -532,22 +543,34 @@ <!-- Activities --> <string name="activities_no_results_headline">Событий ещё нет</string> + <string name="activities_no_results_message">Этот поток будет отображать события вроде\nдобавления, изменения файлов или открытия доступа к ним</string> <string name="webview_error">Произошла ошибка</string> <string name="prefs_category_about">О программе</string> + <string name="actionbar_contacts">Резервное копирование контактов</string> + <string name="actionbar_contacts_restore">Восстановить контакты</string> + <string name="contacts_backup_button">Создать резервную копию сейчас</string> <string name="contacts_restore_button">Восстановить из резервной копии</string> <string name="contacts_header_restore">Восстановить</string> <string name="contacts_header_backup">Резервное копирование</string> <string name="contacts_automatic_backup">Резервное копирование контактов</string> <string name="contacts_last_backup">Последнее резервное копирование</string> + <string name="contacts_read_permission">Требуется разрешение на чтение контактов</string> + <string name="contacts_write_permission">Требуется разрешение на запись контактов</string> <string name="contactlist_title">Восстановить контакты</string> <string name="contaclist_restore_selected">Восстановить выбранные контакты</string> + <string name="contactlist_account_chooser_title">Выберите аккаунт для импорта</string> + <string name="contactlist_no_permission">Отсутствуют разрешения, ничего не импортировано!</string> <string name="contacts_preference_choose_date">Выберите дату</string> <string name="contacts_preference_backup_never">никогда</string> <string name="contacts_preferences_no_file_found">Файл не найден</string> + <string name="contacts_preferences_something_strange_happened">Не удалось найти последнюю резервную копию!</string> <string name="contacts_preferences_backup_scheduled">Резервное копирование запланировано и скоро начётся</string> <string name="contacts_preferences_import_scheduled">Импорт запланирован и скоро начнётся</string> <!-- Notifications --> <string name="new_notification_received">Получено новое уведомление</string> - </resources> + <string name="drawer_logout">Выйти</string> + + +</resources> From be4fb43fb415f94572f64914c2dd923870c4ed96 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 4 May 2017 11:12:14 +0200 Subject: [PATCH 859/881] extract strings, use title --- .../com/owncloud/android/ui/activity/StorageMigration.java | 5 ++--- src/main/res/values/strings.xml | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java b/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java index 82bb61ca45..f53d80d9da 100644 --- a/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java +++ b/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java @@ -221,10 +221,9 @@ public class StorageMigration { } private void askToStillMove() { - new AlertDialog.Builder(mContext) - .setMessage("Source directory not readable. Do you still want to change the storage path to " - + mStorageTarget + "? Note: all data will have to be downloaded again.") + .setTitle(R.string.file_migration_source_not_readable_title) + .setMessage(mContext.getString(R.string.file_migration_source_not_readable, mStorageTarget)) .setNegativeButton(R.string.common_no, new OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index b63bde879f..78265138de 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -422,6 +422,9 @@ <string name="file_migration_override_data_folder">Replace</string> <string name="file_migration_use_data_folder">Use</string> + <string name="file_migration_source_not_readable_title">Source directory not readable!</string> + <string name="file_migration_source_not_readable">Do you still want to change the storage path to %1$s?\n\nNote: all data will have to be downloaded again.</string> + <string name="prefs_category_accounts">Accounts</string> <string name="prefs_add_account">Add account</string> <string name="drawer_manage_accounts">Manage accounts</string> From 0592eac9bf6253956edf711b092cee7fff2ab7e5 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 4 May 2017 12:19:50 +0200 Subject: [PATCH 860/881] codacy: put fields on top; they should be declared at the top of the class, before any method declarations, constructors, initializers or inner classes. --- .../authentication/PassCodeManager.java | 6 +- .../authentication/SsoWebViewClient.java | 12 ++-- .../operations/UploadFileOperation.java | 63 ++++++++++--------- .../android/services/OperationsService.java | 20 +++--- .../adapter/ExpandableUploadListAdapter.java | 7 ++- .../CopyAndUploadContentUrisTask.java | 29 +++++---- 6 files changed, 65 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/PassCodeManager.java b/src/main/java/com/owncloud/android/authentication/PassCodeManager.java index ab3b46c913..b4b382f1fc 100644 --- a/src/main/java/com/owncloud/android/authentication/PassCodeManager.java +++ b/src/main/java/com/owncloud/android/authentication/PassCodeManager.java @@ -50,6 +50,9 @@ public class PassCodeManager { public static PassCodeManager mPassCodeManagerInstance = null; + private Long mTimestamp = 0l; + private int mVisibleActivitiesCounter = 0; + public static PassCodeManager getPassCodeManager() { if (mPassCodeManagerInstance == null) { mPassCodeManagerInstance = new PassCodeManager(); @@ -57,9 +60,6 @@ public class PassCodeManager { return mPassCodeManagerInstance; } - private Long mTimestamp = 0l; - private int mVisibleActivitiesCounter = 0; - protected PassCodeManager() {}; public void onActivityCreated(Activity activity) { diff --git a/src/main/java/com/owncloud/android/authentication/SsoWebViewClient.java b/src/main/java/com/owncloud/android/authentication/SsoWebViewClient.java index 7ba9db90ec..de66df9434 100644 --- a/src/main/java/com/owncloud/android/authentication/SsoWebViewClient.java +++ b/src/main/java/com/owncloud/android/authentication/SsoWebViewClient.java @@ -55,18 +55,17 @@ import java.security.cert.X509Certificate; public class SsoWebViewClient extends WebViewClient { private static final String TAG = SsoWebViewClient.class.getSimpleName(); - - public interface SsoWebViewClientListener { - public void onSsoFinished(String sessionCookie); - } - + private Context mContext; private Handler mListenerHandler; private WeakReference<SsoWebViewClientListener> mListenerRef; private String mTargetUrl; private String mLastReloadedUrlAtError; - + public interface SsoWebViewClientListener { + public void onSsoFinished(String sessionCookie); + } + public SsoWebViewClient (Context context, Handler listenerHandler, SsoWebViewClientListener listener) { mContext = context; mListenerHandler = listenerHandler; @@ -191,5 +190,4 @@ public class SsoWebViewClient extends WebViewClient { ((AuthenticatorActivity)mContext).createAuthenticationDialog(view, handler); } - } diff --git a/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index 390a2b11b6..d0f159dda9 100644 --- a/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -72,43 +72,17 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class UploadFileOperation extends SyncOperation { + private static final String TAG = UploadFileOperation.class.getSimpleName(); + public static final int CREATED_BY_USER = 0; public static final int CREATED_AS_INSTANT_PICTURE = 1; public static final int CREATED_AS_INSTANT_VIDEO = 2; - public static OCFile obtainNewOCFileToUpload(String remotePath, String localPath, String mimeType) { - - // MIME type - if (mimeType == null || mimeType.length() <= 0) { - mimeType = MimeTypeUtil.getBestMimeTypeByFilename(localPath); - } - - OCFile newFile = new OCFile(remotePath); - newFile.setStoragePath(localPath); - newFile.setLastSyncDateForProperties(0); - newFile.setLastSyncDateForData(0); - - // size - if (localPath != null && localPath.length() > 0) { - File localFile = new File(localPath); - newFile.setFileLength(localFile.length()); - newFile.setLastSyncDateForData(localFile.lastModified()); - } // don't worry about not assigning size, the problems with localPath - // are checked when the UploadFileOperation instance is created - - - newFile.setMimetype(mimeType); - - return newFile; - } - - private static final String TAG = UploadFileOperation.class.getSimpleName(); - - private Account mAccount; /** * OCFile which is to be uploaded. */ private OCFile mFile; + /** * Original OCFile which is to be uploaded in case file had to be renamed * (if forceOverwrite==false and remote file already exists). @@ -139,6 +113,34 @@ public class UploadFileOperation extends SyncOperation { protected RequestEntity mEntity = null; + private Account mAccount; + + public static OCFile obtainNewOCFileToUpload(String remotePath, String localPath, String mimeType) { + + // MIME type + if (mimeType == null || mimeType.length() <= 0) { + mimeType = MimeTypeUtil.getBestMimeTypeByFilename(localPath); + } + + OCFile newFile = new OCFile(remotePath); + newFile.setStoragePath(localPath); + newFile.setLastSyncDateForProperties(0); + newFile.setLastSyncDateForData(0); + + // size + if (localPath != null && localPath.length() > 0) { + File localFile = new File(localPath); + newFile.setFileLength(localFile.length()); + newFile.setLastSyncDateForData(localFile.lastModified()); + } // don't worry about not assigning size, the problems with localPath + // are checked when the UploadFileOperation instance is created + + + newFile.setMimetype(mimeType); + + return newFile; + } + public UploadFileOperation(Account account, OCFile file, OCUpload upload, @@ -148,8 +150,7 @@ public class UploadFileOperation extends SyncOperation { Context context ) { if (account == null) { - throw new IllegalArgumentException("Illegal NULL account in UploadFileOperation " + - "creation"); + throw new IllegalArgumentException("Illegal NULL account in UploadFileOperation " + "creation"); } if (upload == null) { throw new IllegalArgumentException("Illegal NULL file in UploadFileOperation creation"); diff --git a/src/main/java/com/owncloud/android/services/OperationsService.java b/src/main/java/com/owncloud/android/services/OperationsService.java index 3b63fdd249..512a4a7f63 100644 --- a/src/main/java/com/owncloud/android/services/OperationsService.java +++ b/src/main/java/com/owncloud/android/services/OperationsService.java @@ -117,15 +117,16 @@ public class OperationsService extends Service { public static final String ACTION_COPY_FILE = "COPY_FILE"; public static final String ACTION_CHECK_CURRENT_CREDENTIALS = "CHECK_CURRENT_CREDENTIALS"; - public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() + - ".OPERATION_ADDED"; - public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + - ".OPERATION_FINISHED"; + public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() + ".OPERATION_ADDED"; + public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + ".OPERATION_FINISHED"; + private ServiceHandler mOperationsHandler; + private OperationsServiceBinder mOperationsBinder; + + private SyncFolderHandler mSyncFolderHandler; private ConcurrentMap<Integer, Pair<RemoteOperation, RemoteOperationResult>> - mUndispatchedFinishedOperations = - new ConcurrentHashMap<Integer, Pair<RemoteOperation, RemoteOperationResult>>(); + mUndispatchedFinishedOperations = new ConcurrentHashMap<>(); private static class Target { public Uri mServerUrl = null; @@ -138,11 +139,6 @@ public class OperationsService extends Service { mCookie = cookie; } } - - private ServiceHandler mOperationsHandler; - private OperationsServiceBinder mOperationsBinder; - - private SyncFolderHandler mSyncFolderHandler; /** * Service initialization @@ -165,7 +161,6 @@ public class OperationsService extends Service { mSyncFolderHandler = new SyncFolderHandler(thread.getLooper(), this); } - /** * Entry point to add a new operation to the queue of operations. * <p/> @@ -709,7 +704,6 @@ public class OperationsService extends Service { } } - /** * Notifies the currently subscribed listeners about the end of an operation. * diff --git a/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java index 4c2aa22e29..cd62412ed8 100755 --- a/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java @@ -67,11 +67,14 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; public class ExpandableUploadListAdapter extends BaseExpandableListAdapter implements Observer { private static final String TAG = ExpandableUploadListAdapter.class.getSimpleName(); + + public ProgressListener mProgressListener; + private FileActivity mParentActivity; private UploadsStorageManager mUploadsStorageManager; - public ProgressListener mProgressListener; + private UploadGroup[] mUploadGroups = null; interface Refresh { public void refresh(); @@ -141,8 +144,6 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple abstract public int getGroupIcon(); } - private UploadGroup[] mUploadGroups = null; - public ExpandableUploadListAdapter(FileActivity parentActivity) { Log_OC.d(TAG, "ExpandableUploadListAdapter"); mParentActivity = parentActivity; diff --git a/src/main/java/com/owncloud/android/ui/asynctasks/CopyAndUploadContentUrisTask.java b/src/main/java/com/owncloud/android/ui/asynctasks/CopyAndUploadContentUrisTask.java index e6f8a3b8ff..555cee6ffe 100644 --- a/src/main/java/com/owncloud/android/ui/asynctasks/CopyAndUploadContentUrisTask.java +++ b/src/main/java/com/owncloud/android/ui/asynctasks/CopyAndUploadContentUrisTask.java @@ -48,6 +48,20 @@ public class CopyAndUploadContentUrisTask extends AsyncTask<Object, Void, Result private final String TAG = CopyAndUploadContentUrisTask.class.getSimpleName(); + /** + * Listener in main thread to be notified when the task ends. Held in a WeakReference assuming that its + * lifespan is associated with an Activity context, that could be finished by the user before the AsyncTask + * ends. + */ + private WeakReference<OnCopyTmpFilesTaskListener> mListener; + + /** + * Reference to application context, used to access app resources. Holding it should not be a problem, + * since it needs to exist until the end of the AsyncTask although the caller Activity were finished + * before. + */ + private final Context mAppContext; + /** * Helper method building a correct array of parameters to be passed to {@link #execute(Object[])} )} * @@ -93,21 +107,6 @@ public class CopyAndUploadContentUrisTask extends AsyncTask<Object, Void, Result }; } - /** - * Listener in main thread to be notified when the task ends. Held in a WeakReference assuming that its - * lifespan is associated with an Activity context, that could be finished by the user before the AsyncTask - * ends. - */ - private WeakReference<OnCopyTmpFilesTaskListener> mListener; - - /** - * Reference to application context, used to access app resources. Holding it should not be a problem, - * since it needs to exist until the end of the AsyncTask although the caller Activity were finished - * before. - */ - private final Context mAppContext; - - public CopyAndUploadContentUrisTask( OnCopyTmpFilesTaskListener listener, Context context From e85f1592e26411b8af60ccdc146774822eae001c Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 4 May 2017 12:30:03 +0200 Subject: [PATCH 861/881] codacy: Use one line for each declaration, it enhances code readability. --- .../com/owncloud/android/authentication/AccountUtils.java | 3 ++- .../com/owncloud/android/files/services/FileUploader.java | 7 +++++-- .../owncloud/android/files/services/IndexedForest.java | 8 +++++--- .../android/operations/RefreshFolderOperation.java | 4 +++- .../android/operations/SynchronizeFolderOperation.java | 4 +++- .../owncloud/android/operations/UploadFileOperation.java | 4 +++- .../owncloud/android/providers/FileContentProvider.java | 6 +++++- .../owncloud/android/ui/fragment/OCFileListFragment.java | 3 ++- 8 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/owncloud/android/authentication/AccountUtils.java b/src/main/java/com/owncloud/android/authentication/AccountUtils.java index 1f536492f8..fe3269087a 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountUtils.java +++ b/src/main/java/com/owncloud/android/authentication/AccountUtils.java @@ -96,7 +96,8 @@ public class AccountUtils { int lastAtPos = account.name.lastIndexOf("@"); String hostAndPort = account.name.substring(lastAtPos + 1); String username = account.name.substring(0, lastAtPos); - String otherHostAndPort, otherUsername; + String otherHostAndPort; + String otherUsername; Locale currentLocale = context.getResources().getConfiguration().locale; for (Account otherAccount : ocAccounts) { lastAtPos = otherAccount.name.lastIndexOf("@"); diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index 3d23bdff57..f8a6608622 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -302,7 +302,8 @@ public class FileUploader extends Service UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(context.getContentResolver(), context); OCUpload[] failedUploads = uploadsStorageManager.getFailedUploads(); Account currentAccount = null; - boolean resultMatch, accountMatch; + boolean resultMatch; + boolean accountMatch; for ( OCUpload failedUpload: failedUploads) { accountMatch = (account == null || account.name.equals(failedUpload.getAccountName())); resultMatch = (uploadResult == null || uploadResult.equals(failedUpload.getLastResult())); @@ -434,7 +435,9 @@ public class FileUploader extends Service return Service.START_NOT_STICKY; } - String[] localPaths = null, remotePaths = null, mimeTypes = null; + String[] localPaths = null; + String[] remotePaths = null; + String[] mimeTypes = null; OCFile[] files = null; if (intent.hasExtra(KEY_FILE)) { diff --git a/src/main/java/com/owncloud/android/files/services/IndexedForest.java b/src/main/java/com/owncloud/android/files/services/IndexedForest.java index b6e7c843e8..37b728e50a 100644 --- a/src/main/java/com/owncloud/android/files/services/IndexedForest.java +++ b/src/main/java/com/owncloud/android/files/services/IndexedForest.java @@ -41,13 +41,13 @@ import java.util.concurrent.ConcurrentMap; */ public class IndexedForest<V> { - private ConcurrentMap<String, Node<V>> mMap = new ConcurrentHashMap<String, Node<V>>(); + private ConcurrentMap<String, Node<V>> mMap = new ConcurrentHashMap<>(); @SuppressWarnings("PMD.ShortClassName") private class Node<V> { String mKey = null; Node<V> mParent = null; - Set<Node<V>> mChildren = new HashSet<Node<V>>(); // TODO be careful with hash() + Set<Node<V>> mChildren = new HashSet<>(); // TODO be careful with hash() V mPayload = null; // payload is optional @@ -112,7 +112,9 @@ public class IndexedForest<V> { } else { // value really added - String currentPath = remotePath, parentPath = null, parentKey = null; + String currentPath = remotePath; + String parentPath = null; + String parentKey = null; Node<V> currentNode = valuedNode, parentNode = null; boolean linked = false; while (!OCFile.ROOT_PATH.equals(currentPath) && !linked) { diff --git a/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java b/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java index 7f6215a971..30918f158f 100644 --- a/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java @@ -375,7 +375,9 @@ public class RefreshFolderOperation extends RemoteOperation { } // loop to update every child - OCFile remoteFile = null, localFile = null, updatedFile = null; + OCFile remoteFile = null; + OCFile localFile = null; + OCFile updatedFile = null; RemoteFile r; for (int i=1; i<folderAndFiles.size(); i++) { /// new OCFile instance with the data from the server diff --git a/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java index 46288bc6fe..4d1e939089 100644 --- a/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -288,7 +288,9 @@ public class SynchronizeFolderOperation extends SyncOperation { } // loop to synchronize every child - OCFile remoteFile = null, localFile = null, updatedFile = null; + OCFile remoteFile = null; + OCFile localFile = null; + OCFile updatedFile = null; RemoteFile r; for (int i=1; i<folderAndFiles.size(); i++) { /// new OCFile instance with the data from the server diff --git a/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index d0f159dda9..cc328dad67 100644 --- a/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -294,7 +294,9 @@ public class UploadFileOperation extends SyncOperation { mCancellationRequested.set(false); mUploadStarted.set(true); RemoteOperationResult result = null; - File temporalFile = null, originalFile = new File(mOriginalStoragePath), expectedFile = null; + File temporalFile = null; + File originalFile = new File(mOriginalStoragePath); + File expectedFile = null; try { diff --git a/src/main/java/com/owncloud/android/providers/FileContentProvider.java b/src/main/java/com/owncloud/android/providers/FileContentProvider.java index c11eefd9e2..9078d480f3 100644 --- a/src/main/java/com/owncloud/android/providers/FileContentProvider.java +++ b/src/main/java/com/owncloud/android/providers/FileContentProvider.java @@ -1131,7 +1131,11 @@ public class FileContentProvider extends ContentProvider { // AccountManager are not synchronous Account[] accounts = AccountManager.get(getContext()).getAccountsByType( MainApp.getAccountType()); - String serverUrl, username, oldAccountName, newAccountName; + String serverUrl; + String username; + String oldAccountName; + String newAccountName; + for (Account account : accounts) { // build both old and new account name serverUrl = ama.getUserData(account, AccountUtils.Constants.KEY_OC_BASE_URL); diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 0b92ae6988..7c163687a3 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1020,7 +1020,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi private void updateFooter() { if (!mJustFolders) { - int filesCount = 0, foldersCount = 0; + int filesCount = 0; + int foldersCount = 0; int count = mAdapter.getCount(); OCFile file; for (int i = 0; i < count; i++) { From 5c9419db90580b9c5929fc1c770fac886526f669 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 4 May 2017 12:32:43 +0200 Subject: [PATCH 862/881] Codacy: Position literals first in String comparisons --- .../android/ui/activity/ReceiveExternalFilesActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index 6949b5569c..8d561a776b 100755 --- a/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -726,7 +726,7 @@ public class ReceiveExternalFilesActivity extends FileActivity ListView mListView = (ListView) findViewById(android.R.id.list); String current_dir = mParents.peek(); - if (current_dir.equals("")) { + if ("".equals(current_dir)) { actionBar.setTitle(getString(R.string.uploader_top_message)); } else { actionBar.setTitle(current_dir); @@ -953,7 +953,7 @@ public class ReceiveExternalFilesActivity extends FileActivity String lastPath = PreferenceManager.getLastUploadPath(this); // "/" equals root-directory - if (lastPath.equals("/")) { + if ("/".equals(lastPath)) { mParents.add(""); } else { String[] dir_names = lastPath.split("/"); From 01d28bbdbc7b4398a0fb6c3de75cc72d7155b099 Mon Sep 17 00:00:00 2001 From: AndyScherzinger <info@andy-scherzinger.de> Date: Thu, 4 May 2017 12:36:17 +0200 Subject: [PATCH 863/881] Codacy: simplify if statement(s) --- .../nextcloud/providers/DocumentsStorageProvider.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/nextcloud/providers/DocumentsStorageProvider.java b/src/main/java/org/nextcloud/providers/DocumentsStorageProvider.java index 2341de0085..ca94302ec1 100644 --- a/src/main/java/org/nextcloud/providers/DocumentsStorageProvider.java +++ b/src/main/java/org/nextcloud/providers/DocumentsStorageProvider.java @@ -178,7 +178,7 @@ public class DocumentsStorageProvider extends DocumentsProvider { private void initiateStorageMap() { - mRootIdToStorageManager = new HashMap<Long, FileDataStorageManager>(); + mRootIdToStorageManager = new HashMap<>(); ContentResolver contentResolver = getContext().getContentResolver(); @@ -188,7 +188,6 @@ public class DocumentsStorageProvider extends DocumentsProvider { final OCFile rootDir = storageManager.getFileByPath("/"); mRootIdToStorageManager.put(rootDir.getFileId(), storageManager); } - } private boolean waitOrGetCancelled(CancellationSignal cancellationSignal) { @@ -198,15 +197,11 @@ public class DocumentsStorageProvider extends DocumentsProvider { return false; } - if (cancellationSignal != null && cancellationSignal.isCanceled()) { - return false; - } - - return true; + return !(cancellationSignal != null && cancellationSignal.isCanceled()); } Vector<OCFile> findFiles(OCFile root, String query) { - Vector<OCFile> result = new Vector<OCFile>(); + Vector<OCFile> result = new Vector<>(); for (OCFile f : mCurrentStorageManager.getFolderContent(root, false)) { if (f.isFolder()) { result.addAll(findFiles(f, query)); From 64fad91842d5edb190ac5b72cdeb5400f0fb25b7 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 4 May 2017 13:36:23 +0200 Subject: [PATCH 864/881] handle back press correct --- .../ui/activity/ContactsPreferenceActivity.java | 11 +++++++++++ .../contactsbackup/ContactsBackupFragment.java | 11 +++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 3a062faadc..697bc99ad5 100644 --- a/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.BottomNavigationView; +import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.View; @@ -54,6 +55,7 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag public static final String PREFERENCE_CONTACTS_AUTOMATIC_BACKUP = "PREFERENCE_CONTACTS_AUTOMATIC_BACKUP"; public static final String PREFERENCE_CONTACTS_LAST_BACKUP = "PREFERENCE_CONTACTS_LAST_BACKUP"; + public static final String BACKUP_TO_LIST = "BACKUP_TO_LIST"; @Override protected void onCreate(Bundle savedInstanceState) { @@ -158,4 +160,13 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { // not needed } + + @Override + public void onBackPressed() { + if (getSupportFragmentManager().findFragmentByTag(ContactListFragment.TAG) != null) { + getSupportFragmentManager().popBackStack(BACKUP_TO_LIST, FragmentManager.POP_BACK_STACK_INCLUSIVE); + } else { + finish(); + } + } } \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java index 150826763a..e133d0a49d 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java @@ -29,7 +29,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.SwitchCompat; import android.view.LayoutInflater; @@ -450,11 +449,11 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi Fragment contactListFragment = ContactListFragment.newInstance(backupToRestore, contactsPreferenceActivity.getAccount()); - FragmentTransaction transaction = contactsPreferenceActivity.getSupportFragmentManager(). - beginTransaction(); - transaction.replace(R.id.frame_container, contactListFragment); - transaction.addToBackStack(null); - transaction.commit(); + contactsPreferenceActivity.getSupportFragmentManager(). + beginTransaction() + .replace(R.id.frame_container, contactListFragment, ContactListFragment.TAG) + .addToBackStack(ContactsPreferenceActivity.BACKUP_TO_LIST) + .commit(); } else { Toast.makeText(contactsPreferenceActivity, R.string.contacts_preferences_no_file_found, Toast.LENGTH_SHORT).show(); From 9d7a831114831c87482cfba63321b08ecc438010 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 4 May 2017 14:18:32 +0200 Subject: [PATCH 865/881] show correct title when switching to "on device" --- .../java/com/owncloud/android/ui/activity/DrawerActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 8354da1565..810628d322 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -425,6 +425,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU case R.id.nav_on_device: menuItem.setChecked(true); mCheckedMenuItem = menuItem.getItemId(); + EventBus.getDefault().post(new ChangeMenuEvent()); showFiles(true); break; case R.id.nav_uploads: From 4ee600f3aa6aa719ffb62d19488ab062f6989d57 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 4 May 2017 14:29:46 +0200 Subject: [PATCH 866/881] check if writable --- .../providers/SystemDefaultStoragePointProvider.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java b/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java index 739a699e32..4a06ed7c96 100644 --- a/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java +++ b/src/main/java/com/owncloud/android/datastorage/providers/SystemDefaultStoragePointProvider.java @@ -43,8 +43,7 @@ public class SystemDefaultStoragePointProvider extends AbstractStoragePointProvi public Vector<StoragePoint> getAvailableStoragePoint() { Vector<StoragePoint> result = new Vector<>(); - final String defaultStringDesc = - MainApp.getAppContext().getString(R.string.storage_description_default); + final String defaultStringDesc = MainApp.getAppContext().getString(R.string.storage_description_default); File path; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { path = MainApp.getAppContext().getExternalMediaDirs()[0]; @@ -52,7 +51,7 @@ public class SystemDefaultStoragePointProvider extends AbstractStoragePointProvi path = getExternalStorageDirectory(); } - if (path != null) { + if (path != null && path.canWrite()) { result.add(new StoragePoint(defaultStringDesc, path.getAbsolutePath())); } From 2705f3e11683eb290436de193e5fc8f3ec51f45c Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Fri, 5 May 2017 00:21:30 +0000 Subject: [PATCH 867/881] [tx-robot] updated from transifex --- src/main/res/values-cs-rCZ/strings.xml | 2 - src/main/res/values-de-rDE/strings.xml | 2 - src/main/res/values-de/strings.xml | 2 - src/main/res/values-el/strings.xml | 2 - src/main/res/values-es-rMX/strings.xml | 2 - src/main/res/values-es/strings.xml | 2 - src/main/res/values-fr/strings.xml | 2 - src/main/res/values-ja-rJP/strings.xml | 17 ++++- src/main/res/values-nb-rNO/strings.xml | 2 - src/main/res/values-nl/strings.xml | 2 - src/main/res/values-pl/strings.xml | 2 - src/main/res/values-pt-rBR/strings.xml | 2 - src/main/res/values-ru/strings.xml | 90 ++++++++++++++++++++++++-- src/main/res/values-sq/strings.xml | 7 +- src/main/res/values-tr/strings.xml | 2 - src/main/res/values-zh-rCN/strings.xml | 22 ++++++- 16 files changed, 126 insertions(+), 34 deletions(-) diff --git a/src/main/res/values-cs-rCZ/strings.xml b/src/main/res/values-cs-rCZ/strings.xml index f6d06fb9dd..31baf69dde 100644 --- a/src/main/res/values-cs-rCZ/strings.xml +++ b/src/main/res/values-cs-rCZ/strings.xml @@ -389,8 +389,6 @@ <string name="file_migration_restoring_accounts_configuration">Obnovování konfigurace účtů…</string> <string name="file_migration_ok_finished">Dokončeno</string> <string name="file_migration_failed_not_enough_space">CHYBA: Nedostatečné místo</string> - <string name="file_migration_failed_not_writable">CHYBA: Soubor není zapisovatelný</string> - <string name="file_migration_failed_not_readable">CHYBA: Soubor nelze číst</string> <string name="file_migration_failed_dir_already_exists">CHYBA: Nextcloud adresář již existuje</string> <string name="file_migration_failed_while_coping">CHYBA: V průběhu migrace</string> <string name="file_migration_failed_while_updating_index">CHYBA: V průběhu aktualizace indexu</string> diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index d8eace745d..9d0c460a15 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -411,8 +411,6 @@ <string name="file_migration_restoring_accounts_configuration">Konfiguration der Konten wiederherstellen…</string> <string name="file_migration_ok_finished">Abgeschlossen</string> <string name="file_migration_failed_not_enough_space">FEHLER: zu wenig Platz</string> - <string name="file_migration_failed_not_writable">FEHLER: Datei kann nicht geschrieben werden</string> - <string name="file_migration_failed_not_readable">FEHLER: Datei kann nicht gelesen werden</string> <string name="file_migration_failed_dir_already_exists">FEHLER: Nextcloud Ordner existiert bereits</string> <string name="file_migration_failed_while_coping">FEHLER: Migration fehlgeschlagen</string> <string name="file_migration_failed_while_updating_index">FEHLER: Während der Aktualisierung des Indexes</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 71fca6342c..516c3f6969 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -411,8 +411,6 @@ <string name="file_migration_restoring_accounts_configuration">Konfiguration der Konten wiederherstellen…</string> <string name="file_migration_ok_finished">Abgeschlossen</string> <string name="file_migration_failed_not_enough_space">FEHLER: zu wenig Platz</string> - <string name="file_migration_failed_not_writable">FEHLER: Datei kann nicht geschrieben werden</string> - <string name="file_migration_failed_not_readable">FEHLER: Datei kann nicht gelesen werden</string> <string name="file_migration_failed_dir_already_exists">FEHLER: Nextcloud Ordner existiert bereits</string> <string name="file_migration_failed_while_coping">FEHLER: Migration fehlgeschlagen</string> <string name="file_migration_failed_while_updating_index">FEHLER: Während der Aktualisierung des Indexes</string> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index c49535629c..f515dbf3d3 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -410,8 +410,6 @@ <string name="file_migration_restoring_accounts_configuration">Γίνεται επαναφορά ρυθμίσεων λογαριασμών…</string> <string name="file_migration_ok_finished">Ολοκληρώθηκε</string> <string name="file_migration_failed_not_enough_space">ΣΦΑΛΜΑ: Ανεπαρκής αποθηκευτικός χώρος</string> - <string name="file_migration_failed_not_writable">ΣΦΑΛΜΑ: Το αρχείο δεν είναι εγγράψιμο</string> - <string name="file_migration_failed_not_readable">ΣΦΑΛΜΑ: Το αρχείο δεν είναι αναγνώσιμο</string> <string name="file_migration_failed_dir_already_exists">ΣΦΑΛΜΑ: Υπάρχει ήδη ο κατάλογος Nextcloud</string> <string name="file_migration_failed_while_coping">ΣΦΑΛΜΑ: Κατά την μεταφορά</string> <string name="file_migration_failed_while_updating_index">ΣΦΑΛΜΑ: Κατά την ενημέρωση ευρετηρίου</string> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 720ed0f44c..2ca08c5328 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -411,8 +411,6 @@ en los últimos 7 días. </string> <string name="file_migration_restoring_accounts_configuration">Guardando la configuración de las cuentas…</string> <string name="file_migration_ok_finished">Terminado</string> <string name="file_migration_failed_not_enough_space">ERROR: Espacio insuficiente</string> - <string name="file_migration_failed_not_writable">ERROR: No se puede escribir el archivo</string> - <string name="file_migration_failed_not_readable">ERROR: El archivo no se puede leer</string> <string name="file_migration_failed_dir_already_exists">ERROR: El directorio de Nextcloud ya existe</string> <string name="file_migration_failed_while_coping">ERROR: Falla durante la migración</string> <string name="file_migration_failed_while_updating_index">ERROR: Falla durante la actualización del índice</string> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 5175f47e0b..18c94729c5 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -411,8 +411,6 @@ <string name="file_migration_restoring_accounts_configuration">Restaurando configuración de cuentas…</string> <string name="file_migration_ok_finished">Finalizado</string> <string name="file_migration_failed_not_enough_space">ERROR: no hay espacio suficiente</string> - <string name="file_migration_failed_not_writable">ERROR: El archivo no se puede escribir</string> - <string name="file_migration_failed_not_readable">ERROR: El archivo no se puede leer</string> <string name="file_migration_failed_dir_already_exists">ERROR: El directorio de Nextcloud ya existe</string> <string name="file_migration_failed_while_coping">ERROR: Fallo durante la migración</string> <string name="file_migration_failed_while_updating_index">ERROR: Fallo al actualizar el índice</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 31764c2bd1..2bc873d534 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -410,8 +410,6 @@ <string name="file_migration_restoring_accounts_configuration">Restauration de la configuration des comptes…</string> <string name="file_migration_ok_finished">Terminé</string> <string name="file_migration_failed_not_enough_space">ERREUR : Espace insuffisant</string> - <string name="file_migration_failed_not_writable">ERREUR : Le fichier n\'est pas modifiable</string> - <string name="file_migration_failed_not_readable">ERREUR : Le fichier n\'est pas lisible</string> <string name="file_migration_failed_dir_already_exists">ERREUR : Le dossier Nextcloud existe déjà</string> <string name="file_migration_failed_while_coping">ERREUR : Echec lors de la migration</string> <string name="file_migration_failed_while_updating_index">ERREUR : Echec lors de la mise à jour de l\'index</string> diff --git a/src/main/res/values-ja-rJP/strings.xml b/src/main/res/values-ja-rJP/strings.xml index b5d9de0a51..f8b2865ae9 100644 --- a/src/main/res/values-ja-rJP/strings.xml +++ b/src/main/res/values-ja-rJP/strings.xml @@ -68,10 +68,13 @@ <string name="prefs_remember_last_upload_location_summary">最後に使用した共有場所を記憶する</string> <string name="recommend_subject">スマートフォンで %1$s を試してください!</string> - <string name="auth_check_server">サーバーのチェック</string> + <string name="recommend_text">スマートフォンで %1$s を利用してみませんか。\nここからダウンロードしてください: %2$s</string> + + <string name="auth_check_server">サーバーのチェック</string> <string name="auth_host_url">サーバーアドレス https://…</string> <string name="auth_username">ユーザー名</string> <string name="auth_password">パスワード</string> + <string name="auth_register">まだサーバーがありませんか?\nここをクリックして、プロバイダーから取得してください</string> <string name="sync_string_files">ファイル</string> <string name="setup_btn_connect">接続</string> <string name="uploader_btn_upload_text">アップロード</string> @@ -83,20 +86,32 @@ <string name="uploader_error_title_no_file_to_upload">アップロードするファイルはありません</string> <string name="uploader_error_message_received_piece_of_text">%1$s でテキストをファイルとしてアップロードできませんでした。</string> <string name="uploader_error_message_no_file_to_upload">受信したデータには有効なファイルが含まれませんでした。</string> + <string name="uploader_error_title_file_cannot_be_uploaded">このファイルはアップロードできません</string> <string name="uploader_error_message_read_permission_not_granted">%1$s で受信ファイルを読み込む権限がありません</string> + <string name="uploader_error_message_source_file_not_found">選択したアップロードするファイルが見つかりません。ファイルが存在するかどうか確認してください。</string> + <string name="uploader_error_message_source_file_not_copied">ファイルを一時フォルダーにコピーできませんでした。再送してください。</string> <string name="uploader_upload_files_behaviour">アップロードオプション:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">ファイルをNextcloudのフォルダーに移動</string> <string name="uploader_upload_files_behaviour_only_upload">ファイルをソースフォルダに保持する</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">ファイルをソースフォルダから削除する</string> <string name="file_list_seconds_ago">数秒前</string> + <string name="file_list_empty_headline">ここにファイルはありません</string> + <string name="file_list_empty">コンテンツをアップロードするか、デバイスと同期してください。</string> + <string name="file_list_empty_favorites">ファイルをお気に入りに登録するか、デバイスと同期してください。</string> + <string name="file_list_empty_favorites_filter_list">お気に入りに登録されたファイルやフォルダーがここに表示されます</string> + <string name="file_list_empty_favorites_filter">お気に入りのファイルが見つかりませんでした。</string> <string name="file_list_loading">読込中…</string> + <string name="file_list_no_app_for_file_type">このファイル形式に設定されたアプリがありません。</string> <string name="local_file_list_empty">このフォルダーにはファイルがありません。</string> <string name="file_list_empty_headline_search">このフォルダーの結果はありません</string> <string name="file_list_empty_headline_server_search">結果なし</string> + <string name="file_list_empty_favorite_headline">まだお気に入りに登録されていません</string> <string name="file_list_empty_shared_headline">まだ何も共有されていません</string> <string name="file_list_empty_shared">共有したファイルやフォルダーは、ここに表示されます。</string> <string name="file_list_empty_headline_server_search_videos">ビデオなし</string> <string name="file_list_empty_headline_server_search_photos">写真なし</string> + <string name="file_list_empty_search">別のフォルダーにありませんか?</string> + <string name="file_list_empty_recently_modified">過去 7 日間に更新されたファイルは見つかりません</string> <string name="upload_list_empty_headline">アップロードは利用できません</string> <string name="file_list_folder">フォルダー</string> <string name="file_list_folders">フォルダー</string> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 5122b3acac..3b9d892f55 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -411,8 +411,6 @@ <string name="file_migration_restoring_accounts_configuration">Gjenoppretter kontokonfigurasjon…</string> <string name="file_migration_ok_finished">Fullført</string> <string name="file_migration_failed_not_enough_space">FEIL: Ikke nok plass</string> - <string name="file_migration_failed_not_writable">FEIL: Filen er skrivebeskyttet</string> - <string name="file_migration_failed_not_readable">FEIL: er ikke lesbar</string> <string name="file_migration_failed_dir_already_exists">FEIL: Nextcloudmappen finnes allerede</string> <string name="file_migration_failed_while_coping">FEIL: Under migrering</string> <string name="file_migration_failed_while_updating_index">FEIL: Under oppdatering av indeks</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 9256bbf842..fa6d24c043 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -412,8 +412,6 @@ Kies er eentje van een provider.</string> <string name="file_migration_restoring_accounts_configuration">Accountconfiguratie herstellen…</string> <string name="file_migration_ok_finished">Afgerond</string> <string name="file_migration_failed_not_enough_space">FOUT: Niet genoeg ruimte</string> - <string name="file_migration_failed_not_writable">FOUT: Bestand niet beschrijfbaar</string> - <string name="file_migration_failed_not_readable">FOUT: Bestand niet leesbaar</string> <string name="file_migration_failed_dir_already_exists">FOUT: Nextcloudmap bestaat al</string> <string name="file_migration_failed_while_coping">FOUT: Tijdens migratie</string> <string name="file_migration_failed_while_updating_index">FOUT: Tijdens bijwerken index</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 21aa3c2fe4..08fad8e296 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -410,8 +410,6 @@ <string name="file_migration_restoring_accounts_configuration">Przywracanie konfiguracji konta…</string> <string name="file_migration_ok_finished">Skończone</string> <string name="file_migration_failed_not_enough_space">BŁĄD: Brak miejsca</string> - <string name="file_migration_failed_not_writable">BŁĄD: Plik nie do zapisu</string> - <string name="file_migration_failed_not_readable">BŁĄD: Plik nie do odczytu </string> <string name="file_migration_failed_dir_already_exists">BŁĄD: Katalog Nextcloud już istnieje</string> <string name="file_migration_failed_while_coping">BŁĄD: Nieudana migracja</string> <string name="file_migration_failed_while_updating_index">BŁĄD: Nieudana aktualizacja indeksu</string> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index c06d316826..712c2eff8e 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -411,8 +411,6 @@ <string name="file_migration_restoring_accounts_configuration">Restaurando a configuração das contas…</string> <string name="file_migration_ok_finished">Finalizado</string> <string name="file_migration_failed_not_enough_space">ERRO: Espaço insuficiente</string> - <string name="file_migration_failed_not_writable">ERRO: Arquivo é somente leitura</string> - <string name="file_migration_failed_not_readable">ERRO: Arquivo não é legível</string> <string name="file_migration_failed_dir_already_exists">ERRO: Diretório Nexcloud já existe</string> <string name="file_migration_failed_while_coping">ERRO: Falha durante a migração</string> <string name="file_migration_failed_while_updating_index">ERRO: Falha ao atualizar índice</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 377a8f450f..5350e4045d 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="about_android">%1$s для Android</string> + <string name="about_android">%1$s для Android +</string> <string name="about_version">версия %1$s</string> <string name="actionbar_sync">Обновить учётную запись</string> <string name="actionbar_upload">Загрузить</string> @@ -46,6 +47,10 @@ <string name="prefs_fingerprint">Блокировка отпечатком пальца</string> <string name="prefs_fingerprint_notsetup">Отпечатки не были настроены.</string> <string name="prefs_show_hidden_files">Показать скрытые файлы</string> + <string name="prefs_instant_upload">Моментальная загрузка изображений</string> + <string name="prefs_instant_upload_summary">Немедленно загружать изображения, сделанные камерой</string> + <string name="prefs_instant_video_upload">Моментальная загрузка видео</string> + <string name="prefs_instant_video_upload_summary">Немедленно загружать видео, сделанные камерой</string> <string name="prefs_log_title">Включить журналирование</string> <string name="prefs_log_summary">Используется для регистрации ошибок</string> <string name="prefs_log_title_history">История журналирования</string> @@ -54,14 +59,24 @@ <string name="prefs_calendar_contacts">Синхронизировать календарь и контакты</string> <string name="prefs_calendar_contacts_summary">Настроить DAVdroid (v1.3.0+) для текущего аккаунта</string> <string name="prefs_calendar_contacts_address_resolve_error">Не удается определить адрес сервера для DAVdroid</string> + <string name="prefs_calendar_contacts_no_store_error">Не установлен магазин Google Play или приложение F-Droid</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Настройка синхронизации календаря & контактов выполнена успешно.</string> <string name="prefs_help">Помощь</string> + <string name="prefs_recommend">Рекомендовать другу</string> <string name="prefs_feedback">Обратная связь</string> <string name="prefs_imprint">Штамп</string> - <string name="recommend_subject">Попробуйте %1$s на вашем смартфоне!</string> - <string name="auth_check_server">Проверить сервер</string> + <string name="prefs_remember_last_share_location">Запомнить расположение общего ресурса</string> + <string name="prefs_remember_last_upload_location_summary">Запомнить расположение загрузки последней публикации</string> + + <string name="recommend_subject">Попробуйте %1$s на вашем смартфоне!</string> + <string name="recommend_text">Хочу предложить вам использовать %1$s на смартфоне!\nЗагрузить можно здесь: %2$s + </string> + + <string name="auth_check_server">Проверить сервер</string> <string name="auth_host_url">Адрес сервера https://...</string> <string name="auth_username">Имя пользователя</string> <string name="auth_password">Пароль</string> + <string name="auth_register">Нет сервера?\nНажмите здесь чтобы получить от провайдера</string> <string name="sync_string_files">Файлы</string> <string name="setup_btn_connect">Подключиться</string> <string name="uploader_btn_upload_text">Загрузить</string> @@ -73,21 +88,43 @@ <string name="uploader_error_title_no_file_to_upload">Нет файла для загрузки</string> <string name="uploader_error_message_received_piece_of_text">%1$s не удается загрузить часть текста как файл.</string> <string name="uploader_error_message_no_file_to_upload">Принятые данные не содержат исправный файл.</string> + <string name="uploader_error_title_file_cannot_be_uploaded">Этот файл не может быть загружен</string> <string name="uploader_error_message_read_permission_not_granted">%1$s не позволено читать принятый файл</string> + <string name="uploader_error_message_source_file_not_found">Файл для загрузки не был найден в положенном месте. Пожалуйста проверьте, существует ли файл.</string> + <string name="uploader_error_message_source_file_not_copied">Произошла ошибка во время копирования этого файла во временный каталог. Пожалуйста попробуйте отправить его заново.</string> <string name="uploader_upload_files_behaviour">Настройка загрузки:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Перемещать файл в папку Nextcloud</string> <string name="uploader_upload_files_behaviour_only_upload">Сохранять файл в исходном каталоге</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Удалять файл из исходного каталога</string> <string name="file_list_seconds_ago">несколько секунд назад</string> + <string name="file_list_empty_headline">Здесь нет файлов</string> + <string name="file_list_empty">Загрузите что-нибудь или синхронизируйте со своими устройствами!</string> + <string name="file_list_empty_favorites">Добавьте файлы в избранное или синхронизируйте со своими устройствами!</string> + <string name="file_list_empty_favorites_filter_list">Здесь появятся файлы и каталоги, отмеченные как избранные</string> + <string name="file_list_empty_favorites_filter">По запросу избранных файлов не найдено.</string> <string name="file_list_loading">Загрузка…</string> + <string name="file_list_no_app_for_file_type">Приложение для этого типа файла не найдено!</string> <string name="local_file_list_empty">В этом каталоге нет файлов.</string> <string name="file_list_empty_headline_search">В этой папке результатов не найдено</string> <string name="file_list_empty_headline_server_search">Результаты отсутствуют</string> + <string name="file_list_empty_favorite_headline">Избранного ещё нет</string> <string name="file_list_empty_shared_headline">Вы ещё ничем не поделились</string> <string name="file_list_empty_shared">Здесь появятся файлы и каталоги, которыми вы поделитесь</string> <string name="file_list_empty_headline_server_search_videos">Видео отсуствуют</string> <string name="file_list_empty_headline_server_search_photos">Фотографии отсутствуют</string> + <string name="file_list_empty_search">Искать в другом каталоге?</string> + <string name="file_list_empty_recently_modified">Не найдно файлов, изменённых за последние 7 дней</string> + <string name="file_list_empty_recently_modified_filter">По запросу не найдно файлов, +изменённых за последние 7 дней!</string> + <string name="file_list_empty_recently_added">Не найдено файлов, добавленных недавно</string> + <string name="file_list_empty_recently_added_filter">По запросу не найдено файлов, добавленных недавно!</string> + <string name="file_list_empty_text_photos">Загрузите фотографии или включите автоматическую загрузку!</string> + <string name="file_list_empty_text_photos_filter">По запросу фото не найдено!</string> + <string name="file_list_empty_text_videos">Загрузите видео или включите автоматическую загрузку!</string> + <string name="file_list_empty_text_videos_filter">По запросу файлов видео не найдено!</string> <string name="upload_list_empty_headline">Нет доступных загрузок</string> + <string name="upload_list_empty_text">Загрузите что-нибудь или включите моментальную загрузку!</string> + <string name="upload_list_empty_text_auto_upload">Загрузите что-нибудь или включите автоматическую загрузку!</string> <string name="file_list_folder">каталог</string> <string name="file_list_folders">каталоги</string> <string name="file_list_file">файл</string> @@ -99,11 +136,14 @@ <string name="filedetails_modified">Изменён:</string> <string name="filedetails_download">Скачать</string> <string name="filedetails_sync_file">Синхронизировать</string> + <string name="filedetails_renamed_in_upload_msg">Файл был переименован в %1$s во время загрузки</string> + <string name="list_layout">Вид списком</string> <string name="action_share">Поделиться</string> <string name="common_yes">Да</string> <string name="common_no">Нет</string> <string name="common_ok">ОК</string> <string name="common_remove_upload">Удалить загрузку</string> + <string name="common_retry_upload">Повторить загрузку</string> <string name="common_cancel_sync">Отменить синхронизацию</string> <string name="common_cancel">Отменить</string> <string name="common_back">Назад</string> @@ -123,8 +163,10 @@ <string name="uploader_info_dirname">Имя каталога</string> <string name="uploader_upload_in_progress_ticker">Загружается …</string> <string name="uploader_upload_in_progress_content">%1$d%% Загружается %2$s</string> + <string name="uploader_upload_succeeded_ticker">Загружено</string> <string name="uploader_upload_succeeded_content_single">%1$s загружено</string> <string name="uploader_upload_failed_ticker">Сбой при загрузке</string> + <string name="uploader_upload_failed_content_single">Невозможно загрузить %1$s</string> <string name="uploader_upload_failed_credentials_error">Загрузка не удалась, вам необходимо войти повторно.</string> <string name="uploads_view_title">Загрузки</string> <string name="uploads_view_group_current_uploads">Текущие</string> @@ -141,22 +183,30 @@ <string name="uploads_view_upload_status_failed_localfile_error">Локальный файл не найден</string> <string name="uploads_view_upload_status_failed_permission_error">Ошибка прав доступа</string> <string name="uploads_view_upload_status_conflict">Конфликт</string> + <string name="uploads_view_upload_status_service_interrupted">Работа приложения была прекращена</string> <string name="uploads_view_upload_status_unknown_fail">Неизвестная ошибка</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Ожидание подключения Wi-Fi</string> <string name="uploads_view_later_waiting_to_upload">Ожидание загрузки</string> <string name="downloader_download_in_progress_ticker">Скачивается …</string> <string name="downloader_download_in_progress_content">%1$d%% Скачивается %2$s</string> + <string name="downloader_download_succeeded_ticker">Скачивание завершено</string> <string name="downloader_download_succeeded_content">%1$s скачано</string> <string name="downloader_download_failed_ticker">Сбой при скачивании</string> + <string name="downloader_download_failed_content">Скачивание %1$s не может быть завершено</string> <string name="downloader_not_downloaded_yet">Ещё не скачано</string> <string name="downloader_download_failed_credentials_error">Сбой при скачивании, вам необходимо войти повторно</string> <string name="common_choose_account">Выберите аккаунт</string> <string name="sync_fail_ticker">Сбой при синхронизации</string> + <string name="sync_fail_ticker_unauthorized">Ошибка синхронизации, вам нужно войти повторно</string> + <string name="sync_fail_content">Синхронизация %1$s не может быть завершена</string> + <string name="sync_fail_content_unauthorized">Неверный пароль для %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Обнаружены конфликты</string> <string name="sync_conflicts_in_favourites_content">%1$d файлов не может быть синхронизировано</string> <string name="sync_fail_in_favourites_ticker">Не удалось синхронизировать файлы</string> <string name="sync_fail_in_favourites_content">Содержимое %1$d файлов не может быть синхронизировано (конфликтов: %2$d)</string> <string name="sync_foreign_files_forgotten_ticker">Некоторые загруженные файлы не были перенесены в локальную папку </string> <string name="sync_foreign_files_forgotten_content">Не удалось скопировать %1$d файлов из каталога %2$s в</string> + <string name="sync_foreign_files_forgotten_explanation">Начиная с версии 1.3.16, файлы, загружаемые с этого устройства, копируются в локальный каталог %1$s, чтобы предотвратить потерю данных при синхронизации файла с несколькими учётными записями.\n\nПоэтому все файлы, загруженные предыдущими версиями данного приложения, были скопированы в каталог %2$s. Однако, во время синхронизации что-то помешало завершить эту операцию. Можете оставить файлы как есть и удалить ссылку на %3$s, либо переместить их в %1$s и сохранить ссылку на %4$s.\n\nНиже перечислены локальные файлы, и соответствующие им удалённые файлы в %5$s, к которым они привязаны.</string> <string name="sync_current_folder_was_removed">Каталог %1$s больше не существует</string> <string name="foreign_files_move">Переместить всё</string> <string name="foreign_files_success">Все файлы были перемещены</string> @@ -330,11 +380,17 @@ <string name="copy_link">Копировать ссылку</string> <string name="clipboard_text_copied">Скопировано в буфер обмена</string> + <string name="clipboard_no_text_to_copy">Нет принятого текста для копирования в буфер обмена</string> <string name="clipboard_uxexpected_error">Неожиданная ошибка во время копирования в буфер обмена</string> <string name="clipboard_label">Текст скопирован из %1$s</string> <string name="error_cant_bind_to_operations_service">Критическая ошибка: невозможно выполнить действия</string> + <string name="network_error_socket_exception">При подключении к серверу возникла ошибка.</string> + <string name="network_error_socket_timeout_exception">Во время ожидания сервера произошла ошибка, действие не может быть завершено.</string> + <string name="network_error_connect_timeout_exception">Во время ожидания сервера произошла ошибка, действие не может быть завершено.</string> + <string name="network_host_not_available">Действие не может быть завершено, сервер недоступен</string> + <string name="forbidden_permissions">У вас нет права доступа %s</string> <string name="forbidden_permissions_rename">для переименования этого файла</string> <string name="forbidden_permissions_delete">для удаления этого файла</string> @@ -357,8 +413,6 @@ <string name="file_migration_restoring_accounts_configuration">Восстановление настроек пользователя…</string> <string name="file_migration_ok_finished">Завершено</string> <string name="file_migration_failed_not_enough_space">ОШИБКА: Недостаточно места</string> - <string name="file_migration_failed_not_writable">ОШИБКА: Файл недоступен для записи</string> - <string name="file_migration_failed_not_readable">ОШИБКА: Файл не доступен для чтения</string> <string name="file_migration_failed_dir_already_exists">ОШИБКА: Каталог Nextcloud уже существует</string> <string name="file_migration_failed_while_coping">ОШИБКА: Ошибка при миграции</string> <string name="file_migration_failed_while_updating_index">ОШИБКА: Ошибка при обновлении индекса</string> @@ -387,18 +441,22 @@ <string name="move_file_not_found">Невозможно переместить. Убедитесь, что файл существует</string> <string name="move_file_invalid_into_descendent">Невозможно переместить каталог в его подкаталог</string> + <string name="move_file_invalid_overwrite">Файл уже существует в каталоге назначения</string> <string name="move_file_error">Произошла ошибка при попытке перемещения этого файла или каталога</string> <string name="forbidden_permissions_move">для перемещения этого файла</string> <string name="copy_file_not_found">Не удалось произвести копирование. Проверьте что файл существует</string> + <string name="copy_file_invalid_into_descendent">Невозможно копирование каталога в его подкаталог</string> + <string name="copy_file_invalid_overwrite">Файл уже существует в каталоге назначения</string> <string name="copy_file_error">Произошла ошибка при попытке копирования этого файла или каталога</string> <string name="forbidden_permissions_copy">для копирования этого файла</string> <string name="prefs_category_instant_uploading">Немедленная загрузка</string> <string name="prefs_category_details">Подробно</string> - <string name="sync_folder_failed_content">Синхронизация каталога %1$s не может быть завершена</string> + <string name="prefs_instant_video_upload_path_title">Каталог для немедленной загрузки видео</string> + <string name="sync_folder_failed_content">Синхронизация каталога %1$s не может быть завершена</string> <string name="shared_subject_header">поделился</string> <string name="with_you_subject_header">с вами</string> @@ -439,6 +497,7 @@ <string name="share_add_user_or_group">Добавить пользователя или группу</string> <string name="share_via_link_section_title">Поделиться ссылкой</string> <string name="share_via_link_expiration_date_label">Установить срок действия</string> + <string name="share_via_link_password_label">Защитить паролем</string> <string name="share_via_link_password_title">Безопасный</string> <string name="share_via_link_edit_permission_label">Разрешить редактирование</string> <string name="share_via_link_hide_file_listing_permission_label">Скрыть список файлов</string> @@ -454,6 +513,7 @@ <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( в %2$s )</string> + <string name="share_sharee_unavailable">Извините, версия вашего сервера не позволяет поделиться с пользователями через клиент. \nПожалуйста обратитесь к администратору</string> <string name="share_privilege_can_share">может делиться с другими</string> <string name="share_privilege_can_edit">может редактировать</string> <string name="share_privilege_can_edit_create">создать</string> @@ -462,24 +522,37 @@ <string name="edit_share_unshare">Закрыть общий доступ</string> <string name="edit_share_done">готово</string> + <string name="action_retry_uploads">Повторить неудавшиеся</string> <string name="action_clear_failed_uploads">Очистить неудавшиеся</string> + <string name="action_clear_successful_uploads">Очищено</string> + <string name="action_clear_finished_uploads">Очистить завершенные</string> + <string name="action_switch_grid_view">Вид сеткой</string> <string name="action_switch_list_view">Вид списком</string> <string name="manage_space_title">Управление свободным местом</string> + <string name="manage_space_description">Настройки, сертификаты базы данных и сервера из данных %1$s будут удалены навсегда. \n\nЗагруженные файлы будут сохранены нетронутыми. \n\nЭтот процесс может занять некоторое время.</string> <string name="manage_space_clear_data">Очистить данные</string> <string name="manage_space_error">Некоторые файлы не могут быть удалены.</string> + <string name="permission_storage_access">Для загрузки и скачивания файлов требуются дополнительные права доступа.</string> + <string name="local_file_not_found_toast">Файл не был найден в локальной файловой системе</string> <string name="confirmation_remove_files_alert">Вы действительно хотите удалить выбранные элементы?</string> <string name="confirmation_remove_folders_alert">Вы действительно хотите удалить выбранные элементы и их содержимое?</string> + <string name="uploads_view_upload_status_waiting_for_charging">Ожидание зарядки устройства</string> <string name="actionbar_search">Поиск</string> <string name="files_drop_not_supported">Это есть в новой версии Nextcloud, пожалуйста обновитесь</string> <string name="learn_more">Узнать больше</string> <string name="drawer_folder_sync">Автоматическая загрузка</string> <string name="drawer_participate">Участие</string> + <string name="participate_testing_headline">Помогите нам в тестировании</string> + <string name="participate_testing_bug_text">Нашли ошибку? Заметили необычное поведение программы?</string> <string name="participate_testing_report_text">Сообщить о проблеме на Github</string> + <string name="participate_testing_version_text">Вам интересно участие в тестировании следующих версий?</string> <string name="participate_beta_headline">Протестируйте разрабатываемую версию</string> + <string name="participate_beta_text">Она включает в себя все готовящиеся возможности с самой передовой. Могут появляться баги, в таком случае, напишите о них нам</string> <string name="participate_release_candidate_headline">Кандидат в релизы</string> + <string name="participate_release_candidate_text">Релиз-кандидат (RC) - это текущее состояние готовящегося выпуска, и, ожидается, что он будет стабильным. Проверка с вашими индивидуальными настройками может помочь убедится в этом. Зарегистрируйтесь для тестирования в Google Play или используйте раздел \"версии\" в каталоге приложений F-Droid.</string> <string name="participate_contribute_headline">Активное участие</string> <string name="participate_contribute_irc_text">Присоединиться к IRC-чату: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Помогите другим на нашем <a href="%1$s">форуме</a></string> @@ -489,7 +562,9 @@ <string name="choose_remote_folder">Выберите каталог …</string> <string name="folder_sync_loading_folders">Загрузка каталогов …</string> <string name="folder_sync_no_results">Не найдены каталоги с медиа(файлами).</string> + <string name="folder_sync_preferences">Настройки автозагрузки</string> <string name="folder_sync_settings">Настройки</string> + <string name="folder_sync_new_info">Моментальная загрузка была полностью переделана. Используйте главное меню для перенастройки автоматической загрузки. Извините за неудобства.\n\nВам понравятся новые расширенные возможности автоматической загрузки!</string> <string name="folder_sync_preferences_folder_path">Для %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d выбран</item> @@ -505,6 +580,7 @@ <string name="notifications_no_results_headline">Уведомлений нет</string> <string name="notifications_no_results_message">Проверьте позже.</string> + <string name="upload_file_dialog_title">Ввод имени и типа загружаемого файла </string> <string name="upload_file_dialog_filename">Имя файла</string> <string name="upload_file_dialog_filetype">Тип файла</string> <string name="upload_file_dialog_filetype_snippet_text">Текстовый файл заготовок(*.txt)</string> @@ -520,6 +596,8 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Надежный дом для всех ваших данных</string> + <string name="welcome_feature_1_text">Доступ, общий доступ и защита ваших файлов для дома и предприятия</string> + <string name="welcome_feature_2_title">Работа с несколькими аккаунтами</string> <string name="welcome_feature_2_text">Доступ ко всем вашим облакам</string> diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index 4104406d11..71337abe24 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -82,6 +82,7 @@ <string name="file_list_empty_headline_search">Nuk ka rezultate në këtë dosje</string> <string name="file_list_empty_search">Përpiquni të shikoni në një dosje tjetër</string> <string name="upload_list_empty_headline">Nuk ka asnjë ngarkim në gjëndje</string> + <string name="upload_list_empty_text">Ngarko disa të dhëna ose aktivizo ngarkimin e menjëhershëm!</string> <string name="file_list_folder">dosje</string> <string name="file_list_folders">dosje</string> <string name="file_list_file">Skedar</string> @@ -367,8 +368,6 @@ <string name="file_migration_restoring_accounts_configuration">Rikthimi i konfigurimit… të llogarive</string> <string name="file_migration_ok_finished">Përfundoi</string> <string name="file_migration_failed_not_enough_space">GABIM: Nuk ka hapsirë mjaftueshëm </string> - <string name="file_migration_failed_not_writable">GABIM: Skedari nuk mund të shkruhet</string> - <string name="file_migration_failed_not_readable">GABIM: Skedari nuk është i lexueshëm</string> <string name="file_migration_failed_dir_already_exists">GABIM: Drejtoria Nextcloud ekziston tashmë</string> <string name="file_migration_failed_while_coping">GABIM: Gjatë migrimit</string> <string name="file_migration_failed_while_updating_index">GABIM: Gjatë përditësimit të indeksit</string> @@ -512,6 +511,7 @@ <string name="participate_contribute_irc_text">Bashkohu në bisedat në IRC: <a href=\"%1$s\">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Ndihmo të tjerët në <a href="%1$s">forum</a></string> <string name="participate_contribute_translate_text"><a href=\"%1$s\">Përktheni</a> aplikacionin</string> + <string name="participate_contribute_github_text">Kontriboni si një zhvillues, shih<a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> për detaje</string> <string name="move_to">Levizni tek…</string> <string name="copy_to">Kopjojeni tek…</string> <string name="choose_remote_folder">Zgjidh dosjen…</string> @@ -526,6 +526,7 @@ <item quantity="other">%d të përzgjedhura</item> </plurals> + <string name="upload_file_dialog_title">Vendos emrin dhe tipin e dokumentit të aploduar </string> <string name="upload_file_dialog_filename">Emri dokumentit</string> <string name="upload_file_dialog_filetype">Tipi dokumentit</string> <string name="upload_file_dialog_filetype_snippet_text">Skedar elementi tekst(.txt)</string> @@ -541,6 +542,8 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">Një shtëpi e sigurt për të gjitha të dhënat tuaja</string> + <string name="welcome_feature_1_text">Akseso, ndaj dhe mbro skedarët e tuaja në shtëpinë dhe organizatën tuaj.</string> + <string name="welcome_feature_2_title">Llogari e shumfishtë</string> <string name="welcome_feature_2_text">Lidhuni me të gjitha shërbimet cloud</string> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index 24d9b4e1ec..ac70352c3d 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -411,8 +411,6 @@ <string name="file_migration_restoring_accounts_configuration">Hesap ayarları geri yükleniyor…</string> <string name="file_migration_ok_finished">Tamamlandı</string> <string name="file_migration_failed_not_enough_space">HATA: Depolama alanı yetersiz</string> - <string name="file_migration_failed_not_writable">HATA: Dosya yazılabilir değil</string> - <string name="file_migration_failed_not_readable">HATA: Dosya okunabilir değil</string> <string name="file_migration_failed_dir_already_exists">HATA: Nextcloud klasörü zaten var</string> <string name="file_migration_failed_while_coping">HATA: Aktarımda sorun çıktı</string> <string name="file_migration_failed_while_updating_index">HATA: Dizin güncellenirken sorun çıktı</string> diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 12ef642224..bdb0d1773e 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -65,10 +65,15 @@ <string name="prefs_feedback">反馈</string> <string name="prefs_imprint">版本说明</string> <string name="recommend_subject">在您的智能手机上试用 %1$s!</string> - <string name="auth_check_server">检查服务器</string> + <string name="recommend_text">我想邀请你在智能机上使用%1$s。 +从这里下载:%2$s</string> + + <string name="auth_check_server">检查服务器</string> <string name="auth_host_url">服务器地址 https://...</string> <string name="auth_username">用户名</string> <string name="auth_password">密码</string> + <string name="auth_register">你是不是还没有服务器? +点击这里从提供商获取一个</string> <string name="sync_string_files">文件</string> <string name="setup_btn_connect">连接</string> <string name="uploader_btn_upload_text">上传</string> @@ -80,20 +85,35 @@ <string name="uploader_error_title_no_file_to_upload">文件没有上传</string> <string name="uploader_error_message_received_piece_of_text">%1$s不能把一段文字做为文件上传</string> <string name="uploader_error_message_no_file_to_upload">得到的数据没有包括有效文件</string> + <string name="uploader_error_title_file_cannot_be_uploaded">不能上传这个文件</string> <string name="uploader_error_message_read_permission_not_granted">%1$s 不让读取已经获得的文件</string> + <string name="uploader_error_message_source_file_not_found">没有找到刚刚选择上传的文件。请检查文件是否存在。</string> + <string name="uploader_error_message_source_file_not_copied">不能把文件拷贝到临时文件夹。试着重新发送。</string> <string name="uploader_upload_files_behaviour">上传选项:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">移动文件到Nextcloud文件夹</string> <string name="uploader_upload_files_behaviour_only_upload">在原文件夹中保留文件</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">从原文件夹中删除文件</string> <string name="file_list_seconds_ago">几秒前</string> + <string name="file_list_empty_headline">这里没有文件 +</string> + <string name="file_list_empty_favorites">把一些文件设为“我喜欢的”或者从设备同步</string> + <string name="file_list_empty_favorites_filter_list">你标记为“我喜欢的”文件和文件夹会显示在这里</string> + <string name="file_list_empty_favorites_filter">没有找到您搜索的“我喜欢的”。</string> <string name="file_list_loading">加载中…</string> + <string name="file_list_no_app_for_file_type">没有设置应用程序来处理这种类型的文件</string> <string name="local_file_list_empty">在该文件夹中不存在文件。</string> <string name="file_list_empty_headline_search">此文件夹无结果</string> <string name="file_list_empty_headline_server_search">没有结果</string> + <string name="file_list_empty_favorite_headline">还没有“我喜欢的”</string> <string name="file_list_empty_shared_headline">还没有共享过文件</string> <string name="file_list_empty_shared">您共享的文件和文件夹将显示在这里</string> <string name="file_list_empty_headline_server_search_videos">无视频</string> <string name="file_list_empty_headline_server_search_photos">无照片</string> + <string name="file_list_empty_search">说不定它在另外一个文件夹?</string> + <string name="file_list_empty_recently_modified">没有找到最近7天修改的文件</string> + <string name="file_list_empty_recently_modified_filter">没有搜索到被修改的文件 + 在最近7天。</string> + <string name="file_list_empty_recently_added">没有找到最近添加的文件</string> <string name="upload_list_empty_headline">没有可以上传的</string> <string name="file_list_folder">文件夹</string> <string name="file_list_folders">文件夹</string> From 6266937aff8560b343eb418ffd80de41c877e473 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Fri, 5 May 2017 16:08:14 +0200 Subject: [PATCH 868/881] use drone for all flavours use only on master and PR push use google stuff only on gplay, modified --- .drone.yml | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/.drone.yml b/.drone.yml index acc92f50e3..8392235efe 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,19 +1,24 @@ pipeline: test: - image: nextcloudci/android:android-15 + image: nextcloudci/android:android-17 commands: + # uncomment gplay for Gplay, Modified only + - sh -c "if [ '$FLAVOUR' != 'Generic' ]; then sed -i '/com.google.*.gms/s/^.*\/\///g' build.gradle; fi" + - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI -c 20M - emulator -avd test -no-window & - ./wait_for_emulator.sh + # build app and assemble APK, in debug mode - - ./gradlew assembleGeneric + - ./gradlew assemble${FLAVOUR} + # run all the instrumented tests of app module - DISABLED until we get an stable setup for Espresso in Travis # - ./gradlew connectedDebugAndroidTest --info + # install app, then assemble and install instrumented tests of app module - - ./gradlew :installGenericDebug - #- ./gradlew :installModifiedDebug - - ./gradlew :installGenericDebugAndroidTest - #- ./gradlew :installModifiedDebugAndroidTest + - ./gradlew :install${FLAVOUR}Debug + - ./gradlew :install${FLAVOUR}DebugAndroidTest + # run sample instrumented unit test # TODO fails because test runner is not available #- adb shell am instrument -w -e debug false -e class com.owncloud.android.datamodel.OCFileUnitTest com.owncloud.android.test/android.support.test.runner.AndroidJUnitRunner @@ -22,3 +27,11 @@ pipeline: - ANDROID_TARGET=android-24 - ANDROID_ABI=armeabi-v7a - LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:/opt/android-sdk-linux/tools/lib64/gles_mesa/ + +matrix: + FLAVOUR: + - Generic + - Gplay + - Modified + +branches: master \ No newline at end of file From ada1d9e9ab1f75cb6d59e239655261e526cbf9ec Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Sat, 6 May 2017 00:21:25 +0000 Subject: [PATCH 869/881] [tx-robot] updated from transifex --- src/main/res/values-de-rDE/strings.xml | 5 ++ src/main/res/values-de/strings.xml | 5 ++ src/main/res/values-es-rMX/strings.xml | 9 ++- src/main/res/values-es/strings.xml | 5 ++ src/main/res/values-fr/strings.xml | 5 ++ src/main/res/values-pl/strings.xml | 5 ++ src/main/res/values-ru/strings.xml | 5 ++ src/main/res/values-sq/strings.xml | 93 ++++++++++++++++++++++++++ src/main/res/values-tr/strings.xml | 5 ++ 9 files changed, 135 insertions(+), 2 deletions(-) diff --git a/src/main/res/values-de-rDE/strings.xml b/src/main/res/values-de-rDE/strings.xml index 9d0c460a15..068e535ace 100644 --- a/src/main/res/values-de-rDE/strings.xml +++ b/src/main/res/values-de-rDE/strings.xml @@ -411,6 +411,8 @@ <string name="file_migration_restoring_accounts_configuration">Konfiguration der Konten wiederherstellen…</string> <string name="file_migration_ok_finished">Abgeschlossen</string> <string name="file_migration_failed_not_enough_space">FEHLER: zu wenig Platz</string> + <string name="file_migration_failed_not_writable">FEHLER: Zieldatei kann nicht geschrieben werden</string> + <string name="file_migration_failed_not_readable">FEHLER: Quelldatei kann nicht gelesen werden</string> <string name="file_migration_failed_dir_already_exists">FEHLER: Nextcloud Ordner existiert bereits</string> <string name="file_migration_failed_while_coping">FEHLER: Migration fehlgeschlagen</string> <string name="file_migration_failed_while_updating_index">FEHLER: Während der Aktualisierung des Indexes</string> @@ -419,6 +421,9 @@ <string name="file_migration_override_data_folder">Überschreiben</string> <string name="file_migration_use_data_folder">Verwende bestehenden</string> + <string name="file_migration_source_not_readable_title">Quellverzeichnis kann nicht gelesen werden!</string> + <string name="file_migration_source_not_readable">Möchten Sie wirklich den Speicherpfad in %1$s ändern?\n\nHinweis: Alle Daten müssen dann erneut heruntergeladen werden.</string> + <string name="prefs_category_accounts">Konten</string> <string name="prefs_add_account">Konto hinzufügen</string> <string name="drawer_manage_accounts">Konten verwalten</string> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 516c3f6969..c74b95c668 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -411,6 +411,8 @@ <string name="file_migration_restoring_accounts_configuration">Konfiguration der Konten wiederherstellen…</string> <string name="file_migration_ok_finished">Abgeschlossen</string> <string name="file_migration_failed_not_enough_space">FEHLER: zu wenig Platz</string> + <string name="file_migration_failed_not_writable">FEHLER: Zieldatei kann nicht geschrieben werden</string> + <string name="file_migration_failed_not_readable">FEHLER: Quelldatei kann nicht gelesen werden</string> <string name="file_migration_failed_dir_already_exists">FEHLER: Nextcloud Ordner existiert bereits</string> <string name="file_migration_failed_while_coping">FEHLER: Migration fehlgeschlagen</string> <string name="file_migration_failed_while_updating_index">FEHLER: Während der Aktualisierung des Indexes</string> @@ -419,6 +421,9 @@ <string name="file_migration_override_data_folder">Überschreiben</string> <string name="file_migration_use_data_folder">Verwende bestehenden</string> + <string name="file_migration_source_not_readable_title">Quellverzeichnis kann nicht gelesen werden!</string> + <string name="file_migration_source_not_readable">Möchtest Du wirklich den Speicherpfad in %1$s ändern?\n\nHinweis: Alle Daten müssen dann erneut heruntergeladen werden.</string> + <string name="prefs_category_accounts">Konten</string> <string name="prefs_add_account">Konto hinzufügen</string> <string name="drawer_manage_accounts">Konten verwalten</string> diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 2ca08c5328..569e5a4f2a 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -42,10 +42,10 @@ <string name="prefs_category_more">Más</string> <string name="prefs_accounts">Cuentas</string> <string name="prefs_manage_accounts">Administrar cuentas</string> - <string name="prefs_passcode">Bloqueo de código de seguridad</string> + <string name="prefs_passcode">Bloqueo con código de seguridad</string> <string name="prefs_fingerprint">Bloqueo por huella digital</string> <string name="prefs_fingerprint_notsetup">No se ha establecido ninguna huella digital. </string> - <string name="prefs_show_hidden_files">Mostrar archivos escondidos</string> + <string name="prefs_show_hidden_files">Mostrar archivos ocultos</string> <string name="prefs_instant_upload">Carga instantánea de imágenes</string> <string name="prefs_instant_upload_summary">Cargar instantaneamente las fotografías tomadas por la cámara</string> <string name="prefs_instant_video_upload">Carga instantánea de video</string> @@ -411,6 +411,8 @@ en los últimos 7 días. </string> <string name="file_migration_restoring_accounts_configuration">Guardando la configuración de las cuentas…</string> <string name="file_migration_ok_finished">Terminado</string> <string name="file_migration_failed_not_enough_space">ERROR: Espacio insuficiente</string> + <string name="file_migration_failed_not_writable">ERROR: El archivo destino no se puede escribir</string> + <string name="file_migration_failed_not_readable">ERROR: El archivo fuente no se puede leer</string> <string name="file_migration_failed_dir_already_exists">ERROR: El directorio de Nextcloud ya existe</string> <string name="file_migration_failed_while_coping">ERROR: Falla durante la migración</string> <string name="file_migration_failed_while_updating_index">ERROR: Falla durante la actualización del índice</string> @@ -419,6 +421,9 @@ en los últimos 7 días. </string> <string name="file_migration_override_data_folder">Remplazar</string> <string name="file_migration_use_data_folder">Usar</string> + <string name="file_migration_source_not_readable_title">¡El directorio fuente no se puede leer!</string> + <string name="file_migration_source_not_readable">¿Aún desea cambiar la ruta de almacenamiento a %1$s?\n\nNota: todos los datos tendrán que ser descargados de nuevo. </string> + <string name="prefs_category_accounts">Cuentas</string> <string name="prefs_add_account">Agregar cuenta</string> <string name="drawer_manage_accounts">Administrar cuentas</string> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 18c94729c5..3f9a0ac222 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -411,6 +411,8 @@ <string name="file_migration_restoring_accounts_configuration">Restaurando configuración de cuentas…</string> <string name="file_migration_ok_finished">Finalizado</string> <string name="file_migration_failed_not_enough_space">ERROR: no hay espacio suficiente</string> + <string name="file_migration_failed_not_writable">ERROR: No se puede escribir el archivo de destino</string> + <string name="file_migration_failed_not_readable">ERROR: No se puede leer el archivo de origen</string> <string name="file_migration_failed_dir_already_exists">ERROR: El directorio de Nextcloud ya existe</string> <string name="file_migration_failed_while_coping">ERROR: Fallo durante la migración</string> <string name="file_migration_failed_while_updating_index">ERROR: Fallo al actualizar el índice</string> @@ -419,6 +421,9 @@ <string name="file_migration_override_data_folder">Reemplazar</string> <string name="file_migration_use_data_folder">Usar</string> + <string name="file_migration_source_not_readable_title">¡No se puede leer el directorio de origen!</string> + <string name="file_migration_source_not_readable">¿Aún quieres cambiar la ruta de almacenamiento a |%1$s?\n\nNota: habrá que descargar de nuevo todos los datos.</string> + <string name="prefs_category_accounts">Cuentas</string> <string name="prefs_add_account">Agregar cuenta</string> <string name="drawer_manage_accounts">Administrar cuentas</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 2bc873d534..371caa1437 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -410,6 +410,8 @@ <string name="file_migration_restoring_accounts_configuration">Restauration de la configuration des comptes…</string> <string name="file_migration_ok_finished">Terminé</string> <string name="file_migration_failed_not_enough_space">ERREUR : Espace insuffisant</string> + <string name="file_migration_failed_not_writable">ERREUR : Le fichier n\'est pas modifiable</string> + <string name="file_migration_failed_not_readable">ERREUR : Le fichier n\'est pas lisible</string> <string name="file_migration_failed_dir_already_exists">ERREUR : Le dossier Nextcloud existe déjà</string> <string name="file_migration_failed_while_coping">ERREUR : Echec lors de la migration</string> <string name="file_migration_failed_while_updating_index">ERREUR : Echec lors de la mise à jour de l\'index</string> @@ -418,6 +420,9 @@ <string name="file_migration_override_data_folder">Remplacer</string> <string name="file_migration_use_data_folder">Conserver le dossier actuel</string> + <string name="file_migration_source_not_readable_title">Le dossier n\'est pas lisible !</string> + <string name="file_migration_source_not_readable">Souhaitez-vous modifier le chemin de stockage pour %1$s ?\n\nNote : toutes les données devront être à nouveau téléchargées.</string> + <string name="prefs_category_accounts">Comptes</string> <string name="prefs_add_account">Ajouter un compte</string> <string name="drawer_manage_accounts">Gérer les comptes</string> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 08fad8e296..9a1a73950f 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -410,6 +410,8 @@ <string name="file_migration_restoring_accounts_configuration">Przywracanie konfiguracji konta…</string> <string name="file_migration_ok_finished">Skończone</string> <string name="file_migration_failed_not_enough_space">BŁĄD: Brak miejsca</string> + <string name="file_migration_failed_not_writable">BŁĄD: Nie można zapisać pliku docelowego</string> + <string name="file_migration_failed_not_readable">BŁĄD: Nie można odczytać pliku źródłowego</string> <string name="file_migration_failed_dir_already_exists">BŁĄD: Katalog Nextcloud już istnieje</string> <string name="file_migration_failed_while_coping">BŁĄD: Nieudana migracja</string> <string name="file_migration_failed_while_updating_index">BŁĄD: Nieudana aktualizacja indeksu</string> @@ -418,6 +420,9 @@ <string name="file_migration_override_data_folder">Zamień</string> <string name="file_migration_use_data_folder">Użyj</string> + <string name="file_migration_source_not_readable_title">Nie można odczytać katalogu źródłowego!</string> + <string name="file_migration_source_not_readable">Czy nadal chcesz zmienić ścieżkę do %1$s?\n\nUwaga: Wszystkie dane będą musiały zostać ponownie pobrane.</string> + <string name="prefs_category_accounts">Konta</string> <string name="prefs_add_account">Dodaj konto</string> <string name="drawer_manage_accounts">Zarządzaj kontami</string> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 5350e4045d..25cfdbd725 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -413,6 +413,8 @@ <string name="file_migration_restoring_accounts_configuration">Восстановление настроек пользователя…</string> <string name="file_migration_ok_finished">Завершено</string> <string name="file_migration_failed_not_enough_space">ОШИБКА: Недостаточно места</string> + <string name="file_migration_failed_not_writable">ОШИБКА: Файл назначения недоступен для записи</string> + <string name="file_migration_failed_not_readable">ОШИБКА: Исходный файл недоступен для чтения</string> <string name="file_migration_failed_dir_already_exists">ОШИБКА: Каталог Nextcloud уже существует</string> <string name="file_migration_failed_while_coping">ОШИБКА: Ошибка при миграции</string> <string name="file_migration_failed_while_updating_index">ОШИБКА: Ошибка при обновлении индекса</string> @@ -421,6 +423,9 @@ <string name="file_migration_override_data_folder">Перезаписать</string> <string name="file_migration_use_data_folder">Использовать существующий</string> + <string name="file_migration_source_not_readable_title">Исходный каталог недоступен для чтения!</string> + <string name="file_migration_source_not_readable">Вы действительно хотите изменить расположение хранилища на %1$s?\n\nВнимание: придётся заново скачать все данные.</string> + <string name="prefs_category_accounts">Аккаунты</string> <string name="prefs_add_account">Добавить аккаунт</string> <string name="drawer_manage_accounts">Управление аккаунтами</string> diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index 71337abe24..6fb98eb625 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -13,10 +13,28 @@ <string name="actionbar_send_file">Dërgojeni</string> <string name="actionbar_sort">Renditni</string> <string name="actionbar_sort_title">Renditni sipas</string> + <string name="sort_by">Rendit sipas</string> + <string name="menu_item_sort_by_name_a_z">A - Z</string> + <string name="menu_item_sort_by_name_z_a">Z - A</string> + <string name="menu_item_sort_by_date_newest_first">Më të rejat në fillim</string> + <string name="menu_item_sort_by_date_oldest_first">Më të vjetrat në fillim</string> + <string name="menu_item_sort_by_size_biggest_first">Më të mëdhajat në fillim</string> + <string name="menu_item_sort_by_size_smallest_first">Më të voglat në fillim</string> + <string name="drawer_item_all_files">Të gjithë skedarët</string> + <string name="drawer_item_files">Skedarët</string> + <string name="drawer_item_home">Kryefaqja</string> + <string name="drawer_item_favorites">Të preferuarat</string> + <string name="drawer_item_photos">Fotot</string> <string name="drawer_item_on_device">Në pajisjen</string> + <string name="drawer_item_recently_added">Të shtuara së fundmi</string> + <string name="drawer_item_recently_modified">Të modifikuara së fundmi</string> + <string name="drawer_item_shared">Të ndara</string> + <string name="drawer_item_videos">Videot</string> <string name="drawer_item_settings">Rregullime</string> <string name="drawer_item_uploads_list">Ngarkimet</string> + <string name="drawer_item_activities">Aktivitetet</string> + <string name="drawer_item_notifications">Njoftimet</string> <string name="drawer_quota">%1$s e %2$s përdorur</string> <string name="drawer_close">Mbylle</string> <string name="drawer_open">Hape</string> @@ -25,6 +43,8 @@ <string name="prefs_accounts">Llogaritë</string> <string name="prefs_manage_accounts">Administroni llogaritë</string> <string name="prefs_passcode">Kyçje kodkalimi</string> + <string name="prefs_fingerprint">Kyç me shenja gishtash</string> + <string name="prefs_fingerprint_notsetup">Shenjat e gishtave nuk janë vendosur</string> <string name="prefs_show_hidden_files">Trego skedarët e fshehur</string> <string name="prefs_instant_upload">Ngarkime të menjëhershme fotosh</string> <string name="prefs_instant_upload_summary">Ngarkoni menjëherë foto të bëra nga kamera</string> @@ -77,12 +97,32 @@ <string name="file_list_seconds_ago">sekonda më parë</string> <string name="file_list_empty_headline">Këtu nuk ka asnjë skedar</string> <string name="file_list_empty">Ngarko disa të dhëna ose sinkronizo me pajisjet e tua!</string> + <string name="file_list_empty_favorites">Shto disa skedar të preferuar ose sinkronizo me paisjen tënde</string> + <string name="file_list_empty_favorites_filter_list">Skedarët dhe direktorit që i shënoni si të preferuara do të shfaqen këtu</string> + <string name="file_list_empty_favorites_filter">Kërkimi juaj nuk ktheu asnjë skedar të preferuar</string> <string name="file_list_loading">Po ngarkohet…</string> + <string name="file_list_no_app_for_file_type">Nuk ka asnjë konfigurim për të trajtuar këtë tip skedari</string> <string name="local_file_list_empty">Në këtë dosje s’ka skedar.</string> <string name="file_list_empty_headline_search">Nuk ka rezultate në këtë dosje</string> + <string name="file_list_empty_headline_server_search">Asnjë rezultat</string> + <string name="file_list_empty_favorite_headline">Asgjë e preferuar akoma</string> + <string name="file_list_empty_shared_headline">Asgjë e ndarë akoma</string> + <string name="file_list_empty_shared">Skedarët dhe direktorit që ndani do të shfaqen këtu</string> + <string name="file_list_empty_headline_server_search_videos">Asnjë video</string> + <string name="file_list_empty_headline_server_search_photos">Asnjë foto</string> <string name="file_list_empty_search">Përpiquni të shikoni në një dosje tjetër</string> + <string name="file_list_empty_recently_modified">Nuk u gjetë asnjë skedar i modifikuar 7 ditët e fundit</string> + <string name="file_list_empty_recently_modified_filter">Kërkimi juaj nuk ktheu asnjë skedar të modifikuar +në 7 ditët e fundit.</string> + <string name="file_list_empty_recently_added">Nuk u gjet asnjë skedar i shtuar së fundmi</string> + <string name="file_list_empty_recently_added_filter">Kërkimi juaj nuk ktheu ndonjë skedar të kthyer së fundmi.</string> + <string name="file_list_empty_text_photos">Ngarkoni disa foto ose aktivizoni ngarkimin direkt.</string> + <string name="file_list_empty_text_photos_filter">Kërkimi juaj nuk ktheu asnjë foto. </string> + <string name="file_list_empty_text_videos">Ngarkoni disa video ose aktivizoni ngarkimin direkt.</string> + <string name="file_list_empty_text_videos_filter">Kërkimi juaj nuk ktheu asnjë video.</string> <string name="upload_list_empty_headline">Nuk ka asnjë ngarkim në gjëndje</string> <string name="upload_list_empty_text">Ngarko disa të dhëna ose aktivizo ngarkimin e menjëhershëm!</string> + <string name="upload_list_empty_text_auto_upload">Ngarko disa përmbajtje ose aktivizo ngarkimin direkt. </string> <string name="file_list_folder">dosje</string> <string name="file_list_folders">dosje</string> <string name="file_list_file">Skedar</string> @@ -238,6 +278,8 @@ <string name="favorite">Caktojeni si të gatshëm jo në linjë</string> <string name="unfavorite">Hiqeni si të gatshëm jo në linjë</string> + <string name="favorite_real">Vendose si të preferuar</string> + <string name="unset_favorite_real">Hiqe si të preferuar</string> <string name="common_rename">Riemërtojeni</string> <string name="common_remove">Hiqe</string> <string name="confirmation_remove_file_alert">Doni vërtet të hiqni %1$s?</string> @@ -311,6 +353,7 @@ <string name="conflict_use_local_version">versionin vendor</string> <string name="conflict_use_server_version">versionin e shërbyesit</string> + <string name="preview_sorry">Më vjen keq.</string> <string name="preview_image_description">Parapamje figure</string> <string name="preview_image_error_unknown_format">Kjo figurë nuk mund të shfaqet</string> @@ -368,6 +411,8 @@ <string name="file_migration_restoring_accounts_configuration">Rikthimi i konfigurimit… të llogarive</string> <string name="file_migration_ok_finished">Përfundoi</string> <string name="file_migration_failed_not_enough_space">GABIM: Nuk ka hapsirë mjaftueshëm </string> + <string name="file_migration_failed_not_writable">GABIM: Skedari destinacion nuk ështe i shkrueshëm</string> + <string name="file_migration_failed_not_readable">GABIM: Skedari burim nuk është i lexueshëm</string> <string name="file_migration_failed_dir_already_exists">GABIM: Drejtoria Nextcloud ekziston tashmë</string> <string name="file_migration_failed_while_coping">GABIM: Gjatë migrimit</string> <string name="file_migration_failed_while_updating_index">GABIM: Gjatë përditësimit të indeksit</string> @@ -376,6 +421,9 @@ <string name="file_migration_override_data_folder">Mbishkruaj</string> <string name="file_migration_use_data_folder">Përdor ekzistueset</string> + <string name="file_migration_source_not_readable_title">Direktoria burim nuk është lexueshme!</string> + <string name="file_migration_source_not_readable">Doni akoma ta ndryshoni rrugën e kujtesës në %1$s? \n\n Shënim: të gjitha të dhënat duhet të shkarkohen edhe njëherë.</string> + <string name="prefs_category_accounts">Llogari</string> <string name="prefs_add_account">Shtoni llogari</string> <string name="drawer_manage_accounts">Menaxhoni llogaritë</string> @@ -505,6 +553,7 @@ <string name="participate_testing_report_text">Raportoni një problem në Github</string> <string name="participate_testing_version_text">Jeni të interesuar për të na ndihmuar në testimin e versionit të ardhshëm?</string> <string name="participate_beta_headline">Testoni versionin Beta</string> + <string name="participate_beta_text">Kjo përfshin të gjitha karakteristikat që do të vijnë dhe ky është vetëm fillimi. Buget/gabimet mund të ndodhin, nëse dhe kur të ndodhin, ju lutemi të raportoni për gjetjet tuaja. </string> <string name="participate_release_candidate_headline">Lëshimi i kandidatit</string> <string name="participate_release_candidate_text">Lëshimi i kandidatit (RC) është një fragment i lëshimit të ardhshme dhe pritet të jetë i qëndrueshëm. Testimi i setup-it tuaj individuale mund të ndihmojë për ta siguruar këtë. Regjistrohuni për testimin në Play Store ose manualisht shikoni në seksionin \"versionet\" në F-Droid.</string> <string name="participate_contribute_headline">Kontribim aktiv</string> @@ -526,6 +575,13 @@ <item quantity="other">%d të përzgjedhura</item> </plurals> + <string name="activity_list_loading_activity">Duke ngarkuar aktivitetet 1…</string> + <string name="activity_list_no_results">Asnjë aktivitet nuk u gjet.</string> + + <string name="notifications_loading_activity">Duke ngarkuar njoftimet 1…</string> + <string name="notifications_no_results_headline">Asnjë njofim</string> + <string name="notifications_no_results_message">Ju lutemi kontrolloni përsëri më vonë.</string> + <string name="upload_file_dialog_title">Vendos emrin dhe tipin e dokumentit të aploduar </string> <string name="upload_file_dialog_filename">Emri dokumentit</string> <string name="upload_file_dialog_filetype">Tipi dokumentit</string> @@ -552,4 +608,41 @@ <string name="whats_new_skip">Kalo</string> + <string name="fingerprint_scan_finger">Ju lutemi skanoni gishtin tuaj</string> + <string name="fingerprint_unknown">Gishti nuk u njoh</string> + + <!-- User information --> + <string name="user_info_full_name">Emri i plotë</string> + <string name="user_info_email">E-mail</string> + <string name="user_info_phone">Numri i telefonit</string> + <string name="user_info_address">Adresa</string> + <string name="user_info_website">Website</string> + <string name="user_info_twitter">Twitter</string> + + <string name="user_information_description">Informacioni i përdoruesit</string> + + <!-- Activities --> + <string name="activities_no_results_headline">Akoma asnjë aktivitet</string> + <string name="activities_no_results_message">Ky burim do tregoj eventet si\nshtimet, ndryshimet dhe ndarjet</string> + <string name="webview_error">Ndodhi një gabim</string> + <string name="prefs_category_about">Rreth </string> + + <string name="actionbar_contacts">Krijo backup të kontakteve</string> + <string name="actionbar_contacts_restore">Rikthe kontaktet</string> + <string name="contacts_backup_button">Backup kontaktet</string> + <string name="contacts_restore_button">Rikthe backup-in e fundit</string> + <string name="contacts_header_restore">Rikthe</string> + <string name="contacts_header_backup">Backup</string> + <string name="contacts_automatic_backup">Backup i kontakteve</string> + <string name="contacts_last_backup">Backup i fundit</string> + <string name="contacts_read_permission">Kërkohet e drejta për të lexuar listën e kontakteve</string> + <string name="contacts_write_permission">Kërkohet e drejta për të ndryshuar listën e kontakteve</string> + <string name="contactlist_title">Rikthe kontaktet</string> + <string name="contaclist_restore_selected">Rikthe kontaktet e zgjedhura</string> + <string name="contactlist_account_chooser_title">Zgjidh llogarinë që do të importohet</string> + <string name="contactlist_no_permission">Nuk është dhënë asnjë e drejtë, asgjë nuk u importua!</string> + <string name="contacts_preference_choose_date">Zgjidh datën</string> + <string name="contacts_preference_backup_never">kurrë</string> + <string name="contacts_preferences_no_file_found">Nuk u gjet asnjë skedarë</string> + <string name="contacts_preferences_something_strange_happened">Ne nuk mund të gjejmë backup-in tuaj të fundit!</string> </resources> diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index ac70352c3d..f847d2b8cf 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -411,6 +411,8 @@ <string name="file_migration_restoring_accounts_configuration">Hesap ayarları geri yükleniyor…</string> <string name="file_migration_ok_finished">Tamamlandı</string> <string name="file_migration_failed_not_enough_space">HATA: Depolama alanı yetersiz</string> + <string name="file_migration_failed_not_writable">HATA: Hedef dosya yazılabilir değil</string> + <string name="file_migration_failed_not_readable">HATA: Kaynak dosya okunabilir değil</string> <string name="file_migration_failed_dir_already_exists">HATA: Nextcloud klasörü zaten var</string> <string name="file_migration_failed_while_coping">HATA: Aktarımda sorun çıktı</string> <string name="file_migration_failed_while_updating_index">HATA: Dizin güncellenirken sorun çıktı</string> @@ -419,6 +421,9 @@ <string name="file_migration_override_data_folder">Değiştirilsin</string> <string name="file_migration_use_data_folder">Kullanılsın</string> + <string name="file_migration_source_not_readable_title">Kaynak klasör okunabilir değil!</string> + <string name="file_migration_source_not_readable">Buna rağmen depolama konumunu %1$s olarak değiştirmek istediğinize emin misiniz?\n\nNot: Tüm verilerin yeniden indirilmesi gerekecek.</string> + <string name="prefs_category_accounts">Hesaplar</string> <string name="prefs_add_account">Hesap ekle</string> <string name="drawer_manage_accounts">Hesap yönetimi</string> From b8197ee993ad9c7865de1edb6558ca77b3ad12b6 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Sat, 6 May 2017 12:25:05 +0200 Subject: [PATCH 870/881] prevent using destroyed activity --- .../com/owncloud/android/utils/DisplayUtils.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/src/main/java/com/owncloud/android/utils/DisplayUtils.java index 379f190634..45fc63576c 100644 --- a/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -539,10 +539,14 @@ public class DisplayUtils { public static void downloadIcon(Context context, String iconUrl, SimpleTarget imageView, int placeholder, int width, int height) { - if (iconUrl.endsWith(".svg")) { - downloadSVGIcon(context, iconUrl, imageView, placeholder, width, height); - } else { - downloadPNGIcon(context, iconUrl, imageView, placeholder); + try { + if (iconUrl.endsWith(".svg")) { + downloadSVGIcon(context, iconUrl, imageView, placeholder, width, height); + } else { + downloadPNGIcon(context, iconUrl, imageView, placeholder); + } + } catch (Exception e) { + Log_OC.d(TAG, "not setting image as activity is destroyed"); } } From db660e12d5f9869c6349b41bbca2f78293d32b36 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Sun, 7 May 2017 00:21:47 +0000 Subject: [PATCH 871/881] [tx-robot] updated from transifex --- src/main/res/values-el/strings.xml | 3 +++ src/main/res/values-fr/strings.xml | 12 ++++++------ src/main/res/values-nl/strings.xml | 4 ++++ src/main/res/values-pt-rBR/strings.xml | 5 +++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index f515dbf3d3..566c618f9f 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -410,6 +410,8 @@ <string name="file_migration_restoring_accounts_configuration">Γίνεται επαναφορά ρυθμίσεων λογαριασμών…</string> <string name="file_migration_ok_finished">Ολοκληρώθηκε</string> <string name="file_migration_failed_not_enough_space">ΣΦΑΛΜΑ: Ανεπαρκής αποθηκευτικός χώρος</string> + <string name="file_migration_failed_not_writable">ΣΦΑΛΜΑ: Το αρχείο προορισμού δεν είναι εγγράψιμο</string> + <string name="file_migration_failed_not_readable">Σφάλμα: Το αρχείο προέλευσης δεν είναι αναγνώσιμο</string> <string name="file_migration_failed_dir_already_exists">ΣΦΑΛΜΑ: Υπάρχει ήδη ο κατάλογος Nextcloud</string> <string name="file_migration_failed_while_coping">ΣΦΑΛΜΑ: Κατά την μεταφορά</string> <string name="file_migration_failed_while_updating_index">ΣΦΑΛΜΑ: Κατά την ενημέρωση ευρετηρίου</string> @@ -637,6 +639,7 @@ <string name="contacts_preference_choose_date">Επιλογή ημερομηνίας</string> <string name="contacts_preference_backup_never">ποτέ</string> <string name="contacts_preferences_no_file_found">Δεν βρέθηκε αρχείο</string> + <string name="contacts_preferences_something_strange_happened">Δεν μπορούμε να βρούμε το τελευταίο σας αντίγραφο ασφαλείας!</string> <string name="contacts_preferences_backup_scheduled">Η λήψη αντιγράφου αφαλείας έχει προγραμματιστεί και θα ξεκινήσει σύντομα</string> <string name="contacts_preferences_import_scheduled">Η εισαγωγή έχει προγραμματιστεί και θα ξεκινήσει σύντομα</string> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 371caa1437..b8e1137910 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -340,7 +340,7 @@ <string name="placeholder_timestamp">18/05/2012 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Téléverse par wifi uniquement</string> + <string name="auto_upload_on_wifi">Téléverser par wifi uniquement</string> <string name="instant_upload_on_wifi">Téléverser les images via une connexion WiFi uniquement</string> <string name="instant_video_upload_on_wifi">Téléverser les images via une connexion WiFi uniquement</string> <string name="instant_video_upload_on_charging">Téléverser les images uniquement si le chargeur est branché</string> @@ -486,7 +486,7 @@ <string name="upload_move_files">Déplacer le fichier</string> <string name="select_all">Tout sélectionner</string> - <string name="pref_behaviour_entries_keep_file">conserver dans le dossier original</string> + <string name="pref_behaviour_entries_keep_file">conservé dans le dossier original</string> <string name="pref_behaviour_entries_move">déplacé vers le dossier de l\'application</string> <string name="pref_behaviour_entries_delete_file">supprimé</string> <string name="prefs_storage_path">Chemin de stockage</string> @@ -529,8 +529,8 @@ <string name="action_clear_successful_uploads">Effacé</string> <string name="action_clear_finished_uploads">Effacer tous les téléversements terminés</string> - <string name="action_switch_grid_view">Affichage Mosaïque</string> - <string name="action_switch_list_view">Affichage Liste</string> + <string name="action_switch_grid_view">Affichage mosaïque</string> + <string name="action_switch_list_view">Affichage liste</string> <string name="manage_space_title">Gestion de l\'espace</string> <string name="manage_space_description">Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \n\nLes fichiers téléchargés ne seront pas impactés.\n\nCette opération peut prendre du temps.</string> @@ -644,8 +644,8 @@ <string name="contacts_preference_backup_never">jamais</string> <string name="contacts_preferences_no_file_found">Aucun fichier trouvé</string> <string name="contacts_preferences_something_strange_happened">Nous ne trouvons pas votre dernière copie de sauvegarde !</string> - <string name="contacts_preferences_backup_scheduled">Sauvegarde planifiée et va commencer prochainement</string> - <string name="contacts_preferences_import_scheduled">Importation planifiée et va commencer prochainement</string> + <string name="contacts_preferences_backup_scheduled">La sauvegarde est planifiée et va démarrer</string> + <string name="contacts_preferences_import_scheduled">L\'import est planifié et va démarrer</string> <!-- Notifications --> <string name="new_notification_received">Nouvelle notification reçue</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index fa6d24c043..5db97a1ede 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -412,6 +412,8 @@ Kies er eentje van een provider.</string> <string name="file_migration_restoring_accounts_configuration">Accountconfiguratie herstellen…</string> <string name="file_migration_ok_finished">Afgerond</string> <string name="file_migration_failed_not_enough_space">FOUT: Niet genoeg ruimte</string> + <string name="file_migration_failed_not_writable">FOUT: Doelbestand niet schrijfbaar</string> + <string name="file_migration_failed_not_readable">FOUT: Bronbestand niet leesbaar</string> <string name="file_migration_failed_dir_already_exists">FOUT: Nextcloudmap bestaat al</string> <string name="file_migration_failed_while_coping">FOUT: Tijdens migratie</string> <string name="file_migration_failed_while_updating_index">FOUT: Tijdens bijwerken index</string> @@ -420,6 +422,7 @@ Kies er eentje van een provider.</string> <string name="file_migration_override_data_folder">Vervangen</string> <string name="file_migration_use_data_folder">Gebruiken</string> + <string name="file_migration_source_not_readable_title">Bronmap niet leesbaar!</string> <string name="prefs_category_accounts">Accounts</string> <string name="prefs_add_account">Account toevoegen</string> <string name="drawer_manage_accounts">Accounts beheren </string> @@ -624,6 +627,7 @@ Kies er eentje van een provider.</string> <string name="prefs_category_about">Over</string> <string name="actionbar_contacts">Contactpersonen backup</string> + <string name="actionbar_contacts_restore">Herstellen contactpersonen</string> <string name="contacts_backup_button">Nu backupppen</string> <string name="contacts_restore_button">Herstel de laatste backup</string> <string name="contacts_header_restore">Herstellen</string> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 712c2eff8e..2b05e5917e 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -411,6 +411,8 @@ <string name="file_migration_restoring_accounts_configuration">Restaurando a configuração das contas…</string> <string name="file_migration_ok_finished">Finalizado</string> <string name="file_migration_failed_not_enough_space">ERRO: Espaço insuficiente</string> + <string name="file_migration_failed_not_writable">ERRO: Arquivo de destino não gravável</string> + <string name="file_migration_failed_not_readable">ERRO: Arquivo fonte não legível</string> <string name="file_migration_failed_dir_already_exists">ERRO: Diretório Nexcloud já existe</string> <string name="file_migration_failed_while_coping">ERRO: Falha durante a migração</string> <string name="file_migration_failed_while_updating_index">ERRO: Falha ao atualizar índice</string> @@ -419,6 +421,9 @@ <string name="file_migration_override_data_folder">Substituir</string> <string name="file_migration_use_data_folder">Usar</string> + <string name="file_migration_source_not_readable_title">Diretório fonte não legível!</string> + <string name="file_migration_source_not_readable">Você ainda quer mudar o caminho de armazenagem para %1$s?\n\nImportante: Todos os dados terão de ser baixados novamente.</string> + <string name="prefs_category_accounts">Contas</string> <string name="prefs_add_account">Adicionar uma conta</string> <string name="drawer_manage_accounts">Gerenciar contas</string> From 5dc5863af3137aa6e80dddd68252c7e59a8b1812 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Mon, 8 May 2017 00:21:53 +0000 Subject: [PATCH 872/881] [tx-robot] updated from transifex --- src/main/res/values-nb-rNO/strings.xml | 6 ++++++ src/main/res/values-nl/strings.xml | 3 +++ src/main/res/values-pt-rBR/strings.xml | 16 ++++++++-------- src/main/res/values-sq/strings.xml | 10 +++++++++- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 3b9d892f55..79b6a2a334 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -411,6 +411,8 @@ <string name="file_migration_restoring_accounts_configuration">Gjenoppretter kontokonfigurasjon…</string> <string name="file_migration_ok_finished">Fullført</string> <string name="file_migration_failed_not_enough_space">FEIL: Ikke nok plass</string> + <string name="file_migration_failed_not_writable">FEIL: Målfila er ikke skrivbar</string> + <string name="file_migration_failed_not_readable">Feil: Kildefila er ikke lesbar</string> <string name="file_migration_failed_dir_already_exists">FEIL: Nextcloudmappen finnes allerede</string> <string name="file_migration_failed_while_coping">FEIL: Under migrering</string> <string name="file_migration_failed_while_updating_index">FEIL: Under oppdatering av indeks</string> @@ -419,6 +421,9 @@ <string name="file_migration_override_data_folder">Erstatt</string> <string name="file_migration_use_data_folder">Bruk</string> + <string name="file_migration_source_not_readable_title">Målmappa er ikke lesbar!</string> + <string name="file_migration_source_not_readable">Ønsker du å endre lagringsstien til %1$s\n\nMerk: All data vil måtte lastes ned igjen.</string> + <string name="prefs_category_accounts">Kontoer</string> <string name="prefs_add_account">Legg til en konto</string> <string name="drawer_manage_accounts">Håndter kontoer</string> @@ -622,6 +627,7 @@ <string name="prefs_category_about">Om</string> <string name="actionbar_contacts">Sikkerhetskopiering av kontakter</string> + <string name="actionbar_contacts_restore">Gjenopprett kontakter</string> <string name="contacts_backup_button">Sikkerhetskopier nå</string> <string name="contacts_restore_button">Gjenopprett fra siste sikkerhetskopiering</string> <string name="contacts_header_restore">Gjenopprett</string> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 5db97a1ede..60c60f450c 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -423,6 +423,8 @@ Kies er eentje van een provider.</string> <string name="file_migration_use_data_folder">Gebruiken</string> <string name="file_migration_source_not_readable_title">Bronmap niet leesbaar!</string> + <string name="file_migration_source_not_readable">Wil je echt het opslagpad wijzigen naar %1$s?\n\nLet op: alle gegevens moeten opnieuw worden gedownloaded.</string> + <string name="prefs_category_accounts">Accounts</string> <string name="prefs_add_account">Account toevoegen</string> <string name="drawer_manage_accounts">Accounts beheren </string> @@ -643,6 +645,7 @@ Kies er eentje van een provider.</string> <string name="contacts_preference_choose_date">Kies datum</string> <string name="contacts_preference_backup_never">nooit</string> <string name="contacts_preferences_no_file_found">Geen bestand gevonden</string> + <string name="contacts_preferences_something_strange_happened">We kunnen uw laatste backup niet vinden!</string> <string name="contacts_preferences_backup_scheduled">Backup ingepland en zal zo starten</string> <string name="contacts_preferences_import_scheduled">Import ingepland en zal zo starten</string> diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 2b05e5917e..f09a357808 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -155,7 +155,7 @@ <string name="about_title">Sobre</string> <string name="change_password">Alterar senha</string> <string name="delete_account">Excluir conta</string> - <string name="delete_account_warning">Excluir a conta %s?\n\nNão é possível desfazer a exclusão.</string> + <string name="delete_account_warning">Excluir a conta %s?\n\nNão será possível desfazer a exclusão.</string> <string name="create_account">Criar conta</string> <string name="upload_chooser_title">Enviar de …</string> <string name="uploader_info_dirname">Nome da pasta</string> @@ -273,7 +273,7 @@ <string name="auth_unsupported_auth_method">O servidor não suporta este método de autenticação</string> <string name="auth_unsupported_multiaccount">%1$s não suporta múltiplas contas</string> <string name="auth_fail_get_user_name">Seu servidor não está retornando um ID correto de usuário. Por favor, contacte o administrador</string> - <string name="auth_can_not_auth_against_server">Não é possível obter autenticação neste servidor</string> + <string name="auth_can_not_auth_against_server">Não foi possível obter autenticação neste servidor</string> <string name="auth_account_does_not_exist">A conta ainda não existe no dispositivo</string> <string name="favorite">Definir como disponível offline</string> @@ -365,11 +365,11 @@ <string name="prefs_instant_upload_path_use_subfolders_summary">Armazena em subpastas baseado no ano e mês</string> <string name="share_link_no_support_share_api">O compartilhamento não está habilitado em seu servidor. Por favor, contact o administrador.</string> - <string name="share_link_file_no_exist">Não é possível compartilhar. Por favor verifique se o arquivo existe</string> + <string name="share_link_file_no_exist">Não foi possível compartilhar. Por favor verifique se o arquivo existe</string> <string name="share_link_file_error">Ocorreu um erro durante a tentativa de compartilhar esse arquivo ou pasta</string> - <string name="unshare_link_file_no_exist">Não é possível descompartilhar. Por favor verifique se o arquivo existe</string> + <string name="unshare_link_file_no_exist">Não foi possível descompartilhar. Por favor verifique se o arquivo existe</string> <string name="unshare_link_file_error">Ocorreu um erro ao tentar descompartilhar este arquivo ou pasta</string> - <string name="update_link_file_no_exist">Não é possível atualizar. Verifique se o arquivo existe</string> + <string name="update_link_file_no_exist">Não foi possível atualizar. Verifique se o arquivo existe</string> <string name="update_link_file_error">Ocorreu um erro enquanto tentava atualizar o compartilhamento</string> <string name="share_link_password_title">Digite uma senha</string> <string name="share_link_empty_password">Você deve digitar uma senha</string> @@ -431,7 +431,7 @@ <string name="actionbar_logger">Logs</string> <string name="log_send_history_button">Enviar histórico</string> - <string name="log_send_no_mail_app">Nenhum aplicativo para enviar registros foi encontrado. Por favor instale um cliente de email.</string> + <string name="log_send_no_mail_app">Nenhum aplicativo para enviar registros foi encontrado. Por favor instale um cliente de e-mail.</string> <string name="log_send_mail_subject">%1$s logs do aplicativo Android</string> <string name="log_progress_dialog_text">Carregando dados …</string> @@ -449,7 +449,7 @@ <string name="forbidden_permissions_move">mover este arquivo</string> - <string name="copy_file_not_found">Não é possível copiar. Por favor, verifique se o arquivo existe</string> + <string name="copy_file_not_found">Não foi possível copiar. Por favor, verifique se o arquivo existe</string> <string name="copy_file_invalid_into_descendent">Não é possível copiar uma pasta para uma das suas próprias pastas subjacentes</string> <string name="copy_file_invalid_overwrite">O arquivo já está presente na pasta destino</string> <string name="copy_file_error">Ocorreu um erro ao tentar copiar este arquivo ou pasta</string> @@ -613,7 +613,7 @@ <!-- User information --> <string name="user_info_full_name">Nome completo</string> - <string name="user_info_email">Email</string> + <string name="user_info_email">E-mail</string> <string name="user_info_phone">Número do telefone</string> <string name="user_info_address">Endereço</string> <string name="user_info_website">Website</string> diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index 6fb98eb625..085ef5155b 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -645,4 +645,12 @@ në 7 ditët e fundit.</string> <string name="contacts_preference_backup_never">kurrë</string> <string name="contacts_preferences_no_file_found">Nuk u gjet asnjë skedarë</string> <string name="contacts_preferences_something_strange_happened">Ne nuk mund të gjejmë backup-in tuaj të fundit!</string> - </resources> + <string name="contacts_preferences_backup_scheduled">Backup-i u skedulua dhe do të filloj së shpejti</string> + <string name="contacts_preferences_import_scheduled">Importimi u skedulua dhe do të filloj së shpejti</string> + + <!-- Notifications --> + <string name="new_notification_received">Morët njoftime të reja</string> + <string name="drawer_logout">Dilni</string> + + +</resources> From e90b3288f31ecf69521aecb47060676b357e0ec0 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Mon, 8 May 2017 15:47:20 +0200 Subject: [PATCH 873/881] Fix push things Signed-off-by: Mario Danic <mario@lovelyhq.com> --- src/gplay/java/com/owncloud/android/utils/PushUtils.java | 2 +- .../android/services/firebase/NCFirebaseInstanceIDService.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/gplay/java/com/owncloud/android/utils/PushUtils.java b/src/gplay/java/com/owncloud/android/utils/PushUtils.java index cbbaacea6d..319be7376f 100644 --- a/src/gplay/java/com/owncloud/android/utils/PushUtils.java +++ b/src/gplay/java/com/owncloud/android/utils/PushUtils.java @@ -156,7 +156,7 @@ public class PushUtils { if (!TextUtils.isEmpty(arbitraryValue = arbitraryDataProvider.getValue(account, KEY_PUSH))) { Gson gson = new Gson(); PushConfigurationState pushArbitraryData = gson.fromJson(arbitraryValue, - PushArbitraryData.class); + PushConfigurationState.class); RemoteOperation unregisterAccountDeviceForProxyOperation = new UnregisterAccountDeviceForProxyOperation(context.getResources(). getString(R.string.push_server_url), diff --git a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index a5ab4d409a..c5f39a5070 100644 --- a/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/modified/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -36,8 +36,6 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { //You can implement this method to store the token on your server if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { PreferenceManager.setPushToken(MainApp.getAppContext(), FirebaseInstanceId.getInstance().getToken()); - PreferenceManager.setPushTokenUpdateTime(MainApp.getAppContext(), System.currentTimeMillis()); - PushUtils.pushRegistrationToServer(); } } From e7fa4d24e5f0dc6edaf62afd5037375fa34ad7a6 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Tue, 9 May 2017 00:22:33 +0000 Subject: [PATCH 874/881] [tx-robot] updated from transifex --- src/main/res/values-en-rGB/strings.xml | 338 ++++++++++++++++--------- src/main/res/values-nb-rNO/strings.xml | 6 +- src/main/res/values-ru/strings.xml | 1 + 3 files changed, 225 insertions(+), 120 deletions(-) diff --git a/src/main/res/values-en-rGB/strings.xml b/src/main/res/values-en-rGB/strings.xml index bdc0cac2d9..7dcf0e810f 100644 --- a/src/main/res/values-en-rGB/strings.xml +++ b/src/main/res/values-en-rGB/strings.xml @@ -13,10 +13,28 @@ <string name="actionbar_send_file">Send</string> <string name="actionbar_sort">Sort</string> <string name="actionbar_sort_title">Sort by</string> + <string name="sort_by">Sort by</string> + <string name="menu_item_sort_by_name_a_z">A - Z</string> + <string name="menu_item_sort_by_name_z_a">Z - A</string> + <string name="menu_item_sort_by_date_newest_first">Newest first</string> + <string name="menu_item_sort_by_date_oldest_first">Oldest first</string> + <string name="menu_item_sort_by_size_biggest_first">Biggest first</string> + <string name="menu_item_sort_by_size_smallest_first">Smallest first</string> + <string name="drawer_item_all_files">All files</string> + <string name="drawer_item_files">Files</string> + <string name="drawer_item_home">Home</string> + <string name="drawer_item_favorites">Favourites</string> + <string name="drawer_item_photos">Photos</string> <string name="drawer_item_on_device">On device</string> + <string name="drawer_item_recently_added">Recently added</string> + <string name="drawer_item_recently_modified">Recently modified</string> + <string name="drawer_item_shared">Shared</string> + <string name="drawer_item_videos">Videos</string> <string name="drawer_item_settings">Settings</string> <string name="drawer_item_uploads_list">Uploads</string> + <string name="drawer_item_activities">Activities</string> + <string name="drawer_item_notifications">Notifications</string> <string name="drawer_quota">%1$s of %2$s used</string> <string name="drawer_close">Close</string> <string name="drawer_open">Open</string> @@ -25,11 +43,13 @@ <string name="prefs_accounts">Accounts</string> <string name="prefs_manage_accounts">Manage accounts</string> <string name="prefs_passcode">Passcode lock</string> + <string name="prefs_fingerprint">Fingerprint lock</string> + <string name="prefs_fingerprint_notsetup">No fingerprints have been set up.</string> <string name="prefs_show_hidden_files">Show hidden files</string> - <string name="prefs_instant_upload">Instant picture uploads</string> - <string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string> - <string name="prefs_instant_video_upload">Instant video uploads</string> - <string name="prefs_instant_video_upload_summary">Instantly upload videos recorded by camera</string> + <string name="prefs_instant_upload">Instant uploading of pictures</string> + <string name="prefs_instant_upload_summary">Upload pictures taken by camera instantly</string> + <string name="prefs_instant_video_upload">Instant uploading of video</string> + <string name="prefs_instant_video_upload_summary">Upload videos recorded by camera instantly</string> <string name="prefs_log_title">Enable logging</string> <string name="prefs_log_summary">This is used to log problems</string> <string name="prefs_log_title_history">Logging history</string> @@ -38,23 +58,23 @@ <string name="prefs_calendar_contacts">Sync calendar & contacts</string> <string name="prefs_calendar_contacts_summary">Set up DAVdroid (v1.3.0+) for current account</string> <string name="prefs_calendar_contacts_address_resolve_error">Server address for account could not be resolved for DAVdroid</string> - <string name="prefs_calendar_contacts_no_store_error">No Google Play store or F-Droid app installed</string> - <string name="prefs_calendar_contacts_sync_setup_successful">Calendar & contacts sync set up successfully</string> + <string name="prefs_calendar_contacts_no_store_error">Neither F-droid nor Google Play is installed</string> + <string name="prefs_calendar_contacts_sync_setup_successful">Calendar & contacts sync set up</string> <string name="prefs_help">Help</string> - <string name="prefs_recommend">Recommend to a friend</string> + <string name="prefs_recommend">Recommend to friend</string> <string name="prefs_feedback">Feedback</string> <string name="prefs_imprint">Imprint</string> - <string name="prefs_remember_last_share_location">Remember share location</string> - <string name="prefs_remember_last_upload_location_summary">Remember last share upload location</string> + <string name="prefs_remember_last_share_location">Remember location of share</string> + <string name="prefs_remember_last_upload_location_summary">Remember location of share most recently used</string> <string name="recommend_subject">Try %1$s on your smartphone!</string> - <string name="recommend_text">I want to invite you to use %1$s on your smartphone!\nDownload here: %2$s</string> + <string name="recommend_text">I want to invite you to use %1$s on your smartphone.\nDownload here: %2$s</string> <string name="auth_check_server">Check server</string> <string name="auth_host_url">Server address https://…</string> <string name="auth_username">Username</string> <string name="auth_password">Password</string> - <string name="auth_register">Don’t have a server yet?\nClick here to get one from a provider</string> + <string name="auth_register">Do you not have a server yet?\nClick here to get one from a provider</string> <string name="sync_string_files">Files</string> <string name="setup_btn_connect">Connect</string> <string name="uploader_btn_upload_text">Upload</string> @@ -66,24 +86,42 @@ <string name="uploader_error_title_no_file_to_upload">No file to upload</string> <string name="uploader_error_message_received_piece_of_text">%1$s cannot upload a piece of text as a file.</string> <string name="uploader_error_message_no_file_to_upload">Received data did not include a valid file.</string> - <string name="uploader_error_title_file_cannot_be_uploaded">File cannot be uploaded</string> + <string name="uploader_error_title_file_cannot_be_uploaded">This file can not be uploaded</string> <string name="uploader_error_message_read_permission_not_granted">%1$s is not allowed to read a received file</string> - <string name="uploader_error_message_source_file_not_found">File to upload was not found in its location. Please check whether the file exists.</string> - <string name="uploader_error_message_source_file_not_copied">An error occurred while copying the file to a temporary folder. Please try to send again.</string> + <string name="uploader_error_message_source_file_not_found">File selected for upload not found. Please check whether the file exists.</string> + <string name="uploader_error_message_source_file_not_copied">Could not copy file to a temporary folder. Try to resend it.</string> <string name="uploader_upload_files_behaviour">Upload option:</string> <string name="uploader_upload_files_behaviour_move_to_nextcloud_folder">Move file to Nextcloud folder</string> <string name="uploader_upload_files_behaviour_only_upload">Keep file in source folder</string> <string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Delete file from source folder</string> <string name="file_list_seconds_ago">seconds ago</string> - <string name="file_list_empty_headline">No files in here</string> - <string name="file_list_empty">Upload some content or sync with your devices!</string> + <string name="file_list_empty_headline">No files here</string> + <string name="file_list_empty">Upload some content or sync with your devices.</string> + <string name="file_list_empty_favorites">Favorite some files or sync with your devices.</string> + <string name="file_list_empty_favorites_filter_list">Files and folders you mark as favorites will show up here</string> + <string name="file_list_empty_favorites_filter">Your search returned no favorited files.</string> <string name="file_list_loading">Loading…</string> - <string name="file_list_no_app_for_file_type">No app found for file type!</string> + <string name="file_list_no_app_for_file_type">No app set up to handle this file type.</string> <string name="local_file_list_empty">There are no files in this folder.</string> <string name="file_list_empty_headline_search">No results in this folder</string> - <string name="file_list_empty_search">Try looking in another folder?</string> + <string name="file_list_empty_headline_server_search">No results</string> + <string name="file_list_empty_favorite_headline">Nothing favorited yet</string> + <string name="file_list_empty_shared_headline">Nothing shared yet</string> + <string name="file_list_empty_shared">Files and folders you share will show up here</string> + <string name="file_list_empty_headline_server_search_videos">No videos</string> + <string name="file_list_empty_headline_server_search_photos">No photos</string> + <string name="file_list_empty_search">Maybe it is in a different folder?</string> + <string name="file_list_empty_recently_modified">Found no files modified during the last 7 days</string> + <string name="file_list_empty_recently_modified_filter">Your search returned no files modified in the last 7 days.</string> + <string name="file_list_empty_recently_added">Found no recently added files</string> + <string name="file_list_empty_recently_added_filter">Your search returned no recently added files.</string> + <string name="file_list_empty_text_photos">Upload some photos or activate auto upload.</string> + <string name="file_list_empty_text_photos_filter">Your search returned no photos.</string> + <string name="file_list_empty_text_videos">Upload some videos or activate auto upload.</string> + <string name="file_list_empty_text_videos_filter">Your search returned no videos.</string> <string name="upload_list_empty_headline">No uploads available</string> - <string name="upload_list_empty_text">Upload some content or activate instant upload!</string> + <string name="upload_list_empty_text">Upload some content or activate instant uploading.</string> + <string name="upload_list_empty_text_auto_upload">Upload some content or activate auto upload.</string> <string name="file_list_folder">folder</string> <string name="file_list_folders">folders</string> <string name="file_list_file">file</string> @@ -95,14 +133,14 @@ <string name="filedetails_modified">Modified:</string> <string name="filedetails_download">Download</string> <string name="filedetails_sync_file">Synchronise</string> - <string name="filedetails_renamed_in_upload_msg">File was renamed to %1$s during upload</string> - <string name="list_layout">List layout</string> + <string name="filedetails_renamed_in_upload_msg">File renamed to %1$s during upload</string> + <string name="list_layout">Listed layout</string> <string name="action_share">Share</string> <string name="common_yes">Yes</string> <string name="common_no">No</string> <string name="common_ok">OK</string> <string name="common_remove_upload">Remove upload</string> - <string name="common_retry_upload">Retry upload</string> + <string name="common_retry_upload">Retry uploading</string> <string name="common_cancel_sync">Cancel sync</string> <string name="common_cancel">Cancel</string> <string name="common_back">Back</string> @@ -122,10 +160,10 @@ <string name="uploader_info_dirname">Folder name</string> <string name="uploader_upload_in_progress_ticker">Uploading …</string> <string name="uploader_upload_in_progress_content">%1$d%% Uploading %2$s</string> - <string name="uploader_upload_succeeded_ticker">Upload succeeded</string> + <string name="uploader_upload_succeeded_ticker">Uploaded</string> <string name="uploader_upload_succeeded_content_single">%1$s uploaded</string> <string name="uploader_upload_failed_ticker">Upload failed</string> - <string name="uploader_upload_failed_content_single">Upload of %1$s could not be completed</string> + <string name="uploader_upload_failed_content_single">Could not upload %1$s</string> <string name="uploader_upload_failed_credentials_error">Upload failed, you need to log in again</string> <string name="uploads_view_title">Uploads</string> <string name="uploads_view_group_current_uploads">Current</string> @@ -142,37 +180,37 @@ <string name="uploads_view_upload_status_failed_localfile_error">Local file not found</string> <string name="uploads_view_upload_status_failed_permission_error">Permission error</string> <string name="uploads_view_upload_status_conflict">Conflict</string> - <string name="uploads_view_upload_status_service_interrupted">App was terminated</string> + <string name="uploads_view_upload_status_service_interrupted">App terminated</string> <string name="uploads_view_upload_status_unknown_fail">Unknown error</string> - <string name="uploads_view_upload_status_waiting_for_wifi">Waiting for WiFi connectivity</string> + <string name="uploads_view_upload_status_waiting_for_wifi">Waiting for Wi-Fi connectivity</string> <string name="uploads_view_later_waiting_to_upload">Waiting to upload</string> <string name="downloader_download_in_progress_ticker">Downloading …</string> <string name="downloader_download_in_progress_content">%1$d%% Downloading %2$s</string> - <string name="downloader_download_succeeded_ticker">Download succeeded</string> + <string name="downloader_download_succeeded_ticker">Downloaded</string> <string name="downloader_download_succeeded_content">%1$s downloaded</string> <string name="downloader_download_failed_ticker">Download failed</string> - <string name="downloader_download_failed_content">Download of %1$s could not be completed</string> + <string name="downloader_download_failed_content">Could not download %1$s</string> <string name="downloader_not_downloaded_yet">Not downloaded yet</string> <string name="downloader_download_failed_credentials_error">Download failed, you need to log in again</string> <string name="common_choose_account">Choose account</string> <string name="sync_fail_ticker">Sync failed</string> - <string name="sync_fail_ticker_unauthorized">Sync failed; you need to log in again</string> - <string name="sync_fail_content">Sync of %1$s could not be completed</string> - <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string> + <string name="sync_fail_ticker_unauthorized">Sync failed, you need to log in again</string> + <string name="sync_fail_content">Could not complete sync of %1$s</string> + <string name="sync_fail_content_unauthorized">Wrong password for %1$s</string> <string name="sync_conflicts_in_favourites_ticker">Conflicts found</string> <string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync files could not be synced</string> <string name="sync_fail_in_favourites_ticker">Kept-in-sync files failed</string> <string name="sync_fail_in_favourites_content">Contents of %1$d files could not be synced (%2$d conflicts)</string> <string name="sync_foreign_files_forgotten_ticker">Some local files were forgotten</string> <string name="sync_foreign_files_forgotten_content">%1$d files out of the %2$s folder could not be copied into</string> - <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronisation. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string> - <string name="sync_current_folder_was_removed">Folder %1$s does not exist anymore</string> + <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded with earlier versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string> + <string name="sync_current_folder_was_removed">The folder %1$s does not exist anymore</string> <string name="foreign_files_move">Move all</string> <string name="foreign_files_success">All files were moved</string> <string name="foreign_files_fail">Some files could not be moved</string> <string name="foreign_files_local_text">Local: %1$s</string> <string name="foreign_files_remote_text">Remote: %1$s</string> - <string name="upload_query_move_foreign_files">There is not enough space to copy the selected files into the %1$s folder. Would you like to move them instead?</string> + <string name="upload_query_move_foreign_files">Insufficient space prevents copying the selected files into the %1$s folder. Would you like to move them there instead?</string> <string name="pass_code_enter_pass_code">Please enter your passcode</string> <string name="pass_code_configure_your_pass_code">Enter your passcode</string> @@ -190,16 +228,16 @@ <string name="media_event_done">%1$s playback finished</string> <string name="media_err_nothing_to_play">No media file found</string> <string name="media_err_no_account">No account provided</string> - <string name="media_err_not_in_owncloud">File not in a valid account</string> + <string name="media_err_not_in_owncloud">The file is not in a valid account</string> <string name="media_err_unsupported">Unsupported media codec</string> - <string name="media_err_io">Media file could not be read</string> - <string name="media_err_malformed">Media file not correctly encoded</string> - <string name="media_err_timeout">Timed out whilst trying to play</string> - <string name="media_err_invalid_progressive_playback">Media file cannot be streamed</string> - <string name="media_err_unknown">Media file cannot be played with the stock media player</string> - <string name="media_err_security_ex">Security error trying to play %1$s</string> - <string name="media_err_io_ex">Input error trying to play %1$s</string> - <string name="media_err_unexpected">Unexpected error trying to play %1$s</string> + <string name="media_err_io">Could not read the media file</string> + <string name="media_err_malformed">The media file has incorrect encoding</string> + <string name="media_err_timeout">Attempt to play file timed out</string> + <string name="media_err_invalid_progressive_playback">The media file can not be streamed</string> + <string name="media_err_unknown">The stock media player is unable to play the media file</string> + <string name="media_err_security_ex">A security error was encountered trying to play %1$s</string> + <string name="media_err_io_ex">Input error while trying to play %1$s</string> + <string name="media_err_unexpected">Unexpected error while trying to play %1$s</string> <string name="media_rewind_description">Rewind button</string> <string name="media_play_pause_description">Play or pause button</string> <string name="media_forward_description">Fast-forward button</string> @@ -214,56 +252,58 @@ <string name="auth_account_not_new">An account for the same user and server already exists on the device</string> <string name="auth_account_not_the_same">The entered user does not match the user of this account</string> <string name="auth_unknown_error_title">Unknown error occurred!</string> - <string name="auth_unknown_host_title">Couldn\'t find host</string> - <string name="auth_incorrect_path_title">Server instance not found</string> + <string name="auth_unknown_host_title">Could not find host</string> + <string name="auth_incorrect_path_title">Server not found</string> <string name="auth_timeout_title">The server took too long to respond</string> - <string name="auth_incorrect_address_title">Wrong server address format</string> + <string name="auth_incorrect_address_title">Wrong address format for server</string> <string name="auth_ssl_general_error_title">SSL initialisation failed</string> - <string name="auth_ssl_unverified_server_title">Couldn\'t verify SSL server\'s identity</string> + <string name="auth_ssl_unverified_server_title">Could not verify the identity of the SSL server</string> <string name="auth_bad_oc_version_title">Unrecognised server version</string> - <string name="auth_wrong_connection_title">Couldn\'t establish connection</string> + <string name="auth_wrong_connection_title">Could not establish connection</string> <string name="auth_secure_connection">Secure connection established</string> <string name="auth_unauthorized">Wrong username or password</string> <string name="auth_oauth_error">Unsuccessful authorisation</string> <string name="auth_oauth_error_access_denied">Access denied by authorisation server</string> - <string name="auth_wtf_reenter_URL">Unexpected state; please enter the server address again</string> + <string name="auth_wtf_reenter_URL">Unexpected state, please enter the server address again</string> <string name="auth_expired_oauth_token_toast">Your authorisation expired. Please, authorise again</string> <string name="auth_expired_basic_auth_toast">Please enter the current password</string> <string name="auth_expired_saml_sso_token_toast">Your session expired. Please connect again</string> - <string name="auth_connecting_auth_server">Connecting to authentication server …</string> + <string name="auth_connecting_auth_server">Connecting to authentication server…</string> <string name="auth_unsupported_auth_method">The server does not support this authentication method</string> <string name="auth_unsupported_multiaccount">%1$s does not support multiple accounts</string> - <string name="auth_fail_get_user_name">Your server is not returning a correct user id, please contact an administrator </string> + <string name="auth_fail_get_user_name">Your server is not returning a correct user ID, please contact an administrator</string> <string name="auth_can_not_auth_against_server">Cannot authenticate to this server</string> - <string name="auth_account_does_not_exist">Account does not exist in the device yet</string> + <string name="auth_account_does_not_exist">Account does not exist on the device yet</string> <string name="favorite">Set as available offline</string> <string name="unfavorite">Unset as available offline</string> + <string name="favorite_real">Set as favourite</string> + <string name="unset_favorite_real">Unset favourite</string> <string name="common_rename">Rename</string> <string name="common_remove">Remove</string> <string name="confirmation_remove_file_alert">Do you really want to remove %1$s?</string> - <string name="confirmation_remove_folder_alert">Do you really want to remove %1$s and its contents?</string> + <string name="confirmation_remove_folder_alert">"Do you really want to remove %1$s and the contents thereof?"</string> <string name="confirmation_remove_local">Local only</string> - <string name="remove_success_msg">Removal succeeded</string> + <string name="remove_success_msg">Removed</string> <string name="remove_fail_msg">Removal failed</string> <string name="rename_dialog_title">Enter a new name</string> - <string name="rename_local_fail_msg">Local copy could not be renamed; try a different name</string> - <string name="rename_server_fail_msg">Rename could not be completed</string> - <string name="sync_file_fail_msg">Remote file could not be checked</string> + <string name="rename_local_fail_msg">Local copy could not be renamed, try a different name</string> + <string name="rename_server_fail_msg">Could not give server new name</string> + <string name="sync_file_fail_msg">Could not check remote file</string> <string name="sync_file_nothing_to_do_msg">File contents already synchronised</string> - <string name="create_dir_fail_msg">Folder could not be created</string> + <string name="create_dir_fail_msg">Could not create folder</string> <string name="filename_forbidden_characters">Forbidden characters: / \\ < > : \" | ? *</string> <string name="filename_forbidden_charaters_from_server">File name contains at least one invalid character</string> <string name="filename_empty">File name cannot be empty</string> - <string name="wait_a_moment">Wait a moment</string> + <string name="wait_a_moment">Wait a moment…</string> <string name="wait_checking_credentials">Checking stored credentials</string> - <string name="filedisplay_unexpected_bad_get_content">Unexpected problem; please select the file from a different app</string> - <string name="filedisplay_no_file_selected">No file was selected</string> + <string name="filedisplay_unexpected_bad_get_content">Unexpected problem, please select the file from a different app</string> + <string name="filedisplay_no_file_selected">No file selected</string> <string name="activity_chooser_title">Send link to …</string> <string name="wait_for_tmp_copy_from_private_storage">Copying file from private storage</string> <string name="oauth_check_onoff">Log in with oAuth2</string> - <string name="oauth_login_connection">Connecting to oAuth2 server…</string> + <string name="oauth_login_connection">Connecting to OAuth 2 server…</string> <string name="ssl_validator_header">The identity of the site could not be verified</string> <string name="ssl_validator_reason_cert_not_trusted">- The server certificate is not trusted</string> @@ -271,7 +311,7 @@ <string name="ssl_validator_reason_cert_not_yet_valid">- The server certificate valid dates are in the future</string> <string name="ssl_validator_reason_hostname_not_verified">- The URL does not match the hostname in the certificate</string> <string name="ssl_validator_question">Do you want to trust this certificate anyway?</string> - <string name="ssl_validator_not_saved">The certificate could not be saved</string> + <string name="ssl_validator_not_saved">Could not save certificate</string> <string name="ssl_validator_btn_details_see">Details</string> <string name="ssl_validator_btn_details_hide">Hide</string> <string name="ssl_validator_label_subject">Issued to:</string> @@ -295,24 +335,27 @@ <string name="placeholder_sentence">This is a placeholder</string> <string name="placeholder_filename">placeholder.txt</string> - <string name="placeholder_filetype">PNG Image</string> + <string name="placeholder_filetype">PNG image</string> <string name="placeholder_filesize">389 KB</string> <string name="placeholder_timestamp">2012/05/18 12:23 PM</string> <string name="placeholder_media_time">12:23:45</string> - <string name="auto_upload_on_wifi">Upload via wifi only</string> - <string name="instant_upload_on_wifi">Upload pictures via wifi only</string> - <string name="instant_video_upload_on_wifi">Upload videos via wifi only</string> - <string name="instant_video_upload_on_charging">Upload when charging only</string> - <string name="instant_upload_on_charging">Upload when charging only</string> + <string name="auto_upload_on_wifi">Only upload on Wi-Fi</string> + <string name="instant_upload_on_wifi">Only upload pictures on Wi-Fi</string> + <string name="instant_video_upload_on_wifi">Only upload videos on Wi-Fi</string> + <string name="instant_video_upload_on_charging">Only upload when charging</string> + <string name="instant_upload_on_charging">Only upload when charging</string> <string name="instant_upload_path">/InstantUpload</string> <string name="conflict_title">File conflict</string> - <string name="conflict_message">Which files do you want to keep? If you select both versions, the local file will have a number added to its name.</string> + <string name="conflict_message">Which files do you want to keep? If you select both versions, the local file will have a number appended to its name.</string> <string name="conflict_keep_both">Keep both</string> <string name="conflict_use_local_version">local version</string> <string name="conflict_use_server_version">server version</string> + <string name="preview_sorry">Sorry.</string> <string name="preview_image_description">Image preview</string> + <string name="preview_image_error_unknown_format">Unable to show image</string> + <string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local folder</string> <string name="prefs_instant_upload_path_title">Instant upload folder</string> <string name="prefs_folder_sync_local_path_title">Local folder</string> @@ -320,7 +363,7 @@ <string name="prefs_instant_upload_path_use_subfolders_title">Use subfolders</string> <string name="prefs_instant_upload_path_use_subfolders_summary">Store in subfolders based on year and month</string> - <string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your administrator.</string> + <string name="share_link_no_support_share_api">Sharing is not enabled on your server. Please contact your administrator.</string> <string name="share_link_file_no_exist">Unable to share. Please check whether the file exists</string> <string name="share_link_file_error">An error occurred while trying to share this file or folder</string> <string name="unshare_link_file_no_exist">Unable to unshare. Please check whether the file exists</string> @@ -334,56 +377,60 @@ <string name="copy_link">Copy link</string> <string name="clipboard_text_copied">Copied to clipboard</string> - <string name="clipboard_no_text_to_copy">No text received to copy to clipboard</string> + <string name="clipboard_no_text_to_copy">Received no text to copy to clipboard</string> <string name="clipboard_uxexpected_error">Unexpected error while copying to clipboard</string> <string name="clipboard_label">Text copied from %1$s</string> - <string name="error_cant_bind_to_operations_service">Critical error: cannot perform operations</string> + <string name="error_cant_bind_to_operations_service">Critical error: Unable to perform operations</string> - <string name="network_error_socket_exception">An error occurred whilst connecting to the server.</string> - <string name="network_error_socket_timeout_exception">An error occurred while waiting for the server; the operation couldn\'t be completed</string> - <string name="network_error_connect_timeout_exception">An error occurred while waiting for the server; the operation couldn\'t be completed</string> - <string name="network_host_not_available">The operation couldn\'t be completed; server is unavailable</string> - <string name="forbidden_permissions">You do not have permission %s</string> + <string name="network_error_socket_exception">An error occurred during connection to the server.</string> + <string name="network_error_socket_timeout_exception">An error occurred while waiting for the server. Could not complete operation.</string> + <string name="network_error_connect_timeout_exception">An error occurred while waiting for the server. Could not complete operation.</string> + <string name="network_host_not_available">Could not complete operation. Server unavailable</string> + + <string name="forbidden_permissions">You are not permitted %s</string> <string name="forbidden_permissions_rename">to rename this file</string> <string name="forbidden_permissions_delete">to delete this file</string> <string name="share_link_forbidden_permissions">to share this file</string> <string name="unshare_link_forbidden_permissions">to unshare this file</string> <string name="update_link_forbidden_permissions">to update this share</string> - <string name="forbidden_permissions_create">to create the file</string> + <string name="forbidden_permissions_create">to create this file</string> <string name="uploader_upload_forbidden_permissions">to upload to this folder</string> <string name="downloader_download_file_not_found">The file is no longer available on the server</string> <string name="file_migration_dialog_title">Updating storage path</string> <string name="file_migration_finish_button">Finish</string> - <string name="file_migration_preparing">Preparing for migration…</string> + <string name="file_migration_preparing">Preparing migration…</string> <string name="file_migration_checking_destination">Checking destination…</string> - <string name="file_migration_saving_accounts_configuration">Saving accounts configuration…</string> - <string name="file_migration_waiting_for_unfinished_sync">Waiting for unfinished synchronizations…</string> + <string name="file_migration_saving_accounts_configuration">Saving configuration of accounts…</string> + <string name="file_migration_waiting_for_unfinished_sync">Waiting for all synchronizations to finish…</string> <string name="file_migration_migrating">Moving data…</string> <string name="file_migration_updating_index">Updating index…</string> <string name="file_migration_cleaning">Cleaning…</string> - <string name="file_migration_restoring_accounts_configuration">Restoring accounts configuration…</string> + <string name="file_migration_restoring_accounts_configuration">Restoring configuration of accounts…</string> <string name="file_migration_ok_finished">Finished</string> - <string name="file_migration_failed_not_enough_space">ERROR: Not enough space</string> - <string name="file_migration_failed_not_writable">ERROR: File is not writable</string> - <string name="file_migration_failed_not_readable">ERROR: File is not readable</string> + <string name="file_migration_failed_not_enough_space">ERROR: Insufficient space</string> + <string name="file_migration_failed_not_writable">ERROR: Destination file not writable</string> + <string name="file_migration_failed_not_readable">ERROR: Source file not readable</string> <string name="file_migration_failed_dir_already_exists">ERROR: Nextcloud directory already exists</string> - <string name="file_migration_failed_while_coping">ERROR: While migrating</string> - <string name="file_migration_failed_while_updating_index">ERROR: While updating index</string> + <string name="file_migration_failed_while_coping">ERROR: Failed during migration</string> + <string name="file_migration_failed_while_updating_index">ERROR: Failed to updating index</string> - <string name="file_migration_directory_already_exists">Data folder already exists, what to do?</string> - <string name="file_migration_override_data_folder">Override</string> - <string name="file_migration_use_data_folder">Use existing</string> + <string name="file_migration_directory_already_exists">Data folder exists already. Choose one of the following:</string> + <string name="file_migration_override_data_folder">Replace</string> + <string name="file_migration_use_data_folder">Use</string> + + <string name="file_migration_source_not_readable_title">Source directory not readable!</string> + <string name="file_migration_source_not_readable">Do you still want to change the storage path to %1$s?\n\nNote: all data will have to be downloaded again.</string> <string name="prefs_category_accounts">Accounts</string> <string name="prefs_add_account">Add account</string> <string name="drawer_manage_accounts">Manage accounts</string> - <string name="auth_redirect_non_secure_connection_title">Secure connection is redirected through an unsecured route.</string> + <string name="auth_redirect_non_secure_connection_title">Secure connection redirected through an unsecured route.</string> <string name="actionbar_logger">Logs</string> <string name="log_send_history_button">Send history</string> - <string name="log_send_no_mail_app">No app for sending logs found. Please install a mail app.</string> + <string name="log_send_no_mail_app">No app for sending logs found. Please install an e-mail client.</string> <string name="log_send_mail_subject">%1$s Android app logs</string> <string name="log_progress_dialog_text">Loading data …</string> @@ -391,26 +438,26 @@ <string name="saml_authentication_wrong_pass">Incorrect password</string> <string name="actionbar_move">Move</string> <string name="actionbar_copy">Copy</string> - <string name="file_list_empty_moving">Nothing in here. You can add a folder!</string> + <string name="file_list_empty_moving">Nothing in here. You can add a folder.</string> <string name="folder_picker_choose_button_text">Choose</string> - <string name="move_file_not_found">Unable to move. Please check whether the file exists</string> - <string name="move_file_invalid_into_descendent">It is not possible to move a folder into a descendant</string> - <string name="move_file_invalid_overwrite">The file exists already in the destination folder</string> + <string name="move_file_not_found">Unable to move file. Please check whether it exists</string> + <string name="move_file_invalid_into_descendent">It is not possible to move a folder into one of its own underlying folders</string> + <string name="move_file_invalid_overwrite">The file is already present in the destination folder</string> <string name="move_file_error">An error occurred whilst trying to move this file or folder</string> <string name="forbidden_permissions_move">to move this file</string> <string name="copy_file_not_found">Unable to copy. Please check whether the file exists</string> - <string name="copy_file_invalid_into_descendent">It is not possible to copy a folder into a descendant</string> - <string name="copy_file_invalid_overwrite">The file exists already in the destination folder</string> + <string name="copy_file_invalid_into_descendent">It is not possible to copy a folder into one of its own underlying folders</string> + <string name="copy_file_invalid_overwrite">The file is already present in the destination folder</string> <string name="copy_file_error">An error occurred while trying to copy this file or folder</string> <string name="forbidden_permissions_copy">to copy this file</string> <string name="prefs_category_instant_uploading">Instant uploads</string> <string name="prefs_category_details">Details</string> - <string name="prefs_instant_video_upload_path_title">Instant upload video folder</string> + <string name="prefs_instant_video_upload_path_title">Video folder for instant uploads</string> <string name="sync_folder_failed_content">Synchronisation of %1$s folder could not be completed</string> <string name="shared_subject_header">shared</string> @@ -452,7 +499,7 @@ <string name="share_add_user_or_group">Add user or group</string> <string name="share_via_link_section_title">Share link</string> <string name="share_via_link_expiration_date_label">Set expiration date</string> - <string name="share_via_link_password_label">Password protect</string> + <string name="share_via_link_password_label">Protect with password</string> <string name="share_via_link_password_title">Secured</string> <string name="share_via_link_edit_permission_label">Allow editing</string> <string name="share_via_link_hide_file_listing_permission_label">Hide file listing</string> @@ -468,7 +515,7 @@ <string name="share_email_clarification">%1$s (email)</string> <string name="share_known_remote_clarification">%1$s ( at %2$s )</string> - <string name="share_sharee_unavailable">Sorry, your server version does not allow share with users within clients. \nPlease contact your administrator</string> + <string name="share_sharee_unavailable">Upgrade the server version to allow sharing between users from within their clients.\nPlease contact your administrator</string> <string name="share_privilege_can_share">can share</string> <string name="share_privilege_can_edit">can edit</string> <string name="share_privilege_can_edit_create">create</string> @@ -477,55 +524,63 @@ <string name="edit_share_unshare">Stop sharing</string> <string name="edit_share_done">done</string> - <string name="action_retry_uploads">Retry failed</string> + <string name="action_retry_uploads">New attempt failed</string> <string name="action_clear_failed_uploads">Clear failed</string> - <string name="action_clear_successful_uploads">Clear successful</string> - <string name="action_clear_finished_uploads">Clear all finished</string> + <string name="action_clear_successful_uploads">Cleared</string> + <string name="action_clear_finished_uploads">Clear finished uploads</string> <string name="action_switch_grid_view">Grid view</string> <string name="action_switch_list_view">List view</string> <string name="manage_space_title">Manage space</string> - <string name="manage_space_description">Settings, database and server certificates from %1$s\'s data will be deleted permanently. \n\nDownloaded files will be kept untouched.\n\nThis process can take some time.</string> + <string name="manage_space_description">Settings, database and server certificates from %1$s\'s data will be deleted permanently. \n\nDownloaded files will be kept untouched.\n\nThis process can take a while.</string> <string name="manage_space_clear_data">Clear data</string> <string name="manage_space_error">Some files could not be deleted.</string> - <string name="permission_storage_access">Additional permissions required to upload & download files.</string> - <string name="local_file_not_found_toast">The file was not found in the local file system</string> + <string name="permission_storage_access">Additional permissions required to upload and download files.</string> + <string name="local_file_not_found_toast">File not found in local file system</string> <string name="confirmation_remove_files_alert">Do you really want to remove the selected items?</string> <string name="confirmation_remove_folders_alert">Do you really want to remove the selected items and their contents?</string> - <string name="uploads_view_upload_status_waiting_for_charging">Waiting for device charging</string> + <string name="uploads_view_upload_status_waiting_for_charging">Awaiting charge</string> <string name="actionbar_search">Search</string> <string name="files_drop_not_supported">This is a Nextcloud feature, please update.</string> <string name="learn_more">Learn more</string> <string name="drawer_folder_sync">Auto upload</string> <string name="drawer_participate">Participate</string> - <string name="participate_testing_headline">Help us testing</string> - <string name="participate_testing_bug_text">Found a bug? Something is odd?</string> + <string name="participate_testing_headline">Help by testing</string> + <string name="participate_testing_bug_text">Found a bug? Oddments?</string> <string name="participate_testing_report_text">Report an issue on Github</string> - <string name="participate_testing_version_text">Interested in helping us testing the next Version?</string> + <string name="participate_testing_version_text">Interested in helping out by testing the next version?</string> + <string name="participate_beta_headline">Test the dev version</string> + <string name="participate_beta_text">This includes all upcoming features and it is on the very bleeding edge. Bugs/errors can occur, if and when they do, please report of your findings.</string> <string name="participate_release_candidate_headline">Release candidate</string> - <string name="participate_release_candidate_text">The release candidate (RC) is a snapshot of the upcoming release and it is expected to be stable. Testing your individual setup could help to ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid.</string> + <string name="participate_release_candidate_text">The release candidate (RC) is a snapshot of the upcoming release and is expected to be stable. Testing your individual setup could help ensure this. Sign up for testing on the Play store or manually look in the \"versions\" section on F-Droid.</string> <string name="participate_contribute_headline">Actively Contribute</string> <string name="participate_contribute_irc_text">Join the chat on IRC: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Help others on the <a href="%1$s">forum</a></string> <string name="participate_contribute_translate_text"><a href="%1$s">Translate</a> the app</string> - <string name="participate_contribute_github_text">Contribute as a developer, see <a href="https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for details</string> <string name="move_to">Move to…</string> <string name="copy_to">Copy to…</string> <string name="choose_remote_folder">Choose folder…</string> <string name="folder_sync_loading_folders">Loading folders…</string> <string name="folder_sync_no_results">No media folders found.</string> - <string name="folder_sync_preferences">Auto upload preferences</string> + <string name="folder_sync_preferences">Preferences for auto uploading</string> <string name="folder_sync_settings">Settings</string> - <string name="folder_sync_new_info">Instant upload has been revamped completely. Please see the main menu and re-configure your auto upload. Sorry for the inconvenience.\n\nEnjoy the new and extended auto upload capabilities!</string> + <string name="folder_sync_new_info">Instant uploading has been revamped completely. Re-configure your auto upload from within the main menu.\n\nEnjoy the new and extended auto uploading.</string> <string name="folder_sync_preferences_folder_path">For %1$s</string> <plurals name="items_selected_count"> <item quantity="one">%d selected</item> <item quantity="other">%d selected</item> </plurals> - <string name="upload_file_dialog_title">Input upload filename and filetype</string> + <string name="activity_list_loading_activity">Loading activities…</string> + <string name="activity_list_no_results">No activities found.</string> + + <string name="notifications_loading_activity">Loading notifications…</string> + <string name="notifications_no_results_headline">No notifications</string> + <string name="notifications_no_results_message">Please check back later.</string> + + <string name="upload_file_dialog_title">Input filename and filetype to upload</string> <string name="upload_file_dialog_filename">Filename</string> <string name="upload_file_dialog_filetype">Filetype</string> <string name="upload_file_dialog_filetype_snippet_text">Snippet text file(.txt)</string> @@ -541,7 +596,7 @@ <!-- Welcome to Nc intro features --> <string name="welcome_feature_1_title">A safe home for all your data</string> - <string name="welcome_feature_1_text">Access, share & protect your files at home and in your enterprise</string> + <string name="welcome_feature_1_text">Access, share and protect your files at home and at work</string> <string name="welcome_feature_2_title">Multi account</string> <string name="welcome_feature_2_text">Connect to all your clouds</string> @@ -551,4 +606,49 @@ <string name="whats_new_skip">Skip</string> - </resources> + <string name="fingerprint_scan_finger">Please scan your finger</string> + <string name="fingerprint_unknown">Finger not recognized</string> + + <!-- User information --> + <string name="user_info_full_name">Full name</string> + <string name="user_info_email">E-mail</string> + <string name="user_info_phone">Phone number</string> + <string name="user_info_address">Address</string> + <string name="user_info_website">Website</string> + <string name="user_info_twitter">Twitter</string> + + <string name="user_information_description">User information</string> + + <!-- Activities --> + <string name="activities_no_results_headline">No activity yet</string> + <string name="activities_no_results_message">This stream will show events like\nadditions, changes and shares</string> + <string name="webview_error">Error occurred</string> + <string name="prefs_category_about">About</string> + + <string name="actionbar_contacts">Backup contacts</string> + <string name="actionbar_contacts_restore">Restore contacts</string> + <string name="contacts_backup_button">Backup now</string> + <string name="contacts_restore_button">Restore last backup</string> + <string name="contacts_header_restore">Restore</string> + <string name="contacts_header_backup">Backup</string> + <string name="contacts_automatic_backup">Contacts backup</string> + <string name="contacts_last_backup">Last backup</string> + <string name="contacts_read_permission">Permission to read contact list needed</string> + <string name="contacts_write_permission">Permission to change contact list needed</string> + <string name="contactlist_title">Restore contacts</string> + <string name="contaclist_restore_selected">Restore selected contacts</string> + <string name="contactlist_account_chooser_title">Choose account to import</string> + <string name="contactlist_no_permission">No permission given, nothing imported!</string> + <string name="contacts_preference_choose_date">Choose date</string> + <string name="contacts_preference_backup_never">never</string> + <string name="contacts_preferences_no_file_found">No file found</string> + <string name="contacts_preferences_something_strange_happened">We can\'t find your last backup!</string> + <string name="contacts_preferences_backup_scheduled">Backup scheduled and will start shortly</string> + <string name="contacts_preferences_import_scheduled">Import scheduled and will start shortly</string> + + <!-- Notifications --> + <string name="new_notification_received">New notification received</string> + <string name="drawer_logout">Logout</string> + + +</resources> diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 79b6a2a334..34f23f8ae0 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -643,9 +643,13 @@ <string name="contacts_preference_choose_date">Velg dato</string> <string name="contacts_preference_backup_never">aldri</string> <string name="contacts_preferences_no_file_found">Ingen fil funnet</string> + <string name="contacts_preferences_something_strange_happened">Vi kan ikke finne din siste sikkerhetskopi!</string> <string name="contacts_preferences_backup_scheduled">Sikkerhetskopi planlagt og i snarlig effektuering</string> <string name="contacts_preferences_import_scheduled">Importering planlagt og i snarlig effektuering</string> <!-- Notifications --> <string name="new_notification_received">Nytt varsel mottatt</string> - </resources> + <string name="drawer_logout">Utlogging</string> + + +</resources> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 25cfdbd725..cc37811388 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -562,6 +562,7 @@ <string name="participate_contribute_irc_text">Присоединиться к IRC-чату: <a href="%1$s">#nextcloud-mobile</a></string> <string name="participate_contribute_forum_text">Помогите другим на нашем <a href="%1$s">форуме</a></string> <string name="participate_contribute_translate_text">Участвовать в <a href=\"%1$s\">переводе</a> приложения</string> + <string name="participate_contribute_github_text">Рецензируйте, именяйте и пишите код, подробности по ссылке <a href=\"https://github.com/nextcloud/android/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a>.</string> <string name="move_to">Переместить в…</string> <string name="copy_to">Копировать в…</string> <string name="choose_remote_folder">Выберите каталог …</string> From 28dfecc6d93d211df549ef57d4c41f254c258039 Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Tue, 9 May 2017 17:43:00 -0500 Subject: [PATCH 875/881] Fix Issue #970 --- src/main/res/values/setup.xml | 2 +- src/modified/res/values/setup.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/res/values/setup.xml b/src/main/res/values/setup.xml index e62dc23d57..643025b648 100644 --- a/src/main/res/values/setup.xml +++ b/src/main/res/values/setup.xml @@ -42,7 +42,7 @@ <!-- Contacts backup --> <bool name="contacts_backup">true</bool> - <string name="contacts_backup_folder">/Contacts-Backup</string> + <string name="contacts_backup_folder">/.Contacts-Backup</string> <integer name="contacts_backup_expire">-1</integer> <!-- To fill if you want to show webviews instead of regular welcome views --> diff --git a/src/modified/res/values/setup.xml b/src/modified/res/values/setup.xml index 65f1c89d7c..e3d10aa8bc 100644 --- a/src/modified/res/values/setup.xml +++ b/src/modified/res/values/setup.xml @@ -42,7 +42,7 @@ <!-- Contacts backup --> <bool name="contacts_backup">true</bool> - <string name="contacts_backup_folder">/Contacts-Backup</string> + <string name="contacts_backup_folder">/.Contacts-Backup</string> <integer name="contacts_backup_expire">30</integer> <!-- Colors --> From e101785ce24d5b2c3e60db15952c733e95a7009c Mon Sep 17 00:00:00 2001 From: alejandro <aleister09@gmail.com> Date: Tue, 9 May 2017 17:44:12 -0500 Subject: [PATCH 876/881] Show hidden files after enable it --- .../owncloud/android/ui/adapter/FileListListAdapter.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java index 7b6b0b9a69..ddf7de92df 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -77,7 +77,6 @@ public class FileListListAdapter extends BaseAdapter { private Vector<OCFile> mFilesAll = new Vector<OCFile>(); private Vector<OCFile> mFiles = null; private boolean mJustFolders; - private boolean mShowHiddenFiles; private FileDataStorageManager mStorageManager; private Account mAccount; @@ -106,9 +105,6 @@ public class FileListListAdapter extends BaseAdapter { FileStorageUtils.mSortOrder = PreferenceManager.getSortOrder(mContext); FileStorageUtils.mSortAscending = PreferenceManager.getSortAscending(mContext); - // Fetch preferences for showing hidden files - mShowHiddenFiles = PreferenceManager.showHiddenFilesEnabled(mContext); - // initialise thumbnails cache on background thread new ThumbnailsCacheManager.InitDiskCacheTask().execute(); } @@ -456,7 +452,7 @@ public class FileListListAdapter extends BaseAdapter { if (mJustFolders) { mFiles = getFolders(mFiles); } - if (!mShowHiddenFiles) { + if (!PreferenceManager.showHiddenFilesEnabled(mContext)) { mFiles = filterHiddenFiles(mFiles); } mFiles = FileStorageUtils.sortOcFolder(mFiles); @@ -623,7 +619,7 @@ public class FileListListAdapter extends BaseAdapter { mFiles = new Vector<>(); if (ocFiles != null && ocFiles.size() > 0) { mFiles.addAll(ocFiles); - if (!mShowHiddenFiles) { + if (!PreferenceManager.showHiddenFilesEnabled(mContext)) { mFiles = filterHiddenFiles(mFiles); } mFiles = FileStorageUtils.sortOcFolder(mFiles); From db7e5fae8924efaf720710be58d9d55033afbda2 Mon Sep 17 00:00:00 2001 From: Nextcloud bot <bot@nextcloud.com> Date: Wed, 10 May 2017 00:24:22 +0000 Subject: [PATCH 877/881] [tx-robot] updated from transifex --- src/main/res/values-cs-rCZ/strings.xml | 32 +++++++++++++++++++++++++- src/main/res/values-el/strings.xml | 4 ++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/res/values-cs-rCZ/strings.xml b/src/main/res/values-cs-rCZ/strings.xml index 31baf69dde..15ef73bf77 100644 --- a/src/main/res/values-cs-rCZ/strings.xml +++ b/src/main/res/values-cs-rCZ/strings.xml @@ -19,7 +19,10 @@ <string name="menu_item_sort_by_date_newest_first">První nejnovější</string> <string name="menu_item_sort_by_date_oldest_first">První nejstarší</string> <string name="menu_item_sort_by_size_biggest_first">První největší</string> + <string name="menu_item_sort_by_size_smallest_first">Nejprve nejmenší</string> + <string name="drawer_item_all_files">Všechny soubory</string> + <string name="drawer_item_files">Soubor</string> <string name="drawer_item_home">Domů</string> <string name="drawer_item_favorites">Oblíbené</string> <string name="drawer_item_photos">Fotky</string> @@ -27,6 +30,7 @@ <string name="drawer_item_recently_added">Nedávno přidané</string> <string name="drawer_item_recently_modified">Nedávno změněné</string> <string name="drawer_item_shared">Sdíleno</string> + <string name="drawer_item_videos">Video</string> <string name="drawer_item_settings">Nastavení</string> <string name="drawer_item_uploads_list">Nahrání</string> <string name="drawer_item_activities">Aktivity</string> @@ -99,9 +103,13 @@ <string name="file_list_empty_headline_search">V této složce nebylo nic nalezeno</string> <string name="file_list_empty_headline_server_search">Žádné výsledky</string> <string name="file_list_empty_favorite_headline">Zatím není nic oblíbeno</string> + <string name="file_list_empty_shared_headline">Není nic sdílené</string> + <string name="file_list_empty_headline_server_search_videos">Žádné video</string> + <string name="file_list_empty_headline_server_search_photos">Žádná fotka</string> <string name="file_list_empty_search">Zkusit hledat v jiné složce?</string> <string name="upload_list_empty_headline">Nic k nahrání</string> <string name="upload_list_empty_text">Nahrajte nějaký obsah, nebo aktivujte okamžité nahrání!</string> + <string name="upload_list_empty_text_auto_upload">Nahrajte nějaký obsah nebo aktivujte automatické nahrávání.</string> <string name="file_list_folder">adresář</string> <string name="file_list_folders">adresářů</string> <string name="file_list_file">soubor</string> @@ -332,6 +340,7 @@ <string name="conflict_use_local_version">místní verze</string> <string name="conflict_use_server_version">serverová verze</string> + <string name="preview_sorry">Omlouváme se za to.</string> <string name="preview_image_description">Náhled obrázku</string> <string name="preview_image_error_unknown_format">Nelze zobrazit obrázek</string> @@ -549,6 +558,9 @@ </plurals> <string name="activity_list_loading_activity">Načítání aktivit…</string> + <string name="activity_list_no_results">Žádné aktivity nebyly nalezeny.</string> + + <string name="notifications_no_results_headline">Žádné oznámení</string> <string name="notifications_no_results_message">Prosíme, vraťte se později.</string> <string name="upload_file_dialog_title">Jméno a typ vstupního souboru k nahrání</string> @@ -592,16 +604,34 @@ <!-- Activities --> <string name="activities_no_results_headline">Zatím žádná aktivita</string> + <string name="activities_no_results_message">Datový proud bude zobrazovat události jako přidání, změny a sdílení</string> <string name="webview_error">Došlo k chybě</string> <string name="prefs_category_about">O aplikaci</string> + <string name="actionbar_contacts">Záložní kontakty</string> + <string name="actionbar_contacts_restore">Obnovení kontaktů</string> + <string name="contacts_backup_button">Zálohujte nyní</string> <string name="contacts_restore_button">Obnovit poslední zálohu</string> <string name="contacts_header_restore">Obnovit</string> <string name="contacts_header_backup">Záloha</string> + <string name="contacts_automatic_backup">Zálohování kontaktů</string> <string name="contacts_last_backup">Poslední záloha</string> <string name="contacts_read_permission">Je třeba oprávnění ke čtení seznamu kontaktů</string> + <string name="contacts_write_permission">Povolení změn v seznam kontaktů je vyžadováno</string> + <string name="contactlist_title">Restore contacts</string> + <string name="contaclist_restore_selected">Obnovit vybrané kontakty</string> + <string name="contactlist_account_chooser_title">Vyber účet, který chceš importovat</string> + <string name="contactlist_no_permission">Povolení není udělené, žádný import!</string> <string name="contacts_preference_choose_date">Zvolte datum</string> <string name="contacts_preference_backup_never">Nikdy</string> + <string name="contacts_preferences_no_file_found">Nebyl nalezen žádný soubor</string> + <string name="contacts_preferences_something_strange_happened">Nemůžeme najít poslední zálohu!</string> + <string name="contacts_preferences_backup_scheduled">Zálohování je naplánováno a brzy začne</string> + <string name="contacts_preferences_import_scheduled">Import je naplánován a brzy začne</string> + <!-- Notifications --> <string name="new_notification_received">Přijato nové upozornění</string> - </resources> + <string name="drawer_logout">Odhlásit se</string> + + +</resources> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 566c618f9f..cfa6446dcd 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -420,6 +420,9 @@ <string name="file_migration_override_data_folder">Αντικατάσταση</string> <string name="file_migration_use_data_folder">Χρήση</string> + <string name="file_migration_source_not_readable_title">Ο πηγαίος φάκελος δεν ειναι αναγνώσιμος!</string> + <string name="file_migration_source_not_readable">Θέλετε ακόμη να αλλάξετε το μονοπάτι αποθήκευσης σε %1$s;\n\nΣημείωση: όλα τα δεδομένα θα πρέπει να κατεβαστούν ξανά. </string> + <string name="prefs_category_accounts">Λογαριασμοί</string> <string name="prefs_add_account">Προσθήκη λογαριασμού</string> <string name="drawer_manage_accounts">Διαχείριση λογαριασμών</string> @@ -636,6 +639,7 @@ <string name="contactlist_title">Επαναφορά επαφών</string> <string name="contaclist_restore_selected">Επαναφορά επιλεγμένων επαφών</string> <string name="contactlist_account_chooser_title">Επιλογή λογαριασμού για εισαγωγή</string> + <string name="contactlist_no_permission">Κανένα δικαίωμα δεν δόθηκε, τίποτε δεν εισήχθη</string> <string name="contacts_preference_choose_date">Επιλογή ημερομηνίας</string> <string name="contacts_preference_backup_never">ποτέ</string> <string name="contacts_preferences_no_file_found">Δεν βρέθηκε αρχείο</string> From d3ea3a8ccf404ea2499a57c54b0884e61f0ba1c1 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Wed, 10 May 2017 19:54:40 +0200 Subject: [PATCH 878/881] Add support for folder favorite action Signed-off-by: Mario Danic <mario@lovelyhq.com> --- .../java/com/owncloud/android/files/FileMenuFilter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 6c00ab1f9c..7ccdd6649f 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -243,14 +243,14 @@ public class FileMenuFilter { } // Favorite - if (!allFiles() || synchronizing || allFavorites()) { + if (!canBeFavorited() || synchronizing || allFavorites()) { toHide.add(R.id.action_favorite); } else { toShow.add(R.id.action_favorite); } // Unfavorite - if (!allFiles() || synchronizing || allNotFavorites()) { + if (!canBeFavorited() || synchronizing || allNotFavorites()) { toHide.add(R.id.action_unset_favorite); } else { toShow.add(R.id.action_unset_favorite); @@ -316,6 +316,10 @@ public class FileMenuFilter { return mFiles != null && !containsFolder(); } + private boolean canBeFavorited() { + return mFiles != null; + } + private boolean containsFolder() { for (OCFile file : mFiles) { if (file.isFolder()) { From f30cbca78c12e11dcfee167d4feae4d6b6a1ba9a Mon Sep 17 00:00:00 2001 From: klemens <ka7@github.com> Date: Wed, 10 May 2017 21:04:47 +0200 Subject: [PATCH 879/881] spelling fixes --- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- THIRD_PARTY.txt | 2 +- automationTest/README.md | 4 ++-- .../com/owncloud/android/files/services/FileUploader.java | 2 +- src/main/java/com/owncloud/android/media/MediaService.java | 4 ++-- .../android/services/observer/FileObserverService.java | 2 +- .../services/observer/SyncedFolderObserverService.java | 6 +++--- .../com/owncloud/android/syncadapter/FileSyncAdapter.java | 4 ++-- .../java/com/owncloud/android/ui/activity/BaseActivity.java | 2 +- .../com/owncloud/android/ui/activity/PassCodeActivity.java | 2 +- .../owncloud/android/ui/activity/UploadListActivity.java | 2 +- .../android/ui/fragment/ExpandableListFragment.java | 4 ++-- .../owncloud/android/ui/fragment/ExtendedListFragment.java | 2 +- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63def433ba..ab0ba9a492 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,7 @@ - Display quota if configured/available in navigation drawer - Resume chunked uploads instead of complete restarts - Filter remote and local file lists -- Simple integration with DAVdroid for calender and contacts sync +- Simple integration with DAVdroid for calendar and contacts sync - Mix folders and files on sort by date - Upload when charging option - Revamp upload options Move/Copy/Just-Upload diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 299cb57dd8..48e74b035a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -58,7 +58,7 @@ If your issue appears to be a bug, and hasn't been reported, open a new issue. # Contributing to Source Code Thanks for wanting to contribute source code to Nextcloud. That's great! -New contributions are addded under AGPL version 3. +New contributions are added under AGPL version 3. ## Developing process We are all about quality while not sacrificing speed so we use a very pragmatic workflow. diff --git a/THIRD_PARTY.txt b/THIRD_PARTY.txt index 12dd17aee9..47839cf4ea 100644 --- a/THIRD_PARTY.txt +++ b/THIRD_PARTY.txt @@ -12,7 +12,7 @@ ########### This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License verions 2, +it under the terms of the GNU General Public License versions 2, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, diff --git a/automationTest/README.md b/automationTest/README.md index 899bb8dc79..23450f9847 100644 --- a/automationTest/README.md +++ b/automationTest/README.md @@ -4,7 +4,7 @@ This project contains a set of automatic tests operating in the UI level. Tests are to be run with the tool Appium. Check [here][0] to install it and all its dependencies (including Maven). -You will need to modify the constants in automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/Config.java to assign appropiate values for your test server and accounts. +You will need to modify the constants in automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/Config.java to assign appropriate values for your test server and accounts. You will need to include the ownCloud.apk to test in automationTest/src/test/resources/. To run the tests from command line, plug a device to your computer or start and emulator. Then type @@ -15,6 +15,6 @@ To run only one category of the test mvn clean -Dtest=RunSmokeTests test -The project may also be imported in Eclipse, with the appropiate plug-ins, and run from it. +The project may also be imported in Eclipse, with the appropriate plug-ins, and run from it. [0]: http://appium.io/slate/en/master/?java#about-appium \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index f8a6608622..e98e71d246 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -84,7 +84,7 @@ import java.util.Vector; * * On next invocation of {@link FileUploader} uploaded files which * previously failed will be uploaded again until either upload succeeded or a - * fatal error occured. + * fatal error occurred. * * Every file passed to this service is uploaded. No filtering is performed. * However, Intent keys (e.g., KEY_WIFI_ONLY) are obeyed. diff --git a/src/main/java/com/owncloud/android/media/MediaService.java b/src/main/java/com/owncloud/android/media/MediaService.java index 409943bdcf..e2850d8356 100644 --- a/src/main/java/com/owncloud/android/media/MediaService.java +++ b/src/main/java/com/owncloud/android/media/MediaService.java @@ -135,7 +135,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre /** Flag signaling if the audio should be played immediately when the file is prepared */ protected boolean mPlayOnPrepared; - /** Position, in miliseconds, where the audio should be started */ + /** Position, in milliseconds, where the audio should be started */ private int mStartPosition; /** Interface to access the service through binding */ @@ -568,7 +568,7 @@ public class MediaService extends Service implements OnCompletionListener, OnPre * * The system will avoid finishing the service as much as possible when resources as low. * - * A notification must be created to keep the user aware of the existance of the service. + * A notification must be created to keep the user aware of the existence of the service. */ private void setUpAsForeground(String content) { String ticker = String.format(getString(R.string.media_notif_ticker), getString(R.string.app_name)); diff --git a/src/main/java/com/owncloud/android/services/observer/FileObserverService.java b/src/main/java/com/owncloud/android/services/observer/FileObserverService.java index 375165cdb7..6692b56c66 100644 --- a/src/main/java/com/owncloud/android/services/observer/FileObserverService.java +++ b/src/main/java/com/owncloud/android/services/observer/FileObserverService.java @@ -177,7 +177,7 @@ public class FileObserverService extends Service { (Account) intent.getParcelableExtra(ARG_ACCOUNT)); } else { - Log_OC.e(TAG, "Unknown action recieved; ignoring it: " + intent.getAction()); + Log_OC.e(TAG, "Unknown action received; ignoring it: " + intent.getAction()); } return Service.START_STICKY; diff --git a/src/main/java/com/owncloud/android/services/observer/SyncedFolderObserverService.java b/src/main/java/com/owncloud/android/services/observer/SyncedFolderObserverService.java index fd48c23e70..ff9c58a621 100644 --- a/src/main/java/com/owncloud/android/services/observer/SyncedFolderObserverService.java +++ b/src/main/java/com/owncloud/android/services/observer/SyncedFolderObserverService.java @@ -72,7 +72,7 @@ public class SyncedFolderObserverService extends Service { observer.addListener(new AdvancedFileAlterationListener(syncedFolder)); monitor.addObserver(observer); } catch (Exception e) { - Log_OC.d(TAG, "Failed getting an observer to intialize " + e); + Log_OC.d(TAG, "Failed getting an observer to initialize " + e); } } @@ -138,7 +138,7 @@ public class SyncedFolderObserverService extends Service { advancedFileAlterationObserver.addListener(new AdvancedFileAlterationListener(syncedFolder)); monitor.addObserver(advancedFileAlterationObserver); } catch (Exception e) { - Log_OC.d(TAG, "Failed getting an observer to intialize"); + Log_OC.d(TAG, "Failed getting an observer to initialize"); } } else { monitor.removeObserver(fileAlterationObserver); @@ -155,7 +155,7 @@ public class SyncedFolderObserverService extends Service { advancedFileAlterationObserver.addListener(new AdvancedFileAlterationListener(syncedFolder)); monitor.addObserver(advancedFileAlterationObserver); } catch (Exception e) { - Log_OC.d(TAG, "Failed getting an observer to intialize"); + Log_OC.d(TAG, "Failed getting an observer to initialize"); } } diff --git a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 1213e19175..358e707897 100644 --- a/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -180,7 +180,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { } else { Log_OC.d(TAG, "Leaving synchronization before synchronizing the root folder " + - "because cancelation request"); + "because cancellation request"); } @@ -351,7 +351,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (mCancellation && i <files.size()) { Log_OC.d(TAG, "Leaving synchronization before synchronizing " + files.get(i).getRemotePath() + - " due to cancelation request"); + " due to cancellation request"); } } diff --git a/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java b/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java index 5ef755c9d9..2c1f913de3 100644 --- a/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java @@ -222,7 +222,7 @@ public abstract class BaseActivity extends AppCompatActivity { boolean mMandatoryCreation; /** - * Constuctor + * Constructor * * @param mandatoryCreation When 'true', if an account was not created, the app is closed. */ diff --git a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java index 53b246e45c..a2a2c3245b 100644 --- a/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java @@ -171,7 +171,7 @@ public class PassCodeActivity extends AppCompatActivity { /** - * Binds the appropiate listeners to the input boxes receiving each digit of the pass code. + * Binds the appropriate listeners to the input boxes receiving each digit of the pass code. */ protected void setTextListeners() { diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index cec0cfca1d..24d4991276 100755 --- a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -90,7 +90,7 @@ public class UploadListActivity extends FileActivity implements UploadListFragme setContentView(R.layout.upload_list_layout); - // this activity has no file really bound, it's for mulitple accounts at the same time; should no inherit + // this activity has no file really bound, it's for multiple accounts at the same time; should no inherit // from FileActivity; moreover, some behaviours inherited from FileActivity should be delegated to Fragments; // but that's other story setFile(null); diff --git a/src/main/java/com/owncloud/android/ui/fragment/ExpandableListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ExpandableListFragment.java index c7022f29bc..6023022bd2 100755 --- a/src/main/java/com/owncloud/android/ui/fragment/ExpandableListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ExpandableListFragment.java @@ -82,8 +82,8 @@ public class ExpandableListFragment extends ExtendedListFragment implements OnCh @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { - // to be @overriden - Log_OC.e(TAG, "onChildClick(). This method should be overriden!"); + // to be @overridden + Log_OC.e(TAG, "onChildClick(). This method should be overridden!"); return false; } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 2192c7d636..4b04a6d362 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -549,7 +549,7 @@ public class ExtendedListFragment extends Fragment @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - // to be @overriden + // to be @overridden } @Override From 39bf45da6427c32badeff4fe7383f313de9afe8b Mon Sep 17 00:00:00 2001 From: tobiasKaminsky <tobias@kaminsky.me> Date: Thu, 11 May 2017 11:36:41 +0200 Subject: [PATCH 880/881] revert this, although it will get removed by a different PR --- .../com/owncloud/android/ui/fragment/OCFileListFragment.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 720b417adb..f5bee75bfa 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -250,6 +250,10 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi public void onResume() { super.onResume(); + if (remoteOperationAsyncTask != null) { + remoteOperationAsyncTask.cancel(true); + } + if (getActivity() != null) { AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } From 4e122a912469e9cf6c482b7469b5aca8170ace90 Mon Sep 17 00:00:00 2001 From: Mario Danic <mario@lovelyhq.com> Date: Thu, 11 May 2017 11:50:46 +0200 Subject: [PATCH 881/881] Fix issues Signed-off-by: Mario Danic <mario@lovelyhq.com> --- .../java/com/owncloud/android/files/FileMenuFilter.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 7ccdd6649f..694f4e94b3 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -243,14 +243,14 @@ public class FileMenuFilter { } // Favorite - if (!canBeFavorited() || synchronizing || allFavorites()) { + if (mFiles.isEmpty() || synchronizing || allFavorites()) { toHide.add(R.id.action_favorite); } else { toShow.add(R.id.action_favorite); } // Unfavorite - if (!canBeFavorited() || synchronizing || allNotFavorites()) { + if (mFiles.isEmpty() || synchronizing || allNotFavorites()) { toHide.add(R.id.action_unset_favorite); } else { toShow.add(R.id.action_unset_favorite); @@ -316,10 +316,6 @@ public class FileMenuFilter { return mFiles != null && !containsFolder(); } - private boolean canBeFavorited() { - return mFiles != null; - } - private boolean containsFolder() { for (OCFile file : mFiles) { if (file.isFolder()) {