Merge branch 'develop' into release-1.6.0

This commit is contained in:
jabarros 2014-10-02 09:04:11 +02:00
commit 2e472998c1
39 changed files with 722 additions and 33 deletions

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

BIN
libs/disklrucache-2.0.2.jar Normal file

Binary file not shown.

View file

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
</lint>

View file

@ -31,6 +31,7 @@
<string name="prefs_feedback">Geriyə cavab</string>
<string name="prefs_imprint">İşarələmək</string>
<string name="recommend_subject">%1$s-i ağıllı telefonunuzda yoxlayın!</string>
<string name="recommend_text">Mən sizi öz smartfonunuzda %1$s istifadə etmək üçün dəvət etmək istəyirəm! Burdan endirin: %2$s</string>
<string name="auth_check_server">Serveri yoxla</string>
<string name="auth_host_url">Server ünvanı https://…</string>
<string name="auth_username">İstifadəçi adı</string>
@ -128,6 +129,7 @@ Aşağıda göstərilən %5$s-də olan daxili və xarici fayl(lar) link edilmiş
<string name="media_state_playing">%1$s (oxuyur)</string>
<string name="media_state_loading">%1$s (yüklənir)</string>
<string name="media_event_done">%1$s geriyə oxunuş bitib</string>
<string name="media_err_nothing_to_play">Media faylı tapılmadı</string>
<string name="common_remove">Sil</string>
<string name="ssl_validator_btn_details_see">Detallar</string>
<string name="unshare_link_file_error">Bu fayl və ya qovluğun yayımlanmasının dayandırılmasında səhv baş verdi</string>

View file

@ -264,6 +264,9 @@
<string name="prefs_category_accounts">Профили</string>
<string name="prefs_add_account">Добавяне на профил</string>
<string name="auth_redirect_non_secure_connection_title">Сигурна връзка е пренасочена по несигурен път.</string>
<string name="actionbar_logger">Доклади</string>
<string name="log_send_history_button">Изпрати История</string>
<string name="log_progress_dialog_text">Зареждане на информация...</string>
<string name="saml_authentication_required_text">Нужна е идентификация</string>
<string name="saml_authentication_wrong_pass">Грешна парола</string>
<string name="actionbar_move">Премести</string>

View file

@ -49,7 +49,7 @@
<string name="uploader_error_forbidden_content">এই যৌথ কনটেন্ট এ %1$s এর প্রবেশ অনুমোদিত নয়</string>
<string name="uploader_info_uploading">আপলোড করা হচ্ছে</string>
<string name="file_list_empty">এখানে কিছুই নেই। কিছু আপলোড করুন !</string>
<string name="file_list_loading">লোড হচছে....</string>
<string name="file_list_loading">লোড হচছে....</string>
<string name="local_file_list_empty">এই ফোলডারে কোন ফাইল নেই</string>
<string name="filedetails_select_file">অতিরিক্ত তথ্য প্রদর্শন করতে চাইলে ফাইলে ট্যাপ দিন</string>
<string name="filedetails_size">আয়তনঃ</string>
@ -140,7 +140,7 @@
<string name="media_forward_description">আগান</string>
<string name="auth_getting_authorization">অনুমোদন নেয়া হচ্ছে....</string>
<string name="auth_trying_to_login">লগইনের চেষটা চলছে..</string>
<string name="auth_no_net_conn_title">নেটওয়ারক কানেকশন নেই</string>
<string name="auth_no_net_conn_title">নেটওয়ার্ক সংযোগ নেই</string>
<string name="auth_nossl_plain_ok_title">নিরাপদ যোগাযোগ পাওয়া গেলনা</string>
<string name="auth_connection_established">যোগাযোগ স্থাপিত হয়েছে</string>
<string name="auth_testing_connection">যোগাযোগ পরীক্ষা করা হচ্ছে...</string>
@ -232,7 +232,7 @@
<string name="conflict_message">স্থানীয় ফাইল আর দুরবর্তী ফাইল %s এক নয়। এগোতে চাইলে সার্ভারের ফাইলের কনটেন্ট প্রদিস্থাপিত হবে।</string>
<string name="conflict_keep_both">উভয়কে রাখ</string>
<string name="conflict_overwrite">উপরে লেখ</string>
<string name="conflict_dont_upload">আপলোড করোনা</string>
<string name="conflict_dont_upload">আপলোড করোনা</string>
<string name="preview_image_description">ছবি প্রাকদর্শন</string>
<string name="preview_image_error_unknown_format">ছবিটি প্রদর্শন করা যাবেনা</string>
<string name="error__upload__local_file_not_copied">%1$s কে %2$s স্থানীয় ফোল্ডারে কপি করা গেলনা </string>
@ -260,5 +260,9 @@
<string name="prefs_category_accounts">একাউন্ট</string>
<string name="prefs_add_account">একাউন্ট যোগ কর</string>
<string name="auth_redirect_non_secure_connection_title">নিরাপদ সংযোগকে একটি অনিরাপদ পথে দিকবদল করা হয়েছে</string>
<string name="saml_authentication_wrong_pass">ভুল কুটশব্দ</string>
<string name="actionbar_move">সরাও</string>
<string name="file_list_empty_moving">এখানে কিছু নেই। একটি ফোল্ডার যোগ করতে পারেন!</string>
<string name="move_choose_button_text">বেছে নিন</string>
<string name="move_file_not_found">সরাতে ব্যার্থ হলো। ফাইলটি রয়েছে কিনা দেখুন।</string>
</resources>

View file

@ -263,6 +263,10 @@ administrátora.</string>
<string name="prefs_category_accounts">Účty</string>
<string name="prefs_add_account">Přidat účet</string>
<string name="auth_redirect_non_secure_connection_title">Zabezpečené spojení je přesměrováváno nezabezpečenou trasou.</string>
<string name="actionbar_logger">Logy</string>
<string name="log_send_history_button">Odeslat historii</string>
<string name="log_mail_subject">Logy aplikace ownCloud pro Android</string>
<string name="log_progress_dialog_text">Načítám data...</string>
<string name="saml_authentication_required_text">Vyžadováno přihlášení</string>
<string name="saml_authentication_wrong_pass">Nesprávné heslo</string>
<string name="actionbar_move">Přesunout</string>

View file

@ -262,6 +262,9 @@
<string name="prefs_category_accounts">Konti</string>
<string name="prefs_add_account">Tilføj konto</string>
<string name="auth_redirect_non_secure_connection_title">Sikker forbindelse videredirigeres gennem en usikker rute.</string>
<string name="actionbar_logger">Logge</string>
<string name="log_send_history_button">Send historik</string>
<string name="log_progress_dialog_text">Indlæser data...</string>
<string name="saml_authentication_required_text">Godkendelse påkrævet</string>
<string name="saml_authentication_wrong_pass">Forkert kodeord</string>
<string name="actionbar_move">Flyt</string>

View file

@ -264,14 +264,18 @@
<string name="prefs_category_accounts">Konten</string>
<string name="prefs_add_account">Konto hinzufügen</string>
<string name="auth_redirect_non_secure_connection_title">Die gesicherte Verbindung wird auf eine unsichere Route weitergeleitet.</string>
<string name="saml_authentication_required_text">Authentifizierung benötigt</string>
<string name="actionbar_logger">Protokolle</string>
<string name="log_send_history_button">Verlauf senden</string>
<string name="log_mail_subject">Protokolle der ownCloud-Android-App</string>
<string name="log_progress_dialog_text">Daten werden geladen …</string>
<string name="saml_authentication_required_text">Legitimierung benötigt</string>
<string name="saml_authentication_wrong_pass">Falsches Passwort</string>
<string name="actionbar_move">Verschieben</string>
<string name="file_list_empty_moving">Nichts vorhanden. Sie können einen Ordner hinzufügen!</string>
<string name="move_choose_button_text">Auswählen</string>
<string name="move_file_not_found">Verschieben nicht möglich. Prüfen Sie, ob die Datei existiert</string>
<string name="move_file_not_found">Verschieben nicht möglich. Bitte überprüfen Sie, ob die Datei existiert</string>
<string name="move_file_invalid_into_descendent">Es ist nicht möglich einen Ordner eine Ebene tiefer zu verschieben</string>
<string name="move_file_invalid_overwrite">Die Datei existiert bereits im Zielordner</string>
<string name="move_file_error">Es ist ein Fehler beim Verschieben dieser Datei oder Ordners aufgetreten.</string>
<string name="move_file_invalid_overwrite">Die Datei ist bereits im Zielordner vorhanden</string>
<string name="move_file_error">Es ist ein Fehler beim Verschieben dieser Datei oder dieses Ordners aufgetreten.</string>
<string name="forbidden_permissions_move">um diese Datei zu verschieben</string>
</resources>

View file

@ -264,14 +264,18 @@
<string name="prefs_category_accounts">Konten</string>
<string name="prefs_add_account">Konto hinzufügen</string>
<string name="auth_redirect_non_secure_connection_title">Die gesicherte Verbindung wird auf eine unsichere Route weitergeleitet.</string>
<string name="saml_authentication_required_text">Authentifizierung benötigt</string>
<string name="actionbar_logger">Protokolle</string>
<string name="log_send_history_button">Verlauf senden</string>
<string name="log_mail_subject">Protokolle der ownCloud-Android-App</string>
<string name="log_progress_dialog_text">Daten werden geladen …</string>
<string name="saml_authentication_required_text">Legitimierung benötigt</string>
<string name="saml_authentication_wrong_pass">Falsches Passwort</string>
<string name="actionbar_move">Verschieben</string>
<string name="file_list_empty_moving">Nichts vorhanden. Du kannst einen Ordner hinzufügen!</string>
<string name="move_choose_button_text">Auswählen</string>
<string name="move_file_not_found">Verschieben nicht möglich. Prüfe, dass die Datei existiert</string>
<string name="move_file_invalid_into_descendent">Es ist nicht möglich einen Ordner eine Ebene tiefer zu verschieben</string>
<string name="move_file_invalid_overwrite">Die Datei existiert bereits im Zielordner</string>
<string name="move_file_invalid_overwrite">Die Datei ist bereits im Zielordner vorhanden</string>
<string name="move_file_error">Es ist ein Fehler beim Verschieben dieser Datei oder Ordners aufgetreten.</string>
<string name="forbidden_permissions_move">zum Datei verschieben</string>
</resources>

View file

@ -264,4 +264,5 @@
<string name="saml_authentication_required_text">Απαιτείται πιστοποίηση</string>
<string name="saml_authentication_wrong_pass">Εσφαλμένο συνθηματικό</string>
<string name="move_choose_button_text">Επιλέξτε</string>
<string name="forbidden_permissions_move">για μετακίνηση αυτού του αρχείου</string>
</resources>

View file

@ -264,6 +264,10 @@
<string name="prefs_category_accounts">Accounts</string>
<string name="prefs_add_account">Add account</string>
<string name="auth_redirect_non_secure_connection_title">Secure connection is redirected through an unsecured route.</string>
<string name="actionbar_logger">Logs</string>
<string name="log_send_history_button">Send History</string>
<string name="log_mail_subject">ownCloud Android app logs</string>
<string name="log_progress_dialog_text">Loading data...</string>
<string name="saml_authentication_required_text">Authentication required</string>
<string name="saml_authentication_wrong_pass">Incorrect password</string>
<string name="actionbar_move">Move</string>

View file

@ -1,4 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="actionbar_upload_files">Archivos</string>
<string name="sync_string_files">Archivos</string>
<string name="empty"></string>
</resources>

View file

@ -104,6 +104,7 @@
<string name="sync_fail_in_favourites_content">Los contenidos de %1$d ficheros no se han sincronizado (%2$d conflictos)</string>
<string name="sync_foreign_files_forgotten_ticker">Algunos archivos locales se han perdido</string>
<string name="sync_foreign_files_forgotten_content">%1$d archivos en la carpeta %2$s no pudieron ser copiados a</string>
<string name="sync_foreign_files_forgotten_explanation">A partir de la versión 1.3.16, los ficheros subidos desde este dispositivo se copian en la carpeta local %1$s para evitar la pérdida de datos cuando se sincroniza un único archivo con varias cuentas.\n\nDebido a este cambio, todos los ficheros subidos con versiones anteriores de esta aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error impidió que se completara esta operación durante la sincronización de la cuenta. Puede dejar los archivos tal y como están y eliminar el enlace a %3$s o mover los archivos a la carpeta %1$s y mantener el enlace a %4$s.\n\nDebajo se muestran los archivos locales y los archivos remotos en %5$s a los que fueron enlazados.</string>
<string name="sync_current_folder_was_removed">La carpeta local %1$s no existe.</string>
<string name="foreign_files_move">Mover todo</string>
<string name="foreign_files_success">Todos los archivos fueron movidos</string>
@ -263,12 +264,16 @@
<string name="prefs_category_accounts">Cuentas</string>
<string name="prefs_add_account">Agregar cuenta</string>
<string name="auth_redirect_non_secure_connection_title">La conexión segura está siendo redirigida por una ruta insegura.</string>
<string name="actionbar_logger">Trazas</string>
<string name="log_send_history_button">Enviar historial</string>
<string name="log_progress_dialog_text">Cargando datos...</string>
<string name="saml_authentication_required_text">Se necesita autenticación</string>
<string name="saml_authentication_wrong_pass">Contraseña incorrecta</string>
<string name="actionbar_move">Mover</string>
<string name="file_list_empty_moving">Aquí no hay nada. ¡Puede agregar una carpeta!</string>
<string name="move_choose_button_text">Seleccionar</string>
<string name="move_file_not_found">No se puede mover. Revise si el archivo existe</string>
<string name="move_file_invalid_into_descendent">No se puede mover una carpeta dentro de una de sus descendientes.</string>
<string name="move_file_invalid_overwrite">El archivo ya existe en la carpeta de destino</string>
<string name="move_file_error">Hubo un error al tratar de mover este archivo o carpeta</string>
<string name="forbidden_permissions_move">para mover este archivo</string>

View file

@ -30,6 +30,7 @@
<string name="prefs_recommend">Suosittele kaverille</string>
<string name="prefs_feedback">Palaute</string>
<string name="recommend_subject">Kokeile %1$sia älypuhelimellasi!</string>
<string name="recommend_text">Kutsun sinut käyttämään %1$sia älypuhelimellasi!\nLataa se tästä: %2$s</string>
<string name="auth_check_server">Tarkista palvelin</string>
<string name="auth_host_url">Palvelinosoite https://…</string>
<string name="auth_username">Käyttäjätunnus</string>
@ -240,6 +241,10 @@
<string name="prefs_category_accounts">Tilit</string>
<string name="prefs_add_account">Lisää tili</string>
<string name="auth_redirect_non_secure_connection_title">Salattu yhteys on ohjattu uudelleen salaamatonta reittiä pitkin.</string>
<string name="actionbar_logger">Lokit</string>
<string name="log_send_history_button">Lähetä historia</string>
<string name="log_mail_subject">ownCloudin Android-sovelluksen lokit</string>
<string name="log_progress_dialog_text">Ladataan tietoja...</string>
<string name="saml_authentication_required_text">Tunnistautuminen vaaditaan</string>
<string name="saml_authentication_wrong_pass">Väärä salasana</string>
<string name="actionbar_move">Siirrä</string>

View file

@ -16,7 +16,7 @@
<string name="prefs_accounts">Comptes</string>
<string name="prefs_manage_accounts">Gestion des comptes utilisateur</string>
<string name="prefs_pincode">Utilisation d\'un code de sécurité</string>
<string name="prefs_pincode_summary">Protéger l\'accès aux données maniplulées par le client</string>
<string name="prefs_pincode_summary">Protéger l\'accès aux données manipulées par le client</string>
<string name="prefs_instant_upload">Téléchargements instantanés d\'images</string>
<string name="prefs_instant_upload_summary">Téléversement instantané des photos prises par la caméra</string>
<string name="prefs_instant_video_upload">Téléchargements instantanés de vidéos</string>
@ -31,6 +31,8 @@
<string name="prefs_feedback">Commentaires</string>
<string name="prefs_imprint">Empreinte</string>
<string name="recommend_subject">Essayez %1$s sur votre smartphone !</string>
<string name="recommend_text">J\'aimerais vous inviter à utiliser %1$s sur votre smartphone !
Téléchargez-le ici : %2$s</string>
<string name="auth_check_server">Vérifier le serveur</string>
<string name="auth_host_url">Adresse du serveur https://...</string>
<string name="auth_username">Nom d\'utilisateur</string>
@ -103,6 +105,11 @@
<string name="sync_fail_in_favourites_content">Le contenu de %1$d fichiers n\'a put être synchronisé (%2$d conflits)</string>
<string name="sync_foreign_files_forgotten_ticker">Certains fichiers locaux ont été oubliés</string>
<string name="sync_foreign_files_forgotten_content">%1$d fichiers du dossier %2$s n\'ont pas pu être copiés dans</string>
<string name="sync_foreign_files_forgotten_explanation">Depuis la version 1.3.16, les fichiers envoyé depuis ce périphérique sont copiés dans le dossier local %1$s pour éviter une perte de données lorsqu\'un même fichier est synchronisé avec plusieurs comptes.
En raison de cette modification, tous les fichiers envoyés avec des versions antérieures de cette application ont été copiés dans le dossier %2$s. Cependant une erreur a empêché l\'achèvement de cette opération pendant la synchronisation du compte. Vous pouvez soit laisser les fichiers tels quels et supprimer le lien vers %3$s, soit déplacer les fichiers dans le dossier %1$s et garder le lien vers %4$s.
Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxquels ils étaient liés.</string>
<string name="sync_current_folder_was_removed">Le dossier %1$s n\'existe plus</string>
<string name="foreign_files_move">Tout déplacer</string>
<string name="foreign_files_success">Tous les fichiers ont été déplacés</string>
@ -237,7 +244,9 @@
<string name="preview_image_error_unknown_format">Cette image ne peut pas être affichée</string>
<string name="error__upload__local_file_not_copied">%1$s n\'a pas pu être copié dans le dossier local %2$s</string>
<string name="share_link_no_support_share_api">Désolé, le partage n\'est pas disponible sur votre serveur. Contactez votre administrateur, s\'il vous plait.</string>
<string name="share_link_file_no_exist">Impossible de partager. Vérifiez que le fichier est bien présent</string>
<string name="share_link_file_error">Une erreur est survenue lors de la tentative de partage de ce fichier ou répertoire</string>
<string name="unshare_link_file_no_exist">Impossible de supprimer le partage. Vérifiez que le fichier est bien présent</string>
<string name="unshare_link_file_error">Une erreur est survenue lors de la tentative dannulation du partage de ce fichier ou répertoire</string>
<string name="activity_chooser_send_file_title">Envoyer</string>
<string name="copy_link">Copier le lien</string>
@ -258,8 +267,18 @@
<string name="downloader_download_file_not_found">Ce fichier nest plus disponible sur le serveur</string>
<string name="prefs_category_accounts">Comptes</string>
<string name="prefs_add_account">Ajouter un compte</string>
<string name="auth_redirect_non_secure_connection_title">Le connexion sécurisée est redirigée vers une route non-sécurisée.</string>
<string name="actionbar_logger">Journaux</string>
<string name="log_send_history_button">Historique des envois</string>
<string name="log_progress_dialog_text">Chargement des données...</string>
<string name="saml_authentication_required_text">Authentification requise</string>
<string name="saml_authentication_wrong_pass">Mot de passe incorrect</string>
<string name="actionbar_move">Déplacer</string>
<string name="file_list_empty_moving">Il n\'y rien ici. Vous pouvez ajouter un dossier !</string>
<string name="move_choose_button_text">Choisir</string>
<string name="move_file_not_found">Impossible de supprimer. Vérifiez que le fichier est bien présent</string>
<string name="move_file_invalid_into_descendent">Il n\'est pas possible de déplacer un dossier vers un de ses descendants</string>
<string name="move_file_invalid_overwrite">Le fichier existe déjà dans le dossier destinataire</string>
<string name="move_file_error">Une erreur est survenue lors de la tentative de déplacement de ce fichier ou dossier</string>
<string name="forbidden_permissions_move">de déplacer ce fichier</string>
</resources>

View file

@ -83,6 +83,7 @@
<string name="uploader_upload_succeeded_content_single">%1$s sikeresen fel lett töltve</string>
<string name="uploader_upload_failed_ticker">A feltöltés nem sikerült</string>
<string name="uploader_upload_failed_content_single"> %1$s fájl feltöltése sikertelen</string>
<string name="uploader_upload_failed_credentials_error">Feltöltés sikertelen, jelentkezz be újra</string>
<string name="downloader_download_in_progress_ticker">Letöltés ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Letöltés %2$s</string>
<string name="downloader_download_succeeded_ticker">A letöltés sikeres</string>
@ -90,8 +91,10 @@
<string name="downloader_download_failed_ticker">A letöltés sikertelen</string>
<string name="downloader_download_failed_content">A letöltésből %1$s nem lett befejezve</string>
<string name="downloader_not_downloaded_yet">Még nem töltötte le</string>
<string name="downloader_download_failed_credentials_error">Letöltés sikertelen, jelentkezz be újra.</string>
<string name="common_choose_account">Válasszon azonosítót</string>
<string name="sync_fail_ticker">A szinkronizálás sikertelen</string>
<string name="sync_fail_ticker_unauthorized">Szinkronizálás sikertelen, jelentkezz be újra.</string>
<string name="sync_fail_content">%1$s szinkronizációját nem sikerült befejezni</string>
<string name="sync_fail_content_unauthorized">Érvénytelen jelszó a következőhöz %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Ütközések vannak</string>
@ -105,6 +108,7 @@
<string name="foreign_files_fail">Egyes fájlokat nem sikerült áthelyezni</string>
<string name="foreign_files_local_text">Helyi: %1$s</string>
<string name="foreign_files_remote_text">Távoli: %1$s</string>
<string name="upload_query_move_foreign_files">Nincs elég hely a kiválasztott fájlok másolására a %1$s könyvtárban. Szeretnéd áthelyezni inkább?</string>
<string name="pincode_enter_pin_code">Kérem adja meg az alkalmazás PIN-kódját</string>
<string name="pincode_configure_your_pin">Az alkalmazás PIN-kódja</string>
<string name="pincode_configure_your_pin_explanation">A PIN-t kötelező lesz megadni az alkalmazás minden indításakor</string>
@ -161,9 +165,12 @@
<string name="auth_connecting_auth_server">Kapcsolódás a felhasználóazonosítást végző kiszolgálóhoz...</string>
<string name="auth_unsupported_auth_method">A kiszolgáló nem támogatja ezt a felhasználóazonosítási módszert</string>
<string name="auth_unsupported_multiaccount">%1$s nem támogat több bejelenkezési jogosultságot</string>
<string name="auth_can_not_auth_against_server">Nem tudod hitelesíteni magadat ezen a szerveren</string>
<string name="fd_keep_in_sync">Automatikusan frissítse a fájlokat</string>
<string name="common_rename">Átnevezés</string>
<string name="common_remove">Eltávolítás</string>
<string name="confirmation_remove_alert">Tényleg el akarod távolítani %1$s?</string>
<string name="confirmation_remove_folder_alert">Tényleg el akarod távolítani a %1$s és tartalmát?</string>
<string name="confirmation_remove_local">Csak a helyi példány</string>
<string name="confirmation_remove_folder_local">Csak a helyi tartalmat</string>
<string name="confirmation_remove_remote">Törlés a szerverről</string>
@ -175,7 +182,9 @@
<string name="rename_server_fail_msg">Az átnevezés nem sikerült</string>
<string name="sync_file_fail_msg">A távoli fájl nem volt ellenőrizhető</string>
<string name="sync_file_nothing_to_do_msg">Az állományok már szinkonizálva vannak</string>
<string name="create_dir_fail_msg">A könyvtárt nem lehet létrehozni</string>
<string name="filename_forbidden_characters">Nem megendedett karakterek: / \\ &lt; &gt; : \" | ? *</string>
<string name="filename_empty">A fájl név nem lehet üres</string>
<string name="wait_a_moment">Egy pillanat...</string>
<string name="filedisplay_unexpected_bad_get_content">Váratlan hiba; válassza ki a fájlt más programból</string>
<string name="filedisplay_no_file_selected">Egy fájl sincs kiválasztva</string>
@ -213,6 +222,7 @@
<string name="placeholder_timestamp">2012/05/18 12:23</string>
<string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Képeket csak WiFi kapcsolaton keresztül töltsünk föl</string>
<string name="instant_video_upload_on_wifi">Videó feltöltés csak WIFI-vel</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Frissítési ütközés</string>
<string name="conflict_message">%s távoli állományt nem szinkronizáltuk a helyi példánnyal. Ha folytatja, akkor a távoli állományt felülírjuk.</string>
@ -220,6 +230,8 @@
<string name="conflict_overwrite">Felülírás</string>
<string name="conflict_dont_upload">Ne töltsük föl</string>
<string name="preview_image_description">Előnézeti kép</string>
<string name="preview_image_error_unknown_format">Ez a kép nem jeleníthető meg</string>
<string name="error__upload__local_file_not_copied">%1$s nem lehet másolni a %2$s helyi könyvtárba</string>
<string name="share_link_file_error">Hiba lépett fel a mappa megosztásakor</string>
<string name="unshare_link_file_error">Hiba lépett fel a mappa megosztásának visszavonásakor</string>
<string name="activity_chooser_send_file_title">Küldjük el</string>

View file

@ -264,6 +264,10 @@
<string name="prefs_category_accounts">Account</string>
<string name="prefs_add_account">Aggiungi account</string>
<string name="auth_redirect_non_secure_connection_title">La connessione sicura è rediretta attraverso un percorso non sicuro.</string>
<string name="actionbar_logger">Registri</string>
<string name="log_send_history_button">Invia cronologia</string>
<string name="log_mail_subject">Registri applicazione ownCloud Android</string>
<string name="log_progress_dialog_text">Caricamento dati...</string>
<string name="saml_authentication_required_text">Autenticazione richiesta</string>
<string name="saml_authentication_wrong_pass">Password errata</string>
<string name="actionbar_move">Sposta</string>

View file

@ -265,6 +265,9 @@
<string name="prefs_category_accounts">アカウント</string>
<string name="prefs_add_account">アカウントを追加</string>
<string name="auth_redirect_non_secure_connection_title">暗号化されていない接続を経て、暗号化接続へリダイレクトされました。</string>
<string name="actionbar_logger">ログ</string>
<string name="log_send_history_button">ログを送信</string>
<string name="log_progress_dialog_text">読込中 ...</string>
<string name="saml_authentication_required_text">認証を必要とする</string>
<string name="saml_authentication_wrong_pass">無効なパスワード</string>
<string name="actionbar_move">移動</string>

View file

@ -35,6 +35,7 @@
<string name="auth_host_url">Serverio adresas </string>
<string name="auth_username">Prisijungimo vardas</string>
<string name="auth_password">Slaptažodis</string>
<string name="auth_register">Naujas į %1$s?</string>
<string name="sync_string_files">Failai</string>
<string name="setup_btn_connect">Prisijungti</string>
<string name="uploader_btn_upload_text">Įkelti</string>
@ -48,6 +49,8 @@
<string name="uploader_error_forbidden_content">%1$s neleidžiama prieiti prie turinio, kuriuo dalijamasi</string>
<string name="uploader_info_uploading">Išsiunčiama</string>
<string name="file_list_empty">Čia tuščia. Įkelkite ką nors!</string>
<string name="file_list_loading">Įkeliama ...</string>
<string name="local_file_list_empty">Šiame aplanke nėra failų.</string>
<string name="filedetails_select_file">Palieskite failą, kad parodyti papildomą informaciją.</string>
<string name="filedetails_size">Dydis:</string>
<string name="filedetails_type">Tipas:</string>
@ -91,6 +94,7 @@
<string name="downloader_download_failed_credentials_error">Atsisiuntimas nepavyko, Jums reikia prisijungti pakartotinai</string>
<string name="common_choose_account">Pasirinkite paskyrą</string>
<string name="sync_fail_ticker">Sinchronizacija nepavyko</string>
<string name="sync_fail_ticker_unauthorized">Sinchronizacija nepavyko. Jums reikia prisijungti iš naujo</string>
<string name="sync_fail_content">%1$s sinchronizacija nepavyko</string>
<string name="sync_fail_content_unauthorized">Netinkamas slaptažodis %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Rastas konfliktas</string>
@ -158,10 +162,12 @@
<string name="auth_connecting_auth_server">Jungiamasi prie autentikacijos serverio...</string>
<string name="auth_unsupported_auth_method">Serveris nepalaiko šio autentikacijos metodo</string>
<string name="auth_unsupported_multiaccount">%1$s nepalaiko kelių paskyrų iš karto</string>
<string name="auth_can_not_auth_against_server">Jungiamasi prie autentikacijos serverio...</string>
<string name="fd_keep_in_sync">Laikyti failą naujinamą</string>
<string name="common_rename">Pervadinti</string>
<string name="common_remove">Pašalinti</string>
<string name="confirmation_remove_alert">Ar tikrai norite pašalinti %1$s?</string>
<string name="confirmation_remove_folder_alert">Ar tikrai norite pašalinti %1$s ir ten esantį turinį?</string>
<string name="confirmation_remove_local">Tik vietiniai</string>
<string name="confirmation_remove_folder_local">Tik vietinis turinys</string>
<string name="confirmation_remove_remote">Pašalinti iš serverio</string>
@ -174,6 +180,7 @@
<string name="sync_file_fail_msg">Nutolę failai negalėjo būti patikrinti</string>
<string name="sync_file_nothing_to_do_msg">Failo turinys jau sunchronizuotas</string>
<string name="create_dir_fail_msg">Aplanko sukurti nepavyko</string>
<string name="filename_forbidden_characters">Neleistini simboliai: / \\ &lt; &gt; : \" | ? *</string>
<string name="filename_empty">Failo pavadinimas negali būti tuščias</string>
<string name="wait_a_moment">Truputį palaukite</string>
<string name="filedisplay_unexpected_bad_get_content">Netikėta problema ; prašome pasirinkti failą iš kitos programėlės</string>

View file

@ -0,0 +1,4 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="empty"></string>
</resources>

View file

@ -31,6 +31,7 @@
<string name="prefs_feedback">Tilbakemelding</string>
<string name="prefs_imprint">Avtrykk</string>
<string name="recommend_subject">Prøv %1$s på smarttelefonen din!</string>
<string name="recommend_text">Jeg ønsker å invitere deg til å bruke %1$s på smarttelefonen din!\nLast ned her: %2$s</string>
<string name="auth_check_server">Sjekk server</string>
<string name="auth_host_url">Serveradresse https://...</string>
<string name="auth_username">Brukernavn</string>
@ -103,6 +104,7 @@
<string name="sync_fail_in_favourites_content">Innholdet av %1$d filer kunne ikke synkroniseres (%2$d konflikter)</string>
<string name="sync_foreign_files_forgotten_ticker">Noen lokale filer ble glemt</string>
<string name="sync_foreign_files_forgotten_content">%1$d filer fra %2$s mappen kunne ikke kopieres til</string>
<string name="sync_foreign_files_forgotten_explanation">Fra versjon 1.3.16 blir filer som lastes opp fra denne enheten kopiert inn i den lokale mappen %1$s for å forhindre tap av data når samme fil synkroniseres med flere kontoer.\n\nPga. denne endringen ble alle filer som er blitt lastet opp med tidligere versjoner av denne appen, kopiert til mappe %2$s. Imidlertid kunne ikke denne kopieringen fullføres under konto-synkroniseringen pga. en feil. Du kan enten la filen(e) ligge der de ligger og fjerne lenken til %3$s, eller flytte filene til mappe %1$s og beholde lenken til %4$s.\n\nNedenfor finner du en liste over de lokale filene og de eksterne filene i %5$s som de var lenket til.</string>
<string name="sync_current_folder_was_removed">Mappen %1$s finnes ikke lengere</string>
<string name="foreign_files_move">Flytt alle</string>
<string name="foreign_files_success">Alle filer ble flyttet</string>
@ -238,7 +240,9 @@
<string name="error__upload__local_file_not_copied">%1$s kunne ikke kopieres til lokal mappe %2$s</string>
<string name="share_link_no_support_share_api">Beklager, deling er ikke skrudd på for din tjener. Ta kontakt med
administratoren.</string>
<string name="share_link_file_no_exist">Kan ikke dele. Sjekk om filen eksisterer.</string>
<string name="share_link_file_error">Det skjedde en feil under deling av denne filen eller mappen</string>
<string name="unshare_link_file_no_exist">Kan ikke fjerne deling. Sjekk om filen eksisterer.</string>
<string name="unshare_link_file_error">En feil oppstod ved avslutting av delingen av denne filen eller mappen</string>
<string name="activity_chooser_send_file_title">Send</string>
<string name="copy_link">Kopier lenke</string>
@ -260,7 +264,17 @@
<string name="prefs_category_accounts">Kontoer</string>
<string name="prefs_add_account">Legg til en konto</string>
<string name="auth_redirect_non_secure_connection_title">Sikker tilkobling videresendes gjennom en usikker rute.</string>
<string name="actionbar_logger">Logger</string>
<string name="log_send_history_button">Send historikk</string>
<string name="log_progress_dialog_text">Laster data...</string>
<string name="saml_authentication_required_text">Autentisering kreves</string>
<string name="saml_authentication_wrong_pass">Feil passord</string>
<string name="actionbar_move">Flytt</string>
<string name="file_list_empty_moving">Ingenting her. Du kan legge til en mappe!</string>
<string name="move_choose_button_text">Velg</string>
<string name="move_file_not_found">Kan ikke flytte. Sjekk om filen eksisterer.</string>
<string name="move_file_invalid_into_descendent">Det er ikke mulig å flytte en mappe inn i sin egen undermappe</string>
<string name="move_file_invalid_overwrite">Filen finnes allerede i målmappen</string>
<string name="move_file_error">En feil oppstod ved flytting av denne filen eller mappen</string>
<string name="forbidden_permissions_move">å flytte denne filen</string>
</resources>

View file

@ -267,6 +267,10 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar
<string name="prefs_category_accounts">Accounts</string>
<string name="prefs_add_account">Toevoegen account</string>
<string name="auth_redirect_non_secure_connection_title">De beveiligde verbinding is omgeleid via een onveilige route.</string>
<string name="actionbar_logger">Logs</string>
<string name="log_send_history_button">Verstuur geschiedenis</string>
<string name="log_mail_subject">ownCloud Android app logs</string>
<string name="log_progress_dialog_text">Laden data...</string>
<string name="saml_authentication_required_text">Authenticatie vereist</string>
<string name="saml_authentication_wrong_pass">Onjuist wachtwoord</string>
<string name="actionbar_move">verplaatsen</string>

View file

@ -264,6 +264,9 @@
<string name="prefs_category_accounts">Konta</string>
<string name="prefs_add_account">Dodaj konto</string>
<string name="auth_redirect_non_secure_connection_title">Bezpieczne połączenie jest przekierowywane przez niezabezpieczone trasy.</string>
<string name="actionbar_logger">Logi</string>
<string name="log_send_history_button">Wyślij historię</string>
<string name="log_progress_dialog_text">Ładuję dane...</string>
<string name="saml_authentication_required_text">Wymagana autoryzacja</string>
<string name="saml_authentication_wrong_pass">Złe hasło</string>
<string name="actionbar_move">Przenieś</string>

View file

@ -264,6 +264,10 @@
<string name="prefs_category_accounts">Contas</string>
<string name="prefs_add_account">Adicionar uma conta</string>
<string name="auth_redirect_non_secure_connection_title">A conexão segura está redirecionada através de uma rota insegura.</string>
<string name="actionbar_logger">Logs</string>
<string name="log_send_history_button">Enviar Histórico</string>
<string name="log_mail_subject">Logs do aplicativo ownCloud Android</string>
<string name="log_progress_dialog_text">Carregamento de dados...</string>
<string name="saml_authentication_required_text">Autenticação é requerida</string>
<string name="saml_authentication_wrong_pass">Senha incorreta</string>
<string name="actionbar_move">Mover</string>

View file

@ -260,6 +260,8 @@
<string name="prefs_category_accounts">Contas</string>
<string name="prefs_add_account">Adicionar conta</string>
<string name="auth_redirect_non_secure_connection_title">Uma ligação segura foi redireccionada por uma rota insegura.</string>
<string name="log_send_history_button">Enviar Histórico</string>
<string name="log_progress_dialog_text">A carregar os dados...</string>
<string name="saml_authentication_required_text">Autenticação necessária</string>
<string name="saml_authentication_wrong_pass">Password errada</string>
<string name="actionbar_move">Mover</string>

View file

@ -31,6 +31,8 @@
<string name="prefs_feedback">Обратная связь</string>
<string name="prefs_imprint">Штамп</string>
<string name="recommend_subject">Попробуйте %1$s на вашем смартфоне!</string>
<string name="recommend_text">Хочу предложить вам использовать %1$s на смартфоне!\nЗагрузить можно здесь: %2$s
</string>
<string name="auth_check_server">Проверить сервер</string>
<string name="auth_host_url">Адрес сервера https://...</string>
<string name="auth_username">Имя пользователя</string>
@ -238,7 +240,9 @@
<string name="preview_image_error_unknown_format">Это изображение не может быть отображено</string>
<string name="error__upload__local_file_not_copied">%1$s не возможно скопировать в локальною папку %2$s </string>
<string name="share_link_no_support_share_api">К сожалению, на вашем сервере отключен совместный доступ. Пожалуйста, свяжитесь с вашим администратором.</string>
<string name="share_link_file_no_exist">Невозможно добавить в общий доступ. Пожалуйста, проверьте, существует ли файл</string>
<string name="share_link_file_error">Ошибка предоставления общего доступа к этому файлу или каталогу</string>
<string name="unshare_link_file_no_exist">Невозможно убрать из общего доступа. Пожалуйста, проверьте, существует ли файл</string>
<string name="unshare_link_file_error">Ошибка удаления общего доступа к этому файлу или каталогу</string>
<string name="activity_chooser_send_file_title">Отправить</string>
<string name="copy_link">Копировать ссылку</string>
@ -260,8 +264,18 @@
<string name="prefs_category_accounts">Учётные записи</string>
<string name="prefs_add_account">Добавить учетную запись</string>
<string name="auth_redirect_non_secure_connection_title">Безопасное соединение перенаправлено через небезопасный маршрут.</string>
<string name="actionbar_logger">Журналы</string>
<string name="log_send_history_button">История Отправлений</string>
<string name="log_mail_subject">Журналы Андроид-приложения ownCloud</string>
<string name="log_progress_dialog_text">Загружаются данные...</string>
<string name="saml_authentication_required_text">Требуется аутентификация </string>
<string name="saml_authentication_wrong_pass">Неправильный пароль</string>
<string name="actionbar_move">Переместить</string>
<string name="file_list_empty_moving">Здесь ничего нет. Вы можете добавить папку!</string>
<string name="move_choose_button_text">Выбрать</string>
<string name="move_file_not_found">Невозможно переместить. Пожалуйста, проверьте, существует ли файл</string>
<string name="move_file_invalid_into_descendent">Невозможно переместить папку в папку-потомок</string>
<string name="move_file_invalid_overwrite">Файл уже существует в папке назначения</string>
<string name="move_file_error">Произошла ошибка при попытке перемещения этого файла или папки</string>
<string name="forbidden_permissions_move">переместить этот файл</string>
</resources>

View file

@ -104,6 +104,7 @@
<string name="sync_fail_in_favourites_content">Vsebine %1$d datotek ni bilo mogoče uskladiti (zaznanih je %2$d sporov)</string>
<string name="sync_foreign_files_forgotten_ticker">Nekatere krajevne datoteke so spregledane</string>
<string name="sync_foreign_files_forgotten_content">Skupno %1$d datotek iz mape %2$s ni mogoče kopirati v</string>
<string name="sync_foreign_files_forgotten_explanation">Od različice 1.3.16 so datoteke, poslane iz te naprave, varnostno kopirane v krajevno mapo %1$s. S tem je preprečena možnost izgube podatkov, ko se ena datoteka usklajuje z več računi.\n\nZaradi te spremembe so vse datoteke, ki so bile kopirane v prejšnjih različicah, kopirane v mapo %2$s. Zaradi napake ni mogoče končati usklajevanja. Datoteke lahko ali pustite kjer so, in odstranite povezavo na %3$s, ali pa premaknete datoteke v mapo %1$s in ohranite povezavo do %4$s.\n\nSpodaj so izpisane krajevne datoteke in oddaljene povezane datoteke v mapi %5$s.</string>
<string name="sync_current_folder_was_removed">Mapa %1$s ne obstaja več</string>
<string name="foreign_files_move">Premakni vse</string>
<string name="foreign_files_success">Vse datoteke so uspešno premaknjene na novo mesto</string>
@ -263,6 +264,9 @@
<string name="prefs_category_accounts">Računi</string>
<string name="prefs_add_account">Dodaj račun</string>
<string name="auth_redirect_non_secure_connection_title">Varna povezava je preusmerjena preko ne-varne poti.</string>
<string name="actionbar_logger">Dnevnik</string>
<string name="log_send_history_button">Pošlji zgodovino</string>
<string name="log_progress_dialog_text">Poteka nalaganje podatkov ...</string>
<string name="saml_authentication_required_text">Zahtevana je overitev</string>
<string name="saml_authentication_wrong_pass">Napačno geslo</string>
<string name="actionbar_move">Premakni</string>
@ -272,4 +276,5 @@
<string name="move_file_invalid_into_descendent">Ni mogoče premakniti mape v podrejeno mapo.</string>
<string name="move_file_invalid_overwrite">Datoteka v ciljni mapi že obstaja.</string>
<string name="move_file_error">Prišlo je do napake med premikanjem datoteke v mapo</string>
<string name="forbidden_permissions_move">med premikanjem datoteke</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="empty"></string>
</resources>

View file

@ -264,6 +264,10 @@
<string name="prefs_category_accounts">Hesaplar</string>
<string name="prefs_add_account">Hesap ekle</string>
<string name="auth_redirect_non_secure_connection_title">Güvenli bağlantı, güvenli olmayan bir rotaya yönlendiriliyor.</string>
<string name="actionbar_logger">Günlükler</string>
<string name="log_send_history_button">Geçmişi Gönder</string>
<string name="log_mail_subject">ownCloud Android uygulama kayıtları</string>
<string name="log_progress_dialog_text">Veri yükleniyor...</string>
<string name="saml_authentication_required_text">Kimlik doğrulama gerekli</string>
<string name="saml_authentication_wrong_pass">Hatalı parola</string>
<string name="actionbar_move">Taşı</string>

View file

@ -287,7 +287,7 @@
<string name="actionbar_logger">Logs</string>
<string name="log_send_history_button">Send History</string>
<string name="log_mail_subject">Owncloud Android app logs</string>
<string name="log_mail_subject">ownCloud Android app logs</string>
<string name="log_progress_dialog_text">Loading data...</string>
<string name="saml_authentication_required_text">Authentication required</string>

View file

@ -188,6 +188,7 @@ public class FileDataStorageManager {
cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink());
cv.put(ProviderTableMeta.FILE_PERMISSIONS, file.getPermissions());
cv.put(ProviderTableMeta.FILE_REMOTE_ID, file.getRemoteId());
cv.put(ProviderTableMeta.FILE_UPDATE_THUMBNAIL, file.needsUpdateThumbnail());
boolean sameRemotePath = fileExists(file.getRemotePath());
if (sameRemotePath ||
@ -878,6 +879,8 @@ public class FileDataStorageManager {
file.setPublicLink(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PUBLIC_LINK)));
file.setPermissions(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PERMISSIONS)));
file.setRemoteId(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_REMOTE_ID)));
file.setNeedsUpdateThumbnail(c.getInt(
c.getColumnIndex(ProviderTableMeta.FILE_UPDATE_THUMBNAIL)) == 1 ? true : false);
}
return file;
@ -1222,6 +1225,7 @@ public class FileDataStorageManager {
cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink());
cv.put(ProviderTableMeta.FILE_PERMISSIONS, file.getPermissions());
cv.put(ProviderTableMeta.FILE_REMOTE_ID, file.getRemoteId());
cv.put(ProviderTableMeta.FILE_UPDATE_THUMBNAIL, file.needsUpdateThumbnail() ? 1 : 0);
boolean existsByPath = fileExists(file.getRemotePath());
if (existsByPath || fileExists(file.getFileId())) {

View file

@ -68,6 +68,8 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
private String mPermissions;
private String mRemoteId;
private boolean mNeedsUpdateThumbnail;
/**
* Create new {@link OCFile} with given path.
@ -109,6 +111,8 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
mPublicLink = source.readString();
mPermissions = source.readString();
mRemoteId = source.readString();
mNeedsUpdateThumbnail = source.readInt() == 0;
}
@Override
@ -131,6 +135,7 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
dest.writeString(mPublicLink);
dest.writeString(mPermissions);
dest.writeString(mRemoteId);
dest.writeInt(mNeedsUpdateThumbnail ? 1 : 0);
}
/**
@ -343,6 +348,7 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
mPublicLink = null;
mPermissions = null;
mRemoteId = null;
mNeedsUpdateThumbnail = false;
}
/**
@ -408,6 +414,14 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
return mNeedsUpdating;
}
public boolean needsUpdateThumbnail() {
return mNeedsUpdateThumbnail;
}
public void setNeedsUpdateThumbnail(boolean needsUpdateThumbnail) {
this.mNeedsUpdateThumbnail = needsUpdateThumbnail;
}
public long getLastSyncDateForProperties() {
return mLastSyncDateForProperties;
}

View file

@ -31,7 +31,7 @@ import com.owncloud.android.MainApp;
public class ProviderMeta {
public static final String DB_NAME = "filelist";
public static final int DB_VERSION = 7;
public static final int DB_VERSION = 8;
private ProviderMeta() {
}
@ -70,6 +70,7 @@ public class ProviderMeta {
public static final String FILE_PUBLIC_LINK = "public_link";
public static final String FILE_PERMISSIONS = "permissions";
public static final String FILE_REMOTE_ID = "remote_id";
public static final String FILE_UPDATE_THUMBNAIL = "update_thumbnail";
public static final String FILE_DEFAULT_SORT_ORDER = FILE_NAME
+ " collate nocase asc";

View file

@ -391,6 +391,7 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
long syncDate = System.currentTimeMillis();
file.setLastSyncDateForProperties(syncDate);
file.setLastSyncDateForData(syncDate);
file.setNeedsUpdateThumbnail(true);
file.setModificationTimestamp(mCurrentDownload.getModificationTimestamp());
file.setModificationTimestampAtLastSyncForData(mCurrentDownload.getModificationTimestamp());
// file.setEtag(mCurrentDownload.getEtag()); // TODO Etag, where available

View file

@ -97,6 +97,8 @@ public class FileContentProvider extends ContentProvider {
ProviderTableMeta.FILE_PERMISSIONS);
mFileProjectionMap.put(ProviderTableMeta.FILE_REMOTE_ID,
ProviderTableMeta.FILE_REMOTE_ID);
mFileProjectionMap.put(ProviderTableMeta.FILE_UPDATE_THUMBNAIL,
ProviderTableMeta.FILE_UPDATE_THUMBNAIL);
}
private static final int SINGLE_FILE = 1;
@ -559,7 +561,8 @@ public class FileContentProvider extends ContentProvider {
+ ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER, "
+ ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT, "
+ ProviderTableMeta.FILE_PERMISSIONS + " TEXT null,"
+ ProviderTableMeta.FILE_REMOTE_ID + " TEXT null);"
+ ProviderTableMeta.FILE_REMOTE_ID + " TEXT null,"
+ ProviderTableMeta.FILE_UPDATE_THUMBNAIL + " INTEGER);" //boolean
);
// Create table ocshares
@ -708,6 +711,23 @@ public class FileContentProvider extends ContentProvider {
}
if (!upgraded)
Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
if (oldVersion < 8 && newVersion >= 8) {
Log_OC.i("SQL", "Entering in the #8 ADD in onUpgrade");
db.beginTransaction();
try {
db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_UPDATE_THUMBNAIL + " INTEGER " +
" DEFAULT 0");
upgraded = true;
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
if (!upgraded)
Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
}
}

View file

@ -0,0 +1,189 @@
package com.owncloud.android.ui.adapter;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.util.Log;
import com.jakewharton.disklrucache.DiskLruCache;
import com.owncloud.android.BuildConfig;
import com.owncloud.android.lib.common.utils.Log_OC;
public class DiskLruImageCache {
private DiskLruCache mDiskCache;
private CompressFormat mCompressFormat;
private int mCompressQuality;
private static final int CACHE_VERSION = 1;
private static final int VALUE_COUNT = 1;
private static final int IO_BUFFER_SIZE = 8 * 1024;
private static final Pattern CAPITAL_LETTERS = Pattern.compile("[A-Z]");
private StringBuffer mValidKeyBuffer = new StringBuffer(64);
private StringBuffer mConversionBuffer = new StringBuffer(2).append('_');
private static final String TAG = "DiskLruImageCache";
public DiskLruImageCache( Context context,String uniqueName, int diskCacheSize,
CompressFormat compressFormat, int quality ) throws IOException {
final File diskCacheDir = getDiskCacheDir(context, uniqueName );
mDiskCache = DiskLruCache.open(
diskCacheDir, CACHE_VERSION, VALUE_COUNT, diskCacheSize
);
mCompressFormat = compressFormat;
mCompressQuality = quality;
}
private boolean writeBitmapToFile( Bitmap bitmap, DiskLruCache.Editor editor )
throws IOException, FileNotFoundException {
OutputStream out = null;
try {
out = new BufferedOutputStream( editor.newOutputStream( 0 ), IO_BUFFER_SIZE );
return bitmap.compress( mCompressFormat, mCompressQuality, out );
} finally {
if ( out != null ) {
out.close();
}
}
}
private File getDiskCacheDir(Context context, String uniqueName) {
// Check if media is mounted or storage is built-in, if so, try and use external cache dir
// otherwise use internal cache dir
final String cachePath = context.getExternalCacheDir().getPath();
Log_OC.d(TAG, "create dir: " + cachePath + File.separator + uniqueName);
return new File(cachePath + File.separator + uniqueName);
}
public void put( String key, Bitmap data ) {
DiskLruCache.Editor editor = null;
String validKey = convertToValidKey(key);
try {
editor = mDiskCache.edit( validKey );
if ( editor == null ) {
return;
}
if( writeBitmapToFile( data, editor ) ) {
mDiskCache.flush();
editor.commit();
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "image put on disk cache " + validKey );
}
} else {
editor.abort();
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + validKey );
}
}
} catch (IOException e) {
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + validKey );
}
try {
if ( editor != null ) {
editor.abort();
}
} catch (IOException ignored) {
}
}
}
public Bitmap getBitmap( String key ) {
Bitmap bitmap = null;
DiskLruCache.Snapshot snapshot = null;
String validKey = convertToValidKey(key);
try {
snapshot = mDiskCache.get( validKey );
if ( snapshot == null ) {
return null;
}
final InputStream in = snapshot.getInputStream( 0 );
if ( in != null ) {
final BufferedInputStream buffIn =
new BufferedInputStream( in, IO_BUFFER_SIZE );
bitmap = BitmapFactory.decodeStream( buffIn );
}
} catch ( IOException e ) {
e.printStackTrace();
} finally {
if ( snapshot != null ) {
snapshot.close();
}
}
if ( BuildConfig.DEBUG ) {
Log.d("cache_test_DISK_", bitmap == null ? "not found" : "image read from disk " + validKey);
}
return bitmap;
}
public boolean containsKey( String key ) {
boolean contained = false;
DiskLruCache.Snapshot snapshot = null;
String validKey = convertToValidKey(key);
try {
snapshot = mDiskCache.get( validKey );
contained = snapshot != null;
} catch (IOException e) {
e.printStackTrace();
} finally {
if ( snapshot != null ) {
snapshot.close();
}
}
return contained;
}
public void clearCache() {
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "disk cache CLEARED");
}
try {
mDiskCache.delete();
} catch ( IOException e ) {
e.printStackTrace();
}
}
public File getCacheFolder() {
return mDiskCache.getDirectory();
}
private String convertToValidKey(String key) {
Matcher capitalLettersMatcher = CAPITAL_LETTERS.matcher(key);
mValidKeyBuffer.delete(0, mValidKeyBuffer.length());
mConversionBuffer.delete(1, mConversionBuffer.length());
while (capitalLettersMatcher.find()) {
mConversionBuffer.replace(1, 2, capitalLettersMatcher.group(0).toLowerCase());
capitalLettersMatcher.appendReplacement(mValidKeyBuffer, mConversionBuffer.toString());
}
capitalLettersMatcher.appendTail(mValidKeyBuffer);
return mValidKeyBuffer.toString();
}
}

View file

@ -17,10 +17,21 @@
*/
package com.owncloud.android.ui.adapter;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.Vector;
import android.accounts.Account;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.os.AsyncTask;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -36,7 +47,9 @@ import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.utils.BitmapUtils;
import com.owncloud.android.utils.DisplayUtils;
@ -45,11 +58,14 @@ import com.owncloud.android.utils.DisplayUtils;
* instance.
*
* @author Bartek Przybylski
*
* @author Tobias Kaminsky
* @author David A. Velasco
*/
public class FileListListAdapter extends BaseAdapter implements ListAdapter {
private final static String PERMISSION_SHARED_WITH_ME = "S";
private static final String TAG = FileListListAdapter.class.getSimpleName();
private Context mContext;
private OCFile mFile = null;
private Vector<OCFile> mFiles = null;
@ -59,15 +75,159 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
private Account mAccount;
private ComponentsGetter mTransferServiceGetter;
private final Object thumbnailDiskCacheLock = new Object();
private DiskLruImageCache mThumbnailCache;
private boolean mThumbnailCacheStarting = true;
private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10; // 10MB
private static final CompressFormat mCompressFormat = CompressFormat.JPEG;
private static final int mCompressQuality = 70;
private Bitmap defaultImg;
public FileListListAdapter(
boolean justFolders,
Context context,
ComponentsGetter transferServiceGetter
) {
mJustFolders = justFolders;
mContext = context;
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);
mTransferServiceGetter = transferServiceGetter;
defaultImg = BitmapFactory.decodeResource(mContext.getResources(),
DisplayUtils.getResourceId("image/png", "default.png"));
// Initialise disk cache on background thread
new InitDiskCacheTask().execute();
}
class InitDiskCacheTask extends AsyncTask<File, Void, Void> {
@Override
protected Void doInBackground(File... params) {
synchronized (thumbnailDiskCacheLock) {
try {
mThumbnailCache = new DiskLruImageCache(mContext, "thumbnailCache",
DISK_CACHE_SIZE, mCompressFormat, mCompressQuality);
} catch (Exception e) {
Log_OC.d(TAG, "Thumbnail cache could not be opened ", e);
mThumbnailCache = null;
}
mThumbnailCacheStarting = false; // Finished initialization
thumbnailDiskCacheLock.notifyAll(); // Wake any waiting threads
}
return null;
}
}
static class AsyncDrawable extends BitmapDrawable {
private final WeakReference<ThumbnailGenerationTask> bitmapWorkerTaskReference;
public AsyncDrawable(Resources res, Bitmap bitmap,
ThumbnailGenerationTask bitmapWorkerTask) {
super(res, bitmap);
bitmapWorkerTaskReference =
new WeakReference<ThumbnailGenerationTask>(bitmapWorkerTask);
}
public ThumbnailGenerationTask getBitmapWorkerTask() {
return bitmapWorkerTaskReference.get();
}
}
class ThumbnailGenerationTask extends AsyncTask<OCFile, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private OCFile file;
public ThumbnailGenerationTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(OCFile... params) {
Bitmap thumbnail = null;
try {
file = params[0];
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()) {
// Converts dp to pixel
Resources r = mContext.getResources();
int px = (int) Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics()
));
if (file.isDown()){
Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
file.getStoragePath(), px, px);
if (bitmap != null) {
thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
// Add thumbnail to cache
addBitmapToCache(imageKey, thumbnail);
file.setNeedsUpdateThumbnail(false);
mStorageManager.saveFile(file);
}
}
}
} catch (Throwable t) {
// the app should never break due to a problem with thumbnails
Log_OC.e(TAG, "Generation of thumbnail for " + file + " failed", t);
if (t instanceof OutOfMemoryError) {
System.gc();
}
}
return thumbnail;
}
protected void onPostExecute(Bitmap bitmap){
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
final ThumbnailGenerationTask bitmapWorkerTask =
getBitmapWorkerTask(imageView);
if (this == bitmapWorkerTask && imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
public void addBitmapToCache(String key, Bitmap bitmap) {
synchronized (thumbnailDiskCacheLock) {
if (mThumbnailCache != null) {
mThumbnailCache.put(key, bitmap);
}
}
}
public Bitmap getBitmapFromDiskCache(String key) {
synchronized (thumbnailDiskCacheLock) {
// Wait while disk cache is started from background thread
while (mThumbnailCacheStarting) {
try {
thumbnailDiskCacheLock.wait();
} catch (InterruptedException e) {}
}
if (mThumbnailCache != null) {
return (Bitmap) mThumbnailCache.getBitmap(key);
}
}
return null;
}
@Override
@ -126,7 +286,8 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2);
localStateView.bringToFront();
FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder();
FileDownloaderBinder downloaderBinder =
mTransferServiceGetter.getFileDownloaderBinder();
FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder();
if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) {
localStateView.setImageResource(R.drawable.downloading_file_indicator);
@ -149,7 +310,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
fileSizeV.setVisibility(View.VISIBLE);
fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));
lastModV.setVisibility(View.VISIBLE);
lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));
lastModV.setText(
DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())
);
// this if-else is needed even thoe fav icon is visible by default
// because android reuses views in listview
if (!file.keepInSync()) {
@ -170,18 +333,40 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
checkBoxV.setVisibility(View.VISIBLE);
}
fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()));
// get Thumbnail if file is image
if (file.isImage()){
// Thumbnail in Cache?
Bitmap thumbnail = getBitmapFromDiskCache(String.valueOf(file.getRemoteId()));
if (thumbnail != null && !file.needsUpdateThumbnail()){
fileIcon.setImageBitmap(thumbnail);
} else {
// generate new Thumbnail
if (cancelPotentialWork(file, fileIcon)) {
final ThumbnailGenerationTask task =
new ThumbnailGenerationTask(fileIcon);
final AsyncDrawable asyncDrawable =
new AsyncDrawable(mContext.getResources(), defaultImg, task);
fileIcon.setImageDrawable(asyncDrawable);
task.execute(file);
}
}
} else {
fileIcon.setImageResource(
DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())
);
}
if (checkIfFileIsSharedWithMe(file)) {
sharedWithMeIconV.setVisibility(View.VISIBLE);
}
}
else {
fileSizeV.setVisibility(View.INVISIBLE);
//fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));
lastModV.setVisibility(View.VISIBLE);
lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));
lastModV.setText(
DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())
);
checkBoxV.setVisibility(View.GONE);
view.findViewById(R.id.imageView3).setVisibility(View.GONE);
@ -189,7 +374,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
fileIcon.setImageResource(R.drawable.shared_with_me_folder);
sharedWithMeIconV.setVisibility(View.VISIBLE);
} else {
fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()));
fileIcon.setImageResource(
DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())
);
}
// If folder is sharedByLink, icon folder must be changed to
@ -209,6 +396,35 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
return view;
}
public static boolean cancelPotentialWork(OCFile file, ImageView imageView) {
final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
if (bitmapWorkerTask != null) {
final OCFile bitmapData = bitmapWorkerTask.file;
// 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;
}
private 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;
}
@Override
public int getViewTypeCount() {
return 1;
@ -226,8 +442,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
/**
* Change the adapted directory for a new one
* @param directory New file to adapt. Can be NULL, meaning "no content to adapt".
* @param updatedStorageManager Optional updated storage manager; used to replace mStorageManager if is different (and not NULL)
* @param directory New file to adapt. Can be NULL, meaning
* "no content to adapt".
* @param updatedStorageManager Optional updated storage manager; used to replace
* mStorageManager if is different (and not NULL)
*/
public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager) {
mFile = directory;
@ -273,7 +491,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
* @return boolean: True if it is shared with me and false if it is not
*/
private boolean checkIfFileIsSharedWithMe(OCFile file) {
return (mFile.getPermissions() != null && !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME)
&& file.getPermissions() != null && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME));
return (mFile.getPermissions() != null
&& !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME)
&& file.getPermissions() != null
&& file.getPermissions().contains(PERMISSION_SHARED_WITH_ME));
}
}

View file

@ -0,0 +1,99 @@
/* ownCloud Android client application
* Copyright (C) 2012-2014 ownCloud Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.owncloud.android.utils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
/**
* Utility class with methods for decoding Bitmaps.
*
* @author David A. Velasco
*/
public class BitmapUtils {
/**
* Decodes a bitmap from a file containing it minimizing the memory use, known that the bitmap
* will be drawn in a surface of reqWidth x reqHeight
*
* @param srcPath Absolute path to the file containing the image.
* @param reqWidth Width of the surface where the Bitmap will be drawn on, in pixels.
* @param reqHeight Height of the surface where the Bitmap will be drawn on, in pixels.
* @return
*/
public static Bitmap decodeSampledBitmapFromFile(String srcPath, int reqWidth, int reqHeight) {
// set desired options that will affect the size of the bitmap
final Options options = new Options();
options.inScaled = true;
options.inPurgeable = true;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
options.inPreferQualityOverSpeed = false;
}
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
options.inMutable = false;
}
// make a false load of the bitmap to get its dimensions
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(srcPath, options);
// calculate factor to subsample the bitmap
options.inSampleSize = calculateSampleFactor(options, reqWidth, reqHeight);
// decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(srcPath, options);
}
/**
* Calculates a proper value for options.inSampleSize in order to decode a Bitmap minimizing
* the memory overload and covering a target surface of reqWidth x reqHeight if the original
* image is big enough.
*
* @param options Bitmap decoding options; options.outHeight and options.inHeight should
* be set.
* @param reqWidth Width of the surface where the Bitmap will be drawn on, in pixels.
* @param reqHeight Height of the surface where the Bitmap will be drawn on, in pixels.
* @return The largest inSampleSize value that is a power of 2 and keeps both
* height and width larger than reqWidth and reqHeight.
*/
private static int calculateSampleFactor(Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
}