From: David A. Velasco Date: Mon, 19 Jan 2015 12:44:30 +0000 (+0100) Subject: Merge pull request #798 from LukeOwncloud/develop X-Git-Tag: oc-android-1.7.0_signed~35 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/b6e4f0f4ae761c0c30452baa2c717fb82256c4dc?hp=1077a6de2977b61d46abefb3a30d393185f40d96 Merge pull request #798 from LukeOwncloud/develop On downgrading upload db, delete and re-create --- diff --git a/build.gradle b/build.gradle index 46308aca..57ec86e5 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:0.14.0' + classpath 'com.android.tools.build:gradle:1.0.0' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8d63f892..ae8d5b24 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 15 10:45:44 CEST 2014 +#Mon Jan 19 09:42:11 CET 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip diff --git a/owncloud-android-library b/owncloud-android-library index 8261865f..e87f5f25 160000 --- a/owncloud-android-library +++ b/owncloud-android-library @@ -1 +1 @@ -Subproject commit 8261865ff24c1bfc05be19ae9364a66dac8f26c3 +Subproject commit e87f5f25ad91950d47ec9b6fa01401360cd7ec8d diff --git a/res/values-af-rZA/strings.xml b/res/values-af-rZA/strings.xml index 0e39030a..634d2672 100644 --- a/res/values-af-rZA/strings.xml +++ b/res/values-af-rZA/strings.xml @@ -7,6 +7,8 @@ Gebruikersnaam Wagwoord sekondes gelede + Ja + Nee OK Kanseleer Fout diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 5134014b..d8d4eb00 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -53,6 +53,10 @@ منذ ثواني لا يوجد شيء هنا. إرفع بعض الملفات! جاري التحميل ... + مجلد + مجلدات + ملف + ملفات اضغظ على الملف ليتم عرض خيارات أكثر الحجم : النوع : @@ -254,4 +258,5 @@ كلمة مرور خاطئة اختيار الأمان + مُشارك diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index d3a9060b..3f91b6d8 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -220,4 +220,5 @@ Aşağıda göstərilən %5$s-də olan daxili və xarici fayl(lar) link edilmiş Hesablar Hesab əlavə et Yalnış şifrə + yayımlanmış diff --git a/res/values-bg-rBG/strings.xml b/res/values-bg-rBG/strings.xml index 4b3ecfd1..1fd8462d 100644 --- a/res/values-bg-rBG/strings.xml +++ b/res/values-bg-rBG/strings.xml @@ -66,6 +66,7 @@ папка папки файл + файл Натисни върху файл, за да видиш допълнителна информация. Размер: Тип: @@ -281,8 +282,6 @@ Сигурна връзка е пренасочена по несигурен път. Доклади Изпрати История - ownCloud Android доклади - Зареждане на информация... Нужна е идентификация Грешна парола Премести @@ -295,4 +294,5 @@ за да преместиш този файл Незабавно качване Сигурност + споделен diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 49e04b49..a2861bae 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -268,4 +268,5 @@ বেছে নিন সরাতে ব্যার্থ হলো। ফাইলটি রয়েছে কিনা দেখুন। নিরাপত্তা + ভাগাভাগিকৃত diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 4c2f8692..9ab386ca 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -1,7 +1,34 @@ + Učitaj + Datoteke Nova fascikla + Postavke + PoÅ¡alji + ViÅ¡e + Pomoć + Korisničko ime + Lozinka + Datoteke + Učitaj + Preuzmite + Podijelite vezu + Da + Ne + Ok + Prekini učitavanje + Odustani + GreÅ¡ka + Nepoznata greÅ¡ka + Promijeni lozinku + Kreiraj račun + Preimenuj + PoÅ¡alji + Potrebna autentifikacija + PogreÅ¡na lozinka + Izaberite + Sigurnost diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 9980cf2c..6979b06a 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -268,4 +268,5 @@ Contrasenya incorrecta Escull Seguretat + compartit diff --git a/res/values-cs-rCZ/strings.xml b/res/values-cs-rCZ/strings.xml index 03387293..d7b4abc7 100644 --- a/res/values-cs-rCZ/strings.xml +++ b/res/values-cs-rCZ/strings.xml @@ -281,8 +281,9 @@ správce systému. Bezpečné spojení je přesměrováno na nezabezpečenou trasu. Logy Odeslat historii - Logy aplikace ownCloud pro Android - Načítám data... + Nebyla nalezena žádná aplikace pro odesílání logů. Nainstalujte poÅ¡tovní aplikaci! + %1$s logy aplikace pro Android + Načítání dat… Vyžadováno přihlášení Nesprávné heslo Přesunout @@ -296,4 +297,7 @@ správce systému. Okamžitá odesílání Zabezpečení Cesta pro nahrávání videí + sdílené + s vámi + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index ee807fca..5aa03ad1 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -280,8 +280,9 @@ Sikker forbindelse videredirigeres til en usikker rute. Logge Send historik - App-logregistreringer for ownCloud Android - Indlæser data... + Der blev ikke fundet apps, der kan sende logge. Installér mail-app\'en! + %1$s Android-app - logge + Indlæser data ... Godkendelse pÃ¥krævet Forkert kodeord Flyt @@ -295,4 +296,7 @@ Øjeblikkelige uploads Sikkerhed Sti til videoupload + delt + med dig + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 00fdce2e..2cd13be6 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -282,8 +282,9 @@ Die gesicherte Verbindung wird auf eine unsichere Route weitergeleitet. Protokolle Verlauf senden - Protokolle der ownCloud-Android-App - Daten werden geladen … + Keine App zum Versenden der Meldungen gefunden. Bitte installieren Sie die Mail-App! + %1$s Android-App Meldungen + Lade Daten… Legitimierung benötigt Falsches Passwort Verschieben @@ -297,4 +298,7 @@ Sofortiges Hochladen Sicherheit Verzeichnis zum Hochladen der Videos + geteilt + Mit Ihnen + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2d7ccd4d..9de3d4ba 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -282,8 +282,9 @@ Die gesicherte Verbindung wird auf eine unsichere Route weitergeleitet. Protokolle Verlauf senden - Protokolle der ownCloud-Android-App - Daten werden geladen … + Keine App zum Versenden der Meldungen gefunden. Bitte installiere die Mail-App! + %1$s Android-App Meldungen + Lade Daten… Legitimierung benötigt Falsches Passwort Verschieben @@ -297,4 +298,7 @@ Sofortiges Hochladen Sicherheit Verzeichnis zum Hochladen der Videos + geteilt + Mit Dir + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 917ca39c..0a1006de 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -11,8 +11,10 @@ Ρυθμίσεις Λεπτομέρειες Αποστολή + Ταξινόμηση + Ταξινόμηση κατά - A-Z + A-Ω Νεότερο - Παλαιότερο + Lisää + Hallitse tilejä + Sovelluksen PIN + Apua + http://esimerkki.fi/palvelu/ + Käyttäjätunnus + Salasana + Lähetä + Ei sisältöä. Siirrä tänne jotakin! + Ladataan... + kansio + kansiot + tiedosto + Tiedostot + Jaa linkki + Poista linkin jako + KYLLÄ + EI + Ok + Peruuta + Virhe + Virheellinen PIN + Sovelluksen PIN poistettu + Sovelluksen PIN tallennettu + Syötetty käyttäjä ei täsmää tämän tilin käyttäjän kanssa + Palvelin ei tue tätä autentikointitapaa + Nimeä uudelleen + Sijainti: + Ylikirjoita + Kopioi linkki + + Siirrä + Valitse + Tiedosto on jo kohdekansiossa. + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 73d97d56..6cc7f921 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -12,23 +12,23 @@ Détails Envoyer Trier - Trier par + Trier - A-Z - Plus récent - Plus ancien + par ordre alphabétique + du plus récent au plus ancien Général Plus Comptes - Gestion des comptes utilisateur - Utilisation d\'un code de sécurité - Protéger l\'accès aux données manipulées par le client - Téléchargements instantanés d\'images - Téléversement instantané des photos prises par la caméra - Téléchargements instantanés de vidéos - Téléversement instantané des vidéos prises par la caméra + Gestion des comptes + Code de sécurité + Protéger l\'accès à l\'application + Envoi instantané des photos + Téléverser immédiatement les photos prises par la caméra + Envoi instantané des vidéos + Téléverser immédiatement les vidéos prises par la caméra Activer les logs Utilisé pour enregistrer les problèmes dans les logs Historique des logs @@ -40,14 +40,14 @@ Empreinte Mémoriser l\'emplacement de partage Mémoriser le dernier emplacement d\'upload - Essayez %1$s sur votre smartphone&nbsp;! + Essayez %1$s sur votre smartphone ! J\'aimerais vous inviter à utiliser %1$s sur votre smartphone ! Téléchargez-le ici : %2$s Vérifier le serveur Adresse du serveur https://… Nom d\'utilisateur Mot de passe - Nouveau dans %1$s&nbsp;? + Nouveau dans %1$s ? Fichiers Connecter Téléverser @@ -129,7 +129,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Tout déplacer Tous les fichiers ont été déplacés Certains fichiers n\'ont pu être déplacés - Local&nbsp;: %1$s + Local : %1$s Distant : %1$s Il n\'y a pas assez de place disponible pour copier les fichiers sélectionnés dans le dossier %1$s. Voulez-vous quand même les déplacer ? Veuillez saisir votre code de sécurité @@ -144,7 +144,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq %1$s lecteur de musique %1$s (lecture) %1$s (chargement) - %1$s pourcentage de lecture finie + Lecture de %1$s terminée Fichier média introuvable Aucun compte n\'a été trouvé Le fichier n\'est pas dans un compte valide @@ -173,7 +173,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Impossible de trouver l\'hôte Aucune instance du serveur n\'a été trouvée Le serveur met trop longtemps à répondre - Adresse invalide + Adresse non valide Échec de l\'initialisation SSL Impossible de vérifier l\'identité du serveur SSL La version du serveur n\'est pas reconnue @@ -195,26 +195,26 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Maintenir le fichier à jour Renommer Supprimer - Voulez-vous vraiment supprimer %1$s&nbsp;? - Voulez-vous vraiment supprimer %1$s et son contenu&nbsp;? + Voulez-vous vraiment supprimer %1$s ? + Voulez-vous vraiment supprimer %1$s et son contenu ? Local seulement - Le contenu local uniquement + Contenu local uniquement Effacer du serveur - Les deux distant et local + Distant et local Suppression effectuée avec succès Suppression impossible Entrez un nouveau nom La version locale ne peut être renommée, veuillez réessayer avec un nom différent Renommage impossible Le fichier distant n\'a pu être vérifié - Le contenu des fichiers est déjà synchronisé + Le contenu du fichier est déjà synchronisé Le dossier n\'a pas pu être créé - Caractères interdits&nbsp;: / \\ &lt; &gt; : " | ? * + Caractères interdits : / \\ < > : \" | ? * Le nom du fichier ne peut pas être vide Veuillez patienter Problème inattendu. Veuillez essayer une autre application pour la sélection du fichier Aucun fichier sélectionné - Envoyer un lien à… + Envoyer le lien vers… Connexion avec oAuth2 Connexion au serveur oAuth2… L\'identité du site ne peut être vérifiée @@ -222,23 +222,23 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq - Le certificat du serveur a expiré - Le certificat du serveur n\'est pas encore valide - L\'URL ne correspond pas au nom d\'hôte du certificat - Voulez-vous tout de même faire confiance à ce certificat&nbsp;? + Voulez-vous tout de même faire confiance à ce certificat ? Impossible de sauvegarder le certificat Détails Masquer - Délivré à&nbsp;: - Délivré par&nbsp;: + Délivré à : + Délivré par : Nom d\'usage : - Organisation&nbsp;: - Unité organisationnelle&nbsp;: - Pays&nbsp;: - Région&nbsp;: - Localisation&nbsp;: - Validité&nbsp;: - De&nbsp;: - À&nbsp;: - Signature&nbsp;: - Algorithme&nbsp;: + Organisation : + Unité organisationnelle : + Pays : + Région : + Localisation : + Validité : + Du : + Au : + Signature : + Algorithme : Impossible d\'afficher le certificat. - Aucune information sur l\'erreur Ceci est un espace réservé @@ -249,7 +249,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq 12:23:45 Téléverser les images via une connexion WiFi uniquement Téléverser les vidéos via une connexion WiFi uniquement - /TéléversementInstantané + /Instantané Conflit de mise à jour Le fichier distant %s n\'est pas synchronisé avec le fichier local. En choisissant de continuer, vous remplacerez le contenu de fichier sur le serveur. Garder les deux versions @@ -258,7 +258,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Prévisualisation de l\'image Cette image ne peut pas être affichée %1$s n\'a pas pu être copié dans le dossier local %2$s - Chemin d\'accès pour le téléversement + Répertoire d\'envoi Désolé, le partage n\'est pas disponible sur votre serveur. Veuillez contacter votre administrateur. Impossible de partager. Vérifiez que le fichier est bien présent Une erreur est survenue lors de la tentative de partage de ce fichier ou répertoire @@ -267,7 +267,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Envoyer Copier le lien Copié dans le presse-papiers - Erreur critique&nbsp;: impossible de réaliser des opérations + Erreur critique : impossible de réaliser des opérations Une erreur s\'est produite pendant la connection au serveur Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée. Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée. @@ -286,7 +286,8 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq La connexion sécurisée est redirigée via une route non-sécurisée. Journaux Envoyer l\'historique - Journaux de l\'application Android ownCloud + Aucune application trouvée pour envoyer les logs. Installez une application de courriel ! + Journaux de l\'application Android %1$s Chargement des données... Authentification requise Mot de passe incorrect @@ -298,6 +299,10 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Le fichier existe déjà dans le dossier de destination Une erreur est survenue lors de la tentative de déplacement de ce fichier ou dossier de déplacer ce fichier - Téléchargements instantanés + Envoi instantané Sécurité + Répertoire d\'envoi des vidéos + partagé(e) + avec vous + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index a7605641..17407273 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -283,7 +283,8 @@ Descárgueo de aquí: %2$s A conexión segura está a ser redirixida a unha ruta non segura. Rexistros Enviar o historial - Rexistros da app ownCloud Android + Non se atopou unha aplicación para enviar os rexistros. Instale unha aplicación de correo! + Rexistros da aplicación %1$s Android Cargando os datos... Requírese autenticación Contrasinal incorrecto @@ -298,4 +299,7 @@ Descárgueo de aquí: %2$s Envío instantáneo Seguranza Enviar a ruta do vídeo + compartido + con vostede + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-hu-rHU/strings.xml b/res/values-hu-rHU/strings.xml index bdfb3e5c..e8d11114 100644 --- a/res/values-hu-rHU/strings.xml +++ b/res/values-hu-rHU/strings.xml @@ -246,8 +246,12 @@ Bemásolva a vágólapra Fiókok + Fiók hozzáadása + Naplók Felhasználóazonosítás szükséges Hibás jelszó + Mozgatás Válasszon Biztonság + Megosztott diff --git a/res/values-id/strings.xml b/res/values-id/strings.xml index 795cfde0..eb2df51e 100644 --- a/res/values-id/strings.xml +++ b/res/values-id/strings.xml @@ -282,8 +282,6 @@ Sambungan aman dialihkan ke rute yang tidak aman. Log Kirim Riwayat - Log apl ownCloud Android - Memuat data... Diperlukan otentikasi Sandi salah Pindah @@ -296,4 +294,5 @@ untuk memindahkan berkas ini Unggah Cepat Keamanan + dibagikan diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 4efe1ef9..e121130b 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -282,7 +282,8 @@ La connessione sicura è rediretta su un percorso non sicuro. Registri Invia cronologia - Registri applicazione ownCloud Android + Non è stata trovata alcuna applicazione per l\'invio dei registri. Installa l\'applicazione mail! + Registri applicazione %1$s Android Caricamento dati in corso... Autenticazione richiesta Password errata @@ -297,4 +298,7 @@ Caricamenti istantanei Protezione Percorso di caricamento video + condiviso + con te + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index 7c0d99c0..d803d8dd 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -64,8 +64,8 @@ ここには何もありません。何かアップロードしてください。 読込中 ... このフォルダーにはファイルがありません。 - フォルダ - フォルダ + フォルダー + フォルダー ファイル ファイル ファイルをタップすると追加情報が表示されます。 @@ -283,19 +283,23 @@ 暗号化接続は非暗号化接続にリダイレクトされました。 ログ ログを送信 - ownCloud Android アプリログ + ログを送るアプリが見つかりませんでした。メールアプリをインストールして下さい。 + %1$s アンドロイドアプリログ 読込中 ... 認証を必要とする 無効なパスワード 移動 - ファイルが有りません。フォルダを追加してください。 + 何もありません。フォルダーを追加してください。 選択 移動できません。ファイルがあるか確認してください。 - フォルダを子フォルダへ移動することはできません。 - そのファイルは、宛先フォルダに既に存在しています。 + フォルダーを子フォルダーへ移動することはできません。 + そのファイルは宛先フォルダーにすでに存在します。 このファイルまたはフォルダーを移動する際にエラーが発生しました このファイルを移動 自動アップロード セキュリティ 動画のアップロードパス + 共有中 + あなたと + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 69623e19..f55428eb 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -1,6 +1,35 @@ + ಪೇರಿಸು + ಕಡತಗಳು + ಹೊಸ ಕಡತಕೋಶ + ಆಯ್ಕೆ + ಕಳುಹಿಸಿ + ಇನ್ನಷ್ಟು + ಸಹಾಯ + ಮುದ್ರೆ + ಬಳಕೆಯ ಹೆಸರು + ಗುಪ್ತ ಪದ + ಕಡತಗಳು + ಪೇರಿಸು + ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ + ಸಂಪರ್ಕ ಕೊಂಡಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು + ಹೌದು + ಇಲ್ಲ + ಸರಿ + ವರ್ಗಾವಣೆ ರದ್ದು ಮಾಡಿ + ರದ್ದು + ತಪ್ಪಾಗಿದೆ + ಗೊತ್ತಿಲ್ಲದ ದೋಷ + ಗುಪ್ತ ಪದವನ್ನು ಬದಲಾಯಿಸಿ + ಮರುಹೆಸರಿಸು + ತೆಗೆದುಹಾಕಿ + ಕಳುಹಿಸಿ + ದೃಢೀಕರಣ ಅಗತ್ಯವಿದೆ + ದುರ್ಬಲ ಗುಪ್ತಪದ + ಆಯ್ಕೆ + ಭದ್ರತೆ diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 3bb9a60c..ef683c18 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -6,29 +6,42 @@ 업로드 다른 앱의 콘텐츠 파일 - 로 열기 + 다음으로 열기 새 폴더 설정 - 세부내용 + 자세한 정보 보내기 + 정렬 + 정렬 순서 + + 가나다 + 최신 - 이전 + 일반 - 더 중요함 + 더 보기 계정 계정 관리 앱 암호 내 클라이언트 보호 - 로깅 허용 - 이건 로그 문제에 사용됩니다 + 사진 즉시 업로드 + 카메라로 찍은 사진 즉시 업로드 + 동영상 즉시 업로드 + 카메라로 찍은 동영상 즉시 업로드 + 로그 기록 사용 + 문제점을 기록하는 데 사용됩니다 로그 기록 여기서 기록된 로그를 보여줍니다 - 역사 삭제하기 + 과거 기록 삭제 도움말 - 친구들에게 권하기 + 친구에게 추천하기 피드백 - 임프린트 - %1$s 을 스마트폰에서 사용해보세요! + 법적 고지 + 공유 위치 기억하기 + 마지막 공유 업로드 위치 기억하기 + %1$s을(를) 스마트폰에서 사용해 보세요! + %1$s을(를) 스마트폰에서 사용해 보는 것을 추천합니다!\n다운로드 링크: %2$s 서버 확인 서버 주소 https://… 사용자 이름 @@ -37,6 +50,7 @@ 파일 접속 업로드 + 업로드 폴더 선택: 계정 없음 이 장치에 %1$s 계정이 없습니다. 먼저 계정을 설정하십시오. 설정 @@ -45,8 +59,10 @@ 받은 콘텐츠가 없습니다. 업로드할 항목이 없습니다. %1$s에서 공유된 콘텐츠에 접근할 수 없습니다 업로드 중 - 초 전 + 초 지남 내용이 없습니다. 업로드할 수 있습니다! + 불러오는 중... + 이 폴더에 파일이 없습니다. 폴더 폴더 파일 @@ -57,9 +73,10 @@ 만든 날짜: 수정한 날짜: 다운로드 - 파일 새로고침 + 파일 새로 고침 업로드 중 파일 이름을 %1$s(으)로 변경하였습니다 링크 공유 + 링크 공유 해제 예 아니요 확인 @@ -69,7 +86,7 @@ 저장하고 끝내기 오류 불러오는 중... - 알수없는 오류 + 알 수 없는 오류 정보 암호 변경 계정 삭제 @@ -81,29 +98,35 @@ 업로드 성공 %1$s을(를) 업로드하였습니다 업로드 실패 - %1$s을(를) 업로드할 수 없었습니다 + %1$s을(를) 업로드할 수 없습니다 + 업로드가 실패하였습니다. 다시 로그인하십시오 다운로드 중... %1$d%% %2$s 다운로드 중 다운로드 성공 %1$s을(를) 다운로드하였습니다 다운로드 실패 - %1$s을(를) 다운로드할 수 없었습니다 + %1$s을(를) 다운로드할 수 없습니다 아직 다운로드 되지 않았습니다 + 다운로드가 실패하였습니다. 다시 로그인하십시오 계정 선택 동기화 실패 + 동기화가 실패하였습니다. 다시 로그인하십시오 %1$s와(ê³¼) 동기화할 수 없었습니다 - %1$s에 대한 비밀번호가 틀립니다 + %1$s의 암호가 올바르지 않습니다 충돌하는 항목 발견됨 - 동기화된 파일 중 %1$d개를 동기화할 수 없었습니다 + 동기화된 파일 중 %1$d개를 동기화할 수 없습니다 파일을 동기화할 수 없었습니다 - 파일 %1$d개의 내용을 동기화할 수 없었습니다 (충돌 %2$d개) - 몇몇 로컬 파일이 사라졌습니다. - %1$s 폴더가 존재하지 않습니다. - 모두 옮김 - 모든 파일 옮김 - 몇몇 파일을 옮기지 못했습니다. + 파일 %1$d개의 내용을 동기화할 수 없습니다 (충돌 %2$d개) + 일부 로컬 파일이 사라졌습니다. + 폴더 %2$s의 파일 중 %1$d개를 복사할 수 없습니다 + 버전 1.3.16부터는 하나의 파일이 여러 계정과 동기화될 때 데이터 손실을 막기 위해서 이 장치에서 업로드된 파일은 로컬 폴더 %1$s(으)로 복사됩니다.\n\n이 변경 사항 때문에 이 앱의 이전 버전에서 업로드된 모든 파일은 폴더 %2$s(으)로 복사되었습니다. 계정 동기화 중 오류가 발생하여 이 작업이 중단되었습니다. 파일을 그대로 둔 다음 %3$s(으)로 향한 링크를 삭제하거나, 파일을 직접 폴더 %1$s(으)로 이동한 다음 %4$s(으)로 향한 링크를 그대로 두십시오.\n\n아래 목록은 로컬 파일과 링크가 걸려 있는 %5$s에 있는 원격 파일입니다. + 폴더 %1$s이(가) 더 이상 존재하지 않습니다. + 모두 이동 + 모든 파일 이동됨 + 몇몇 파일을 이동할 수 없음 로컬: %1$s 원격: %1$s + 선택한 파일을 폴더 %1$s(으)로 복사할 공간이 부족합니다. 파일을 이동하시겠습니까? 앱 암호를 입력하십시오 앱 암호를 입력하십시오 앱을 시작할 때마다 암호를 물어봅니다 @@ -114,79 +137,88 @@ 앱 암호가 삭제되었습니다 앱 암호가 저장되었습니다 %1$s 음악 재생기 - %1$s (재생중) + %1$s (재생 중) %1$s (불러오는 중) %1$s 재생 완료됨 - 미디어 파일을 찾을수 없습니다 + 미디어 파일을 찾을 수 음 준비된 계정이 없습니다 유효한 계정의 파일이 아닙니다 지원하지 않는 미디어 코덱 - 미디어 파일을 읽을수 + 미디어 파일을 읽을 수 없음 미디어 파일이 제대로 인코드 되지 않았습니다 재생 시도 중 시간이 초과됨 - 미디어 파일을 스트리밍 할수 없습니다 - 내장된 미디어 플레이어에서는 이 미디어 파일을 재생할수 없습니다 - %1$s 를 재생하는 중에 보안오류가 발생함 - %1$s 를 재생하는 중에 입력 에러가 발생함 - %1$s 를 재생하던 중에 알수 없는 오류가 발생함 - 되감기 버튼 - 재생 혹은 일시정지 버튼 - 빨리감기 버튼 - 로그인 중... + 미디어 파일을 스트리밍 할 수 없습니다 + 내장된 미디어 플레이어에서 이 미디어 파일을 재생할 수 없습니다 + %1$s을(를) 재생하는 중 보안 오류가 발생함 + %1$s을(를) 재생하는 중 입력 오류가 발생함 + %1$s을(를) 재생하는 중 알 수 없는 오류가 발생함 + 되감기 단추 + 재생 혹은 일시 정지 단추 + 빨리감기 단추 + 인증 정보 가져오는 중... + 로그인 시도 중... 네트워크에 연결할 수 없습니다 암호화된 연결을 사용할 수 없습니다. 연결됨 연결 테스트 중... 서버 설정이 잘못됨 같은 사용자와 서버에 대한 계정이 이미 존재합니다 - 입력된 사용자가 이 계정의 사용자와 일치하지 않음 + 입력된 사용자가 이 계정의 사용자와 일치하지 않습니다 알 수 없는 오류가 발생하였습니다! 호스트를 찾을 수 없음 서버 인스턴스를 찾을 수 없음 - 서버 응답 시간이 초과되었습니다 + 서버 응답 시간이 초과됨 잘못된 URL SSL 초기화 오류 SSL 서버의 신원을 확인할수 없습니다 확인할 수 없는 서버 버전 연결을 수립할 수 없음 암호화된 연결 사용 중 - 잘못된 로그인/암호 - 권한부여가 성공적으로 이뤄지지 않았습니다 - 권한 서버로 부터 접근이 거부되었습니다 - 뜻밖의 상태; 다시 서버 주소를 입력해주십시오 - 인증이 만료되었습니다. 다시 인증해주세요 - 현재 암호를 - 세션이 만료되었습니다. 다시 접속해주세요 - 인증 서버에 접속하는 중... + 잘못된 사용자 이름 및 암호 + 인증 실패 + 인증 서버 접근 거부됨 + 예상하지 못한 상태입니다. 서버 URL을 다시 입력해 주십시오 + 인증이 만료되었습니다. 다시 인증해 주십시오 + 현재 암호를 입력해 주십시오 + 세션이 만료되었습니다. 다시 접속해 주십시오 + 인증 서버에 연결하는 중... 서버에서 이 인증 방법을 지원하지 않습니다. - %1$s 에서는 다중 계정을 지원하지 않습니다 + %1$s에서 다중 계정을 지원하지 않습니다 + 서버에서 올바른 사용자 ID를 반환하지 않았습니다. 관리자에게 연락하십시오 + + 이 서버에 인증할 수 없음 파일을 최신 정보로 유지 이름 바꾸기 삭제 + %1$s을(를) 삭제하시겠습니까? + %1$s 및 포함된 내용을 삭제하시겠습니까? 로컬만 로컬 콘텐츠만 서버에서 삭제 서버와 로컬 모두 - 성공적으로 삭제하였습니다 - 삭제할 수 없었습니다 + 성공적으로 삭제함 + 삭제할 수 없음 새 이름 입력 로컬 파일의 이름을 변경할 수 없습니다. 다른 이름을 입력하십시오 - 이름을 변경할 수 없었습니다 - 원격 파일을 확인할 수 없었습니다 - 파일 내용이 이미 동기화되었습니다 - 사용할수 없는 문자들: / \\ < > : \" | ? * + 이름을 변경할 수 없음 + 원격 파일을 확인할 수 없음 + 파일 내용이 이미 동기화됨 + 폴더를 만들 수 없음 + 사용할 수 없는 문자: / \\ < > : \" | ? * + 파일 이름이 비어 있을 수 없음 잠시 기다려 주십시오 예상하지 못한 오류입니다. 다른 앱에서 파일을 선택하십시오 선택한 파일 없음 + 다음으로 링크 보내기... oAuth2로 로그인하기 - oAuth2 서버에 연결중... - 사이트 인증서를 확인할 수 없었습니다 + oAuth2 서버에 연결 중... + 사이트 인증서를 확인할 수 없습니다 - 서버 인증서를 신뢰할 수 없습니다 - 서버 인증서가 만료되었습니다 - 서버 인증서의 유효 기간이 시작되지 않았습니다 - 인증서의 URLê³¼ 입력한 URL이 일치하지 않습니다 이 인증서를 신뢰하시겠습니까? - 인증서를 저장할 수 없었습니다 + 인증서를 저장할 수 없습니다 자세히 숨기기 발급 대상: @@ -202,27 +234,70 @@ 끝: 서명: 알고리즘: - 이것은 플레이스홀더입니다 + 인증서를 표시할 수 없습니다. + - 오류에 대한 정보가 없습니다 + 이것은 자리 비움자입니다 placeholder.txt PNG 그림 389 KB 2012/05/18 12:23 PM 12:23:45 - WiFi 사용 중일때만 사진 업로드 + Wi-Fi 사용 중일때만 사진 업로드 + Wi-Fi 사용 중일때만 동영상 업로드 /InstantUpload 업데이트 충돌 원격 파일 %s이(가) 로컬 파일과 동기화되지 않았습니다. 계속 진행하면 서버에 있는 파일을 덮어씁니다. 모두 저장 덮어쓰기 업로드하지 않음 - 그림 미리보기 + 사진 미리 보기 + 이 사진을 미리 ë³¼ 수 없습니다 + %1$s을(를) 로컬 폴더 %2$s(으)로 복사할 수 없습니다 + 업로드 경로 + 서버에서 공유가 비활성화되어 있습니다. 관리자에게 연락하십시오. + 공유할 수 없습니다. 파일이 있는지 확인하십시오 + 이 파일이나 폴더를 공유하는 중 오류 발생 + 공유를 해제할 수 없습니다. 파일이 있는지 확인하십시오 + 이 파일이나 폴더의 공유를 해제하는 중 오류 발생 보내기 - 링크 복사 + 링크 주소 복사 클립보드로 복사됨 + 치명적 오류: 작업을 진행할 수 없음 + 서버에 연결하는 중 오류가 발생하였습니다. + 서버를 기다리는 중 오류가 발생하였습니다. 작업이 진행되지 않았을 수도 있습니다 + 서버를 기다리는 중 오류가 발생하였습니다. 작업이 진행되지 않았을 수도 있습니다 + 서버를 사용할 수 없어서 작업을 진행할 수 없습니다 + %s 권한이 없습니다 + 이 파일의 이름을 바꿀 + 이 파일을 삭제할 + 이 파일을 공유할 + 이 파일의 공유를 해제할 + 파일을 생성할 + 이 폴더에 업로드할 + 이 파일을 서버에서 더 이상 사용할 수 없습니다 계정 + 계정 추가 + 보안 연결이 안전하지 않은 경로로 넘어갑니다. + 로그 + 과거 기록 보내기 + 로그를 보낼 앱이 없습니다. 메일 앱을 설치하십시오! + %1$s Android 앱 로그 + 데이터 불러오는 중... 인증 필요함 잘못된 암호 + 이동 + 항목이 없습니다. 폴더를 추가할 수 있습니다! 선택 + 이동할 수 없습니다. 파일이 존재하는 지 확인하십시오 + 폴더를 하위 폴더 아래로 이동할 수 없습니다 + 파일이 이미 대상 폴더에 존재합니다 + 이 파일이나 폴더를 이동하는 중 오류가 발생하였습니다 + 이 파일을 이동할 + 즉시 업로드 보안 + 동영상 업로드 경로 + 공유됨 + 나와 + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml new file mode 100644 index 00000000..69623e19 --- /dev/null +++ b/res/values-lo/strings.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/res/values-lt-rLT/strings.xml b/res/values-lt-rLT/strings.xml index 30cca384..b8c3bb15 100644 --- a/res/values-lt-rLT/strings.xml +++ b/res/values-lt-rLT/strings.xml @@ -11,6 +11,12 @@ Nustatymai Informacija Siųsti + Rikiuoti + Rikiuoti pagal + + A-Z + Naujausi - Seniausi + Bendras @@ -32,6 +38,8 @@ Rekomenduoti draugui Atsiliepimai Imprint + Prisiminti bendrinimo vietą + Prisiminti paskutinio bendrinimo įkėlimo vietą IÅ¡bandykite %1$s savo iÅ¡maniajame telefone! Patikrinti Serverį Serverio adresas @@ -242,4 +250,5 @@ Neteisingas slaptažodis Pasirinkite Saugumas + bendrinamas diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index c185f73f..0895ca91 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -149,6 +149,7 @@ SÅ«tÄ«t Konti + Nepareiza parole Izvēlieties Drošība diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 2ce829c4..23c36119 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -130,4 +130,5 @@ Погрешна лозинка Избери Безбедност + споделен diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 69623e19..b4185fd3 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -1,6 +1,17 @@ + Байршуулах + Файлууд + Тохиргоо + Ерөнхий + Хэрэглэгчийн нэр + Нууц үг + Файлууд + Байршуулах + Аккаунт үүсгэх + Устгах + Аюулгүй байдал diff --git a/res/values-nb-rNO/strings.xml b/res/values-nb-rNO/strings.xml index c9a09ab1..859c7c99 100644 --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@ -11,6 +11,12 @@ Innstillinger Detaljer Send + Sorter + Sorter pÃ¥ + + A-Z + Nyeste - Eldste + Generelt @@ -32,6 +38,8 @@ Anbefal til en venn Tilbakemelding Avtrykk + Husk delt plassering + Husk sist delt plassering for opplasting Prøv %1$s pÃ¥ smarttelefonen din! Jeg ønsker Ã¥ invitere deg til Ã¥ bruke %1$s pÃ¥ smarttelefonen din!\nLast ned her: %2$s Sjekk server @@ -245,6 +253,7 @@ BildeforhÃ¥ndsvisning Dette bildet kan ikke vises %1$s kunne ikke kopieres til lokal mappe %2$s + Sti til opplasting Beklager, deling er ikke skrudd pÃ¥ for din tjener. Ta kontakt med administratoren. Kan ikke dele. Sjekk om filen eksisterer. @@ -270,9 +279,11 @@ Filen finnes ikke pÃ¥ serveren lenger Kontoer Legg til en konto + Sikker forbindelse er omdirigert til en usikker rute. Logger Send historikk - logger for ownCloud Android app + Ingen app for sending av logger funnet. Installer epost-app! + %1$s Android app logger Laster data... Autentisering kreves Feil passord @@ -284,5 +295,10 @@ Filen finnes allerede i mÃ¥lmappen En feil oppstod ved flytting av denne filen eller mappen Ã¥ flytte denne filen + Umiddelbare opplastinger Sikkerhet + Sti til video-opplasting + delt + med deg + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 84a0e0dd..bbe89ba2 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -285,7 +285,8 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar De beveiligde verbinding is omgeleid naar een onveilige route. Logs Verstuur geschiedenis - ownCloud Android app logs + Geen app voor versturen van logs gevonden. Installeer de mail app! + %1$s Android app logs Laden data... Authenticatie vereist Onjuist wachtwoord @@ -300,4 +301,7 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar Directe uploads Beveiliging Upload Video Pad + gedeeld + met u + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 7715d945..cc0f5b44 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -38,6 +38,7 @@ Poleć znajomemu Wsparcie Stopka + Zapamiętaj położenie udostępnienia 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 Sprawdź serwer @@ -280,7 +281,7 @@ Bezpieczne połączenie jest przekierowywane przez niezabezpieczone trasy. Logi Wyślij historię - Logi aplikacji ownCloud Android + %1$s Logi aplikacji Android Ładuję dane... Wymagana autoryzacja Złe hasło @@ -294,4 +295,6 @@ aby przenieść ten plik Automatyczne wysyłanie Bezpieczeństwo + Katalog wysyłania dla wideo + współdzielone diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 004c2ab3..7e02b56a 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -282,8 +282,9 @@ Conexão segura esta redirecionada para uma rota não segura. Logs Enviar Histórico - Logs do aplicativo ownCloud Android - Carregamento de dados... + Não foi encontrado nenhum app para envio de logs. Instale o mail app! + %1$s logs do Android app + Carregando dados... Autenticação é requerida Senha incorreta Mover @@ -297,4 +298,7 @@ Envios Instantâneos Segurança Enviar o Caminho do Vídeo + compartilhado + com você + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index f5ccd30f..efadb601 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -40,8 +40,8 @@ Imprint Lembrar localização de partilha Lembrar da última localização de envio de partilha - Experimente %1$s no seu smartphone! - Quero convidar-te a usares %1$s no teu smartphone!\nFaz download aqui: %2$s + Test %1$s no seu smartphone! + Eu quero convidar-te para usares %1$s no teu smartphone!\nTransfere aqui: %2$s Verificar Servidor Endereço do servidor https://.. Nome de Utilizador @@ -52,7 +52,7 @@ Enviar Escolha a pasta de envio: A conta não foi encontrada - Não tem nenhuma conta %1$s no seu dispositivo. Por favor, configure primeiro uma conta. + Não existe nenhuma conta %1$s no seu dispositivo. Por favor, configure primeiro uma conta. Configurar Sair Sem conteúdo para enviar @@ -60,26 +60,26 @@ O %1$s não está autorizado a aceder aos ficheiro partilhados. A enviar segundos atrás - Vazio. Envie alguma coisa! + Aqui não existe nada. Envie alguma coisa! A carregar ... Não existem ficheiros nesta pasta. pasta pastas ficheiro ficheiros - Clique no ficheiro para visualizar informação adicional. + Toque num ficheiro para visualizar a informação adicional. Tamanho: Tipo: Criado: Modificado: Transferir Atualizar ficheiro - O nome do ficheiro foi alterado para %1$s durante o envio. + O ficheiro foi renomeado para %1$s durante o envio. Partilhar a hiperligação - Deixar de partilhar a ligação + Deixar de partilhar a hiperligação Sim Não - OK + ACEITAR Cancelar a transferência Cancelar o envio Cancelar @@ -94,20 +94,20 @@ Enviar de ... Nome da pasta A enviar ... - A enviar %1$d%% , %2$s completo. - Carregado com sucesso - %1$s foi carregado com sucesso - Carregamento falhou - O envio do ficheiro %1$s não foi concluído. + %1$d%% A enviar %2$s + Envio bem sucedido + %1$s foi enviado com sucesso + Não foi possível enviar + Não foi possível concluir o envio de %1$s. Falha no carregamento, é necessário fazer novo login - A transferir ... - %1$d%% A decarregar %2$s - Descarga com sucesso - %1$s foi descarregado com sucesso - Descarga falhou - O descarregamento %1$s não foi possível descarregar - Não transferido - Falha no download, é necessário fazer login + A transferir... + %1$d%% A transferir %2$s + Transferência bem sucedida + %1$s foi transferido com sucesso + Transferência falhada + Não foi possível concluir a transferência de %1$s + Ainda não foi transferido + Não foi possível transferir, tem de iniciar a sessão novamente Escolha a conta Falhou a sincronização Falhou a sincronização, necessita fazer um novo login @@ -122,29 +122,29 @@ Tal como na versão 1.3.16, os ficheiros que foram enviados deste dispositivo são copiados para a pasta local %1$s para prevenir perda de dados quando um ficheiro é partilhado com várias contas.\n\nDevido a esta alteração, todos os ficheiros das versões anteriores foram copiados para a pasta %2$s. No entanto, um erro impediu a conclusão deste processo durante a sincronização da conta. Pode deixar o ficheiro(s) como estão e remover o link para %3$s, ou mover o(s) ficheiro(s) para a pasta %1$s e guardar o link para %4$s. \n\nEm baixo estão listados ficheiro(s) locais e remotos em %5$s que foram ligados. A pasta %1$s já não existe Mover Todos - Todos os ficheiros foram movidos + Foram movidos todos os ficheiros Não foi possível mover alguns ficheiros Local: %1$s Remoto: %1$s Não existe espaço disponível para copiar o ficheiro seleccionado para a pasta %1$s . Em vez disso deseja mover o ficheiro? - Por favor escreva o PIN da Aplicação - Escreva o PIN da Aplicação - O PIN vai ser pedido todas as vezes que iniciar a aplicação. - Volte a inserir o App PIN, por favor - Remover o PIN do aplicação. - Os códigos PIN introduzidos não são iguais. - Código PIN Incorrecto. - PIN da aplicação removido - PIN da aplicação guardado + Por favor, insira o PIN da App + Insira o PIN da App + O PIN será pedido sempre que a app seja iniciada. + Por favor, reinsira o PIN da App + Remover o seu PIN da App + Os CÓDIGOS da APP não são iguais + CÓDIGO da App Incorreto + CÓDIGOS da App removido + CÓDIGO da App guardado %1$s leitor de música - A tocar: %1$s - %1$s (A carregar) + %1$s (a reproduzir) + %1$s (a carregar) %1$s leitura terminada Não foi encontrado nenhum ficheiro de média Não foi fornecida conta O ficheiro não está numa conta válida - Codec de média não suportado - Não foi possível reproduzir o ficheiro + Codec de multimédia não suportado + Não foi possível ler o ficheiro de multimédia Ficheiro erradamente codificado (codec) O tempo de espera para jogar expirou O ficheiro não pode ser reproduzido (streaming) @@ -152,25 +152,25 @@ Erro de segurança a tentar reproduzir o ficheiro %1$s Erro de input a tentar reproduzir %1$s Erro inesperado a tentar reproduzir %1$s - Botão de rebobinar - Botão Tocar/Pausa + Botão de Retroceder + Botão de Reproduzir/Pausar Botão de avanço rápido A obter autorização... - A tentar entrar... + A tentar iniciar a sessão... Sem ligação à rede - Ligação segura indisponível + Ligação segura indisponível. Ligação estabelecida A testar a ligação... Configuração do servidor incorrecta. Uma conta para este utilizador e servidor já existe no dispositivo O utilizador que escreveu não coincide com o nome de utilizador desta conta Ocorreu um erro desconhecido! - Não é possível encontrar o servidor - Instância servidor não encontrada - O servidor levou demasiado tempo a responder + Não foi possível encontrar o anfitrião + Instância do servidor não encontrada + O servidor demorou muito tempo a responder URL errado Inicialização de SSL falhou - Não foi possível verificar a identidade SSL do servidor + Não foi possível verificar a identidade do servidor SSL Versão do servidor não reconhecida Não consegue estabelecer ligação Ligação segura estabelecida @@ -179,7 +179,7 @@ Acesso negado pelo servidor Estado inesperado, por favor, digite a URL do servidor novamente O prazo da sua autorização expirou. Por favor renove-a - Por favor, introduza a password actual + Por favor, insira a palavra-passe atual A sua sessão expirou. Por favor autentique-se de novo A verificar a sua autenticação no servidor... O servidor não suporta este método de autenticação @@ -280,8 +280,9 @@ Ligação segura é redireccionada para um caminho inseguro. Registos de Alterações Enviar Histórico - Registos das alterações da app ownCloud Android - A carregar os dados ... + Não foi encontrado o aplicativo para envio de registos . Instale app e-mail! + %1$s Android Aplicação de Registyos + A carregar os dados... Autenticação necessária Palavra-passe errada Mover @@ -294,4 +295,8 @@ para mover este ficheiro Envios Instantâneos Segurança + Envio do Caminho do Vídeo + partilhado + consigo + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 123c779b..74c1b55c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -21,10 +21,10 @@ Administrare conturi PIN-ul aplicaÅ£iei ProtejaÅ£i-vă clientul - Încărcare instanta de imagine - Încărca instantaneu imagini luate de camera + Încărcare instantă de imagini + Încarcă instantant imagini luate cu camera Încărcare instantă de videoclipuri. - Încarcă videoclipuri instant, filmate cu camera. + Încarcă instant videoclipuri înregistrate cu camera Permite logarea Acesta este folosit pentru a înregistra problemele Istoria logarilor @@ -236,7 +236,7 @@ 12:23:45 Incarca poze doar via WiFi Încarcă videoclipuri doar via WiFi - /Încărcare instanta + /Încărcare instantă Actualizați conflictul Fișierul de la distanță %s nu este sincronizat cu fișierul local. Continuand, se va înlocui conținutul fișierului de pe server. Pastreaza amandoua @@ -267,12 +267,12 @@ Fișierul nu mai este disponibil pe server Conturi Adaugă cont - Se încarcă datele... Autentificare necesară Parolă greșită Mutare Nu este nimic aici. Poți adăuga un director! Alege pentru a muta acest fișier + Încărcări instante Securitate diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 3f58746b..d79ca6f6 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -1,13 +1,13 @@ - %1$s Приложение для Андроида - Версия %1$s + %1$s для Android + версия %1$s Обновить учетную запись Загрузить Содержимое из других приложений Файлы Открыть с помощью - Новая папка + Новый каталог Настройки Подробно Отправить @@ -15,7 +15,7 @@ Упорядочить по А-Я - Новые - Старые + Новое - Старое @@ -23,12 +23,12 @@ Больше Учётные записи Управление учётными записями - App PIN + PIN приложения Защитить ваш клиент - Быстрая загрузка фотографий + Мгновенная загрузка фотографий Немедленно загружать фотографии сделанные камерой - Быстрая загрузка видео - Быстрая загрузка видео с камеры + Мгновенная загрузка видео + Немедленно загружать видео сделанные камерой Включить журналирование Используется для регистрации ошибок Журнал @@ -38,7 +38,7 @@ Рекомендовать другу Обратная связь Штамп - Запомнить расположение публикации + Запомнить расположение общего ресурса Запомнить расположение загрузки последней публикации Попробуйте %1$s на вашем смартфоне! Хочу предложить вам использовать %1$s на смартфоне!\nЗагрузить можно здесь: %2$s @@ -51,21 +51,21 @@ Файлы Подключиться Загрузить - Выберете папку для загрузки + Выберите каталог для загрузки Учётная запись не найдена - На вашем устройстве нет учётных записей %1$s. Сначала нужно настроить учётную запись. - Установка + На вашем устройстве нет учётных записей %1$s. Пожалуйста настройте учётную запись. + Настройка Выход Нет содержимого для загрузки Содержимое не получено. Нечего загружать. - %1$s не имеет доступа к опубликованным данным + Доступ к общему ресурсу для %1$s запрещен Загрузка - только что + пару секунд назад Здесь ничего нет. Загрузите что-нибудь! Загрузка... - В данной папке нет файлов. - папка - папки + В этом каталоге нет файлов. + каталог + каталоги файл файлы Нажмите на файл для отображения дополнительной информации. @@ -86,57 +86,57 @@ Отмена Сохранить и выйти Ошибка - Идёт загрузка... + Загрузка ... Неизвестная ошибка О программе Сменить пароль Удалить учётную запись Создать учётную запись - Загрузить из... - Имя папки - Загрузка... - %1$d%% загрузки %2$s + Загрузить из ... + Имя каталога + Загрузка ... + %1$d%% Загружается %2$s Загрузка завершена %1$s был успешно загружен Ошибка загрузки Загрузка %1$s не может быть завершена - Загрузка не удалась, Вам необходимо переподключиться - Скачивание... - %1$d%% скачивания %2$s + Загрузка не удалась, нужно заново войти в свою учетную запись + Скачивание ... + %1$d%% Скачивается %2$s Скачивание завершено %1$s успешно скачан Скачивание не удалось Скачивание %1$s не может быть завершено Ещё не скачано - Скачивание не удалось, Вам необходимо переподключиться + Скачивание не удалось, нужно заново войти в свою учетную запись Выберите учётную запись Синхронизация прошла неудачно - Синхронизация не удалась, Вам необходимо переподключиться + Синхронизация не удалась, нужно заново войти в свою учетную запись Синхронизация %1$s не может быть завершена Неверный пароль для %1$s Обнаружены конфликты %1$d файлы не могут быть синхронизированы Не удалось синхронизировать файлы Содержимое %1$d файлов не может быть синхронизировано (конфликтов: %2$d) - Несколько локальных файлов были забыты + Некоторые локальные файлы были проигнорированы Не возможно скопировать %1$d файлы из %2$s папки - Начиная с версии 1.3.16, файлы, загружаемые с этого устройства, копируются в локальную директорию %1$s, чтобы предотвратить потерю данных при синхронизации файла с несколькими учётными записями.\n\nПоэтому все файлы, загруженные предыдущими версиями данного приложения, были скопированы в директорию %2$s. Однако, во время синхронизации что-то помешало завершить эту операцию. Теперь можно либо оставить файлы как есть и удалить ссылку на %3$s, либо переместить их в %1$s и сохранить ссылку на %4$s.\n\nНиже перечислены локальные файлы, и соответствующие им удалённые файлы в %5$s, к которым они привязаны. + Начиная с версии 1.3.16, файлы, загружаемые с этого устройства, копируются в локальный каталог %1$s, чтобы предотвратить потерю данных при синхронизации файла с несколькими учётными записями.\n\nПоэтому все файлы, загруженные предыдущими версиями данного приложения, были скопированы в каталог %2$s. Однако, во время синхронизации что-то помешало завершить эту операцию. Можете оставить файлы как есть и удалить ссылку на %3$s, либо переместить их в %1$s и сохранить ссылку на %4$s.\n\nНиже перечислены локальные файлы, и соответствующие им удалённые файлы в %5$s, к которым они привязаны. Каталог %1$s больше не существует Переместить всё Все файлы были перемещены Некоторые файлы не могут быть перемещены - Локально: %1$s - Удаленно: %1$s - Для копирования выбранных файлов в папку %1$s недостаточно свободного места. Скопировать в другое место? - Вставьте App PIN - Введите App PIN - PIN-код будет запрашиваться при каждом запуске приложения. - Повторите ввод App PIN - Удалить App PIN - Введённые App PIN не совпадают - Неверный App PIN - App PIN удалён - App PIN сохранён + Локальные: %1$s + Удаленные: %1$s + Для копирования выбранных файлов в каталог %1$s недостаточно свободного места. Скопировать в другое место? + Укажите PIN приложения + Введите PIN приложения + PIN будет запрашиваться при каждом запуске приложения. + Повторите ввод PIN приложения + Удалить PIN приложения + Введённые PIN не совпадают + Неверный PIN приложения + PIN приложения удалён + PIN приложения сохранён %1$s аудиоплеер %1$s (проигрывается) %1$s (загружается) @@ -147,7 +147,7 @@ Неподдерживаемый кодек Медиафайл не может быть прочитан Медиафайл некорректно закодирован - Время попыток воспроизведения вышло + Истекло время попытки воспроизведения Невозможно организовать потоковую передачу медиафайла Медиафайл не может быть проигран стандартным плеером Ошибка безопасности при воспроизведении %1$s @@ -156,7 +156,7 @@ Перемотка назад Воспроизведение или пауза Перемотка вперед - Происходит авторизация..... + Выполняется авторизация... Попытка входа... Нет подключения к сети Защищённое соединение недоступно. @@ -173,7 +173,7 @@ Ошибка инициализации SSL Невозможно проверить SSL-сертификат сервера Неизвестная версия сервера - Невозможно установить соединение + Не удается установить соединение Защищённое соединение установлено Неверное имя пользователя или пароль Ошибка авторизации @@ -185,9 +185,9 @@ Подключение к серверу аутентификации... Сервер не поддерживает выбранный метод аутентификации %1$s не поддерживает сразу несколько учётных записей - Ваш сервер не возвращает корректный пользовательский идентификатор, пожалуйста свяжитесь с администратором + Cервер не возвращает корректный пользовательский идентификатор. Пожалуйста, свяжитесь с вашим администратором ⇥ - Невозможно аутентифицироваться на этом сервере + Невозможно авторизоваться на этом сервере Обновлять файл Переименовать Удалить @@ -204,13 +204,13 @@ Переименование не может быть завершено Удаленный файл не может быть проверен Содержимое файла уже синхронизировано - Не возможно создать папку + Не возможно создать каталог Недопустимые символы: / \\ < > : \" | ? * Имя файла не может быть пустым Подождите немного Неизвестная ошибка; выберите этот файл из другого приложения Файлы не выбраны - Отправить ссылку... + Отправить ссылку ... Войти через oAuth2 Подключение к серверу oAuth2... Подлинность сайта не может быть проверена @@ -218,21 +218,21 @@ - Срок действия сертификата сервера истёк - Срок действия сертификата сервера ещё не начался - URL не совпадает с именем сервера в сертификате - Вы хотите доверять данному сертификату в любом случае? + Доверять этому сертификату в любом случае? Сертификат не может быть сохранён Подробно Скрыть - Кому выдано: - Кем выдано: + Кому выдан: + Кем выдан: Имя: Организация: - Организационное подразделение: + Подразделение: Страна: Штат: Местонахождение: Срок действия: - Из: - В: + С: + По: Подпись: Алгоритм: Сертификат не может быть показан. @@ -253,48 +253,53 @@ Не загружать Предпросмотр Это изображение не может быть отображено - %1$s не возможно скопировать в локальною папку %2$s + %1$s невозможно скопировать в локальный каталог %2$s Путь для загрузки - К сожалению, на вашем сервере отключен совместный доступ. Пожалуйста, свяжитесь с вашим администратором. - Невозможно добавить в общий доступ. Пожалуйста, проверьте, существует ли файл - Ошибка предоставления общего доступа к этому файлу или каталогу - Невозможно убрать из общего доступа. Пожалуйста, проверьте, существует ли файл - Ошибка удаления общего доступа к этому файлу или каталогу + Механизм общего доступа не включен на данном сервере. Пожалуйста, свяжитесь с вашим +⇥⇥администратором. + Невозможно поделиться. Убедитесь, что файл существует + При попытке поделиться этим файлом или каталогом произошла ошибка + Невозможно закрыть доступ. Убедитесь что файл существует + При попытке закрыть доступ к этому файлу или каталогу произошла ошибка Отправить Копировать ссылку Скопировано в буфер обмена - Критическая ошибка: невозможно выполнить операции + Критическая ошибка: невозможно выполнить действия При подключении к серверу возникла ошибка - Во время ожидания сервера возникла ошибка, операция не может быть завершена - Во время ожидания сервера возникла ошибка, операция не может быть завершена - Операция не может быть завершена, сервер недоступен + Во время ожидания сервера произошла ошибка, действие не может быть выполнено + Во время ожидания сервера произошла ошибка, действие не может быть выполнено + Действие не может быть выполнено, сервер недоступен - У вас нет доступа %s - переименовать этот файл - удалить этот файл - опубликовать этот файл - отменить публикацию этого файла - создать файл - загрузить в эту папку + У вас нет прав %s + для переименования этого файла + для удаления этого файла + для открытия доступа к этому файлу + для закрытия доступа к этому файлу + для создания файла + для загрузки в этот каталог Этот файл больше недоступен на сервере Учётные записи Добавить учетную запись - Защищённое соединение перенаправлено по незащищённому маршруту + Защищённое соединение перенаправлено по небезопасному маршруту Журналы История Отправлений - Журналы Андроид-приложения ownCloud - Загружаются данные... + Приложение для отправки журнала не найдено. Установите почтовое приложение! + Журналы %1$s для Android + Загрузка данных… Требуется аутентификация Неправильный пароль Переместить - Здесь ничего нет. Вы можете добавить папку! + Здесь ничего нет. Вы можете добавить каталог! Выбрать - Невозможно переместить. Пожалуйста, проверьте, существует ли файл - Невозможно переместить папку в папку-потомок - Файл уже существует в папке назначения - Произошла ошибка при попытке перемещения этого файла или папки - переместить этот файл + Невозможно переместить. Убедитесь, что файл существует + Невозможно переместить каталог в его подкаталог + Файл уже существует в каталоге назначения + Произошла ошибка при попытке перемещения этого файла или каталога + для перемещения этого файла Мгновенные загрузки Безопасность Путь для загрузки Видео + общие + с вами + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-sk-rSK/strings.xml b/res/values-sk-rSK/strings.xml index 5c097d37..4416fd41 100644 --- a/res/values-sk-rSK/strings.xml +++ b/res/values-sk-rSK/strings.xml @@ -282,8 +282,6 @@ Zabezpečené pripojenie je presmerované na nezabezpečenú trasu. Logy OdoslaÅ¥ históriu - Logy aplikácie ownCloud pre Android - Nahrávam dáta... Vyžaduje sa overenie Nesprávne heslo Presunúť @@ -296,4 +294,5 @@ pre presun tohoto súboru Okamžité nahratie Zabezpečenie + zdieľané diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 86be0f34..7f1a6258 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -282,7 +282,8 @@ Varna povezava je preusmerjena preko ne-varne poti. Dnevnik PoÅ¡lji zgodovino - Dnevnik programa ownCloud + Ni nameščenega poÅ¡tnega programa za poÅ¡iljanje dnevnikov. + %1$s dnevniki programa Poteka nalaganje podatkov ... Zahtevana je overitev Napačno geslo @@ -297,4 +298,7 @@ TakojÅ¡nje poÅ¡iljanje v oblak Varnost Pot videa za poÅ¡iljanje + v souporabi + z vami + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 02918e8a..7c1b7ffc 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -77,4 +77,5 @@ Fjalëkalim i gabuar Zgjidh Siguria + Ndarë diff --git a/res/values-sr-rSP/strings.xml b/res/values-sr-rSP/strings.xml index b5d14f16..41e12381 100644 --- a/res/values-sr-rSP/strings.xml +++ b/res/values-sr-rSP/strings.xml @@ -2,6 +2,7 @@ PoÅ¡alji Fajlovi + Novi direktorijum PodeÅ¡avanja Detaljnije PoÅ¡alji @@ -22,14 +23,18 @@ Veličina: Tip: Preuzmi + Podeli prečicu Da Ne Ok + Otkaži otpremanje Otkaži GreÅ¡ka + Nepoznata greÅ¡ka Izmeni lozinku Ukloni nalog Novi nalog + Ime fascikle Otpremanje... UspeÅ¡no otpremljeno Otpremanje nije uspelo diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index feb002e0..254ed65e 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -11,6 +11,12 @@ Inställningar Detaljer Skicka + Sortera + Sortera efter + + A-Ö + Nyast - Äldst + Allmänt @@ -32,6 +38,8 @@ Rekommendera till en vän Feedback Imprint + Kom ihÃ¥g plats för delat + Kom ihÃ¥g senaste uppladdningsplats vid dela Prova %1$s pÃ¥ din smartphone! Jag skullje vilja bjuda in dig till att prova %1$s pÃ¥ din smartphone!\nLadda ner appen frÃ¥n Google Play här: %2$s Kontrollera Server @@ -111,6 +119,7 @@ InnehÃ¥llet i %1$d filer kunde inte synkas (%2$d konflikter) Vissa lokala filer glömdes %1$d filer frÃ¥n %2$s mappar kunde inte kopieras till + FrÃ¥n och med version 1.3.16 kommer filer uppladdade frÃ¥n denna enhet kopieras in till lokal %1$s mapp för att förhindra dataförlust när en enskild fil synkroniseras med flera konton.\n\nPÃ¥ grund av denna ändring kommer alla filer uppladdade i tidigare versioner av denna applikation kopieras in till %2$s mapp. Dock förhindrade ett fel slutförandet av denna operation under konto-synkronisering. Du kan antingen lämna filerna som de är och ta bort länken till %3$s, eller flytta filerna in till %1$s mapp och behÃ¥lla länken till %4$s.\n\nNedan listas de lokala filerna och de fjrran filerna i %5$s som de länkades till. Mappen %1$s existerar inte längre Flytta allt Alla filer flyttades @@ -244,9 +253,12 @@ Förhandsvisa bild Denna bild kan inte visas %1$s kunde inte kopieras till %2$s lokal mapp + Uppladdnings-sökväg Ledsen, delning är inte aktiverat pÃ¥ din server. Vänligen kontakta din administratör. + Lyckades ej dela. Vänligen kontrollera om filen eisterar Ett fel uppstod vid försök att dela denna fil eller mapp + Lyckades ej sluta dela. Vänligen kontrollera om filen existerar Ett fel uppstod vid försök att sluta dela denna fil eller mapp Skicka Kopiera länk @@ -267,6 +279,11 @@ Filen är inte längre tillgänglig pÃ¥ servern Konton Lägg till konto + Säker anslutning är omdirigerad till en osäker väg. + Loggar + Skickat historik + Ingen app för att skicka loggar hittades. Installera mail appen! + %1$s Android app logs Laddar data... Autentisering krävs Fel lösenord @@ -274,6 +291,14 @@ Ingenting här. Du kan skapa en mapp! Välj Gick inte att flytta. Vänligen kontrollera att filen existerar + Det är inte möjligt att flytta mappen in i underliggande struktur + Filen existerar redan i destinationsmappen + Ett fel uppstod vid försök att flytta denna fil eller mapp att flytta den här filen + Direktuppladning Säkerhet + Uppladdnings-sökväg för video + delad + med dig + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index a35922f7..a24876d4 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -282,7 +282,8 @@ Güvenli bağlantı, güvenli olmayan bir rotaya yönlendirildi. Günlükler Geçmişi Gönder - ownCloud Android uygulama kayıtları + Kayıtları göndermek için uygulama bulunamadı. E-posta uygulamasını yükleyin! + %1$s Android uygulama kayıtları Veri yükleniyor... Kimlik doğrulama gerekli Hatalı parola @@ -297,4 +298,7 @@ Anında Yüklemeler Güvenlik Video Yükleme Yolu + paylaşılan + sizinle + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-ug/strings.xml b/res/values-ug/strings.xml index 12a54928..abee26e6 100644 --- a/res/values-ug/strings.xml +++ b/res/values-ug/strings.xml @@ -44,4 +44,5 @@ ھېساباتلار بىخەتەرلىك + ھەمبەھىرلەنگەن diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index e66a5405..e57daeaa 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -38,6 +38,8 @@ Порадити товаришу Зворотній зв\'язок Відбиток + Запам\'ятати позицію + Запам\'ятати останній опублікований шлях завантаження Спробуйте %1$s на своєму смартфоні! Пропоную вам користуватися %1$s на вашому смартфоні!\nЗавантажити можна за посиланням: %2$s Перевірити сервер @@ -279,7 +281,8 @@ Безпечне підключення перенаправляється через незабезпечений маршрут. Журнали Надіслати історію - Журнали Android-додатка ownCloud + Немає додатку для відправки журналів. Встановіть поштовий додаток! + %1$s Android лог додатку Завантаження даних... Потрібна аутентифікація Невірний пароль @@ -293,4 +296,8 @@ перемістити цей файл Миттєво завантаження Безпека + Шлях завантаження відео + спільне + з тобою + %1$s %2$s >>%3$s<< %4$s diff --git a/res/values-yo/strings.xml b/res/values-yo/strings.xml new file mode 100644 index 00000000..69623e19 --- /dev/null +++ b/res/values-yo/strings.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 3f198464..22142ace 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -4,13 +4,19 @@ 版本:%1$s 刷新帐户 上传 - 来自其它app的内容 + 来自其它应用的内容 文件 - 打开 - 增加文件夹 + 打开方式 + 新建文件夹 设置 详细信息 发送 + 排序 + 排序方式 + + A - Z + 新 - 旧 + 常规 @@ -18,13 +24,13 @@ 账号 管理账号 App PIN - 保护您的App客户端 + 保护客户端 即时图片上传 即时上传相机拍摄的图片 - 立即上传视频 + 即时上传视频 即时上传由相机拍摄的视频 开启日志 - 这过去是日志问题 + 用于记录问题 日志历史 这显示已经保存的日志 删除历史 @@ -32,27 +38,28 @@ 推荐给朋友 反馈 版本说明 - 在您的智能手机上试用一下 %1$s! - “我邀请你使用在你的智能手机上使用 %1$s,在这下载:%2$s” - + 记住共享位置 + 记住上次共享上传的位置 + 在您的智能手机上试用 %1$s! + 我邀请你在智能手机上使用 %1$s\n下载路径:%2$s 检查服务器 服务器地址 https://... 用户名 密码 - 新增到 %1$s? + 初次使用 %1$s? 文件 连接 上传 选择上传文件夹: 未找到账号 - 设备上未找到账号,请先创建账号。 + 设备上未找到 %1$s 账号,请先设置账号。 设置 退出 - 没有上传的内容 - 没有接收到内容,无可上传。 + 没有需要上传的内容 + 没有接收到内容,没有需要上传的内容。 %1$s未被允许访问共享内容。 上传 - 秒前 + 几秒前 这里还什么都没有。上传些东西吧! 载入中.... 在该文件夹中不存在文件。 @@ -60,19 +67,19 @@ 文件夹 文件 文件 - 点击一个文件来显示额外的信息。 + 点击一个文件可以显示额外的信息。 大小: 类型: 创建于: - 已修改: + 修改于: 下载 刷新文件 上传过程中文件被更名为了 %1$s 分享链接 - 取消共享链接 + 取消分享链接 是 否 - OK + 确定 取消下载 取消上传 取消 @@ -85,35 +92,35 @@ 删除账号 创建账号 上传自... - 目录名称 + 文件夹名称 上传... %1$d%% 上传 %2$s 上传成功 %1$s 成功上传 上传失败 - 1$上传未能完成 + %1$s 未能成功上传 上传失败,您需要重新登录 - 下载中…… + 下载中... %1$d%% 下载中 %2$s 下载成功 - %1$s 成功下载 + 成功下载 %1$s 下载失败 - 下载1$s 未能完成 + %1$s 下载未能完成 未下载完毕 下载失败,您需要重新登录 选择账户 同步失败 同步失败,您需要重新登录 %1$s同步未完成。 - 密码错误%1$s + %1$s 的密码错误 发现冲突 %1$d 文件无法同步 文件同步失败 - 无法同步 %1$d 文件内容(与 %2$d 冲突) + 无法同步 %1$d 文件内容(%2$d 冲突) 某些本地文件已被遗忘 %2$s 目录中的 %1$d 个文件不能被复制到 从 1.3.16 版起,从此设备上传的文件将被复制到本地的 %1$s 文件夹,以防止某个单一文件在多个账户间同步而造成的数据损失。\n\n 由于此项变化,此应用之前的版本上传的全部文件都已被复制到了 %2$s 文件夹。然而,账户同步期间有一个错误阻止了此操作的完成。您可能想保持文件不动,并移除指向 %3$s 的链接,或将文件移动到 %1$s 文件夹中并保持其到 %4$s 的链接。下面列出的是本地文件,以及它们被链接到的 %5$s 中的远程文件。 - 文件夹%1$s 不存在 + 文件夹%1$s 已经不存在 移动所有 所有文件已被移动 某些文件无法被移动 @@ -128,7 +135,7 @@ 两次 App PIN码不同 App PIN码不正确 App PIN码已移除 - App PIN码已保存。 + App PIN码已保存 %1$s 音乐播放器 %1$s (播放中) %1$s (载入中) @@ -149,16 +156,16 @@ 播放暂停按钮 快进按钮 正在认证... - 尝试登录 + 尝试登录... 没有网络连接 - 安全链接无效。 + 安全连接不可用。 连接已建立。 测试连接…… - 服务器配置不正确。 + 服务器配置不正确 此设备中已经存在同名同服务器的帐号 输入用户与此帐户的用户不符 发生未知错误! - 无法找到服务器 + 无法找到主机 未发现服务器实例 看起来服务器不太给力 网址不正确 @@ -166,13 +173,13 @@ 无法验证 SSL 服务器的身份 不可辨识的服务器服务器版本 无法建立连接 - 加密连接已建立 - 用户名或密码错误! + 安全连接已建立 + 用户名或密码错误 认证不成功 访问被认证服务器拒绝 意外状态;请再次输入服务器的地址 你的授权已经过期。请重新授权。 - 请输入当前密码: + 请输入当前密码 您的会话超时了,请重新连接 正在连接到认证服务器.... 服务器不支持这种验证方式 @@ -201,15 +208,15 @@ 文件名不能为空 请稍候 未知问题;请试试用其他程序选择此文件 - 未选择文件。 + 未选择文件 发送链接给 … 使用oAuth2登陆 连接oAuth2 服务器... 站点身份无法验证 - 不受信任的服务器证书 - 服务器证书过期 - 服务器证书过新 - 主机名与证书中的记录不匹配 + - 不受信任的服务器证书 + - 服务器证书过期 + - 服务器证书时间比当前时间还晚 + - 主机名与证书中的记录不匹配 是否信任此证书? 证书无法保存 详细信息 @@ -235,8 +242,8 @@ 389字节 2012/05/18 下午12:23 12:23:45 - 仅通过WIFI上传图片。 - 仅在 WIFI 下上传视频 + 仅通过 WIFI 上传图片。 + 仅通过 WIFI 上传视频 /InstantUpload 上传冲突 远程文件 %s 未与本地文件同步。继续将替换服务器上的文件内容。 @@ -244,8 +251,9 @@ 覆盖 不上传 图片预览 - 不能显示图片 + 无法显示图片 无法复制 %1$s 到本地目录 %2$s + 上传路径 抱歉,共享功能未启用。请联系管理员。 无法共享。请检查文件是否存在 共享文件或目录出错 @@ -260,29 +268,34 @@ 等待服务器响应时发生了一个错误,此操作无法完成 服务器不可用,此操作无法完成 - 你没有许可%s + 你没有权限%s 重命名该文件 删除该文件 - 分享该文件 + 共享该文件 取消共享该文件 创建文件 - 上传此文件夹 + 在此文件夹上传 该文件在服务器上不可用 账号 添加账号 + 安全连接被重定向到非安全路径. 日志 发送历史 - ownCloud安卓客户端日志 - 加载数据中... + 未找到可以发送日志的程序。请安装 mail! + %1$s Android 程序日志 + 载入数据... 需要认证 错误密码 移动 这里还什么都没有。上传些东西吧! - 选择(&C)... + 选择 无法移动。请检查文件是否存在 - b不能够把一个目录移动到它的下级 + 无法把一个目录移动到它的下级 该文件已经存在在目标文件夹 尝试移动该文件或文件夹时发生错误 移动该文件 + 即时上传 安全 + 视频上传路径 + 分享 diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index b2731798..892944eb 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -71,4 +71,5 @@ 帳號 密碼錯誤 + 安全 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index c8da742d..645c05ea 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -282,7 +282,8 @@ 安全連線被轉向到一個非安全的連線 紀錄 傳送歷史記錄 - ownCloud Android 應用程式記錄 + 找不到可以傳送記錄的電子郵件程式. 請安裝電子郵件軟體! + %1$s Android 應用程式記錄 資料載入中... 必須驗證 密碼錯誤 @@ -296,4 +297,6 @@ 移動這個檔案 即時上傳 安全性 + 影片上傳路徑 + 以分享的 diff --git a/res/values/strings.xml b/res/values/strings.xml index 8b828682..27751d14 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -304,8 +304,9 @@ Logs Send History - ownCloud Android app logs - Loading data... + No app for sending logs found. Install mail app! + %1$s Android app logs + Loading data… Authentication required Wrong password @@ -324,4 +325,8 @@ Upload Video Path + shared + with you + %1$s %2$s >>%3$s<< %4$s + diff --git a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 1d2cda8c..edab29d4 100644 --- a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -74,7 +74,7 @@ public class ThumbnailsCacheManager { public static Bitmap mDefaultImg = BitmapFactory.decodeResource( MainApp.getAppContext().getResources(), - DisplayUtils.getResourceId("image/png", "default.png") + DisplayUtils.getFileTypeIconId("image/png", "default.png") ); @@ -137,44 +137,15 @@ public class ThumbnailsCacheManager { return null; } - - public static boolean cancelPotentialWork(OCFile file, ImageView imageView) { - final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView); - - if (bitmapWorkerTask != null) { - final OCFile bitmapData = bitmapWorkerTask.mFile; - // If bitmapData is not yet set or it differs from the new data - if (bitmapData == null || bitmapData != file) { - // Cancel previous task - bitmapWorkerTask.cancel(true); - } else { - // The same work is already in progress - return false; - } - } - // No task associated with the ImageView, or an existing task was cancelled - return true; - } - - public static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) { - if (imageView != null) { - final Drawable drawable = imageView.getDrawable(); - if (drawable instanceof AsyncDrawable) { - final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; - return asyncDrawable.getBitmapWorkerTask(); - } - } - return null; - } - - public static class ThumbnailGenerationTask extends AsyncTask { + public static class ThumbnailGenerationTask extends AsyncTask { private final WeakReference mImageViewReference; private static Account mAccount; - private OCFile mFile; + private Object mFile; private FileDataStorageManager mStorageManager; - + + public ThumbnailGenerationTask(ImageView imageView, FileDataStorageManager storageManager, Account account) { - // Use a WeakReference to ensure the ImageView can be garbage collected + // Use a WeakReference to ensure the ImageView can be garbage collected mImageViewReference = new WeakReference(imageView); if (storageManager == null) throw new IllegalArgumentException("storageManager must not be NULL"); @@ -182,92 +153,46 @@ public class ThumbnailsCacheManager { mAccount = account; } - // Decode image in background. + public ThumbnailGenerationTask(ImageView imageView) { + // Use a WeakReference to ensure the ImageView can be garbage collected + mImageViewReference = new WeakReference(imageView); + } + @Override - protected Bitmap doInBackground(OCFile... params) { + protected Bitmap doInBackground(Object... params) { Bitmap thumbnail = null; - + try { if (mAccount != null) { AccountManager accountMgr = AccountManager.get(MainApp.getAppContext()); - + mServerVersion = accountMgr.getUserData(mAccount, Constants.KEY_OC_VERSION); OwnCloudAccount ocAccount = new OwnCloudAccount(mAccount, MainApp.getAppContext()); mClient = OwnCloudClientManagerFactory.getDefaultSingleton(). getClientFor(ocAccount, MainApp.getAppContext()); } - + mFile = params[0]; - final String imageKey = String.valueOf(mFile.getRemoteId()); - - // Check disk cache in background thread - thumbnail = getBitmapFromDiskCache(imageKey); - - // Not found in disk cache - if (thumbnail == null || mFile.needsUpdateThumbnail()) { - // Converts dp to pixel - Resources r = MainApp.getAppContext().getResources(); - - int px = (int) Math.round(r.getDimension(R.dimen.file_icon_size)); - - if (mFile.isDown()){ - Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile( - mFile.getStoragePath(), px, px); - - if (bitmap != null) { - thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px); - - // Add thumbnail to cache - addBitmapToCache(imageKey, thumbnail); - mFile.setNeedsUpdateThumbnail(false); - mStorageManager.saveFile(mFile); - } - - } else { - // Download thumbnail from server - if (mClient != null && mServerVersion != null) { - OwnCloudVersion serverOCVersion = new OwnCloudVersion(mServerVersion); - if (serverOCVersion.compareTo(new OwnCloudVersion(MINOR_SERVER_VERSION_FOR_THUMBS)) >= 0) { - try { - int status = -1; - - String uri = mClient.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" + - px + "/" + px + Uri.encode(mFile.getRemotePath(), "/"); - Log_OC.d("Thumbnail", "URI: " + uri); - GetMethod get = new GetMethod(uri); - status = mClient.executeMethod(get); - if (status == HttpStatus.SC_OK) { - byte[] bytes = get.getResponseBody(); - Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); - thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px); - - // Add thumbnail to cache - if (thumbnail != null) { - addBitmapToCache(imageKey, thumbnail); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } else { - Log_OC.d(TAG, "Server too old"); - } - } - } + if (mFile instanceof OCFile) { + thumbnail = doOCFileInBackground(); + } else if (mFile instanceof File) { + thumbnail = doFileInBackground(); + } else { + // do nothing } - - } catch (Throwable t) { - // the app should never break due to a problem with thumbnails - Log_OC.e(TAG, "Generation of thumbnail for " + mFile + " failed", t); - if (t instanceof OutOfMemoryError) { - System.gc(); + + }catch(Throwable t){ + // the app should never break due to a problem with thumbnails + Log_OC.e(TAG, "Generation of thumbnail for " + mFile + " failed", t); + if (t instanceof OutOfMemoryError) { + System.gc(); + } } - } - + return thumbnail; } - + protected void onPostExecute(Bitmap bitmap){ if (isCancelled()) { bitmap = null; @@ -275,47 +200,183 @@ public class ThumbnailsCacheManager { if (mImageViewReference != null && bitmap != null) { final ImageView imageView = mImageViewReference.get(); - final ThumbnailGenerationTask bitmapWorkerTask = - getBitmapWorkerTask(imageView); + final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (this == bitmapWorkerTask && imageView != null) { - if (imageView.getTag().equals(mFile.getFileId())) { + String tagId = ""; + if (mFile instanceof OCFile){ + tagId = String.valueOf(((OCFile)mFile).getFileId()); + } else if (mFile instanceof File){ + tagId = String.valueOf(((File)mFile).hashCode()); + } + if (String.valueOf(imageView.getTag()).equals(tagId)) { imageView.setImageBitmap(bitmap); } } } } + + /** + * Add thumbnail to cache + * @param imageKey: thumb key + * @param bitmap: image for extracting thumbnail + * @param path: image path + * @param px: thumbnail dp + * @return Bitmap + */ + private Bitmap addThumbnailToCache(String imageKey, Bitmap bitmap, String path, int px){ + + Bitmap thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px); + + // Rotate image, obeying exif tag + thumbnail = BitmapUtils.rotateImage(thumbnail,path); + + // Add thumbnail to cache + addBitmapToCache(imageKey, thumbnail); + + return thumbnail; + } + + /** + * Converts size of file icon from dp to pixel + * @return int + */ + private int getThumbnailDimension(){ + // Converts dp to pixel + Resources r = MainApp.getAppContext().getResources(); + return (int) Math.round(r.getDimension(R.dimen.file_icon_size)); + } + + private Bitmap doOCFileInBackground() { + Bitmap thumbnail = null; + OCFile file = (OCFile)mFile; + + final String imageKey = String.valueOf(file.getRemoteId()); + + // Check disk cache in background thread + thumbnail = getBitmapFromDiskCache(imageKey); + + // Not found in disk cache + if (thumbnail == null || file.needsUpdateThumbnail()) { + + int px = getThumbnailDimension(); + + if (file.isDown()) { + Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile( + file.getStoragePath(), px, px); + + if (bitmap != null) { + thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), px); + + file.setNeedsUpdateThumbnail(false); + mStorageManager.saveFile(file); + } + + } else { + // Download thumbnail from server + if (mClient != null && mServerVersion != null) { + OwnCloudVersion serverOCVersion = new OwnCloudVersion(mServerVersion); + if (serverOCVersion.compareTo(new OwnCloudVersion(MINOR_SERVER_VERSION_FOR_THUMBS)) >= 0) { + try { + int status = -1; + + String uri = mClient.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" + + px + "/" + px + Uri.encode(file.getRemotePath(), "/"); + Log_OC.d("Thumbnail", "URI: " + uri); + GetMethod get = new GetMethod(uri); + status = mClient.executeMethod(get); + if (status == HttpStatus.SC_OK) { + byte[] bytes = get.getResponseBody(); + Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px); + + // Add thumbnail to cache + if (thumbnail != null) { + addBitmapToCache(imageKey, thumbnail); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + Log_OC.d(TAG, "Server too old"); + } + } + } + } + + return thumbnail; + + } + + private Bitmap doFileInBackground() { + Bitmap thumbnail = null; + File file = (File)mFile; + + final String imageKey = String.valueOf(file.hashCode()); + + // Check disk cache in background thread + thumbnail = getBitmapFromDiskCache(imageKey); + + // Not found in disk cache + if (thumbnail == null) { + + int px = getThumbnailDimension(); + + Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile( + file.getAbsolutePath(), px, px); + + if (bitmap != null) { + thumbnail = addThumbnailToCache(imageKey, bitmap, file.getPath(), px); + } + } + return thumbnail; + } + } - - + + public static boolean cancelPotentialWork(Object file, ImageView imageView) { + final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView); + + if (bitmapWorkerTask != null) { + final Object bitmapData = bitmapWorkerTask.mFile; + // If bitmapData is not yet set or it differs from the new data + if (bitmapData == null || bitmapData != file) { + // Cancel previous task + bitmapWorkerTask.cancel(true); + } else { + // The same work is already in progress + return false; + } + } + // No task associated with the ImageView, or an existing task was cancelled + return true; + } + + public static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) { + if (imageView != null) { + final Drawable drawable = imageView.getDrawable(); + if (drawable instanceof AsyncDrawable) { + final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; + return asyncDrawable.getBitmapWorkerTask(); + } + } + return null; + } + public static class AsyncDrawable extends BitmapDrawable { private final WeakReference bitmapWorkerTaskReference; public AsyncDrawable( Resources res, Bitmap bitmap, ThumbnailGenerationTask bitmapWorkerTask - ) { - + ) { + super(res, bitmap); bitmapWorkerTaskReference = - new WeakReference(bitmapWorkerTask); + new WeakReference(bitmapWorkerTask); } public ThumbnailGenerationTask getBitmapWorkerTask() { return bitmapWorkerTaskReference.get(); } } - - - /** - * Remove from cache the remoteId passed - * @param fileRemoteId: remote id of mFile passed - */ - public static void removeFileFromCache(String fileRemoteId){ - synchronized (mThumbnailsDiskCacheLock) { - if (mThumbnailCache != null) { - mThumbnailCache.removeKey(fileRemoteId); - } - mThumbnailsDiskCacheLock.notifyAll(); // Wake any waiting threads - } - } - } diff --git a/src/com/owncloud/android/operations/CreateShareOperation.java b/src/com/owncloud/android/operations/CreateShareOperation.java index b563790f..fc44f530 100644 --- a/src/com/owncloud/android/operations/CreateShareOperation.java +++ b/src/com/owncloud/android/operations/CreateShareOperation.java @@ -24,8 +24,10 @@ package com.owncloud.android.operations; * */ +import android.content.Context; import android.content.Intent; +import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudClient; @@ -46,6 +48,7 @@ public class CreateShareOperation extends SyncOperation { protected FileDataStorageManager mStorageManager; + private Context mContext; private String mPath; private ShareType mShareType; private String mShareWith; @@ -56,6 +59,7 @@ public class CreateShareOperation extends SyncOperation { /** * Constructor + * @param context The context that the share is coming from. * @param path Full path of the file/folder being shared. Mandatory argument * @param shareType 0 = user, 1 = group, 3 = Public link. Mandatory argument * @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType of 0 or 1 @@ -72,9 +76,10 @@ public class CreateShareOperation extends SyncOperation { * To obtain combinations, add the desired values together. * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. */ - public CreateShareOperation(String path, ShareType shareType, String shareWith, boolean publicUpload, + public CreateShareOperation(Context context, String path, ShareType shareType, String shareWith, boolean publicUpload, String password, int permissions, Intent sendIntent) { + mContext = context; mPath = path; mShareType = shareType; mShareWith = shareWith; @@ -128,6 +133,9 @@ public class CreateShareOperation extends SyncOperation { OCFile file = getStorageManager().getFileByPath(mPath); if (file!=null) { mSendIntent.putExtra(Intent.EXTRA_TEXT, share.getShareLink()); + mSendIntent.putExtra(Intent.EXTRA_SUBJECT, String.format(mContext.getString(R.string.subject_token), + getClient().getCredentials().getUsername(), mContext.getString(R.string.shared_subject_header), + file.getFileName(), mContext.getString(R.string.with_you_subject_header))); file.setPublicLink(share.getShareLink()); file.setShareByLink(true); getStorageManager().saveFile(file); diff --git a/src/com/owncloud/android/operations/RenameFileOperation.java b/src/com/owncloud/android/operations/RenameFileOperation.java index bd60e1fb..2fdc8f18 100644 --- a/src/com/owncloud/android/operations/RenameFileOperation.java +++ b/src/com/owncloud/android/operations/RenameFileOperation.java @@ -158,7 +158,7 @@ public class RenameFileOperation extends SyncOperation { */ private boolean isValidNewName() throws IOException { // check tricky names - if (mNewName == null || mNewName.length() <= 0 || mNewName.contains(File.separator) || mNewName.contains("%")) { + if (mNewName == null || mNewName.length() <= 0 || mNewName.contains(File.separator)) { return false; } // create a test file diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index 16c4dcca..ca370b31 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -319,7 +319,7 @@ public class OperationsService extends Service { String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH); Intent sendIntent = operationIntent.getParcelableExtra(EXTRA_SEND_INTENT); if (remotePath.length() > 0) { - operation = new CreateShareOperation(remotePath, ShareType.PUBLIC_LINK, + operation = new CreateShareOperation(OperationsService.this, remotePath, ShareType.PUBLIC_LINK, "", false, "", 1, sendIntent); } diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 762cb999..3bec9167 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -25,6 +25,8 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; +import android.annotation.SuppressLint; +import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; @@ -107,6 +109,7 @@ import com.owncloud.android.ui.preview.PreviewMediaFragment; import com.owncloud.android.ui.preview.PreviewVideoActivity; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; +import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.UriUtils; @@ -517,7 +520,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { // Read sorting order, default to sort by name ascending Integer sortOrder = appPreferences - .getInt("sortOrder", FileListListAdapter.SORT_NAME); + .getInt("sortOrder", FileStorageUtils.SORT_NAME); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.actionbar_sort_title) @@ -605,13 +608,23 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { /** * Called, when the user selected something for uploading + * */ + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) { - requestSimpleUpload(data, resultCode); - + //getClipData is only supported on api level 16+, Jelly Bean + if (data.getData() == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){ + for( int i = 0; i < data.getClipData().getItemCount(); i++){ + Intent intent = new Intent(); + intent.setData(data.getClipData().getItemAt(i).getUri()); + requestSimpleUpload(intent, resultCode); + } + }else { + requestSimpleUpload(data, resultCode); + } } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) { requestMultipleUpload(data, resultCode); @@ -877,6 +890,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { } else if (item == 1) { Intent action = new Intent(Intent.ACTION_GET_CONTENT); action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE); + //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)), ACTION_SELECT_CONTENT_FROM_APPS); } diff --git a/src/com/owncloud/android/ui/activity/LogHistoryActivity.java b/src/com/owncloud/android/ui/activity/LogHistoryActivity.java index 676388d2..793b3d9d 100644 --- a/src/com/owncloud/android/ui/activity/LogHistoryActivity.java +++ b/src/com/owncloud/android/ui/activity/LogHistoryActivity.java @@ -25,6 +25,7 @@ import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.ArrayList; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; @@ -36,6 +37,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; +import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockFragmentActivity; @@ -51,12 +53,15 @@ public class LogHistoryActivity extends SherlockFragmentActivity { private static final String MAIL_ATTACHMENT_TYPE = "text/plain"; + private static final String KEY_LOG_TEXT = "LOG_TEXT"; + private static final String TAG = LogHistoryActivity.class.getSimpleName(); private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; private String mLogPath = FileStorageUtils.getLogPath(); private File logDIR = null; + private String mLogText; @Override @@ -70,6 +75,7 @@ public class LogHistoryActivity extends SherlockFragmentActivity { actionBar.setDisplayHomeAsUpEnabled(true); Button deleteHistoryButton = (Button) findViewById(R.id.deleteLogHistoryButton); Button sendHistoryButton = (Button) findViewById(R.id.sendLogHistoryButton); + TextView logTV = (TextView) findViewById(R.id.logTV); deleteHistoryButton.setOnClickListener(new OnClickListener() { @@ -89,20 +95,22 @@ public class LogHistoryActivity extends SherlockFragmentActivity { } }); - if (mLogPath != null) { - logDIR = new File(mLogPath); - } - - if (logDIR != null && logDIR.isDirectory()) { - // Show a dialog while log data is being loaded - showLoadingDialog(); - - TextView logTV = (TextView) findViewById(R.id.logTV); + if (savedInstanceState == null) { + if (mLogPath != null) { + logDIR = new File(mLogPath); + } - // Start a new thread that will load all the log data - LoadingLogTask task = new LoadingLogTask(logTV); - task.execute(); + if (logDIR != null && logDIR.isDirectory()) { + // Show a dialog while log data is being loaded + showLoadingDialog(); + // Start a new thread that will load all the log data + LoadingLogTask task = new LoadingLogTask(logTV); + task.execute(); + } + } else { + mLogText = savedInstanceState.getString(KEY_LOG_TEXT); + logTV.setText(mLogText); } } @@ -125,41 +133,45 @@ public class LogHistoryActivity extends SherlockFragmentActivity { */ private void sendMail() { + // For the moment we need to consider the possibility that setup.xml + // does not include the "mail_logger" entry. This block prevents that + // compilation fails in this case. String emailAddress; try { Class stringClass = R.string.class; Field mailLoggerField = stringClass.getField("mail_logger"); - int emailAddressId = (Integer)mailLoggerField.get(null); + int emailAddressId = (Integer) mailLoggerField.get(null); emailAddress = getString(emailAddressId); - } catch (Exception e) { emailAddress = ""; } - + ArrayList uris = new ArrayList(); // Convert from paths to Android friendly Parcelable Uri's for (String file : Log_OC.getLogFileNames()) { - if (new File(mLogPath + File.separator, file).exists()) { - Uri u = Uri.parse("file://" + mLogPath + File.separator + file); - uris.add(u); + File logFile = new File(mLogPath, file); + if (logFile.exists()) { + uris.add(Uri.fromFile(logFile)); } } Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); - // Explicitly only use Gmail to send - intent.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail"); - intent.putExtra(Intent.EXTRA_EMAIL, new String[]{ emailAddress }); - intent.putExtra(Intent.EXTRA_SUBJECT, getText(R.string.log_mail_subject)); + intent.putExtra(Intent.EXTRA_EMAIL, emailAddress); + String subject = String.format(getString(R.string.log_send_mail_subject), getString(R.string.app_name)); + intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setType(MAIL_ATTACHMENT_TYPE); intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); - - if (intent.resolveActivity(getPackageManager()) != null) { + try { startActivity(intent); + } catch (ActivityNotFoundException e) { + Toast.makeText(this, getString(R.string.log_send_no_mail_app), Toast.LENGTH_LONG).show(); + Log_OC.i(TAG, "Could not find app for sending log history."); } + } /** @@ -183,7 +195,8 @@ public class LogHistoryActivity extends SherlockFragmentActivity { if (textViewReference != null && result != null) { final TextView logTV = textViewReference.get(); if (logTV != null) { - logTV.setText(result); + mLogText = result; + logTV.setText(mLogText); dismissLoadingDialog(); } } @@ -258,4 +271,12 @@ public class LogHistoryActivity extends SherlockFragmentActivity { loading.dismiss(); } } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + /// global state + outState.putString(KEY_LOG_TEXT, mLogText); + } } \ No newline at end of file diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index 04a4c7af..1d80a703 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -119,7 +119,18 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa return false; } }); - + + // Load package info + String temp; + try { + PackageInfo pkg = getPackageManager().getPackageInfo(getPackageName(), 0); + temp = pkg.versionName; + } catch (NameNotFoundException e) { + temp = ""; + Log_OC.e(TAG, "Error while showing about dialog", e); + } + final String appVersion = temp; + // Register context menu for list of preferences. registerForContextMenu(getListView()); @@ -208,7 +219,7 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa @Override public boolean onPreferenceClick(Preference preference) { String feedbackMail =(String) getText(R.string.mail_feedback); - String feedback =(String) getText(R.string.prefs_feedback); + String feedback =(String) getText(R.string.prefs_feedback) + " - android v" + appVersion; Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, feedback); @@ -286,13 +297,7 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa pAboutApp = (Preference) findPreference("about_app"); if (pAboutApp != null) { pAboutApp.setTitle(String.format(getString(R.string.about_android), getString(R.string.app_name))); - PackageInfo pkg; - try { - pkg = getPackageManager().getPackageInfo(getPackageName(), 0); - pAboutApp.setSummary(String.format(getString(R.string.about_version), pkg.versionName)); - } catch (NameNotFoundException e) { - Log_OC.e(TAG, "Error while showing about dialog", e); - } + pAboutApp.setSummary(String.format(getString(R.string.about_version), appVersion)); } loadInstantUploadPath(); diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index 1df1211c..9c8c8e1f 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -17,7 +17,7 @@ */ package com.owncloud.android.ui.adapter; - + import java.io.File; import java.util.Collections; import java.util.Comparator; @@ -44,13 +44,12 @@ import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; -import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncDrawable; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.ui.activity.ComponentsGetter; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.FileStorageUtils; - + /** * This Adapter populates a ListView with all files and folders in an ownCloud @@ -60,7 +59,7 @@ import com.owncloud.android.utils.FileStorageUtils; * @author Tobias Kaminsky * @author David A. Velasco */ -public class FileListListAdapter extends BaseAdapter implements ListAdapter { +public class FileListListAdapter extends BaseAdapter implements ListAdapter { private final static String PERMISSION_SHARED_WITH_ME = "S"; private Context mContext; @@ -68,14 +67,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { private Vector mFiles = null; private boolean mJustFolders; - private FileDataStorageManager mStorageManager; - private Account mAccount; + private FileDataStorageManager mStorageManager; + private Account mAccount; private ComponentsGetter mTransferServiceGetter; - private Integer mSortOrder; - public static final Integer SORT_NAME = 0; - public static final Integer SORT_DATE = 1; - public static final Integer SORT_SIZE = 2; - private Boolean mSortAscending; + private SharedPreferences mAppPreferences; public FileListListAdapter( @@ -87,22 +82,22 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { mJustFolders = justFolders; mContext = context; mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); - - mTransferServiceGetter = transferServiceGetter; + + mTransferServiceGetter = transferServiceGetter; mAppPreferences = PreferenceManager .getDefaultSharedPreferences(mContext); // Read sorting order, default to sort by name ascending - mSortOrder = mAppPreferences - .getInt("sortOrder", 0); - mSortAscending = mAppPreferences.getBoolean("sortAscending", true); + FileStorageUtils.mSortOrder = mAppPreferences.getInt("sortOrder", 0); + FileStorageUtils.mSortAscending = mAppPreferences.getBoolean("sortAscending", true); + // initialise thumbnails cache on background thread new ThumbnailsCacheManager.InitDiskCacheTask().execute(); } - + @Override public boolean areAllItemsEnabled() { return true; @@ -214,16 +209,18 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { if (thumbnail != null && !file.needsUpdateThumbnail()){ fileIcon.setImageBitmap(thumbnail); } else { + // generate new Thumbnail if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) { - final ThumbnailsCacheManager.ThumbnailGenerationTask task = + final ThumbnailsCacheManager.ThumbnailGenerationTask task = new ThumbnailsCacheManager.ThumbnailGenerationTask( fileIcon, mStorageManager, mAccount ); if (thumbnail == null) { thumbnail = ThumbnailsCacheManager.mDefaultImg; } - final AsyncDrawable asyncDrawable = new AsyncDrawable( + final ThumbnailsCacheManager.AsyncDrawable asyncDrawable = + new ThumbnailsCacheManager.AsyncDrawable( mContext.getResources(), thumbnail, task @@ -233,11 +230,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { } } } else { - fileIcon.setImageResource( - DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()) - ); + fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(file.getMimetype(), file.getFileName())); } - + if (checkIfFileIsSharedWithMe(file)) { sharedWithMeIconV.setVisibility(View.VISIBLE); } @@ -250,7 +245,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { // } else { fileSizeV.setVisibility(View.INVISIBLE); // } - + lastModV.setVisibility(View.VISIBLE); lastModV.setText(showRelativeTimestamp(file)); checkBoxV.setVisibility(View.GONE); @@ -261,7 +256,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { sharedWithMeIconV.setVisibility(View.VISIBLE); } else { fileIcon.setImageResource( - DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()) + DisplayUtils.getFileTypeIconId(file.getMimetype(), file.getFileName()) ); } @@ -281,7 +276,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { return view; } - + /** * Local Folder size in human readable format * @@ -294,7 +289,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { File dir = new File(path); if (dir.exists()) { - long bytes = getFolderSize(dir); + long bytes = FileStorageUtils.getFolderSize(dir); return DisplayUtils.bytesToHumanReadable(bytes); } @@ -320,8 +315,8 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { return result; } return 0; - } - + } + @Override public int getViewTypeCount() { return 1; @@ -359,29 +354,11 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { mFiles = null; } - sortDirectory(); - } - - /** - * Sorts all filenames, regarding last user decision - */ - private void sortDirectory(){ - switch (mSortOrder){ - case 0: - sortByName(mSortAscending); - break; - case 1: - sortByDate(mSortAscending); - break; - case 2: - sortBySize(mSortAscending); - break; - } - + mFiles = FileStorageUtils.sortFolder(mFiles); notifyDataSetChanged(); } - + /** * Filter for getting only the folders * @param files @@ -414,110 +391,23 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME)); } - /** - * Sorts list by Date - * @param sortAscending true: ascending, false: descending - */ - private void sortByDate(boolean sortAscending){ - final Integer val; - if (sortAscending){ - val = 1; - } else { - val = -1; - } - - Collections.sort(mFiles, new Comparator() { - public int compare(OCFile o1, OCFile o2) { - if (o1.isFolder() && o2.isFolder()) { - Long obj1 = o1.getModificationTimestamp(); - return val * obj1.compareTo(o2.getModificationTimestamp()); - } - else if (o1.isFolder()) { - return -1; - } else if (o2.isFolder()) { - return 1; - } else if (o1.getModificationTimestamp() == 0 || o2.getModificationTimestamp() == 0){ - return 0; - } else { - Long obj1 = o1.getModificationTimestamp(); - return val * obj1.compareTo(o2.getModificationTimestamp()); - } - } - }); - } - - /** - * Sorts list by Size - * @param sortAscending true: ascending, false: descending - */ - private void sortBySize(boolean sortAscending){ - final Integer val; - if (sortAscending){ - val = 1; - } else { - val = -1; - } - - Collections.sort(mFiles, new Comparator() { - public int compare(OCFile o1, OCFile o2) { - if (o1.isFolder() && o2.isFolder()) { - Long obj1 = getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o1))); - return val * obj1.compareTo(getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o2)))); - } - else if (o1.isFolder()) { - return -1; - } else if (o2.isFolder()) { - return 1; - } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0){ - return 0; - } else { - Long obj1 = o1.getFileLength(); - return val * obj1.compareTo(o2.getFileLength()); - } - } - }); - } - - /** - * Sorts list by Name - * @param sortAscending true: ascending, false: descending - */ - private void sortByName(boolean sortAscending){ - final Integer val; - if (sortAscending){ - val = 1; - } else { - val = -1; - } - - Collections.sort(mFiles, new Comparator() { - public int compare(OCFile o1, OCFile o2) { - if (o1.isFolder() && o2.isFolder()) { - return val * o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase()); - } else if (o1.isFolder()) { - return -1; - } else if (o2.isFolder()) { - return 1; - } - return val * new AlphanumComparator().compare(o1, o2); - } - }); - } - public void setSortOrder(Integer order, boolean ascending) { SharedPreferences.Editor editor = mAppPreferences.edit(); editor.putInt("sortOrder", order); editor.putBoolean("sortAscending", ascending); editor.commit(); - mSortOrder = order; - mSortAscending = ascending; + FileStorageUtils.mSortOrder = order; + FileStorageUtils.mSortAscending = ascending; - sortDirectory(); + + mFiles = FileStorageUtils.sortFolder(mFiles); + notifyDataSetChanged(); + } private CharSequence showRelativeTimestamp(OCFile file){ return DisplayUtils.getRelativeDateTimeString(mContext, file.getModificationTimestamp(), DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0); - } + } } diff --git a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java index 6190ebee..996851e1 100644 --- a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.Comparator; import android.content.Context; +import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -32,6 +33,8 @@ import android.widget.ListView; import android.widget.TextView; import com.owncloud.android.R; +import com.owncloud.android.datamodel.ThumbnailsCacheManager; +import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.DisplayUtils; /** @@ -46,7 +49,7 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { private Context mContext; private File mDirectory; private File[] mFiles = null; - + public LocalFileListAdapter(File directory, Context context) { mContext = context; swapDirectory(directory); @@ -105,6 +108,7 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { } else { fileIcon.setImageResource(R.drawable.ic_menu_archive); } + fileIcon.setTag(file.hashCode()); TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); TextView lastModV = (TextView) view.findViewById(R.id.last_mod); @@ -125,6 +129,37 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { } checkBoxV.setVisibility(View.VISIBLE); } + + // get Thumbnail if file is image + if (BitmapUtils.isImage(file)){ + // Thumbnail in Cache? + Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( + String.valueOf(file.hashCode()) + ); + if (thumbnail != null){ + fileIcon.setImageBitmap(thumbnail); + } else { + + // generate new Thumbnail + if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) { + final ThumbnailsCacheManager.ThumbnailGenerationTask task = + new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon); + if (thumbnail == null) { + thumbnail = ThumbnailsCacheManager.mDefaultImg; + } + final ThumbnailsCacheManager.AsyncDrawable asyncDrawable = + new ThumbnailsCacheManager.AsyncDrawable( + mContext.getResources(), + thumbnail, + task + ); + fileIcon.setImageDrawable(asyncDrawable); + task.execute(file); + } + } + } else { + fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(null, file.getName())); + } } else { fileSizeV.setVisibility(View.GONE); @@ -132,7 +167,7 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { checkBoxV.setVisibility(View.GONE); } - view.findViewById(R.id.imageView2).setVisibility(View.INVISIBLE); // not GONE; the alignment changes; ugly way to keep it + view.findViewById(R.id.imageView2).setVisibility(View.INVISIBLE); // not GONE; the alignment would change view.findViewById(R.id.imageView3).setVisibility(View.GONE); view.findViewById(R.id.sharedIcon).setVisibility(View.GONE); diff --git a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 2ff29250..1e0e7ee3 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -396,7 +396,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener } ImageView iv = (ImageView) getView().findViewById(R.id.fdIcon); if (iv != null) { - iv.setImageResource(DisplayUtils.getResourceId(mimetype, filename)); + iv.setImageResource(DisplayUtils.getFileTypeIconId(mimetype, filename)); } } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index fd0b1a55..9c85dd98 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -48,6 +48,7 @@ import com.owncloud.android.ui.dialog.RemoveFileDialogFragment; import com.owncloud.android.ui.dialog.RenameFileDialogFragment; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.ui.preview.PreviewMediaFragment; +import com.owncloud.android.utils.FileStorageUtils; /** * A Fragment that lists all files and folders in a given path. @@ -257,15 +258,9 @@ public class OCFileListFragment extends ExtendedListFragment { ); mf.filter(menu); } - - /// additional restrictions for this fragment - // TODO allow in the future 'open with' for previewable files - MenuItem item = menu.findItem(R.id.action_open_file_with); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } + /// TODO break this direct dependency on FileDisplayActivity... if possible + MenuItem item = menu.findItem(R.id.action_open_file_with); FileFragment frag = ((FileDisplayActivity)getSherlockActivity()).getSecondFragment(); if (frag != null && frag instanceof FileDetailFragment && frag.getFile().getFileId() == targetFile.getFileId()) { @@ -291,6 +286,10 @@ public class OCFileListFragment extends ExtendedListFragment { mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); return true; } + case R.id.action_open_file_with: { + mContainerActivity.getFileOperationsHelper().openFile(mTargetFile); + return true; + } case R.id.action_unshare_file: { mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); return true; @@ -439,15 +438,15 @@ public class OCFileListFragment extends ExtendedListFragment { } public void sortByName(boolean descending) { - mAdapter.setSortOrder(FileListListAdapter.SORT_NAME, descending); + mAdapter.setSortOrder(FileStorageUtils.SORT_NAME, descending); } public void sortByDate(boolean descending) { - mAdapter.setSortOrder(FileListListAdapter.SORT_DATE, descending); + mAdapter.setSortOrder(FileStorageUtils.SORT_DATE, descending); } public void sortBySize(boolean descending) { - mAdapter.setSortOrder(FileListListAdapter.SORT_SIZE, descending); + mAdapter.setSortOrder(FileStorageUtils.SORT_SIZE, descending); } } diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index c06f341f..1cee30e8 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -79,7 +79,9 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener { private static final int INITIAL_HIDE_DELAY = 0; // immediate hide private ExtendedViewPager mViewPager; - private PreviewImagePagerAdapter mPreviewImagePagerAdapter; + private PreviewImagePagerAdapter mPreviewImagePagerAdapter; + private int mSavedPosition = 0; + private boolean mHasSavedPosition = false; private boolean mRequestWaitingForBinder; @@ -146,7 +148,7 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener { } mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), getStorageManager()); mViewPager = (ExtendedViewPager) findViewById(R.id.fragmentPager); - int position = mPreviewImagePagerAdapter.getFilePosition(getFile()); + int position = mHasSavedPosition ? mSavedPosition : mPreviewImagePagerAdapter.getFilePosition(getFile()); position = (position >= 0) ? position : 0; mViewPager.setAdapter(mPreviewImagePagerAdapter); mViewPager.setOnPageChangeListener(this); @@ -378,6 +380,8 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener { */ @Override public void onPageSelected(int position) { + mSavedPosition = position; + mHasSavedPosition = true; if (mDownloaderBinder == null) { mRequestWaitingForBinder = true; diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index a3814c77..0995793d 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -53,6 +53,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.RemoveFileDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.TouchImageViewCustom; @@ -82,6 +83,8 @@ public class PreviewImageFragment extends FileFragment { private static final String TAG = PreviewImageFragment.class.getSimpleName(); private boolean mIgnoreFirstSavedState; + + private LoadBitmapTask mLoadBitmapTask = null; /** @@ -190,12 +193,22 @@ public class PreviewImageFragment extends FileFragment { public void onStart() { super.onStart(); if (getFile() != null) { - BitmapLoader bl = new BitmapLoader(mImageView, mMessageView, mProgressWheel); - bl.execute(new String[]{getFile().getStoragePath()}); + mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel); + mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()}); } } + @Override + public void onStop() { + super.onStop(); + if (mLoadBitmapTask != null) { + mLoadBitmapTask.cancel(true); + mLoadBitmapTask = null; + } + + } + /** * {@inheritDoc} */ @@ -328,8 +341,8 @@ public class PreviewImageFragment extends FileFragment { finish(); } - - private class BitmapLoader extends AsyncTask { + + private class LoadBitmapTask extends AsyncTask { /** * Weak reference to the target {@link ImageView} where the bitmap will be loaded into. @@ -365,7 +378,7 @@ public class PreviewImageFragment extends FileFragment { * * @param imageView Target {@link ImageView} where the bitmap will be loaded into. */ - public BitmapLoader(ImageViewCustom imageView, TextView messageView, ProgressBar progressWheel) { + public LoadBitmapTask(ImageViewCustom imageView, TextView messageView, ProgressBar progressWheel) { mImageViewRef = new WeakReference(imageView); mMessageViewRef = new WeakReference(messageView); mProgressWheelRef = new WeakReference(progressWheel); @@ -379,43 +392,65 @@ public class PreviewImageFragment extends FileFragment { String storagePath = params[0]; try { + if (isCancelled()) return result; + File picture = new File(storagePath); if (picture != null) { - //Decode file into a bitmap in real size for being able to make zoom on the image + // Decode file into a bitmap in real size for being able to make zoom on + // the image result = BitmapFactory.decodeStream(new FlushedInputStream (new BufferedInputStream(new FileInputStream(picture)))); } + if (isCancelled()) return result; + if (result == null) { mErrorMessageId = R.string.preview_image_error_unknown_format; Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); + } else { + // Rotate image, obeying exif tag. + result = BitmapUtils.rotateImage(result, storagePath); } } catch (OutOfMemoryError e) { Log_OC.e(TAG, "Out of memory occured for file " + storagePath, e); - // If out of memory error when loading image, try to load it scaled + if (isCancelled()) return result; + + // If out of memory error when loading or rotating image, try to load it scaled result = loadScaledImage(storagePath); if (result == null) { mErrorMessageId = R.string.preview_image_error_unknown_format; Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); + } else { + // Rotate scaled image, obeying exif tag + result = BitmapUtils.rotateImage(result, storagePath); } } catch (NoSuchFieldError e) { mErrorMessageId = R.string.common_error_unknown; - Log_OC.e(TAG, "Error from access to unexisting field despite protection; file " + storagePath, e); + Log_OC.e(TAG, "Error from access to unexisting field despite protection; file " + + storagePath, e); } catch (Throwable t) { mErrorMessageId = R.string.common_error_unknown; Log_OC.e(TAG, "Unexpected error loading " + getFile().getStoragePath(), t); } + return result; } @Override + protected void onCancelled(Bitmap result) { + if (result != null) { + result.recycle(); + } + } + + @Override protected void onPostExecute(Bitmap result) { hideProgressWheel(); if (result != null) { @@ -424,7 +459,7 @@ public class PreviewImageFragment extends FileFragment { showErrorMessage(); } } - + @SuppressLint("InlinedApi") private void showLoadedImage(Bitmap result) { if (mImageViewRef != null) { diff --git a/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java b/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java index f2a9a9b2..3c15de71 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java +++ b/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java @@ -16,6 +16,8 @@ */ package com.owncloud.android.ui.preview; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -31,7 +33,9 @@ import android.view.ViewGroup; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.ui.adapter.FileListListAdapter; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.FileStorageUtils; /** * Adapter class that provides Fragment instances @@ -73,13 +77,15 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter { mAccount = account; mStorageManager = storageManager; mImageFiles = mStorageManager.getFolderImages(parentFolder); + + mImageFiles = FileStorageUtils.sortFolder(mImageFiles); + mObsoleteFragments = new HashSet(); mObsoletePositions = new HashSet(); mDownloadErrors = new HashSet(); //mFragmentManager = fragmentManager; mCachedFragments = new HashMap(); } - /** * Returns the image files handled by the adapter. diff --git a/src/com/owncloud/android/utils/BitmapUtils.java b/src/com/owncloud/android/utils/BitmapUtils.java index 687b5a4f..92824f44 100644 --- a/src/com/owncloud/android/utils/BitmapUtils.java +++ b/src/com/owncloud/android/utils/BitmapUtils.java @@ -16,9 +16,17 @@ */ package com.owncloud.android.utils; +import com.owncloud.android.lib.common.utils.Log_OC; + import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Matrix; import android.graphics.BitmapFactory.Options; +import android.media.ExifInterface; +import android.net.Uri; +import android.webkit.MimeTypeMap; + +import java.io.File; /** * Utility class with methods for decoding Bitmaps. @@ -96,4 +104,87 @@ public class BitmapUtils { return inSampleSize; } + /** + * Rotate bitmap according to EXIF orientation. + * Cf. http://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/ + * @param bitmap Bitmap to be rotated + * @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){ + Bitmap resultBitmap = bitmap; + + 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) + { + matrix.postScale(-1.0f, 1.0f); + } + // 3 + else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) + { + matrix.postRotate(180); + } + // 4 + else if (orientation == ExifInterface.ORIENTATION_FLIP_VERTICAL) + { + matrix.postScale(1.0f, -1.0f); + } + // 5 + else if (orientation == ExifInterface.ORIENTATION_TRANSPOSE) + { + matrix.postRotate(-90); + matrix.postScale(1.0f, -1.0f); + } + // 6 + else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) + { + matrix.postRotate(90); + } + // 7 + else if (orientation == ExifInterface.ORIENTATION_TRANSVERSE) + { + matrix.postRotate(90); + matrix.postScale(1.0f, -1.0f); + } + // 8 + 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 != bitmap) { + bitmap.recycle(); + } + } + catch (Exception exception) + { + Log_OC.e("BitmapUtil", "Could not rotate the image: " + storagePath); + } + return resultBitmap; + } + + /** + * Checks if file passed is an image + * @param file + * @return true/false + */ + public static boolean isImage(File file) { + Uri selectedUri = Uri.fromFile(file); + String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString().toLowerCase()); + String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension); + + return (mimeType != null && mimeType.startsWith("image/")); + } + } diff --git a/src/com/owncloud/android/utils/DisplayUtils.java b/src/com/owncloud/android/utils/DisplayUtils.java index a1afb894..32d90173 100644 --- a/src/com/owncloud/android/utils/DisplayUtils.java +++ b/src/com/owncloud/android/utils/DisplayUtils.java @@ -19,6 +19,7 @@ package com.owncloud.android.utils; import java.net.IDN; +import java.text.DateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -30,6 +31,7 @@ import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.text.format.DateUtils; +import android.webkit.MimeTypeMap; import com.owncloud.android.MainApp; import com.owncloud.android.R; @@ -73,21 +75,28 @@ public class DisplayUtils { private static final String TYPE_VIDEO = "video"; private static final String SUBTYPE_PDF = "pdf"; - private static final String[] SUBTYPES_DOCUMENT = { "msword", - "vnd.openxmlformats-officedocument.wordprocessingml.document", - "vnd.oasis.opendocument.text", - "rtf" - }; + private static final String SUBTYPE_XML = "xml"; + private static final String[] SUBTYPES_DOCUMENT = { + "msword", + "vnd.openxmlformats-officedocument.wordprocessingml.document", + "vnd.oasis.opendocument.text", + "rtf", + "javascript" + }; private static Set SUBTYPES_DOCUMENT_SET = new HashSet(Arrays.asList(SUBTYPES_DOCUMENT)); - private static final String[] SUBTYPES_SPREADSHEET = { "msexcel", - "vnd.openxmlformats-officedocument.spreadsheetml.sheet", - "vnd.oasis.opendocument.spreadsheet" - }; + private static final String[] SUBTYPES_SPREADSHEET = { + "msexcel", + "vnd.ms-excel", + "vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "vnd.oasis.opendocument.spreadsheet" + }; private static Set SUBTYPES_SPREADSHEET_SET = new HashSet(Arrays.asList(SUBTYPES_SPREADSHEET)); - private static final String[] SUBTYPES_PRESENTATION = { "mspowerpoint", - "vnd.openxmlformats-officedocument.presentationml.presentation", - "vnd.oasis.opendocument.presentation" - }; + private static final String[] SUBTYPES_PRESENTATION = { + "mspowerpoint", + "vnd.ms-powerpoint", + "vnd.openxmlformats-officedocument.presentationml.presentation", + "vnd.oasis.opendocument.presentation" + }; private static Set SUBTYPES_PRESENTATION_SET = new HashSet(Arrays.asList(SUBTYPES_PRESENTATION)); private static final String[] SUBTYPES_COMPRESSED = {"x-tar", "x-gzip", "zip"}; private static final Set SUBTYPES_COMPRESSED_SET = new HashSet(Arrays.asList(SUBTYPES_COMPRESSED)); @@ -95,6 +104,8 @@ public class DisplayUtils { private static final String EXTENSION_RAR = "rar"; private static final String EXTENSION_RTF = "rtf"; private static final String EXTENSION_3GP = "3gp"; + private static final String EXTENSION_PY = "py"; + private static final String EXTENSION_JS = "js"; /** * Converts the file size in bytes to human readable output. @@ -114,30 +125,6 @@ public class DisplayUtils { } /** - * Removes special HTML entities from a string - * - * @param s Input string - * @return A cleaned version of the string - */ - public static String HtmlDecode(String s) { - /* - * TODO: Perhaps we should use something more proven like: - * http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#unescapeHtml%28java.lang.String%29 - */ - - String ret = ""; - for (int i = 0; i < s.length(); ++i) { - if (s.charAt(i) == '%') { - ret += (char) Integer.parseInt(s.substring(i + 1, i + 3), 16); - i += 2; - } else { - ret += s.charAt(i); - } - } - return ret; - } - - /** * Converts MIME types like "image/jpg" to more end user friendly output * like "JPG image". * @@ -155,18 +142,25 @@ public class DisplayUtils { /** - * Returns the resource identifier of an image resource to use as icon associated to a - * known MIME type. + * Returns the resource identifier of an image to use as icon associated to a known MIME type. * - * @param mimetype MIME type string. - * @param filename name, with extension - * @return Resource identifier of an image resource. + * @param mimetype MIME type string; if NULL, the method tries to guess it from the extension in filename + * @param filename Name, with extension. + * @return Identifier of an image resource. */ - public static int getResourceId(String mimetype, String filename) { + public static int getFileTypeIconId(String mimetype, String filename) { - if (mimetype == null || "DIR".equals(mimetype)) { - return R.drawable.ic_menu_archive; + if (mimetype == null) { + String fileExtension = getExtension(filename); + mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension); + if (mimetype == null) { + mimetype = TYPE_APPLICATION + "/" + SUBTYPE_OCTET_STREAM; + } + } + if ("DIR".equals(mimetype)) { + return R.drawable.ic_menu_archive; + } else { String [] parts = mimetype.split("/"); String type = parts[0]; @@ -189,6 +183,9 @@ public class DisplayUtils { if (SUBTYPE_PDF.equals(subtype)) { return R.drawable.file_pdf; + } else if (SUBTYPE_XML.equals(subtype)) { + return R.drawable.file_doc; + } else if (SUBTYPES_DOCUMENT_SET.contains(subtype)) { return R.drawable.file_doc; @@ -200,7 +197,7 @@ public class DisplayUtils { } else if (SUBTYPES_COMPRESSED_SET.contains(subtype)) { return R.drawable.file_zip; - + } else if (SUBTYPE_OCTET_STREAM.equals(subtype) ) { if (getExtension(filename).equalsIgnoreCase(EXTENSION_RAR)) { return R.drawable.file_zip; @@ -210,7 +207,10 @@ public class DisplayUtils { } else if (getExtension(filename).equalsIgnoreCase(EXTENSION_3GP)) { return R.drawable.file_movie; - + + } else if ( getExtension(filename).equalsIgnoreCase(EXTENSION_PY) || + getExtension(filename).equalsIgnoreCase(EXTENSION_JS)) { + return R.drawable.file_doc; } } } @@ -222,8 +222,7 @@ public class DisplayUtils { private static String getExtension(String filename) { - String extension = filename.substring(filename.lastIndexOf(".") + 1); - + String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); return extension; } @@ -234,7 +233,8 @@ public class DisplayUtils { */ public static String unixTimeToHumanReadable(long milliseconds) { Date date = new Date(milliseconds); - return date.toLocaleString(); + DateFormat df = DateFormat.getDateTimeInstance(); + return df.format(date); } @@ -295,7 +295,11 @@ public class DisplayUtils { return fileExtension; } - public static CharSequence getRelativeDateTimeString(Context c, long time, long minResolution, long transitionResolution, int flags){ + @SuppressWarnings("deprecation") + public static CharSequence getRelativeDateTimeString ( + Context c, long time, long minResolution, long transitionResolution, int flags + ){ + CharSequence dateString = ""; // in Future @@ -307,18 +311,21 @@ public class DisplayUtils { return c.getString(R.string.file_list_seconds_ago); } else { // Workaround 2.x bug (see https://github.com/owncloud/android/issues/716) - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB && (System.currentTimeMillis() - time) > 24 * 60 * 60 * 1000){ + if ( Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB && + (System.currentTimeMillis() - time) > 24 * 60 * 60 * 1000 ) { Date date = new Date(time); date.setHours(0); date.setMinutes(0); date.setSeconds(0); - dateString = DateUtils.getRelativeDateTimeString(c, date.getTime(), minResolution, transitionResolution, flags); + dateString = DateUtils.getRelativeDateTimeString( + c, date.getTime(), minResolution, transitionResolution, flags + ); } else { dateString = DateUtils.getRelativeDateTimeString(c, time, minResolution, transitionResolution, flags); } } - return dateString.toString().split(",")[0]; + return dateString.toString().split(",")[0]; } /** diff --git a/src/com/owncloud/android/utils/FileStorageUtils.java b/src/com/owncloud/android/utils/FileStorageUtils.java index 892a1ca8..b462cd95 100644 --- a/src/com/owncloud/android/utils/FileStorageUtils.java +++ b/src/com/owncloud/android/utils/FileStorageUtils.java @@ -18,6 +18,11 @@ package com.owncloud.android.utils; import java.io.File; +import java.util.Collections; +import java.util.Comparator; +import java.util.Vector; + +import third_parties.daveKoeller.AlphanumComparator; import com.owncloud.android.MainApp; import com.owncloud.android.R; @@ -39,6 +44,13 @@ import android.os.StatFs; * @author David A. Velasco */ public class FileStorageUtils { + public static Integer mSortOrder; + public static Boolean mSortAscending; + public static final Integer SORT_NAME = 0; + public static final Integer SORT_DATE = 1; + public static final Integer SORT_SIZE = 2; + + //private static final String LOG_TAG = "FileStorageUtils"; public static final String getSavePath(String accountName) { @@ -137,5 +149,141 @@ public class FileStorageUtils { file.setRemoteId(ocFile.getRemoteId()); return file; } + + /** + * Sorts all filenames, regarding last user decision + */ + public static Vector sortFolder(Vector files){ + switch (mSortOrder){ + case 0: + files = FileStorageUtils.sortByName(files); + break; + case 1: + files = FileStorageUtils.sortByDate(files); + break; + case 2: + // mFiles = FileStorageUtils.sortBySize(mSortAscending); + break; + } + + return files; + } + + /** + * Sorts list by Date + * @param sortAscending true: ascending, false: descending + */ + public static Vector sortByDate(Vector files){ + final Integer val; + if (mSortAscending){ + val = 1; + } else { + val = -1; + } + + Collections.sort(files, new Comparator() { + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + Long obj1 = o1.getModificationTimestamp(); + return val * obj1.compareTo(o2.getModificationTimestamp()); + } + else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } else if (o1.getModificationTimestamp() == 0 || o2.getModificationTimestamp() == 0){ + return 0; + } else { + Long obj1 = o1.getModificationTimestamp(); + return val * obj1.compareTo(o2.getModificationTimestamp()); + } + } + }); + + return files; + } + +// /** +// * Sorts list by Size +// * @param sortAscending true: ascending, false: descending +// */ +// public static Vector sortBySize(Vector files){ +// final Integer val; +// if (mSortAscending){ +// val = 1; +// } else { +// val = -1; +// } +// +// Collections.sort(files, new Comparator() { +// public int compare(OCFile o1, OCFile o2) { +// if (o1.isFolder() && o2.isFolder()) { +// Long obj1 = getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o1))); +// return val * obj1.compareTo(getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o2)))); +// } +// else if (o1.isFolder()) { +// return -1; +// } else if (o2.isFolder()) { +// return 1; +// } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0){ +// return 0; +// } else { +// Long obj1 = o1.getFileLength(); +// return val * obj1.compareTo(o2.getFileLength()); +// } +// } +// }); +// +// return files; +// } + + /** + * Sorts list by Name + * @param sortAscending true: ascending, false: descending + */ + public static Vector sortByName(Vector files){ + final Integer val; + if (mSortAscending){ + val = 1; + } else { + val = -1; + } + + Collections.sort(files, new Comparator() { + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + return val * o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase()); + } else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } + return val * new AlphanumComparator().compare(o1, o2); + } + }); + + return files; + } + + /** + * Local Folder size + * @param dir File + * @return Size in bytes + */ + public static long getFolderSize(File dir) { + if (dir.exists()) { + long result = 0; + File[] fileList = dir.listFiles(); + for(int i = 0; i < fileList.length; i++) { + if(fileList[i].isDirectory()) { + result += getFolderSize(fileList[i]); + } else { + result += fileList[i].length(); + } + } + return result; + } + return 0; + } }