<?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>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<lint>
-</lint>
\ No newline at end of file
<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>
<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>
<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>
<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">লà§\87াড হà¦\9aà§\8dà¦\9bà§\87....</string>
<string name="local_file_list_empty">এই ফোলডারে কোন ফাইল নেই</string>
<string name="filedetails_select_file">অতিরিক্ত তথ্য প্রদর্শন করতে চাইলে ফাইলে ট্যাপ দিন</string>
<string name="filedetails_size">আয়তনঃ</string>
<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">নà§\87à¦\9fà¦\93à§\9fারà¦\95 à¦\95ানà§\87à¦\95শন নেই</string>
+ <string name="auth_no_net_conn_title">নà§\87à¦\9fà¦\93à§\9fারà§\8dà¦\95 সà¦\82যà§\8bà¦\97 নেই</string>
<string name="auth_nossl_plain_ok_title">নিরাপদ যোগাযোগ পাওয়া গেলনা</string>
<string name="auth_connection_established">যোগাযোগ স্থাপিত হয়েছে</string>
<string name="auth_testing_connection">যোগাযোগ পরীক্ষা করা হচ্ছে...</string>
<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">à¦\86পলà§\8bড à¦\95à§\8bরà§\8bনা</string>
<string name="preview_image_description">ছবি প্রাকদর্শন</string>
<string name="preview_image_error_unknown_format">ছবিটি প্রদর্শন করা যাবেনা</string>
<string name="error__upload__local_file_not_copied">%1$s কে %2$s স্থানীয় ফোল্ডারে কপি করা গেলনা </string>
<string name="prefs_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>
<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>
<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>
<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>
<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>
<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>
<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>
<?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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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 d’annulation 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>
<string name="downloader_download_file_not_found">Ce fichier n’est 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>
<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>
<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>
<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>
<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>
<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: / \\ < > : \" | ? *</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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: / \\ < > : \" | ? *</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>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="empty"></string>
+</resources>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="empty"></string>
+</resources>
<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>
<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>
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 ||
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;
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())) {
private String mPermissions;
private String mRemoteId;
+ private boolean mNeedsUpdateThumbnail;
+
/**
* Create new {@link OCFile} with given path.
mPublicLink = source.readString();
mPermissions = source.readString();
mRemoteId = source.readString();
+ mNeedsUpdateThumbnail = source.readInt() == 0;
+
}
@Override
dest.writeString(mPublicLink);
dest.writeString(mPermissions);
dest.writeString(mRemoteId);
+ dest.writeInt(mNeedsUpdateThumbnail ? 1 : 0);
}
/**
mPublicLink = null;
mPermissions = null;
mRemoteId = null;
+ mNeedsUpdateThumbnail = false;
}
/**
return mNeedsUpdating;
}
+ public boolean needsUpdateThumbnail() {
+ return mNeedsUpdateThumbnail;
+ }
+
+ public void setNeedsUpdateThumbnail(boolean needsUpdateThumbnail) {
+ this.mNeedsUpdateThumbnail = needsUpdateThumbnail;
+ }
+
public long getLastSyncDateForProperties() {
return mLastSyncDateForProperties;
}
public class ProviderMeta {\r
\r
public static final String DB_NAME = "filelist";\r
- public static final int DB_VERSION = 7;\r
+ public static final int DB_VERSION = 8;\r
\r
private ProviderMeta() {\r
}\r
public static final String FILE_PUBLIC_LINK = "public_link";\r
public static final String FILE_PERMISSIONS = "permissions";\r
public static final String FILE_REMOTE_ID = "remote_id";\r
+ public static final String FILE_UPDATE_THUMBNAIL = "update_thumbnail";\r
\r
public static final String FILE_DEFAULT_SORT_ORDER = FILE_NAME\r
+ " collate nocase asc";\r
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
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;
+ 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
}
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);
}
}
--- /dev/null
+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();
+ }
+
+}
\ No newline at end of file
*/\r
package com.owncloud.android.ui.adapter;\r
\r
+import java.io.File;\r
+import java.lang.ref.WeakReference;\r
import java.util.Vector;\r
\r
import android.accounts.Account;\r
import android.content.Context;\r
+import android.content.res.Resources;\r
+import android.graphics.Bitmap;\r
+import android.graphics.Bitmap.CompressFormat;\r
+import android.graphics.BitmapFactory;\r
+import android.graphics.drawable.BitmapDrawable;\r
+import android.graphics.drawable.Drawable;\r
+import android.media.ThumbnailUtils;\r
+import android.os.AsyncTask;\r
+import android.util.TypedValue;\r
import android.view.LayoutInflater;\r
import android.view.View;\r
import android.view.ViewGroup;\r
import com.owncloud.android.datamodel.OCFile;\r
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;\r
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
+import com.owncloud.android.lib.common.utils.Log_OC;\r
import com.owncloud.android.ui.activity.ComponentsGetter;\r
+import com.owncloud.android.utils.BitmapUtils;\r
import com.owncloud.android.utils.DisplayUtils;\r
\r
\r
* instance.\r
* \r
* @author Bartek Przybylski\r
- * \r
+ * @author Tobias Kaminsky\r
+ * @author David A. Velasco\r
*/\r
public class FileListListAdapter extends BaseAdapter implements ListAdapter {\r
private final static String PERMISSION_SHARED_WITH_ME = "S";\r
+ \r
+ private static final String TAG = FileListListAdapter.class.getSimpleName();\r
\r
private Context mContext;\r
private OCFile mFile = null;\r
private Account mAccount;
private ComponentsGetter mTransferServiceGetter;\r
\r
+ private final Object thumbnailDiskCacheLock = new Object();\r
+ private DiskLruImageCache mThumbnailCache;\r
+ private boolean mThumbnailCacheStarting = true;\r
+ private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10; // 10MB\r
+ private static final CompressFormat mCompressFormat = CompressFormat.JPEG;\r
+ private static final int mCompressQuality = 70;\r
+ private Bitmap defaultImg;\r
+ \r
public FileListListAdapter(\r
boolean justFolders, \r
Context context, \r
ComponentsGetter transferServiceGetter\r
) {\r
+ \r
mJustFolders = justFolders;\r
mContext = context;\r
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
mTransferServiceGetter = transferServiceGetter;\r
+ defaultImg = BitmapFactory.decodeResource(mContext.getResources(), \r
+ DisplayUtils.getResourceId("image/png", "default.png"));\r
+ \r
+ // Initialise disk cache on background thread\r
+ new InitDiskCacheTask().execute();\r
+ }\r
+ \r
+ class InitDiskCacheTask extends AsyncTask<File, Void, Void> {\r
+ @Override\r
+ protected Void doInBackground(File... params) {\r
+ synchronized (thumbnailDiskCacheLock) {\r
+ try {\r
+ mThumbnailCache = new DiskLruImageCache(mContext, "thumbnailCache", \r
+ DISK_CACHE_SIZE, mCompressFormat, mCompressQuality);\r
+ } catch (Exception e) {\r
+ Log_OC.d(TAG, "Thumbnail cache could not be opened ", e);\r
+ mThumbnailCache = null;\r
+ }\r
+ mThumbnailCacheStarting = false; // Finished initialization\r
+ thumbnailDiskCacheLock.notifyAll(); // Wake any waiting threads\r
+ }\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ static class AsyncDrawable extends BitmapDrawable {\r
+ private final WeakReference<ThumbnailGenerationTask> bitmapWorkerTaskReference;\r
+\r
+ public AsyncDrawable(Resources res, Bitmap bitmap,\r
+ ThumbnailGenerationTask bitmapWorkerTask) {\r
+ super(res, bitmap);\r
+ bitmapWorkerTaskReference =\r
+ new WeakReference<ThumbnailGenerationTask>(bitmapWorkerTask);\r
+ }\r
+\r
+ public ThumbnailGenerationTask getBitmapWorkerTask() {\r
+ return bitmapWorkerTaskReference.get();\r
+ }\r
+ }\r
+\r
+ class ThumbnailGenerationTask extends AsyncTask<OCFile, Void, Bitmap> {\r
+ private final WeakReference<ImageView> imageViewReference;\r
+ private OCFile file;\r
+\r
+ \r
+ public ThumbnailGenerationTask(ImageView imageView) {\r
+ // Use a WeakReference to ensure the ImageView can be garbage collected\r
+ imageViewReference = new WeakReference<ImageView>(imageView);\r
+ }\r
+\r
+ // Decode image in background.\r
+ @Override\r
+ protected Bitmap doInBackground(OCFile... params) {\r
+ Bitmap thumbnail = null;\r
+ \r
+ try {\r
+ file = params[0];\r
+ final String imageKey = String.valueOf(file.getRemoteId());\r
+ \r
+ // Check disk cache in background thread\r
+ thumbnail = getBitmapFromDiskCache(imageKey);\r
+ \r
+ // Not found in disk cache\r
+ if (thumbnail == null || file.needsUpdateThumbnail()) { \r
+ // Converts dp to pixel\r
+ Resources r = mContext.getResources();\r
+ int px = (int) Math.round(TypedValue.applyDimension(\r
+ TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics()\r
+ ));\r
+ \r
+ if (file.isDown()){\r
+ Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(\r
+ file.getStoragePath(), px, px);\r
+ \r
+ if (bitmap != null) {\r
+ thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);\r
+ \r
+ // Add thumbnail to cache\r
+ addBitmapToCache(imageKey, thumbnail);\r
+\r
+ file.setNeedsUpdateThumbnail(false);\r
+ mStorageManager.saveFile(file);\r
+ }\r
+ \r
+ }\r
+ }\r
+ \r
+ } catch (Throwable t) {\r
+ // the app should never break due to a problem with thumbnails\r
+ Log_OC.e(TAG, "Generation of thumbnail for " + file + " failed", t);\r
+ if (t instanceof OutOfMemoryError) {\r
+ System.gc();\r
+ }\r
+ }\r
+ \r
+ return thumbnail;\r
+ }\r
+ \r
+ protected void onPostExecute(Bitmap bitmap){\r
+ if (isCancelled()) {\r
+ bitmap = null;\r
+ }\r
+\r
+ if (imageViewReference != null && bitmap != null) {\r
+ final ImageView imageView = imageViewReference.get();\r
+ final ThumbnailGenerationTask bitmapWorkerTask =\r
+ getBitmapWorkerTask(imageView);\r
+ if (this == bitmapWorkerTask && imageView != null) {\r
+ imageView.setImageBitmap(bitmap);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ public void addBitmapToCache(String key, Bitmap bitmap) {\r
+ synchronized (thumbnailDiskCacheLock) {\r
+ if (mThumbnailCache != null) {\r
+ mThumbnailCache.put(key, bitmap);\r
+ }\r
+ }\r
+ }\r
+\r
+ public Bitmap getBitmapFromDiskCache(String key) {\r
+ synchronized (thumbnailDiskCacheLock) {\r
+ // Wait while disk cache is started from background thread\r
+ while (mThumbnailCacheStarting) {\r
+ try {\r
+ thumbnailDiskCacheLock.wait();\r
+ } catch (InterruptedException e) {}\r
+ }\r
+ if (mThumbnailCache != null) {\r
+ return (Bitmap) mThumbnailCache.getBitmap(key);\r
+ }\r
+ }\r
+ return null;\r
}
\r
@Override\r
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
view = inflator.inflate(R.layout.list_item, null);\r
}\r
- \r
+ \r
if (mFiles != null && mFiles.size() > position) {\r
OCFile file = mFiles.get(position);\r
- TextView fileName = (TextView) view.findViewById(R.id.Filename);\r
+ TextView fileName = (TextView) view.findViewById(R.id.Filename); \r
String name = file.getFileName();\r
\r
fileName.setText(name);\r
\r
ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2);\r
localStateView.bringToFront();\r
- FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder();\r
+ FileDownloaderBinder downloaderBinder = \r
+ mTransferServiceGetter.getFileDownloaderBinder();\r
FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder();\r
if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) {\r
localStateView.setImageResource(R.drawable.downloading_file_indicator);\r
fileSizeV.setVisibility(View.VISIBLE);\r
fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
lastModV.setVisibility(View.VISIBLE);\r
- lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));\r
+ lastModV.setText(\r
+ DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
+ );\r
// this if-else is needed even thoe fav icon is visible by default\r
// because android reuses views in listview\r
if (!file.keepInSync()) {\r
checkBoxV.setImageResource(android.R.drawable.checkbox_off_background);\r
}\r
checkBoxV.setVisibility(View.VISIBLE);\r
+ } \r
+ \r
+ // get Thumbnail if file is image\r
+ if (file.isImage()){\r
+ // Thumbnail in Cache?\r
+ Bitmap thumbnail = getBitmapFromDiskCache(String.valueOf(file.getRemoteId()));\r
+ if (thumbnail != null && !file.needsUpdateThumbnail()){\r
+ fileIcon.setImageBitmap(thumbnail);\r
+ } else {\r
+ // generate new Thumbnail\r
+ if (cancelPotentialWork(file, fileIcon)) {\r
+ final ThumbnailGenerationTask task = \r
+ new ThumbnailGenerationTask(fileIcon);\r
+ final AsyncDrawable asyncDrawable =\r
+ new AsyncDrawable(mContext.getResources(), defaultImg, task);\r
+ fileIcon.setImageDrawable(asyncDrawable);\r
+ task.execute(file);\r
+ }\r
+ }\r
+ } else {\r
+ fileIcon.setImageResource(\r
+ DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())\r
+ );\r
}\r
-\r
- fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()));\r
-\r
+
if (checkIfFileIsSharedWithMe(file)) {\r
sharedWithMeIconV.setVisibility(View.VISIBLE);\r
}\r
} \r
else {\r
- \r
fileSizeV.setVisibility(View.INVISIBLE);\r
//fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
lastModV.setVisibility(View.VISIBLE);\r
- lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));\r
+ lastModV.setText(\r
+ DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
+ );\r
checkBoxV.setVisibility(View.GONE);\r
view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
\r
fileIcon.setImageResource(R.drawable.shared_with_me_folder);\r
sharedWithMeIconV.setVisibility(View.VISIBLE);\r
} else {\r
- fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()));\r
+ fileIcon.setImageResource(\r
+ DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())\r
+ );\r
}\r
\r
// If folder is sharedByLink, icon folder must be changed to\r
\r
return view;\r
}\r
+ \r
+ public static boolean cancelPotentialWork(OCFile file, ImageView imageView) {\r
+ final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView);\r
+\r
+ if (bitmapWorkerTask != null) {\r
+ final OCFile bitmapData = bitmapWorkerTask.file;\r
+ // If bitmapData is not yet set or it differs from the new data\r
+ if (bitmapData == null || bitmapData != file) {\r
+ // Cancel previous task\r
+ bitmapWorkerTask.cancel(true);\r
+ } else {\r
+ // The same work is already in progress\r
+ return false;\r
+ }\r
+ }\r
+ // No task associated with the ImageView, or an existing task was cancelled\r
+ return true;\r
+ }\r
+ \r
+ private static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) {\r
+ if (imageView != null) {\r
+ final Drawable drawable = imageView.getDrawable();\r
+ if (drawable instanceof AsyncDrawable) {\r
+ final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;\r
+ return asyncDrawable.getBitmapWorkerTask();\r
+ }\r
+ }\r
+ return null;\r
+ }\r
\r
@Override\r
public int getViewTypeCount() {\r
\r
/**\r
* Change the adapted directory for a new one\r
- * @param directory New file to adapt. Can be NULL, meaning "no content to adapt".\r
- * @param updatedStorageManager Optional updated storage manager; used to replace mStorageManager if is different (and not NULL)\r
+ * @param directory New file to adapt. Can be NULL, meaning \r
+ * "no content to adapt".\r
+ * @param updatedStorageManager Optional updated storage manager; used to replace \r
+ * mStorageManager if is different (and not NULL)\r
*/\r
public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager) {\r
mFile = directory;\r
* @return boolean: True if it is shared with me and false if it is not\r
*/\r
private boolean checkIfFileIsSharedWithMe(OCFile file) {\r
- return (mFile.getPermissions() != null && !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME)\r
- && file.getPermissions() != null && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME));\r
+ return (mFile.getPermissions() != null \r
+ && !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME)\r
+ && file.getPermissions() != null \r
+ && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME));\r
}\r
}\r
--- /dev/null
+/* 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;
+ }
+
+}