From: tobiasKaminsky Date: Thu, 29 Oct 2015 17:53:05 +0000 (+0100) Subject: Merge remote-tracking branch 'remotes/upstream/multiSelect' into beta X-Git-Tag: beta-20151122~81 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/af17dcc57236083ca0959bc1eb979a469bbfb101?hp=-c Merge remote-tracking branch 'remotes/upstream/multiSelect' into beta --- af17dcc57236083ca0959bc1eb979a469bbfb101 diff --combined res/values-cs-rCZ/strings.xml index 5147a57a,e9783020..02edb32a --- a/res/values-cs-rCZ/strings.xml +++ b/res/values-cs-rCZ/strings.xml @@@ -71,7 -71,6 +71,7 @@@ před pár sekundami Žádný obsah. Nahrajte něco! Načítání... + Nebyla nalezena aplikace pro tento typ souboru! V tomto adresáři nejsou žádné soubory. Více informací získáte klepnutím na soubor. Velikost: @@@ -198,11 -197,11 +198,11 @@@ Odebrat z oblíbených Přejmenovat Odstranit - Opravdu chcete odstranit %1$s ? + Opravdu chcete odstranit %1$s ? Opravdu chcete odstranit %1$s a jeho obsah? Pouze místní Pouze místní - Ze serveru + Ze serveru Vzdálený & místní Úspěšně odstraněno Odstranění nelze dokončit diff --combined res/values-de/strings.xml index 562ee84e,44d12ef6..db368755 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@@ -71,7 -71,6 +71,7 @@@ Gerade eben Alles leer. Lade etwas hoch! Lade… + Es wurden keine Apps für den Dateityp gefunden! Es befinden sich keine Dateien in diesem Ordner. Klicken Sie auf eine Datei für weitere Informationen. Größe: @@@ -199,12 -198,10 +199,12 @@@ Favorit entfernen Umbenennen Löschen - Möchtest Du %1$s wirklich löschen? + Möchtest Du %1$s wirklich löschen? Möchtest Du wirklich %1$s und dessen Inhalte entfernen? Nur lokal Nur lokal + Vom Server + Remote & lokal Erfolgreich gelöscht Der Löschvorgang konnte nicht beendet werden Gib einen neuen Namen ein @@@ -259,8 -256,6 +259,8 @@@ Dateikonfilikt Welche Datei möchtest du behalten? Wenn du beide Versionen auswählst, wird der lokalen Datei eine Zahl am Ende Ihres Dateiname angehangen. Beide behalten + Lokale Version + Serverversion Bildvorschau Dieses Bild kann nicht angezeigt werden %1$s konnte nicht in den lokalen %2$s Ordner kopiert werden @@@ -308,11 -303,7 +308,11 @@@ Die Datei ist bereits im Zielordner vorhanden Es ist ein Fehler beim Verschieben der Datei oder des Ordners aufgetreten. um diese Datei zu verschieben + Kopieren nicht möglich. Prüfe, dass die Datei existiert + Es ist nicht möglich, einen Ordner in einen seiner Unterordner zu kopieren Die Datei existiert bereits im Zielverzeichnis + Es ist ein Fehler beim Kopieren der Datei oder des Ordners aufgetreten. + diese Datei zu kopieren Sofortiges Hochladen Sicherheit Verzeichnis zum Hochladen der Videos diff --combined res/values-el/strings.xml index 070d6f50,c1a73528..cf3f3a0f --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@@ -71,7 -71,6 +71,7 @@@ δευτερόλεπτα πριν Δεν υπάρχει τίποτα εδώ. Μεταφορτώστε κάτι! Φόρτωση... + Δεν βρέθηκε εφαρμογή για αυτόν τον τύπο αρχείου Δεν υπάρχουν αρχεία σε αυτό τον φάκελο. Αγγίξτε κάποιο αρχείο για να προβάλετε περισσότερες πληροφορίες. Μέγεθος: @@@ -199,11 -198,11 +199,11 @@@ Κατάργηση από τα αγαπημένα Μετονομασία Αφαίρεση - Θέλετε στ\' αλήθεια να αφαιρέσετε το %1$s; + Θέλετε στ\' αλήθεια να αφαιρέσετε το %1$s; Θέλετε στ\' αλήθεια να διαγράψετε το %1$s και τα περιεχόμενά του; Μόνο τοπικά Μόνο τοπικά - Από το διακομιστή + Από το διακομιστή Απομακρυσμένα & τοπικά Αφαίρεση επιτυχής Η αφαίρεση απέτυχε diff --combined res/values-eo/strings.xml index 7c9473b6,3471045f..774ce690 --- a/res/values-eo/strings.xml +++ b/res/values-eo/strings.xml @@@ -122,7 -122,7 +122,7 @@@ Nefavoratigi Alinomigi Forigi - Ĉu vi vere volas forigi %1$s? + Ĉu vi vere volas forigi %1$s? Ĉu vi vere volas forigi %1$s kaj ĝia enhavo? Nur loka Nur loka @@@ -186,6 -186,4 +186,6 @@@ La dosiero jam ekzistas en la cela dosierujo Sekuro Servila adreso + 1 dosiero + %1$d dosieroj diff --combined res/values-es/strings.xml index 1f630851,4508c528..64e89328 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@@ -71,7 -71,6 +71,7 @@@ hace segundos No hay nada aquí. ¡Suba algo! Cargando... + ¡No se encontró una aplicación para el tipo de archivo! No hay archivos en esta carpeta. Pulsa sobre un archivo para mostrar información adicional. Tamaño: @@@ -139,9 -138,9 +139,9 @@@ La contraseña será requerida cada vez que la aplicación sea iniciada Reintroduzca la contraseña, por favor. Borre su contraseña - Las contraseñas no son identicas - Contraseña incorrecta - Contraseña borrada + Los códigos de acceso no son idénticos + Código de acceso incorrecto + Código de acceso borrado Contraseña almacenada Reproductor de música %1$s %1$s (reproduciendo) @@@ -199,11 -198,11 +199,11 @@@ No-favorito Renombrar Borrar - ¿Realmente desea eliminar %1$s? + ¿Realmente desea eliminar %1$s? ¿Realmente desea eliminar %1$s y todo su contenido? Sólo local Sólo local - Desde el servidor + Desde el servidor Remoto & local Borrado correctamente El borrado no pudo ser completado diff --combined res/values-fi-rFI/strings.xml index 59a6ec10,5bfc565a..c9ef9134 --- a/res/values-fi-rFI/strings.xml +++ b/res/values-fi-rFI/strings.xml @@@ -71,7 -71,6 +71,7 @@@ sekuntia sitten Täällä ei ole mitään. Lähetä tänne jotakin! Ladataan… + Tälle tiedostotyypille ei löytynyt sovellusta! Tässä kansiossa ei ole tiedostoja Napauta tiedostoa nähdäksesi lisätietoja. Koko: @@@ -190,11 -189,11 +190,11 @@@ Poista suosikeista Nimeä uudelleen Poista - Haluatko varmasti poistaa kohteen %1$s? + Haluatko varmasti poistaa kohteen %1$s? Haluatko varmasti poistaa kohteen %1$s ja sen sisällön? Vain paikallinen Vain paikallinen - Palvelimelta + Palvelimelta Etä ja paikallinen Poistettu onnistuneesti Poistamista ei voitu suorittaa loppuun asti diff --combined res/values-fr/strings.xml index 4d72b399,f67f654e..f91bb679 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@@ -72,9 -72,8 +72,9 @@@ Téléchargez-le ici : %2$sil y a quelques secondes Il n\'y a rien ici ! Envoyez donc quelque chose :) Chargement... + Aucune app trouvée pour ce type de fichier ! Aucun fichier n\'est présent dans ce dossier. - Appuyez sur un fichier pour afficher les informations supplémentaires + Appuyez sur un fichier pour afficher des informations supplémentaires Taille : Type : Créé le : @@@ -201,14 -200,14 +201,14 @@@ Ci-dessous la liste des fichiers locaux Impossible de s\'authentifier sur ce serveur Le compte n\'existe pas encore sur ce périphérique Ajouter aux favoris - Supprimer des favoris + Retirer des favoris Renommer Supprimer - Voulez-vous vraiment supprimer %1$s ? + Voulez-vous vraiment supprimer %1$s ? Voulez-vous vraiment supprimer %1$s et son contenu ? Local seulement Local seulement - Depuis le serveur + Depuis le serveur Distant & local Suppression effectuée avec succès Suppression impossible @@@ -280,7 -279,7 +280,7 @@@ Envoyer Copier le lien Copié dans le presse-papier - Erreur critique : impossible de réaliser des opérations + Erreur critique : impossible de réaliser les opérations Une erreur est survenue pendant la connexion au serveur. Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée @@@ -299,7 -298,7 +299,7 @@@ Le connexion sécurisée est redirigée vers une route non-sécurisée. Journaux Envoyer l\'historique - Aucune application trouvée pour l\'envoi de journaux. Installer une application de courriel ! + Aucune application trouvée pour l\'envoi de logs. Installer une application de courriel ! Journaux de l\'application Android %1$s Chargement des données… Authentification requise diff --combined res/values-hu-rHU/strings.xml index 2746202d,49d398d8..a94165e9 --- a/res/values-hu-rHU/strings.xml +++ b/res/values-hu-rHU/strings.xml @@@ -11,22 -11,13 +11,22 @@@ Beállítások Részletek Küldjük el + Rendezés + Rendezés elve + + A-Z + Újabb - régebbi + + Összes fájl Beállítások + Naplófájlok + Bezárás Megnyitás Általános Több @@@ -66,7 -57,6 +66,7 @@@ Feltöltés pár másodperce Itt nincs semmi. Töltsön fel valamit! + Betöltés... Nincs fájl ebben a mappában. Érintsen meg egy fájlt a további információkért. Méret: @@@ -177,7 -167,7 +177,7 @@@ Nem kedvenc Átnevezés Eltávolítás - Tényleg el akarod távolítani %1$s? + Tényleg el akarod távolítani %1$s? Tényleg el akarod távolítani a %1$s és tartalmát? Csak a helyi példány Csak a helyi példány @@@ -231,14 -221,11 +231,14 @@@ Videó feltöltés csak WIFI-vel /InstantUpload Mindkettő megtartása + helyi verzió + szerver verzió Előnézeti kép Ez a kép nem jeleníthető meg %1$s nem lehet másolni a %2$s helyi könyvtárba Hiba lépett fel a mappa megosztásakor Hiba lépett fel a mappa megosztásának visszavonásakor + Jelszó beírása Küldjük el Link másolása Bemásolva a vágólapra @@@ -251,17 -238,5 +251,17 @@@ Mozgatás Válasszon Biztonság + megosztva + veled A kiszolgáló címe + Nincs elég memória + Felhasználónév + 1 könyvtár + %1$d könyvtár + 1 fájl + 1 fájl, 1 könyvtár + 1 fájl, %1$d könyvtár + %1$d fájl + %1$d fájl, 1 könyvtár + %1$d fájl, %2$d könyvtár diff --combined res/values-id/strings.xml index 5ed18faa,3f400bc6..3ba812c3 --- a/res/values-id/strings.xml +++ b/res/values-id/strings.xml @@@ -4,7 -4,7 +4,7 @@@ versi %1$s Segarkan akun Unggah - Konten dari apl lain + Konten dari aplikasi lain Berkas Buka dengan Folder baru @@@ -71,7 -71,6 +71,7 @@@ beberapa detik yang lalu Tidak ada apa-apa di sini. Unggah sesuatu! Memuat... + Aplikasi tidak ditemukan untuk tipe berkas ini! Tidak ada satupun berkas dalam folder ini. Sentuh pada berkas untuk menampilkan informasi tambahan Ukuran: @@@ -93,7 -92,7 +93,7 @@@ Simpan & Keluar Kesalahan Memuat ... - Galat tidak diketahui + Kesalahan tidak diketahui Tentang Ubah sandi Hapus akun @@@ -132,7 -131,7 +132,7 @@@ Semua berkas sudah dipindahkan Beberapa berkas tidak dapat dipindahkan Lokal: %1$s - Jauh: %1$s + Remote: %1$s Ruang tidak cukup untuk menyalin berkas terpilih kedalam folder %1$s. Apakah Anda ingin memindahkannya saja? Silakan masukkan kode sandi Anda Masukkan kode sandi Anda @@@ -149,7 -148,7 +149,7 @@@ %1$s pemutaran selesai Tidak ditemukan berkas media Tidak ada akun yang diberikan - Brkas tidak didalam akun yang sah + Berkas tidak didalam akun yang sah Kodek media tidak didukung Berkas media tidak dapat dibaca Berkas media tidak di enkode dengan benar @@@ -199,11 -198,11 +199,11 @@@ Hapus favorit Ubah nama Hapus - Apakah Anda yakin ingin menghapus %1$s? + Apakah Anda yakin ingin menghapus %1$s? Apakah Anda yakin ingin menghapus %1$s dan isinya? Lokal saja Lokal saja - Dari server + Dari server Remot & lokal Penghapusan berhasil Penghapusan gagal diff --combined res/values-it/strings.xml index 49fd5287,5f241540..8efdd438 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@@ -71,7 -71,6 +71,7 @@@ secondi fa Non c\'è niente qui. Carica qualcosa! Caricamento in corso... + Nessuna applicazione trovata per il tipo di file. Non ci sono file in questa cartella. Tocca un file per visualizzare informazioni aggiuntive. Dimensione: @@@ -199,11 -198,11 +199,11 @@@ Rimuovi dai preferiti Rinomina Rimuovi - Vuoi davvero rimuovere %1$s? + Vuoi davvero rimuovere %1$s? Vuoi davvero rimuovere %1$s e il suo contenuto? Solo localmente Solo locale - Dal server + Dal server Remota e locale Rimozione effettuata con successo La rimozione non può essere completata diff --combined res/values-ko/strings.xml index 1876c657,87a6cd1b..2b1e0000 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@@ -71,7 -71,6 +71,7 @@@ 초 지남 내용이 없습니다. 업로드할 수 있습니다! 불러오는 중... + 파일 형식을 열 수 있는 앱이 없습니다! 이 폴더에 파일이 없습니다. 파일을 누르면 추가 정보가 표시됩니다. 크기: @@@ -199,12 -198,10 +199,12 @@@ 책갈피 해제 이름 바꾸기 삭제 - %1$s을(를) 삭제하시겠습니까? + %1$s을(를) 삭제하시겠습니까? %1$s 및 포함된 내용을 삭제하시겠습니까? 로컬만 로컬만 + 서버만 + 서버와 로컬 모두 성공적으로 삭제함 삭제할 수 없음 새 이름 입력 @@@ -250,17 -247,13 +250,17 @@@ 이것은 자리 비움자입니다 placeholder.txt PNG 그림 - 389 KB - 2012/05/18 12:23 PM + 389KB + 2012년 05월 18일 오후 12:23 12:23:45 Wi-Fi 사용 중일때만 사진 업로드 Wi-Fi 사용 중일때만 동영상 업로드 /InstantUpload + 파일 충돌 + 어떤 파일을 유지하시겠습니까? 두 버전을 모두 선택하면 로컬 파일 이름 뒤에 번호가 추가됩니다. 모두 저장 + 로컬 버전 + 서버 버전 사진 미리 보기 이 사진을 미리 ë³¼ 수 없습니다 %1$s을(를) 로컬 폴더 %2$s(으)로 복사할 수 없습니다 @@@ -291,7 -284,6 +291,7 @@@ 이 파일을 서버에서 더 이상 사용할 수 없습니다 계정 계정 추가 + 보안 연결이 보안되지 않는 연결로 전환되었습니다. 로그 과거 기록 보내기 로그를 보낼 앱이 없습니다. 메일 앱을 설치하십시오! @@@ -307,11 -299,7 +307,11 @@@ 파일이 이미 대상 폴더에 존재합니다 이 파일이나 폴더를 이동하는 중 오류가 발생하였습니다 이 파일을 이동할 + 복사할 수 없습니다. 파일이 존재하는 지 확인하십시오 + 폴더를 하위 폴더 아래로 복사할 수 없습니다 파일이 이미 대상 폴더에 존재합니다 + 이 파일이나 폴더를 복사할 수 없습니다. + 이 파일을 복사할 즉시 업로드 보안 동영상 업로드 경로 @@@ -319,7 -307,6 +319,7 @@@ 공유됨 여러분과 %1$s 님이 \"%2$s\" 항목을 여러분과 공유하였습니다 + \"%1$s\"을(를) 여러분과 공유하였습니다 연결 새로 고침 서버 주소 메모리 부족 diff --combined res/values-lt-rLT/strings.xml index 855116d7,cd0dc50a..37e1752a --- a/res/values-lt-rLT/strings.xml +++ b/res/values-lt-rLT/strings.xml @@@ -21,18 -21,14 +21,18 @@@ Biggest - Smallest--> + Visi failai Parinktys + Žurnalai + Užverti Atverti Bendras Daugiau Paskyros Tvarkyti paskyras + Užrakto kodas Momentiniai nuotraukų įkėlimai IÅ¡ karto nusiųsti nufotografuotas nuotraukas Momentiniai video įkėlimai @@@ -49,7 -45,6 +49,7 @@@ Prisiminti bendrinimo vietą Prisiminti paskutinio bendrinimo įkėlimo vietą IÅ¡bandykite %1$s savo iÅ¡maniajame telefone! + Noriu pakviesti tave naudotis %1$s iÅ¡maniajame telefone!\nParsisiųks čia: %2$s Patikrinti Serverį Serverio adresas Prisijungimo vardas @@@ -70,8 -65,6 +70,8 @@@ IÅ¡siunčiama prieÅ¡ sekundę Čia tuščia. Ä®kelkite ką nors! + Ä®keliama... + Nėra programėlės Å¡iam failo tipui! Å iame aplanke nėra failų. Palieskite failą, kad parodyti papildomą informaciją. Dydis: @@@ -81,7 -74,6 +81,7 @@@ Atsisiųsti Atnaujinti failą Ä®kėlimo metu failas buvo pervadintas į %1$s + SąraÅ¡o iÅ¡dėstymas Dalintis nuoroda Nebesidalinti nuoroda Taip @@@ -121,27 -113,14 +121,27 @@@ %1$s sinchronizacija nepavyko Netinkamas slaptažodis %1$s Rastas konfliktas + %1$d sinchronizuojami failai nebuvo susinchronizuoti + Sinchronizuojamų failų klaida Nepavyko sinchronizuoti %1$d failų turinio (%2$d konfliktų) Keli vietiniai failai buvo užmirÅ¡ti + %1$d failai iÅ¡ %2$s aplanko negali bÅ«ti nukopijuoti Aplankas %1$s nebeegzistuoja Perkelti visus Visi failai buvo perkelti Kai kurių failų negalima perkelti Vietinis: %1$s Nuotolinis: %1$s + Pasirinktiems failams nepakanka vietos %1$s aplanke. Gal juos perkelti? + PraÅ¡au įterpti užraktą + Ä®veskite užraktą + Kiekvieną kartą paleidus programėle bus reikalaujamas užraktas + PraÅ¡au pakartoti užraką + Užrakto paÅ¡alinimas + Nesutampa užraktas + Neteisingas užraktas + Užraktas paÅ¡alintas + Užraktas iÅ¡saugotas %1$s muzikos grotuvas %1$s (grojama) %1$s (įkeliama) @@@ -166,10 -145,8 +166,10 @@@ Nėra tinklo ryÅ¡io Saugus prisijungimas negalimas. RyÅ¡ys užmegztas + Bandomas sujungimas Sugadinta serverio konfigÅ«racija To paties vartotojo ir serverio paskyra jau egzistuoja Å¡iame įrenginyje + Ä®vestas vartotojas neatitinka Å¡ios paskyros vartotojo Ä®vyko nežinoma klaida! Nepavyko rasti mazgo Å is serveris netinkamas @@@ -190,19 -167,14 +190,19 @@@ Jungiamasi prie autentikacijos serverio... Serveris nepalaiko Å¡io autentikacijos metodo %1$s nepalaiko kelių paskyrų iÅ¡ karto + Serveris negražina tinkamo vartotojo ID, susisiekite su administratoriumi Jungiamasi prie autentikacijos serverio... + Paskyra neegzistuoja įrenginyje Mėgiamas + Nebemėgti Pervadinti PaÅ¡alinti - Ar tikrai norite paÅ¡alinti %1$s? + Ar tikrai norite paÅ¡alinti %1$s? Ar tikrai norite paÅ¡alinti %1$s ir ten esantį turinį? Tik vietiniai Tik vietiniai + IÅ¡ serverio + IÅ¡orinis & vietinis PaÅ¡alinta sėkmingai PaÅ¡alinti nepavyko Ä®veskite naują pavadinimą @@@ -212,13 -184,11 +212,13 @@@ Failo turinys jau sunchronizuotas Aplanko sukurti nepavyko Neleistini simboliai: / \\ < > : \" | ? * + Failo vardas sudarytas iÅ¡ neleistinų simbolių Failo pavadinimas negali bÅ«ti tuščias Truputį palaukite Netikėta problema ; praÅ¡ome pasirinkti failą iÅ¡ kitos programėlės Joks failas nebuvo pasirinktas Siųsti nuorodą asmeniui ... + Kopijuoti failą iÅ¡ privačios talpyklos Prisijungti naudojant oAuth2 Jungiamasi prie oAuth2 serverio... Serverio tapatybė negali bÅ«ti patikrinta @@@ -245,89 -215,24 +245,89 @@@ Algoritmas: Sertifikatas negali bÅ«ti parodytas. - Nėra informacijos apie klaidą + Rezervas + rezervas.txt PNG paveikslėlis 389 KB 2012/05/18 12:23 PM 12:23:45 Ä®kelti nuotraukas tik kai prisijungiama per WiFi Ä®kelti video tik per WiFi + /InstantUpload + Failų konfliktas + Kuriuos failus palikti? Jei pažymėsite abi versijas, vietinis failas bus pervadintas, pridedant skaičių prie pavadinimo. Palikti abu + Vietinė versija + Versija serveryje Paveikslėlio peržiÅ«ra Neįmanoma parodyti Å¡io paveikslėlio + %1$s negali bÅ«ti nukopijuota į %2$s vietinį katalogą + Ä®kėlimo kelias + AtsipraÅ¡ome, bet serveris nepalaiko dalijimosi. Susisiekite su administratoriumi. + Nepavyko pasidalinti. Patikrinkite ar failas egzistuoja Ä®vyko klaida bandant dalinti šį failą ar aplanką + Nepavyksta nebedalinti. Patikrinkite ar failas egzistuoja Ä®vyko klaida bandant nebedalinti Å¡io failu ar aplanku + Ä®veskite slaptažodį + Slaptažodis privalomas Siųsti Kopijuoti nuorodą Nukopijuota į talpyklę + Kritinė klaida: negalima įvykdyti operacijos + Klaida prisijungiant prie serverio. + Klaida prisijungiant prie serverio, operacija neįvykdyta + Klaida prisijungiant prie serverio, operacija neįvykdyta + Serveris nepasiekiamas, operacija negali bÅ«ti atlikta + Neturite leidimo %s + pervadinti failo + iÅ¡trinti failo + dalintis failu + nebesidalinti failu + sukurti failą + įkelti į aplanką + Failas neegzistuoja serveryje Paskyros + Pridėti paskyrą + Saugus sujungimas nukreiptas per nesaugų kelią + Žurnalai + Siųsti istoriją + Žurnalų siuntimui nėra programėlės. Ä®diekite paÅ¡to programėlę! + %1$s Android žurnalai + Ä®keliama... + Reikalinga autentikacija Neteisingas slaptažodis + perkelti + Nieko nėra. Galite pridėti aplanką! Pasirinkite + Negalima perkelti. PraÅ¡au patikrinti ar failas egzistuoja + Neįmanoma perkelti aplanko į poaplankį + Failas aplanke jau egzistuoja + Klaida perkeliant failą ar aplanką + perkelti šį failą + Nepavyko nukopijuoti. Patikrinkite ar failas egzistuoja + Neįmanoma nukopijuoti aplanko į poaplankį + Failas aplanke jau egzistuoja + Klaida kopijuojant failą ar aplanką + kopijuoti failo + Momentinis įkėlimas Saugumas + Vaizdo įrašų įkėlimo kelias + Nepavyko baigti %1$s atsiuntimo + Dalinamasi + su jumis + %1$s dalinamasi \"%2$s\" su jumis + \"%1$s\" dalinamasi su jumis + Atnaujinti sujungimą Serverio adresas + Nepakanka atminties + Prisijungimo vardas + 1 aplankalas + %1$d aplankalai + 1 failas + 1 failas, 1 aplankalas + 1 failas, %1$d aplankai + %1$d failai + %1$d failai, 1 aplankas + %1$d failai, %2$d aplankai diff --combined res/values-nb-rNO/strings.xml index 9ba35995,d03a1a78..3ea006cb --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@@ -71,7 -71,6 +71,7 @@@ for fÃ¥ sekunder siden Ingenting her. Last opp noe! Laster... + Ingen app funnet for filtypen! Det er ingen filer i denne mappen. Trykk pÃ¥ en fil for Ã¥ vise ekstra informasjon. Størrelse: @@@ -199,11 -198,11 +199,11 @@@ Fjern favoritt Endre navn Fjern - Vil du virkelig fjerne %1$s? + Vil du virkelig fjerne %1$s? Vil du virkelig fjerne %1$s inkludert innholdet? Kun lokalt Kun lokalt - Fra server + Fra server Ekstern & lokal Fjerning var vellykket Fjerning mislyktes diff --combined res/values-nl/strings.xml index 5d35f019,3ba9a0e3..17040b84 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@@ -72,7 -72,6 +72,7 @@@ Download hier: %2$sseconden geleden Er bevindt zich hier niets. Upload een bestand! Laden... + Geen app gevonden voor het bestandstype! Er staan geen bestanden in deze map. Druk op een bestand om extra informatie weer te geven Grootte: @@@ -202,11 -201,11 +202,11 @@@ Hieronder staan de lokale bestanden en Niet meer favoriet Hernoemen Verwijderen - Wilt u %1$s werkelijk verwijderen? + Wilt u %1$s werkelijk verwijderen? Wilt u %1$s en de inhoud ervan werkelijk verwijderen? Alleen lokaal Alleen lokaal - Van server + Van server Extern & lokaal Succesvol verwijderd Verwijdering kon niet voltooid worden diff --combined res/values-oc/strings.xml index 2a97bfa2,f39570db..e4914e63 --- a/res/values-oc/strings.xml +++ b/res/values-oc/strings.xml @@@ -72,7 -72,6 +72,7 @@@ Telecargatz-lo aicí : %2$si a qualques segondas I a pas res aicí ! Mandatz doncas quicòm :) Cargament... + Cap d\'aplicacion pas trobada per aqueste tipe de fichièr ! Cap de fichièr es pas present dins aqueste dorsièr. Quichatz sus un fichièr per afichar las informacions suplementàrias Talha : @@@ -204,11 -203,11 +204,11 @@@ En rason d\'aquesta modificacion, tote Suprimir dels favorits Renomenar Suprimir - Sètz segur que volètz suprimir %1$s ? + Sètz segur que volètz suprimir %1$s ? Sètz segur que volètz suprimir %1$s e son contengut ? Local solament Local solament - Dempuèi lo servidor + Dempuèi lo servidor Distant & local Supression efectuada amb succès Supression impossibla diff --combined res/values-pt-rBR/strings.xml index 302e83ec,f5b8aee5..887543b2 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@@ -71,7 -71,6 +71,7 @@@ segundos atrás Nada aqui. Envie alguma coisa! Carregando... + Nenhum aplicativo encontrado por tipo de arquivo! Não existe nenhum arquivo nesta pasta. Toque em um arquivo para mostrar informações adicionais. Tamanho: @@@ -199,11 -198,11 +199,11 @@@ Nãofavorito Renomear Remover - Você realmente deseja remover %1$s? + Você realmente deseja remover %1$s? Você realmente deseja remover %1$s e seus conteúdos? Somente local Somente local - Do servidor + Do servidor Remoto & local Removido com sucesso Erro ao remover diff --combined res/values-ru/strings.xml index 4bb799a0,2e5acc3a..ef994285 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@@ -72,7 -72,6 +72,7 @@@ несколько секунд назад Здесь ничего нет. Загрузите что-нибудь! Загрузка... + Не найдено приложений для этого типа файла. В этом каталоге нет файлов. Нажмите на файл для отображения дополнительной информации. Размер: @@@ -200,12 -199,10 +200,12 @@@ Убрать из избранного Переименовать Удалить - Вы действительно хотите удалить %1$s? + Вы действительно хотите удалить %1$s? Вы действительно хотите удалить %1$s и его содержимое? Только локально Только локально + От сервера + Удаленно и локально Удаление завершено Ошибка удаления Введите новое имя @@@ -260,8 -257,6 +260,8 @@@ Конфликт файлов Какие файлы Вы хотите сохранить? При выборе обеих версий, к названию локального файла будет добавлена цифра Сохранить оба + локальная версия + удаленная версия Предпросмотр Это изображение не может быть отображено %1$s невозможно скопировать в локальный каталог %2$s @@@ -309,11 -304,7 +309,11 @@@ Файл уже существует в каталоге назначения Произошла ошибка при попытке перемещения этого файла или каталога для перемещения этого файла + Не удалось произвести копирование. Пожалуйста проверьте существование файла + Нельзя произвести копирование папки в унаследованную папку Файл уже существует в каталоге назначения + Произошла ошибка во время копирования этого файла или папки + для копирования этого файла Мгновенные загрузки Безопасность Путь для загрузки Видео diff --combined res/values-sr/strings.xml index 469676f0,8a27ce0f..0c27de85 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@@ -198,7 -198,7 +198,7 @@@ Неомиљени Преименуј Уклони - Желите да уклоните %1$s? + Желите да уклоните %1$s? Желите да уклоните %1$s и њен садржај? Само локално Само локално @@@ -301,7 -301,6 +301,7 @@@ Дошло је до грешке при премештању фајла или фасцикле да преместите овај фајл Фајл већ постоји у одредишној фасцикли + да копирате овај фајл Тренутна отпремања Безбедност Путања отпремања видеа diff --combined res/values-th-rTH/strings.xml index adefdc86,fffe5dc5..e7783952 --- a/res/values-th-rTH/strings.xml +++ b/res/values-th-rTH/strings.xml @@@ -71,7 -71,6 +71,7 @@@ วินาที ก่อนหน้านี้ ยังไม่มีไฟล์ใดๆเลย ลองอัพโหลดดูสิ! กำลังโหลด... + ไม่พบแอพฯ ที่จะใช้เปิดไฟล์ประเภทนี้! ยังไม่มีไฟล์ในโฟลเดอร์นี้ แตะที่ไฟล์ เพื่อแสดงข้อมูลเพิ่มเติม ขนาด: @@@ -198,11 -197,11 +198,11 @@@ ออกจากรายการโปรด เปลี่ยนชื่อ ลบออก - คุณต้องการที่จะลบ %1$s? + คุณต้องการที่จะลบ %1$s? คุณต้องการที่จะลบ %1$s และเนื้อหาของมัน? เฉพาะต้นทางเท่านั้น เฉพาะต้นทางเท่านั้น - จากเซิฟเวอร์ + จากเซิฟเวอร์ รีโมท & ต้นทาง ลบเรียบร้อยแล้ว ไม่สามารถลบได้ diff --combined res/values-tr/strings.xml index 0ad4cfc1,f9ff21c0..090aec60 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@@ -194,15 -194,15 +194,15 @@@ Bu sunucuya karşı kimlik doğrulama yapılamaz Hesap henüz cihazda mevcut değil - Sık kullanılan + Favorilere ekle Favoriden kaldır Yeniden adlandır Kaldır - Gerçekten %1$s dosyasını kaldırmak istiyor musunuz? + Gerçekten %1$s dosyasını kaldırmak istiyor musunuz? Gerçekten %1$s ve içeriğini kaldırmak istediğinizden emin misiniz? Sadece yerel Sadece yerel - Sunucudan + Sunucudan Uzak ve yerel Kaldırma başarılı Kaldırma başarısız @@@ -307,11 -307,7 +307,11 @@@ Dosya zaten hedef klasörde mevcut Bu dosya veya klasörü taşımaya çalışılırken bir hata oluştu bu dosyayı taşımak için + Kopyalama başarısız. Lütfen dosyanın mevcut olup olmadığını denetleyin + Klasörü, kendi alt klasörüne kopyalamak mümkün değil Dosya zaten hedef klasörde mevcut + Bu dosya veya klasörü kopyalamaya çalışılırken bir hata oluştu + bu dosyayı kopyalamak için Anında Yüklemeler Güvenlik Video Yükleme Yolu diff --combined res/values-uk/strings.xml index 3b675534,40106889..44b450da --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@@ -1,6 -1,6 +1,6 @@@ - %1$s Android App + %1$s Android Додаток версія %1$s Оновити account Відвантажити @@@ -32,7 -32,6 +32,7 @@@ Більше Облікові записи Управління обліковими записами + Захистити паролем Миттєві зображення Миттєві зображення з камери Миттєві відео @@@ -71,7 -70,6 +71,7 @@@ секунди тому Тут нічого немає. Відвантажте що-небудь! Завантаження… + Застосунку для цього типу файла не знайдено! В цій теці немає файлів. Натисніть на файлі для відображення додаткової інформації Розмір: @@@ -81,7 -79,6 +81,7 @@@ Завантажити Оновити файл Файл був переіменований в %1$s протягом вивантаження + Вигляд списку Опублікувати посилання Видалити посилання Так @@@ -134,15 -131,6 +134,15 @@@ Локально: %1$s Віддалено: %1$s Недостатньо місця для копіювання обраних файлів у теку %1$s. Чи бажаєте ви перемістити їх замість копіювання? + Будь ласка, введіть Ваш код доступу + Введіть Ваш код доступу + Код доступу буде запрошено кожного разу після завантаження додатку + Будь ласка, введіть код доступу повторно + Видалити пароль + Коди доступу не співпадають + Невірний код доступу + Код доступу знято + Код доступу збережено %1$s музичний плеєр %1$s (відтворення) %1$s (завантаження) @@@ -196,15 -184,12 +196,15 @@@ Аутентифікація на цьому сервері неможлива Користвача в пристрої не існуе Улюблений + Прибрати з вибраного Перейменувати Видалити - Ви дійсно бажаєте видалити %1$s? + Ви дійсно бажаєте видалити %1$s? Ви дійсно бажаєте видалити %1$s та весь вміст? Лише локально Лише локально + З серверу + Видалити & локальний Успішно видалено Видалення не вдалось Введіть нове ім\'я @@@ -256,11 -241,7 +256,11 @@@ Завантажувати зображення тільки через WiFi Завантажувати відео тільки через WiFi /InstantUpload + Конфлікт файлу + Які файли Ви хочете зберегти? Якщо Ви оберете обидві версії, локальний файл матиме номер, що додається до його імені. Залишити обидва + Локальна версія + Версія сервера Попередній перегляд зображення Не вдалося показати зображення %1$s неможливо скопіювати до %2$s @@@ -307,19 -288,13 +307,19 @@@ Файл вже існує в теці призначення Виникла помилка при спробі перемістити файл або теку перемістити цей файл + Неможливо скопіювати. Будь ласка, перевірте, чи існує файл + Неможливо копіювати теку до підтеки Файл вже існує в теці призначення + Виникла помилка під час спроби скопіювати даний файл чи папку + скопіювати даний файл Миттєво завантаження Безпека Шлях завантаження відео Скачування теки %1$s не може бути завершено + поширений з Вами %1$s поділився \"%2$s\" з вами + З Вами поділилися \"%1$s\" Оновити з\'єднання Ареса серверу Недостатньо пам\'яті diff --combined res/values-zh-rCN/strings.xml index 74eb868f,e485cb18..47aed775 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@@ -71,7 -71,6 +71,7 @@@ 几秒前 这里还什么都没有。上传些东西吧! 加载中... + 找不到用于打开此类型文件的应用 在该文件夹中不存在文件。 点击一个文件可以显示额外的信息。 大小: @@@ -199,11 -198,11 +199,11 @@@ 取消收藏 重命名 删除 - 你确定要删除 %1$s 吗? + 你确定要删除 %1$s 吗? 您确定要删除 %1$s 及其内容吗? 仅本地 仅本地 - 来自服务器 + 来自服务器 远程 & 本地 成功删除 无法完成删除 @@@ -307,11 -306,7 +307,11 @@@ 该文件已经存在在目标文件夹 尝试移动该文件或文件夹时发生错误 移动该文件 + 无法复制文件。请检查文件是否存在 + 将一个目录移动到它的子目录是不可能的 该文件已经存在在目标文件夹 + 尝试复制这个文件或文件夹时发生了错误 + 复制这个文件 即时上传 安全 视频上传路径 diff --combined res/values/setup.xml index 5c775e92,f10a3b7e..1bd4eee0 --- a/res/values/setup.xml +++ b/res/values/setup.xml @@@ -1,12 -1,12 +1,12 @@@ - ownCloud + Owncloud Beta owncloud org.owncloud - owncloud.db + owncloud-beta.db ownCloud - owncloud + owncloud-beta Owncloud_ ownCloud Mozilla/5.0 (Android) ownCloud-android/%1$s @@@ -30,7 -30,7 +30,7 @@@ #FFFFFF #FFFFFF - #F7F7F7 + #FFFFFF #1D2D44 #1D2D44 diff --combined res/values/strings.xml index 70d00408,ef912938..d73dd573 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@@ -23,7 -23,8 +23,7 @@@ All files - + On device Settings Logs Close @@@ -73,7 -74,6 +73,7 @@@ seconds ago Nothing in here. Upload something! Loading… + No App found for file type! There are no files in this folder. Tap on a file to display additional information. Size: @@@ -205,11 -205,11 +205,11 @@@ Unfavorite Rename Remove - "Do you really want to remove %1$s?" + "Do you really want to remove %1$s?" "Do you really want to remove %1$s and its contents?" Local only Local only - From server + From server Remote & local "Removal succeeded" "Removal failed" @@@ -262,11 -262,9 +262,11 @@@ 389 KB 2012/05/18 12:23 PM 12:23:45 - - Upload pictures via WiFi only - Upload videos via WiFi only + + Upload pictures via wifi only + Upload when charging only + Upload videos via wifi only + Upload when charging only /InstantUpload File conflict Which files do you want to keep? If you select both versions, the local file will have a number added to its name. @@@ -278,7 -276,7 +278,7 @@@ This image cannot be shown %1$s could not be copied to %2$s local folder - Upload Path + Upload path Sorry, sharing is not enabled on your server. Please contact your administrator. @@@ -343,7 -341,7 +343,7 @@@ Instant Uploads Security - Upload Video Path + Upload video path Download of %1$s folder could not be completed shared @@@ -366,18 -364,8 +366,21 @@@ %1$d files %1$d files, 1 folder %1$d files, %2$d folders + Switch to grid view + Switch to list view + Common + Cache size + Upload file to server and ... + Behaviour + Copy file + Move file + + do nothing + copy file to OC folder + move file to OC folder + delete origin file + Do you really want to remove selected items? + Do you really want to remove a folder and its content? + selected items diff --combined src/com/owncloud/android/datamodel/OCFile.java index 0c7cc714,9e77f0d1..1c2ec265 --- a/src/com/owncloud/android/datamodel/OCFile.java +++ b/src/com/owncloud/android/datamodel/OCFile.java @@@ -27,18 -27,16 +27,15 @@@ import android.webkit.MimeTypeMap import com.owncloud.android.lib.common.utils.Log_OC; import java.io.File; - import java.util.Enumeration; -import java.io.Serializable; import third_parties.daveKoeller.AlphanumComparator; public class OCFile implements Parcelable, Comparable { - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public OCFile createFromParcel(Parcel source) { return new OCFile(source); } - @Override public OCFile[] newArray(int size) { return new OCFile[size]; } @@@ -75,8 -73,6 +72,8 @@@ private boolean mIsDownloading; + private boolean mShowGridView; + /** * Create new {@link OCFile} with given path. diff --combined src/com/owncloud/android/files/FileOperationsHelper.java index 88cc8843,55368f43..51d447e1 --- a/src/com/owncloud/android/files/FileOperationsHelper.java +++ b/src/com/owncloud/android/files/FileOperationsHelper.java @@@ -22,22 -22,15 +22,22 @@@ package com.owncloud.android.files; import android.accounts.Account; +import android.content.ActivityNotFoundException; +import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; import android.net.Uri; import android.support.v4.app.DialogFragment; import android.webkit.MimeTypeMap; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.lib.common.network.WebdavUtils; @@@ -46,19 -39,12 +46,21 @@@ import com.owncloud.android.lib.resourc import com.owncloud.android.services.OperationsService; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.ui.activity.FileActivity; +import com.owncloud.android.ui.adapter.DiskLruImageCacheFileProvider; import com.owncloud.android.ui.dialog.ShareLinkToDialog; import org.apache.http.protocol.HTTP; +import java.util.List; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + + import java.util.ArrayList; + /** * */ @@@ -102,46 -88,21 +104,46 @@@ public class FileOperationsHelper ); } } - - Intent chooserIntent; + + Intent openFileWithIntent; if (intentForGuessedMimeType != null) { - chooserIntent = Intent.createChooser(intentForGuessedMimeType, mFileActivity.getString(R.string.actionbar_open_with)); + openFileWithIntent = intentForGuessedMimeType; } else { - chooserIntent = Intent.createChooser(intentForSavedMimeType, mFileActivity.getString(R.string.actionbar_open_with)); + openFileWithIntent = intentForSavedMimeType; } - mFileActivity.startActivity(chooserIntent); + List launchables = mFileActivity.getPackageManager(). + queryIntentActivities(openFileWithIntent, PackageManager.GET_INTENT_FILTERS); + + if(launchables != null && launchables.size() > 0) { + try { + mFileActivity.startActivity( + Intent.createChooser( + openFileWithIntent, mFileActivity.getString(R.string.actionbar_open_with) + ) + ); + } catch (ActivityNotFoundException anfe) { + showNoAppForFileTypeToast(mFileActivity.getApplicationContext()); + } + } else { + showNoAppForFileTypeToast(mFileActivity.getApplicationContext()); + } } else { Log_OC.wtf(TAG, "Trying to open a NULL OCFile"); } } + /** + * Displays a toast stating that no application could be found to open the file. + * + * @param context the context to be able to show a toast. + */ + private void showNoAppForFileTypeToast(Context context) { + Toast.makeText(context, + R.string.file_list_no_app_for_file_type, Toast.LENGTH_SHORT) + .show(); + } public void shareFileWithLink(OCFile file) { @@@ -246,28 -207,14 +248,32 @@@ } } + public void sendCachedImage(OCFile file) { + if (file != null) { + Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND); + // set MimeType + sendIntent.setType(file.getMimetype()); +// sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + DiskLruImageCacheFileProvider.AUTHORITY + "/#" + file.getRemoteId() + "#" + file.getFileName())); + sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + DiskLruImageCacheFileProvider.AUTHORITY + file.getRemotePath())); + sendIntent.putExtra(Intent.ACTION_SEND, true); // Send Action + + // Show dialog, without the own app + String[] packagesToExclude = new String[] { mFileActivity.getPackageName() }; + DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file); + chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG); + } else { + Log_OC.wtf(TAG, "Trying to send a NULL OCFile"); + } + } + + public void syncFiles(ArrayList files) { + for (OCFile file: files) { + syncFile(file); + } + } public void syncFile(OCFile file) { - - if (!file.isFolder()){ + if (!file.isFolder()) { Intent intent = new Intent(mFileActivity, OperationsService.class); intent.setAction(OperationsService.ACTION_SYNC_FILE); intent.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); @@@ -275,7 -222,7 +281,7 @@@ intent.putExtra(OperationsService.EXTRA_SYNC_FILE_CONTENTS, true); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(intent); mFileActivity.showLoadingDialog(); - + } else { Intent intent = new Intent(mFileActivity, OperationsService.class); intent.setAction(OperationsService.ACTION_SYNC_FOLDER); @@@ -285,6 -232,12 +291,12 @@@ } } + public void toggleFavorites(ArrayList files, boolean isFavorite){ + for (OCFile file: files) { + toggleFavorite(file, isFavorite); + } + } + public void toggleFavorite(OCFile file, boolean isFavorite) { file.setFavorite(isFavorite); mFileActivity.getStorageManager().saveFile(file); @@@ -388,7 -341,8 +400,8 @@@ service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); - mFileActivity.showLoadingDialog(); + // TODO Tobi loading dialog? + // mFileActivity.showLoadingDialog(); } /** diff --combined src/com/owncloud/android/ui/activity/FileActivity.java index ae75fde9,d74a4a6e..693a9970 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@@ -363,7 -363,12 +363,7 @@@ public class FileActivity extends AppCo // } // Display username in drawer - Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); - if (account != null) { - TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username); - int lastAtPos = account.name.lastIndexOf("@"); - username.setText(account.name.substring(0, lastAtPos)); - } + setUsernameInDrawer(navigationDrawerLayout, AccountUtils.getCurrentOwnCloudAccount(getApplicationContext())); // load slide menu items mDrawerTitles = getResources().getStringArray(R.array.drawer_items); @@@ -383,17 -388,18 +383,17 @@@ mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[0], mDrawerContentDescriptions[0], R.drawable.ic_folder_open)); - // TODO Enable when "On Device" is recovered // On Device - //mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2], - // mDrawerContentDescriptions[2])); + mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[1], mDrawerContentDescriptions[1], + R.drawable.ic_action_download_grey)); // Settings - mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[1], mDrawerContentDescriptions[1], - R.drawable.ic_settings)); + mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2], mDrawerContentDescriptions[2], + R.drawable.ic_action_settings)); // Logs if (BuildConfig.DEBUG) { - mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2], - mDrawerContentDescriptions[2],R.drawable.ic_log)); + mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[3], + mDrawerContentDescriptions[3],R.drawable.ic_log)); } // setting the nav drawer list adapter @@@ -429,21 -435,6 +429,21 @@@ } /** + * sets the given account name in the drawer in case the drawer is available. The account name + * is shortened beginning from the @-sign in the username. + * + * @param navigationDrawerLayout the drawer layout to be used + * @param account the account to be set in the drawer + */ + protected void setUsernameInDrawer(RelativeLayout navigationDrawerLayout, Account account) { + if (navigationDrawerLayout != null && getAccount() != null) { + TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username); + int lastAtPos = account.name.lastIndexOf("@"); + username.setText(account.name.substring(0, lastAtPos)); + } + } + + /** * Updates title bar and home buttons (state and icon). * * Assumes that navigation drawer is NOT visible. @@@ -856,11 -847,15 +856,15 @@@ */ public void showLoadingDialog() { // Construct dialog - LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); - FragmentManager fm = getSupportFragmentManager(); - FragmentTransaction ft = fm.beginTransaction(); - loading.show(ft, DIALOG_WAIT_TAG); - + Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); + if (frag == null) { + Log_OC.d(TAG, "show loading dialog"); + LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); + FragmentManager fm = getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + loading.show(ft, DIALOG_WAIT_TAG); + fm.executePendingTransactions(); + } } @@@ -870,6 -865,7 +874,7 @@@ public void dismissLoadingDialog() { Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); if (frag != null) { + Log_OC.d(TAG, "dismiss loading dialog"); LoadingDialog loading = (LoadingDialog) frag; loading.dismiss(); } @@@ -939,12 -935,6 +944,12 @@@ startActivity(i); } + public void refresh(){ + Intent i = new Intent(this, FileDisplayActivity.class); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(i); + } + // TODO re-enable when "Accounts" is available in Navigation Drawer // public void closeDrawer() { // mDrawerLayout.closeDrawers(); @@@ -954,10 -944,6 +959,10 @@@ restart(); } + public void refreshDirectory(){ + // overridden by FileDisplayActivity + } + private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { @@@ -974,25 -960,24 +979,25 @@@ // break; case 0: // All Files - allFilesOption(); + MainApp.showOnlyFilesOnDevice(false); + refreshDirectory(); mDrawerLayout.closeDrawers(); break; - // TODO Enable when "On Device" is recovered ? -// case 2: -// MainApp.showOnlyFilesOnDevice(true); -// mDrawerLayout.closeDrawers(); -// break; + case 1: // On Device + MainApp.showOnlyFilesOnDevice(true); + refreshDirectory(); + mDrawerLayout.closeDrawers(); + break; - case 1: // Settings + case 2: // Settings Intent settingsIntent = new Intent(getApplicationContext(), Preferences.class); startActivity(settingsIntent); mDrawerLayout.closeDrawers(); break; - case 2: // Logs + case 3: // Logs Intent loggerIntent = new Intent(getApplicationContext(), LogHistoryActivity.class); startActivity(loggerIntent); diff --combined src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 3e9aa659,cf9b29bc..ec214a5e --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@@ -26,6 -26,7 +26,7 @@@ import android.accounts.Account import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.annotation.TargetApi; + import android.os.Parcelable; import android.support.v7.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.ComponentName; @@@ -107,6 -108,8 +108,8 @@@ import com.owncloud.android.utils.FileS import com.owncloud.android.utils.UriUtils; import java.io.File; + import java.util.ArrayList; + import java.util.Iterator; /** * Displays, what files the user has available in his ownCloud. @@@ -149,14 -152,13 +152,14 @@@ public class FileDisplayActivity extend private boolean mSyncInProgress = false; private static String DIALOG_UNTRUSTED_CERT = "DIALOG_UNTRUSTED_CERT"; - private static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER"; + public static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER"; private static String DIALOG_UPLOAD_SOURCE = "DIALOG_UPLOAD_SOURCE"; private static String DIALOG_CERT_NOT_SAVED = "DIALOG_CERT_NOT_SAVED"; private OCFile mWaitingToSend; + private Menu mOptionsMenu; + - @Override protected void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); @@@ -266,7 -268,12 +269,7 @@@ setFile(file); if (mAccountWasSet) { - RelativeLayout navigationDrawerLayout = (RelativeLayout) findViewById(R.id.left_drawer); - if (navigationDrawerLayout != null && getAccount() != null) { - TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username); - int lastAtPos = getAccount().name.lastIndexOf("@"); - username.setText(getAccount().name.substring(0, lastAtPos)); - } + setUsernameInDrawer((RelativeLayout) findViewById(R.id.left_drawer), getAccount()); } if (!stateWasRecovered) { @@@ -295,7 -302,10 +298,7 @@@ /// First fragment OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { - listOfFiles.listDirectory(getCurrentDir()); - // TODO Enable when "On Device" is recovered - // listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice()); - + listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice()); } else { Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >("); } @@@ -314,12 -324,6 +317,12 @@@ startTextPreview(file); } + if (DisplayUtils.isGridView(getFile(), getStorageManager())){ + switchToGridView(); + } else { + switchToListView(); + } + } else { Log_OC.wtf(TAG, "initFragments() called with invalid NULLs!"); if (getAccount() == null) { @@@ -430,7 -434,9 +433,7 @@@ protected void refreshListOfFilesFragment() { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(); - // TODO Enable when "On Device" is recovered ? - // fileListFragment.listDirectory(MainApp.getOnlyOnDevice()); + fileListFragment.listDirectory(MainApp.getOnlyOnDevice()); } } @@@ -482,9 -488,10 +485,9 @@@ @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean drawerOpen = mDrawerLayout.isDrawerOpen(GravityCompat.START); - menu.findItem(R.id.action_upload).setVisible(!drawerOpen); - menu.findItem(R.id.action_create_dir).setVisible(!drawerOpen); menu.findItem(R.id.action_sort).setVisible(!drawerOpen); menu.findItem(R.id.action_sync_account).setVisible(!drawerOpen); + menu.findItem(R.id.action_switch_view).setVisible(!drawerOpen); return super.onPrepareOptionsMenu(menu); } @@@ -493,13 -500,6 +496,13 @@@ public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); + menu.findItem(R.id.action_create_dir).setVisible(false); + mOptionsMenu = menu; + + MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view); + + changeGridIcon(); + return true; } @@@ -508,10 -508,23 +511,10 @@@ public boolean onOptionsItemSelected(MenuItem item) { boolean retval = true; switch (item.getItemId()) { - case R.id.action_create_dir: { - CreateFolderDialogFragment dialog = - CreateFolderDialogFragment.newInstance(getCurrentDir()); - dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER); - break; - } - case R.id.action_sync_account: { startSynchronization(); break; } - case R.id.action_upload: { - UploadSourceDialogFragment dialog = - UploadSourceDialogFragment.newInstance(getAccount()); - dialog.show(getSupportFragmentManager(), DIALOG_UPLOAD_SOURCE); - break; - } case android.R.id.home: { FileFragment second = getSecondFragment(); OCFile currentDir = getCurrentDir(); @@@ -554,57 -567,12 +557,57 @@@ builder.create().show(); break; } + case R.id.action_switch_view:{ + if (isGridView()){ + item.setTitle(getApplicationContext().getString(R.string.action_switch_grid_view)); + item.setIcon(ContextCompat.getDrawable(getApplicationContext(), + R.drawable.ic_view_module)); + DisplayUtils.setViewMode(getFile(), false); + switchToListView(); + } else { + item.setTitle(getApplicationContext().getString(R.string.action_switch_list_view)); + item.setIcon(ContextCompat.getDrawable(getApplicationContext(), + R.drawable.ic_view_list)); + DisplayUtils.setViewMode(getFile(), true); + switchToGridView(); + } + + return true; + } default: retval = super.onOptionsItemSelected(item); } return retval; } + public void createFolder() { + CreateFolderDialogFragment dialog = + CreateFolderDialogFragment.newInstance(getCurrentDir()); + dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER); + } + + public void uploadLocalFilesSelected() { + Intent action = new Intent(this, UploadFilesActivity.class); + action.putExtra( + UploadFilesActivity.EXTRA_ACCOUNT, + getAccount() + ); + startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES); + } + + public void uploadFromOtherAppsSelected() { + Intent action = new Intent(Intent.ACTION_GET_CONTENT); + action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE); + //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } + startActivityForResult( + Intent.createChooser(action, getString(R.string.upload_chooser_title)), + ACTION_SELECT_CONTENT_FROM_APPS + ); + } + private void startSynchronization() { Log_OC.d(TAG, "Got to start sync"); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) { @@@ -799,8 -767,12 +802,12 @@@ */ private void requestMoveOperation(Intent data, int resultCode) { OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); - OCFile targetFile = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE); - getFileOperationsHelper().moveFile(folderToMoveAt, targetFile); + + ArrayList files = data.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES); + + for (Parcelable file : files) { + getFileOperationsHelper().moveFile(folderToMoveAt, (OCFile) file); + } } /** @@@ -811,32 -783,17 +818,36 @@@ */ private void requestCopyOperation(Intent data, int resultCode) { OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); - OCFile targetFile = data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE); - getFileOperationsHelper().copyFile(folderToMoveAt, targetFile); + + ArrayList files = data.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES); + + for (Parcelable file : files) { + getFileOperationsHelper().copyFile(folderToMoveAt, (OCFile) file); + } } @Override public void onBackPressed() { - if (!isDrawerOpen()){ + boolean isFabOpen = isFabOpen(); + boolean isDrawerOpen = isDrawerOpen(); + + /* + * BackPressed priority/hierarchy: + * 1. close drawer if opened + * 2. close FAB if open (only if drawer isn't open) + * 3. navigate up (only if drawer and FAB aren't open) + */ + if(isDrawerOpen && isFabOpen) { + // close drawer first + super.onBackPressed(); + } else if(isDrawerOpen && !isFabOpen) { + // close drawer + super.onBackPressed(); + } else if (!isDrawerOpen && isFabOpen) { + // close fab + getListOfFilesFragment().getFabMain().collapse(); + } else { + // all closed OCFileListFragment listOfFiles = getListOfFilesFragment(); if (mDualPane || getSecondFragment() == null) { OCFile currentDir = getCurrentDir(); @@@ -852,20 -809,8 +863,20 @@@ setFile(listOfFiles.getCurrentFile()); } cleanSecondFragment(); + changeGridIcon(); + } + } + + private void changeGridIcon(){ + MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view); + if (DisplayUtils.isGridView(getFile(), getStorageManager())){ + menuItem.setTitle(getApplicationContext().getString(R.string.action_switch_list_view)); + menuItem.setIcon(ContextCompat.getDrawable(getApplicationContext(), + R.drawable.ic_view_list)); } else { - super.onBackPressed(); + menuItem.setTitle(getApplicationContext().getString(R.string.action_switch_grid_view)); + menuItem.setIcon(ContextCompat.getDrawable(getApplicationContext(), + R.drawable.ic_view_module)); } } @@@ -944,14 -889,6 +955,14 @@@ Log_OC.v(TAG, "onPause() end"); } + public boolean isFabOpen() { + if(getListOfFilesFragment() != null && getListOfFilesFragment().getFabMain() != null && getListOfFilesFragment().getFabMain().isExpanded()) { + return true; + } else { + return false; + } + } + private class SyncBroadcastReceiver extends BroadcastReceiver { @@@ -1007,8 -944,10 +1018,8 @@@ currentDir.getRemotePath().equals(synchFolderRemotePath)) { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(); - // TODO Enable when "On Device" is recovered ? - // fileListFragment.listDirectory(currentDir, - // MainApp.getOnlyOnDevice()); + fileListFragment.listDirectory(currentDir, + MainApp.getOnlyOnDevice()); } } setFile(currentFile); @@@ -1251,7 -1190,9 +1262,7 @@@ OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { // should never be null, indeed OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH); - listOfFiles.listDirectory(root); - // TODO Enable when "On Device" is recovered ? - // listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice()); + listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice()); setFile(listOfFiles.getCurrentFile()); startSyncFolderOperation(root, false); } @@@ -1270,15 -1211,6 +1281,15 @@@ cleanSecondFragment(); // Sync Folder startSyncFolderOperation(directory, false); + + MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view); + + changeGridIcon(); + if (DisplayUtils.isGridView(directory, getStorageManager())){ + switchToGridView(); + } else { + switchToListView(); + } } /** @@@ -1345,7 -1277,9 +1356,7 @@@ // getFileDownloadBinder() - THIS IS A MESS OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { - listOfFiles.listDirectory(); - // TODO Enable when "On Device" is recovered ? - // listOfFiles.listDirectory(MainApp.getOnlyOnDevice()); + listOfFiles.listDirectory(MainApp.getOnlyOnDevice()); } FileFragment secondFragment = getSecondFragment(); if (secondFragment != null && secondFragment instanceof FileDetailFragment) { @@@ -1618,7 -1552,6 +1629,7 @@@ OCFile syncedFile = operation.getLocalFile(); onTransferStateChanged(syncedFile, true, true); invalidateOptionsMenu(); + refreshShowDetails(); } } } @@@ -1874,19 -1807,8 +1885,19 @@@ private void sortByName(boolean ascending) { getListOfFilesFragment().sortByName(ascending); } + private boolean isGridView(){ return getListOfFilesFragment().isGridView(); } + private void switchToGridView() { + getListOfFilesFragment().switchToGridView(); + } + private void switchToListView() { + getListOfFilesFragment().switchToListView(); + } public void allFilesOption() { browseToRoot(); } + + public void refreshDirectory(){ + getListOfFilesFragment().refreshDirectory(); + } } diff --combined src/com/owncloud/android/ui/activity/FolderPickerActivity.java index bb587e0f,56daee72..ff12db6b --- a/src/com/owncloud/android/ui/activity/FolderPickerActivity.java +++ b/src/com/owncloud/android/ui/activity/FolderPickerActivity.java @@@ -62,6 -62,8 +62,8 @@@ import com.owncloud.android.ui.fragment import com.owncloud.android.ui.fragment.OCFileListFragment; import com.owncloud.android.utils.ErrorMessageAdapter; + import java.util.ArrayList; + public class FolderPickerActivity extends FileActivity implements FileFragment.ContainerActivity, OnClickListener, OnEnforceableRefreshListener { @@@ -69,6 -71,8 +71,8 @@@ + ".EXTRA_FOLDER"; public static final String EXTRA_FILE = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_FILE"; + public static final String EXTRA_FILES = UploadFilesActivity.class.getCanonicalName() + + ".EXTRA_FILES"; //TODO: Think something better private SyncBroadcastReceiver mSyncBroadcastReceiver; @@@ -141,7 -145,7 +145,7 @@@ if (!stateWasRecovered) { OCFileListFragment listOfFolders = getListOfFilesFragment(); - listOfFolders.listDirectory(folder/*, false*/); + listOfFolders.listDirectory(folder, false); startSyncFolderOperation(folder, false); } @@@ -155,7 -159,6 +159,7 @@@ Bundle args = new Bundle(); args.putBoolean(OCFileListFragment.ARG_JUST_FOLDERS, true); args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, false); + args.putBoolean(OCFileListFragment.ARG_HIDE_FAB, true); listOfFiles.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.add(R.id.fragment_container, listOfFiles, TAG_LIST_OF_FOLDERS); @@@ -264,6 -267,7 +268,6 @@@ public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); - menu.findItem(R.id.action_upload).setVisible(false); menu.findItem(R.id.action_sort).setVisible(false); return true; } @@@ -310,7 -314,9 +314,7 @@@ protected void refreshListOfFilesFragment() { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(); - // TODO Enable when "On Device" is recovered ? - // fileListFragment.listDirectory(false); + fileListFragment.listDirectory(false); } } @@@ -318,7 -324,9 +322,7 @@@ OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { // should never be null, indeed OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH); - listOfFiles.listDirectory(root); - // TODO Enable when "On Device" is recovered ? - // listOfFiles.listDirectory(root, false); + listOfFiles.listDirectory(root, false); setFile(listOfFiles.getCurrentFile()); updateNavigationElementsInActionBar(); startSyncFolderOperation(root, false); @@@ -369,12 -377,16 +373,16 @@@ } else if (v == mChooseBtn) { Intent i = getIntent(); Parcelable targetFile = i.getParcelableExtra(FolderPickerActivity.EXTRA_FILE); + ArrayList targetFiles = i.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES); Intent data = new Intent(); data.putExtra(EXTRA_FOLDER, getCurrentFolder()); if (targetFile != null) { data.putExtra(EXTRA_FILE, targetFile); } + if (targetFiles != null){ + data.putParcelableArrayListExtra(EXTRA_FILES, targetFiles); + } setResult(RESULT_OK, data); finish(); } @@@ -470,7 -482,9 +478,7 @@@ equals(synchFolderRemotePath)) { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(currentDir); - // TODO Enable when "On Device" is recovered ? - // fileListFragment.listDirectory(currentDir, false); + fileListFragment.listDirectory(currentDir, false); } } setFile(currentFile); diff --combined src/com/owncloud/android/ui/adapter/FileListListAdapter.java index ab596c96,272a7ffc..97724046 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@@ -25,12 -25,16 +25,16 @@@ package com.owncloud.android.ui.adapter import java.io.File; + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Map; import java.util.Vector; import android.accounts.Account; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; + import android.graphics.Color; import android.os.Build; import android.preference.PreferenceManager; import android.text.format.DateUtils; @@@ -79,6 -83,8 +83,8 @@@ public class FileListListAdapter extend private enum ViewType {LIST_ITEM, GRID_IMAGE, GRID_ITEM }; private SharedPreferences mAppPreferences; + + private HashMap mSelection = new HashMap(); public FileListListAdapter( boolean justFolders, @@@ -154,7 -160,7 +160,7 @@@ ViewType viewType; if (!mGridMode){ viewType = ViewType.LIST_ITEM; - } else if (file.isImage()){ + } else if (file.isImage() || file.isVideo()){ viewType = ViewType.GRID_IMAGE; } else { viewType = ViewType.GRID_ITEM; @@@ -194,38 -200,35 +200,37 @@@ switch (viewType){ case LIST_ITEM: TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); + TextView fileSizeSeparatorV = (TextView) view.findViewById(R.id.file_separator); TextView lastModV = (TextView) view.findViewById(R.id.last_mod); - ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); + lastModV.setVisibility(View.VISIBLE); lastModV.setText(showRelativeTimestamp(file)); - checkBoxV.setVisibility(View.GONE); - + fileSizeSeparatorV.setVisibility(View.VISIBLE); fileSizeV.setVisibility(View.VISIBLE); fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); if (!file.isFolder()) { -// AbsListView parentList = (AbsListView)parent; -// if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { -// if (parentList.getChoiceMode() == AbsListView.CHOICE_MODE_NONE) { -// checkBoxV.setVisibility(View.GONE); -// } else { -// if (parentList.isItemChecked(position)) { -// checkBoxV.setImageResource( -// android.R.drawable.checkbox_on_background); -// } else { -// checkBoxV.setImageResource( -// android.R.drawable.checkbox_off_background); -// } -// checkBoxV.setVisibility(View.VISIBLE); -// } -// } + AbsListView parentList = (AbsListView)parent; + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (parentList.getChoiceMode() == AbsListView.CHOICE_MODE_NONE) { + checkBoxV.setVisibility(View.GONE); + } else { + if (parentList.isItemChecked(position)) { + checkBoxV.setImageResource( + R.drawable.ic_checkbox_marked); + } else { + checkBoxV.setImageResource( + R.drawable.ic_checkbox_blank_outline); + } + checkBoxV.setVisibility(View.VISIBLE); + } + } } else { //Folder + fileSizeSeparatorV.setVisibility(View.INVISIBLE); fileSizeV.setVisibility(View.INVISIBLE); } @@@ -285,6 -288,25 +290,25 @@@ break; } + + ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); + checkBoxV.setVisibility(View.GONE); + + AbsListView parentList = (AbsListView)parent; + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (parentList.getChoiceMode() == AbsListView.CHOICE_MODE_NONE) { + checkBoxV.setVisibility(View.GONE); + } else if (parentList.getCheckedItemCount() > 0){ + if (parentList.isItemChecked(position)) { + checkBoxV.setImageResource( + android.R.drawable.checkbox_on_background); + } else { + checkBoxV.setImageResource( + android.R.drawable.checkbox_off_background); + } + checkBoxV.setVisibility(View.VISIBLE); + } + } // For all Views @@@ -322,7 -344,7 +346,7 @@@ task ); fileIcon.setImageDrawable(asyncDrawable); - task.execute(file); + task.execute(file, true); } } @@@ -345,6 -367,12 +369,12 @@@ } } + if (mSelection.get(position) != null) { + view.setBackgroundColor(Color.rgb(248, 248, 248)); + } else { + view.setBackgroundColor(Color.WHITE); + } + return view; } @@@ -411,14 -439,15 +441,14 @@@ * mStorageManager if is different (and not NULL) */ public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager - /*, boolean onlyOnDevice*/) { + , boolean onlyOnDevice) { mFile = directory; if (updatedStorageManager != null && updatedStorageManager != mStorageManager) { mStorageManager = updatedStorageManager; mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); } if (mStorageManager != null) { - // TODO Enable when "On Device" is recovered ? - mFiles = mStorageManager.getFolderContent(mFile/*, onlyOnDevice*/); + mFiles = mStorageManager.getFolderContent(mFile, onlyOnDevice); mFilesOrig.clear(); mFilesOrig.addAll(mFiles); @@@ -429,7 -458,7 +459,7 @@@ mFiles = null; } - mFiles = FileStorageUtils.sortFolder(mFiles); + mFiles = FileStorageUtils.sortOcFolder(mFiles); notifyDataSetChanged(); } @@@ -476,7 -505,7 +506,7 @@@ FileStorageUtils.mSortAscending = ascending; - mFiles = FileStorageUtils.sortFolder(mFiles); + mFiles = FileStorageUtils.sortOcFolder(mFiles); notifyDataSetChanged(); } @@@ -490,7 -519,40 +520,44 @@@ mGridMode = gridMode; } + public boolean isGridMode() { + return mGridMode; + } ++ + public void setNewSelection(int position, boolean checked) { + mSelection.put(position, checked); + notifyDataSetChanged(); + } + + public void removeSelection(int position) { + mSelection.remove(position); + notifyDataSetChanged(); + } + + public void removeSelection(){ + mSelection.clear(); + notifyDataSetChanged(); + } + + public ArrayList getCheckedItemPositions() { + ArrayList ids = new ArrayList(); + + for (Map.Entry entry : mSelection.entrySet()){ + if (entry.getValue()){ + ids.add(entry.getKey()); + } + } + return ids; + } + + public ArrayList getCheckedItems() { + ArrayList files = new ArrayList(); + + for (Map.Entry entry : mSelection.entrySet()){ + if (entry.getValue()){ + files.add((OCFile) getItem(entry.getKey())); + } + } + return files; + } } diff --combined src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java index 4f34b07c,5b92b96d..0b0883c2 --- a/src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java +++ b/src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java @@@ -53,9 -53,9 +53,9 @@@ implements ConfirmationDialogFragmentLi RemoveFileDialogFragment frag = new RemoveFileDialogFragment(); Bundle args = new Bundle(); - int messageStringId = R.string.confirmation_remove_alert; + int messageStringId = R.string.confirmation_remove_file_alert; - int posBtn = R.string.confirmation_remove_remote; + int posBtn = R.string.confirmation_remove_file_remote; int negBtn = -1; if (file.isFolder()) { messageStringId = R.string.confirmation_remove_folder_alert; @@@ -111,7 -111,8 +111,7 @@@ boolean containsFavorite = false; if (mTargetFile.isFolder()) { - // TODO Enable when "On Device" is recovered ? - Vector files = storageManager.getFolderContent(mTargetFile/*, false*/); + Vector files = storageManager.getFolderContent(mTargetFile, false); for(OCFile file: files) { containsFavorite = file.isFavorite() || containsFavorite; diff --combined src/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 6d93ab33,954b8e46..589ccfe4 --- a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@@ -22,12 -22,14 +22,15 @@@ package com.owncloud.android.ui.fragmen import java.util.ArrayList; +import android.app.Activity; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; + import android.view.ActionMode; import android.view.LayoutInflater; + import android.view.Menu; + import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; @@@ -37,16 -39,12 +40,16 @@@ import android.widget.GridView import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; +import android.widget.Toast; +import com.getbase.floatingactionbutton.FloatingActionButton; +import com.getbase.floatingactionbutton.FloatingActionsMenu; import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.ExtendedListView; import com.owncloud.android.ui.activity.OnEnforceableRefreshListener; import com.owncloud.android.ui.adapter.FileListListAdapter; +import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import third_parties.in.srain.cube.GridViewWithHeaderAndFooter; @@@ -69,11 -67,6 +72,11 @@@ public class ExtendedListFragment exten private SwipeRefreshLayout mRefreshGridLayout; private SwipeRefreshLayout mRefreshEmptyLayout; private TextView mEmptyListMessage; + + private FloatingActionsMenu fabMain; + private FloatingActionButton fabUpload; + private FloatingActionButton fabMkdir; + private FloatingActionButton fabUploadFromApp; // Save the state of the scroll in browsing private ArrayList mIndexes; @@@ -106,23 -99,8 +109,23 @@@ return mCurrentListView; } + public FloatingActionButton getFabUpload() { + return fabUpload; + } + + public FloatingActionButton getFabUploadFromApp() { + return fabUploadFromApp; + } + + public FloatingActionButton getFabMkdir() { + return fabMkdir; + } + + public FloatingActionsMenu getFabMain() { + return fabMain; + } - protected void switchToGridView() { + public void switchToGridView() { if ((mCurrentListView == mListView)) { mListView.setAdapter(null); @@@ -137,8 -115,8 +140,8 @@@ mCurrentListView = mGridView; } } - - protected void switchToListView() { + + public void switchToListView() { if (mCurrentListView == mGridView) { mGridView.setAdapter(null); mRefreshGridLayout.setVisibility(View.GONE); @@@ -152,13 -130,6 +155,13 @@@ mCurrentListView = mListView; } } + + public boolean isGridView(){ + if (mAdapter instanceof FileListListAdapter) { + return ((FileListListAdapter) mAdapter).isGridMode(); + } + return false; + } @Override @@@ -166,15 -137,61 +169,61 @@@ Bundle savedInstanceState) { Log_OC.d(TAG, "onCreateView"); + // TODO Tobi remove + // AbsListView.MultiChoiceModeListener listener = new AbsListView.MultiChoiceModeListener() { + // @Override + // public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { + // // Capture total checked items + // final int checkedCount = mListView.getCheckedItemCount(); + // // Set the CAB title according to total checked items + // mode.setTitle(checkedCount + " Selected"); + // // Calls toggleSelection method from ListViewAdapter Class + // // mAdapter.toggleSelection(position); + // + // if (checked){ + // mAdapter.setNewSelection(position,checked); + // } else { + // mAdapter.removeSelection(position); + // } + // } + // + // @Override + // public boolean onCreateActionMode(ActionMode mode, Menu menu) { + // mode.getMenuInflater().inflate(R.menu.context, menu); + // return true; + // } + // + // @Override + // public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + // return false; + // } + // + // @Override + // public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + // return false; + // } + // + // @Override + // public void onDestroyActionMode(ActionMode mode) { + // // mAdapter.removeSelection(); + // } + // }; + View v = inflater.inflate(R.layout.list_fragment, null); mListView = (ExtendedListView)(v.findViewById(R.id.list_root)); mListView.setOnItemClickListener(this); + mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); + // mListView.setMultiChoiceModeListener(listener); mListFooterView = inflater.inflate(R.layout.list_footer, null, false); mGridView = (GridViewWithHeaderAndFooter) (v.findViewById(R.id.grid_root)); mGridView.setNumColumns(GridView.AUTO_FIT); mGridView.setOnItemClickListener(this); + mGridView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); + + // mGridView.setMultiChoiceModeListener(listener); + mGridFooterView = inflater.inflate(R.layout.list_footer, null, false); if (savedInstanceState != null) { @@@ -203,11 -220,6 +252,11 @@@ mCurrentListView = mListView; // list as default + fabMain = (FloatingActionsMenu) v.findViewById(R.id.fab_main); + fabUpload = (FloatingActionButton) v.findViewById(R.id.fab_upload); + fabMkdir = (FloatingActionButton) v.findViewById(R.id.fab_mkdir); + fabUploadFromApp = (FloatingActionButton) v.findViewById(R.id.fab_upload_from_app); + return v; } @@@ -357,23 -369,6 +406,23 @@@ } /** + * Disables FAB. + * + * Sets the 'visibility' state of the FAB contained in the fragment. + * + * When 'false' is set, FAB visibility is set to View.GONE programatically, + * + * @param enabled Desired visibility for the FAB. + */ + public void setFabEnabled(boolean enabled) { + if(enabled) { + fabMain.setVisibility(View.VISIBLE); + } else { + fabMain.setVisibility(View.GONE); + } + } + + /** * Set message for empty list view */ public void setMessageForEmptyList(String message) { diff --combined src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 79a44088,31c19cc2..12ddc68d --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@@ -24,23 -24,18 +24,24 @@@ package com.owncloud.android.ui.fragmen import android.app.Activity; import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.v4.widget.SwipeRefreshLayout; - import android.view.ContextMenu; + import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; + import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.PopupMenu; +import android.widget.TextView; +import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; @@@ -52,28 -47,26 +53,30 @@@ import com.owncloud.android.ui.activity import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.FolderPickerActivity; import com.owncloud.android.ui.activity.OnEnforceableRefreshListener; +import com.owncloud.android.ui.activity.UploadFilesActivity; import com.owncloud.android.ui.adapter.FileListListAdapter; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; +import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.FileActionsDialogFragment; import com.owncloud.android.ui.dialog.RemoveFileDialogFragment; + import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.dialog.RenameFileDialogFragment; +import com.owncloud.android.ui.dialog.UploadSourceDialogFragment; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.ui.preview.PreviewMediaFragment; +import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.ui.preview.PreviewTextFragment; import java.io.File; + import java.util.ArrayList; /** * A Fragment that lists all files and folders in a given path. * * TODO refactor to get rid of direct dependency on FileDisplayActivity */ - public class OCFileListFragment extends ExtendedListFragment implements FileActionsDialogFragment.FileActionsDialogFragmentListener { + public class OCFileListFragment extends ExtendedListFragment { private static final String TAG = OCFileListFragment.class.getSimpleName(); @@@ -82,23 -75,15 +85,23 @@@ public final static String ARG_JUST_FOLDERS = MY_PACKAGE + ".JUST_FOLDERS"; public final static String ARG_ALLOW_CONTEXTUAL_ACTIONS = MY_PACKAGE + ".ALLOW_CONTEXTUAL"; + public final static String ARG_HIDE_FAB = MY_PACKAGE + ".HIDE_FAB"; private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE"; + private static final String KEY_FAB_EVER_CLICKED = "FAB_EVER_CLICKED"; + + private static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER"; private FileFragment.ContainerActivity mContainerActivity; private OCFile mFile = null; private FileListListAdapter mAdapter; private boolean mJustFolders; + + private OCFile mTargetFile; + private boolean miniFabClicked = false; + /** * {@inheritDoc} */ @@@ -158,174 -143,59 +161,215 @@@ setListAdapter(mAdapter); registerLongClickListener(); + + boolean hideFab = (args != null) && args.getBoolean(ARG_HIDE_FAB, false); + if (hideFab) { + setFabEnabled(false); + } else { + setFabEnabled(true); + registerFabListeners(); + + // detect if a mini FAB has ever been clicked + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); + if(prefs.getLong(KEY_FAB_EVER_CLICKED, 0) > 0) { + miniFabClicked = true; + } + + // add labels to the min FABs when none of them has ever been clicked on + if(!miniFabClicked) { + setFabLabels(); + } else { + removeFabLabels(); + } + } } + /** + * adds labels to all mini FABs. + */ + private void setFabLabels() { + getFabUpload().setTitle(getResources().getString(R.string.actionbar_upload)); + getFabMkdir().setTitle(getResources().getString(R.string.actionbar_mkdir)); + getFabUploadFromApp().setTitle(getResources().getString(R.string.actionbar_upload_from_apps)); + } + + /** + * registers all listeners on all mini FABs. + */ + private void registerFabListeners() { + registerFabUploadListeners(); + registerFabMkDirListeners(); + registerFabUploadFromAppListeners(); + } + + /** + * registers {@link android.view.View.OnClickListener} and {@link android.view.View.OnLongClickListener} + * on the Upload mini FAB for the linked action and {@link Toast} showing the underlying action. + */ + private void registerFabUploadListeners() { + getFabUpload().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent action = new Intent(getActivity(), UploadFilesActivity.class); + action.putExtra( + UploadFilesActivity.EXTRA_ACCOUNT, + ((FileActivity) getActivity()).getAccount() + ); + getActivity().startActivityForResult(action, UploadSourceDialogFragment.ACTION_SELECT_MULTIPLE_FILES); + getFabMain().collapse(); + recordMiniFabClick(); + } + }); + + getFabUpload().setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + Toast.makeText(getActivity(), R.string.actionbar_upload, Toast.LENGTH_SHORT).show(); + return true; + } + }); + } + + /** + * registers {@link android.view.View.OnClickListener} and {@link android.view.View.OnLongClickListener} + * on the 'Create Dir' mini FAB for the linked action and {@link Toast} showing the underlying action. + */ + private void registerFabMkDirListeners() { + getFabMkdir().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CreateFolderDialogFragment dialog = + CreateFolderDialogFragment.newInstance(mFile); + dialog.show(getActivity().getSupportFragmentManager(), FileDisplayActivity.DIALOG_CREATE_FOLDER); + getFabMain().collapse(); + recordMiniFabClick(); + } + }); + + getFabMkdir().setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + Toast.makeText(getActivity(), R.string.actionbar_mkdir, Toast.LENGTH_SHORT).show(); + return true; + } + }); + } + + /** + * registers {@link android.view.View.OnClickListener} and {@link android.view.View.OnLongClickListener} + * on the Upload from App mini FAB for the linked action and {@link Toast} showing the underlying action. + */ + private void registerFabUploadFromAppListeners() { + getFabUploadFromApp().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent action = new Intent(Intent.ACTION_GET_CONTENT); + action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE); + + //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } + + getActivity().startActivityForResult( + Intent.createChooser(action, getString(R.string.upload_chooser_title)), + UploadSourceDialogFragment.ACTION_SELECT_CONTENT_FROM_APPS + ); + getFabMain().collapse(); + recordMiniFabClick(); + } + }); + + getFabUploadFromApp().setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + Toast.makeText(getActivity(), + R.string.actionbar_upload_from_apps, + Toast.LENGTH_SHORT).show(); + return true; + } + }); + } + + /** + * records a click on a mini FAB and thus: + *
    + *
  1. persists the click fact
  2. + *
  3. removes the mini FAB labels
  4. + *
+ */ + private void recordMiniFabClick() { + // only record if it hasn't been done already at some other time + if(!miniFabClicked) { + final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); + sp.edit().putLong(KEY_FAB_EVER_CLICKED, 1).commit(); + miniFabClicked = true; + } + } + + /** + * removes the labels on all known min FABs. + */ + private void removeFabLabels() { + getFabUpload().setTitle(null); + getFabMkdir().setTitle(null); + getFabUploadFromApp().setTitle(null); + ((TextView) getFabUpload().getTag(com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE); + ((TextView) getFabMkdir().getTag(com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE); + ((TextView) getFabUploadFromApp().getTag(com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE); + } + private void registerLongClickListener() { - getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - public boolean onItemLongClick(AdapterView arg0, View v, - int index, long arg3) { - showFileAction(index); + getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { + private Menu menu; + + @Override + public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { + final int checkedCount = getListView().getCheckedItemCount(); + // TODO Tobi extract to values + mode.setTitle(checkedCount + " selected"); + + if (checked) { + mAdapter.setNewSelection(position, checked); + } else { + mAdapter.removeSelection(position); + } + + // TODO maybe change: only recreate menu if count changes + menu.clear(); + if (checkedCount == 1) { + createContextMenu(menu); + } else { + // download, move, copy, delete + getActivity().getMenuInflater().inflate(R.menu.multiple_file_actions_menu, menu); + } + + } + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + this.menu = menu; return true; } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return onFileActionChosen(item.getItemId()); + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mAdapter.removeSelection(); + } }); } - // TODO Tobi needed? ++ private void showFileAction(int fileIndex) { Bundle args = getArguments(); PopupMenu pm = new PopupMenu(getActivity(),null); @@@ -379,11 -249,11 +423,11 @@@ /** * Call this, when the user presses the up button. - * - * Tries to move up the current folder one level. If the parent folder was removed from the - * database, it continues browsing up until finding an existing folders. - *

- * return Count of folder levels browsed up. + *

+ * Tries to move up the current folder one level. If the parent folder was removed from the + * database, it continues browsing up until finding an existing folders. + *

+ * @return Count of folder levels browsed up. */ public int onBrowseUp() { OCFile parentDir = null; @@@ -411,7 -281,8 +455,7 @@@ } // exit is granted because storageManager.getFileByPath("/") never returns null mFile = parentDir; - // TODO Enable when "On Device" is recovered ? - listDirectory(mFile /*, MainApp.getOnlyOnDevice()*/); + listDirectory(mFile, MainApp.getOnlyOnDevice()); onRefresh(false); @@@ -429,7 -300,8 +473,7 @@@ if (file != null) { if (file.isFolder()) { // update state and view of this fragment - // TODO Enable when "On Device" is recovered ? - listDirectory(file/*, MainApp.getOnlyOnDevice()*/); + listDirectory(file, MainApp.getOnlyOnDevice()); // then, notify parent activity to let it update its state and view mContainerActivity.onBrowsedDownTo(file); // save index and top position @@@ -448,8 -320,12 +492,8 @@@ } else { mContainerActivity.getFileOperationsHelper().openFile(file); } - - } else { - // automatic download, preview on finish - ((FileDisplayActivity) mContainerActivity).startDownloadForPreview(file); + } - } } else { @@@ -461,17 -337,18 +505,18 @@@ /** * {@inheritDoc} */ - @Override - public void onCreateContextMenu( - ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + // TODO Tobi needed? + public void createContextMenu(Menu menu) { Bundle args = getArguments(); boolean allowContextualActions = (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true); if (allowContextualActions) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.file_actions_menu, menu); - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - OCFile targetFile = (OCFile) mAdapter.getItem(info.position); + OCFile targetFile = null; + if (mAdapter.getCheckedItems().size() == 1){ + targetFile = mAdapter.getCheckedItems().get(0); + } if (mContainerActivity.getStorageManager() != null) { FileMenuFilter mf = new FileMenuFilter( @@@ -494,92 -371,125 +539,128 @@@ item.setEnabled(false); } } + +// String.format(mContext.getString(R.string.subject_token), +// getClient().getCredentials().getUsername(), file.getFileName())); } } - /** - * {@inheritDoc} - */ - @Override - public boolean onFileActionChosen(int menuId, int filePosition) { - mTargetFile = (OCFile) mAdapter.getItem(filePosition); - switch (menuId) { - case R.id.action_share_file: { - mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); - return true; - } - case R.id.action_open_file_with: { - mContainerActivity.getFileOperationsHelper().openFile(mTargetFile); - return true; - } - case R.id.action_unshare_file: { - mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); - return true; - } - case R.id.action_rename_file: { - RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(mTargetFile); - dialog.show(getFragmentManager(), FileDetailFragment.FTAG_RENAME_FILE); - return true; - } - case R.id.action_remove_file: { - RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(mTargetFile); - dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); - return true; - } - case R.id.action_download_file: - case R.id.action_sync_file: { - mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile); - return true; - } - case R.id.action_cancel_download: - case R.id.action_cancel_upload: { - ((FileDisplayActivity) mContainerActivity).cancelTransference(mTargetFile); - return true; - } - case R.id.action_see_details: { - mContainerActivity.showDetails(mTargetFile); - return true; - } - case R.id.action_send_file: { - // Obtain the file - if (!mTargetFile.isDown()) { // Download the file - Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); - ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); + public boolean onFileActionChosen(int menuId) { + if (mAdapter.getCheckedItems().size() == 1){ + OCFile mTargetFile = mAdapter.getCheckedItems().get(0); - } else { - mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); + switch (menuId) { + case R.id.action_share_file: { + mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); + return true; } - return true; - } - case R.id.action_move: { - Intent action = new Intent(getActivity(), FolderPickerActivity.class); + case R.id.action_open_file_with: { + mContainerActivity.getFileOperationsHelper().openFile(mTargetFile); + return true; + } + case R.id.action_unshare_file: { + mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); + return true; + } + case R.id.action_rename_file: { + RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(mTargetFile); + dialog.show(getFragmentManager(), FileDetailFragment.FTAG_RENAME_FILE); + return true; + } + case R.id.action_remove_file: { + RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(mTargetFile); + dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); + return true; + } + case R.id.action_download_file: + case R.id.action_sync_file: { + mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile); + return true; + } + case R.id.action_cancel_download: + case R.id.action_cancel_upload: { + ((FileDisplayActivity) mContainerActivity).cancelTransference(mTargetFile); + return true; + } + case R.id.action_see_details: { + mContainerActivity.showDetails(mTargetFile); + return true; + } + case R.id.action_send_file: { + // Obtain the file + if (!mTargetFile.isDown()) { // Download the file + Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); + ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); - // Pass mTargetFile that contains info of selected file/folder - action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile); - getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); - return true; - } - case R.id.action_favorite_file: { - mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, true); - return true; - } - case R.id.action_unfavorite_file: { - mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, false); - return true; + } else { + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); + } + return true; + } + case R.id.action_move: { + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + ArrayList files = new ArrayList(); + files.add(mTargetFile); + action.putParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES, files); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); + return true; + } + case R.id.action_favorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, true); + return true; + } + case R.id.action_unfavorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, false); + return true; + } + case R.id.action_copy: + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + + // Pass mTargetFile that contains info of selected file/folder + action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_COPY_FILES); + return true; + default: + return false; } - case R.id.action_copy: - Intent action = new Intent(getActivity(), FolderPickerActivity.class); + } else { + ArrayList mTargetFiles = mAdapter.getCheckedItems(); - // Pass mTargetFile that contains info of selected file/folder - action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile); - getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_COPY_FILES); - return true; - default: - return false; + switch (menuId) { + case R.id.action_remove_file: { + RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(mTargetFiles); + dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); + return true; + } + case R.id.action_download_file: + case R.id.action_sync_file: { + mContainerActivity.getFileOperationsHelper().syncFiles(mTargetFiles); + return true; + } + case R.id.action_move: { + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + action.putParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES, mTargetFiles); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); + return true; + } + case R.id.action_favorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorites(mTargetFiles, true); + return true; + } + case R.id.action_unfavorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorites(mTargetFiles, false); + return true; + } + case R.id.action_copy: + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + action.putParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES, mTargetFiles); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_COPY_FILES); + return true; + default: + return false; + } } + } /** @@@ -588,7 -498,7 +669,7 @@@ @Override public boolean onContextItemSelected (MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); - boolean matched = onFileActionChosen(item.getItemId(), ((AdapterContextMenuInfo) item.getMenuInfo()).position); + boolean matched = onFileActionChosen(item.getItemId()); if(!matched) { return super.onContextItemSelected(item); } else { @@@ -608,14 -518,17 +689,14 @@@ } /** - * Calls {@link OCFileListFragment#listDirectory(OCFile)} with a null parameter + * Calls {@link OCFileListFragment#listDirectory(OCFile, boolean)} with a null parameter */ - public void listDirectory(/*boolean onlyOnDevice*/){ - listDirectory(null); - // TODO Enable when "On Device" is recovered ? - // listDirectory(null, onlyOnDevice); + public void listDirectory(boolean onlyOnDevice){ + listDirectory(null, onlyOnDevice); } public void refreshDirectory(){ - // TODO Enable when "On Device" is recovered ? - listDirectory(getCurrentFile()/*, MainApp.getOnlyOnDevice()*/); + listDirectory(getCurrentFile(), MainApp.getOnlyOnDevice()); } /** @@@ -625,7 -538,7 +706,7 @@@ * * @param directory File to be listed */ - public void listDirectory(OCFile directory/*, boolean onlyOnDevice*/) { + public void listDirectory(OCFile directory, boolean onlyOnDevice) { FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (storageManager != null) { @@@ -646,7 -559,8 +727,7 @@@ directory = storageManager.getFileById(directory.getParentId()); } - // TODO Enable when "On Device" is recovered ? - mAdapter.swapDirectory(directory, storageManager/*, onlyOnDevice*/); + mAdapter.swapDirectory(directory, storageManager, onlyOnDevice); if (mFile == null || !mFile.equals(directory)) { mCurrentListView.setSelection(0); } @@@ -683,7 -597,7 +764,7 @@@ OwnCloudVersion version = AccountUtils.getServerVersion( ((FileActivity)mContainerActivity).getAccount()); if (version != null && version.supportsRemoteThumbnails() && - imagesCount > 0 && imagesCount == filesCount) { + DisplayUtils.isGridView(mFile, mContainerActivity.getStorageManager())) { switchToGridView(); registerLongClickListener(); } else {