From: David A. Velasco Date: Thu, 19 Mar 2015 11:59:17 +0000 (+0100) Subject: Merge pull request #914 from owncloud/accessibility X-Git-Tag: oc-android-1.7.1_signed^2~17 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/5ebd90ed2d43a15e8ae5a53465c3c02d062998f8?hp=c963eb0fad38ec71f511de231bd81deadecc70fb Merge pull request #914 from owncloud/accessibility Added accesibility descriptions as a mean to add automatic tests un UI. --- diff --git a/res/layout/password_dialog.xml b/res/layout/password_dialog.xml new file mode 100644 index 00000000..b81e40b4 --- /dev/null +++ b/res/layout/password_dialog.xml @@ -0,0 +1,33 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index d0cd67a4..b6da4251 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -270,8 +270,10 @@ El fitxer ja no està disponible en el servidor Comptes Afegeix compte + Carregant dades... Es requereix autenticació Contrasenya incorrecta + Moure Escull Seguretat diff --git a/res/values-cs-rCZ/strings.xml b/res/values-cs-rCZ/strings.xml index 897be007..34294849 100644 --- a/res/values-cs-rCZ/strings.xml +++ b/res/values-cs-rCZ/strings.xml @@ -260,6 +260,8 @@ správce systému. Při pokusu o sdílení tohoto souboru či složky nastala chyba Nelze ukončit sdílení. Zkontrolujte prosím že soubor existuje Při pokusu o zrušení sdílení tohoto souboru či složky nastala chyba + Zadejte heslo + Musíte zadat heslo Odeslat Zkopírovat odkaz Zkopírováno do schránky diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 337ea373..0e5b4587 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -259,6 +259,8 @@ Der opstod en fejl ved deling af denne fil eller mappe Kan ikke fjerne deling. Tjek venligst om filen findes. Der opstod en fejl ved stopning af deling af denne mappe. + Angiv et kodeord + Du skal angive et kodeord Send Kopiér link Kopieret til udklipsholder diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml index 99125374..0bb8400a 100644 --- a/res/values-de-rDE/strings.xml +++ b/res/values-de-rDE/strings.xml @@ -261,6 +261,8 @@ Es ist ein Fehler beim Freigeben der Datei oder des Ordners aufgetreten. Entfernen der Freigabe nicht möglich. Prüfen Sie, ob die Datei existiert Es ist ein Fehler beim Entfernen der Freigabe für diese Datei oder den Ordner aufgetreten. + Passwort eingeben + Sie müssen ein Passwort eingeben Senden Link kopieren In die Zwischenablage kopiert diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index aa0fdb96..3897d600 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -261,6 +261,8 @@ Es ist ein Fehler beim Freigeben der Datei oder des Ordners aufgetreten. Entfernen der Freigabe nicht möglich. Prüfe, dass die Datei existiert Es ist ein Fehler beim Entfernen der Freigabe für diese Datei oder den Ordner aufgetreten. + Passwort eingeben + Du musst ein Passwort eingeben Senden Link kopieren In die Zwischenablage kopiert diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 29f78e96..f7ee09f5 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -261,6 +261,8 @@ Ένα σφάλμα προέκυψε κατά την προσπάθεια διαμοιρασμού αυτού του αρχείου ή φακέλου Αδύνατη η διακοπή κοινής χρήσης. Παρακαλώ ελέγξτε αν το αρχείο υπάρχει Ένα σφάλμα προέκυψε κατά τη διάρκεια ακύρωσης διαμοιρασμού αυτού του αρχείου ή φακέλου + Εισάγετε ένα κωδικό πρόσβασης. + Πρέπει να εισάγετε ένα κωδικό πρόσβασης. Αποστολή Αντιγραφή συνδέσμου Αντιγραφθηκε στο πρόχειρο diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 450c2a5f..d2632689 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -261,6 +261,8 @@ An error occurred while trying to share this file or folder Unable to unshare. Please check whether the file exists An error occurred while trying to unshare this file or folder + Enter a password + You must enter a password Send Copy link Copied to clipboard diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index e5faa345..47dff013 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -261,6 +261,8 @@ Ocurrió un error al tratar de compartir este archivo o carpeta No se puede dejar de compartir. Revise si el archivo existe Ocurrió un error al tratar de ya no compartir este archivo o carpeta + Introduzca una contraseña + Debe introducir una contraseña Enviar Copiar enlace Copiado al portapapeles diff --git a/res/values-fi-rFI/strings.xml b/res/values-fi-rFI/strings.xml index e69853b7..35b677a5 100644 --- a/res/values-fi-rFI/strings.xml +++ b/res/values-fi-rFI/strings.xml @@ -243,6 +243,8 @@ Jakaminen ei ole käytössä palvelimellasi. Ota yhteys ylläpitäjään. Virhe tiedoston tai kansion jakamista yrittäessä + Anna salasana + Salasana on pakko antaa Lähetä Kopioi linkki Kopioitu leikepöydälle diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f52eec64..4f531a72 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -265,6 +265,8 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Une erreur est survenue lors de la tentative de partage de ce fichier ou répertoire Impossible de supprimer le partage. Vérifiez que le fichier est bien présent Une erreur est survenue lors de la tentative d’annulation du partage de ce fichier ou répertoire + Saisir un mot de passe + Vous devez saisir un mot de passe Envoyer Copier le lien Copié dans le presse-papiers diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 882f17ca..5b643702 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -168,9 +168,9 @@ Descárgueo de aquí: %2$s Produciuse un erro descoñecido! Non foi posíbel atopar a máquina Non se atopou unha instancia do servidor - O servidor tardou demasiado en responder + O servidor tardou de máis en responder URL incorrecto - Produciuse un fallo ao iniciar o SSL + Produciuse un fallo ao preparar o SSL Non foi posíbel verificar a identidade do servidor SSL Versión do servidor non recoñecida Non é posíbel estabelecer a conexión @@ -262,6 +262,8 @@ Descárgueo de aquí: %2$s Produciuse un erro ao tentar compartir este ficheiro ou cartafol. Non foi posíbel deixar de compartir. Comprobe que existe o ficheiro Produciuse un erro ao tentar deixar de compartir este ficheiro ou cartafol + Escriba un contrasinal + Ten que escribir un contrasinal Enviar Copiar a ligazón Copiado no portapapeis. diff --git a/res/values-ia/strings.xml b/res/values-ia/strings.xml index 1f8c5b4a..0aa7da47 100644 --- a/res/values-ia/strings.xml +++ b/res/values-ia/strings.xml @@ -9,23 +9,31 @@ Biggest - Smallest--> General Plus + Contos + Deler historia Adjuta Nomine de usator Contrasigno Files Connecte Incargar + Nulle contos trovate secundas passate Nihil hic. Incarga alcun cosa! + dossier + Dimension: + Typo: Discargar Compartir ligamine Si No Ok + Cancellar discarga Cancellar Error Error Incognite Cambiar contrasigno + Deler conto Nomine de dossier Invia diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index c4f396f3..465db720 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -261,6 +261,8 @@ Si è verificato un errore durante il tentativo di condivisione del file o della cartella Impossibile rimuovere dalla condivisione. Assicurati che il file esista Si è verificato un errore durante il tentativo di rimuovere la condivisione del file o della cartella + Digita una password + Devi digitare una password Invia Copia collegamento Copiato negli appunti diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index e1e1e343..489c22aa 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -262,6 +262,8 @@ このファイルまたはフォルダーを共有する際にエラーが発生しました 共有を解除できません。ファイルがあるか確認してください。 このファイルまたはフォルダーの共有を解除する際にエラーが発生しました + パスワードを入力 + パスワードを入力しなければなりません 送信 リンクをコピー クリップボードにコピー diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index b58f7983..973ac891 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -260,6 +260,8 @@ 이 파일이나 폴더를 공유하는 중 오류 발생 공유를 해제할 수 없습니다. 파일이 있는지 확인하십시오 이 파일이나 폴더의 공유를 해제하는 중 오류 발생 + 비밀번호를 입력하십시요. + 비밀번호를 입력해야만 합니다. 보내기 링크 주소 복사 클립보드로 복사됨 diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0895ca91..e9b3b24e 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -3,9 +3,12 @@ Augšupielādēt Saturs no citām lietotnēm Datnes + Atvērt ar Jauna mape Iestatījumi Sūtīt + Kārtot + Kārtot pēc Vispārīgi diff --git a/res/values-nb-rNO/strings.xml b/res/values-nb-rNO/strings.xml index 3336ec12..f0e04c36 100644 --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@ -187,6 +187,7 @@ Tjeneren din svarer ikke med korrekt bruker-ID, vennligst ta kontakt med en administrator Kan ikke autentisere mot denne serveren + Kontoen eksisterer ikke på enheten enda Hold filen oppdatert Endre navn Fjern @@ -260,6 +261,8 @@ Det skjedde en feil under deling av denne filen eller mappen Kan ikke fjerne deling. Sjekk om filen eksisterer. En feil oppstod ved avslutting av delingen av denne filen eller mappen + Skriv inn ett passord + Du må skrive inn ett passord Send Kopier lenke Kopiert til utklippstavlen @@ -299,4 +302,5 @@ Sikkerhet Sti til video-opplasting Nedlasting av %1$s mappen kunne ikke fullføres + %1$s har delt \"%2$s\" med deg diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index f675c09b..8cfb96d3 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -264,6 +264,8 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar Er trad een fout op bij uw poging dit bestand of deze map te delen Kan delen niet beëindigen. Ga na of het bestand bestaat Er trad een fout op bij uw poging het delen van dit bestand of deze map te beëindigen + Vul het wachtwoord in + U moet een wachtwoord opgeven Versturen Link kopiëren Gekopieerd naar het klembord diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index baf155f9..0eecfea3 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -261,6 +261,8 @@ Ocorreu um erro durante a tentativa de compartilhar esse arquivo ou pasta Não é possível cancelar o compartilhamento. Por favor verifique se o arquivo existe Ocorreu um erro ao tentar descompartilhar este arquivo ou pasta + Digite uma senha + Você deve digitar uma senha Enviar Copiar o link Copiado para área de transferência diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 6a686c25..ce2a6453 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -259,6 +259,8 @@ Ocorreu um erro enquanto tentava partilhar este ficheiro ou pasta Não é possível retirar a partilha. Verifique se o ficheiro existe Ocorreu um erro enquanto retirava a partilha deste ficheiro ou pasta + Introduza uma palavra-passe + Você deve introduzir uma palavra-passe Enviar Copiar hiperligação Copiado para a área de transferência diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index d87cea3d..9b333e65 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -183,6 +183,7 @@ %1$s nu suporta conturi multiple Server-ul dvs. nu întoarce un ID de utilizator corect, vă rugăm să contactați un administrator Nu se poate autentifica cu acest server + Contul nu există încă în dispozitiv Păstrează fișierul actualizat Redenumește Elimină diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index cc739418..c47e73d5 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -262,6 +262,8 @@ При попытке поделиться этим файлом или каталогом произошла ошибка Невозможно закрыть доступ. Убедитесь что файл существует При попытке закрыть доступ к этому файлу или каталогу произошла ошибка + Введите пароль + Вы должны ввести пароль Отправить Копировать ссылку Скопировано в буфер обмена diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 3f99fb3b..7a2f2ba4 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -187,6 +187,7 @@ Strežnik ne vrača ustreznega ID uporabnika. Stopite v stik s skrbnikom sistema. Ni mogoče preveriti pristnosti strežnika + Račun na napravi še ne obstaja. Datoteka naj bo posodobljena Preimenuj Odstrani @@ -260,6 +261,8 @@ Prišlo je do napake med poskusom omogočanja souporabe te datoteke ali mape Ni mogoče prekiniti souporabe. Preverite, ali datoteka obstaja. Prišlo je do napake med poskusom odstranjevanja souporabe te datoteke ali mape + Vpis gesla + Vpisati je treba geslo. Pošlji Kopiraj povezavo Kopirano v odložišče diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 3311ba24..97c114c4 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -57,11 +57,16 @@ Напусти Нема садржаја за отпремање Садржај није примљен. Нема шта да се отпреми. + %1$s није дозвољен приступ дељеном садржају Отпремање пре пар секунди Овде нема ничег. Отпремите нешто! Учитавам Нема фајлова у овој фасцикли. + фасцикла + фасцикле + фајл + фајлови Тапните на фајл ради приказа додатних информација. Величина: Врста: @@ -109,6 +114,11 @@ Не могу да довршим синхронизацију %1$s Неисправна лозинка за %1$s Постоје сукоби + %1$d држи-синх фајлови нису синхронизовани + Синхронизација није успела + Садржај %1$d фајлова не може бити синхронизован (%2$d сукоба) + Неки локални фајлови нису обрађени + %1$d фајлова из фасцикле %2$s није се могло копирати у Од верзије 1.3.16, фајлови отпремљени са уређаја се копирају у локалну фасциклу %1$s да би се спречио губитак података када се исти фајл синхронизује са више налога.\n\nЗбог ове измене, сви фајлови отпремљени са претходним верзијама ове апликације се копирају у фасциклу %2$s. Међутим, грешка је онемогућила довршавање ове радње током синхронизације налога. Можете или оставити фајлове како јесу и уклонити линк до %3$s или преместити фајлове у фасциклу %1$s и задржати везу до %4$s.\n\nИспод су наведени локални фајлови и удаљени фајлови у %5$s са којима су повезани. Фасцикла %1$s више не постоји Премести све @@ -138,7 +148,7 @@ Медијски фајл није исправно кодиран Време истекло у покушавању пуштања Медијски фајл се не може пустити - Медијски фајл се не може пустити са фабричким плејером + Медијски фајл се не може пустити са системским плејером Безбедносна грешка при покушају пуштања %1$s Улазна грешка при покушају пуштања %1$s Неочекивана грешка при покушају пуштања %1$s @@ -235,6 +245,7 @@ 12:23:45 Отпремај слике само путем бежичне мреже Отпремај видео само путем бежичне мреже + /InstantUpload Ажурирај сукоб Удаљени фајл %s није синхронизован са локалним. Ако наставите, заменићете фајл на серверу. Задржи оба @@ -250,6 +261,8 @@ Дошло је до грешке приликом покушаја дељења овог фајла или фасцикле Не могу да прекинем дељење. Проверите да ли фајл постоји Дошло је до грешке приликом покушаја укидања дељења овог фајла или фасцикле + Унесите лозинку + Морате унети лозинку Пошаљи Копирај везу Копирано у клипборд @@ -275,7 +288,7 @@ Нема начина за слање записника. Инсталирајте апликацију е-поште! Записници %1$s Андроид апликације Учитавам податке... - Неопходна провера идентитета + Неопходна аутентификација Погрешна лозинка Премести Овде нема ничега. Можете додати фасциклу! diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 8805fdce..97c73a5a 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -261,6 +261,8 @@ Bu dosya veya klasörü paylaşmaya çalışılırken bir hata oluştu Paylaşımı kaldırma başarısız. Lütfen dosyanın mevcut olup olmadığını denetleyin Bu dosya veya klasör paylaşımı kaldırılmaya çalışılırken bir hata oluştu + Bir parola girin + Bir parola girmelisiniz Gönder Bağlantıyı kopyala Panoya kopyalandı diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 64c57d30..09a0c42e 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -187,6 +187,7 @@ Ваш сервер не повертає коректний ідентифікатор користувача, будь ласка зверніться до адміністратора ⇥ Аутентифікація на цьому сервері неможлива + Користвача в пристрої не існуе Оновлювати файл Перейменувати Видалити @@ -259,6 +260,8 @@ Виникла помилка при спробі поділитися файлом або текою Неможливо заборонити доступ. Будь ласка, перевірте, чи існує файл Виникла помилка при спробі заборонити доступ до файлу або теки + Ввести пароль + Ви повинні ввести пароль Надіслати Копіювати посилання Скопійовано в буфер обміну @@ -298,4 +301,5 @@ Безпека Шлях завантаження відео Скачування теки %1$s не може бути завершено + %1$s розшарено \"%2$s\" з вами diff --git a/res/values/strings.xml b/res/values/strings.xml index 8f2898cb..8b2224bd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -275,6 +275,8 @@ An error occurred while trying to share this file or folder Unable to unshare. Please check whether the file exists An error occurred while trying to unshare this file or folder + Enter a password + You must enter a password Send diff --git a/src/com/owncloud/android/files/FileOperationsHelper.java b/src/com/owncloud/android/files/FileOperationsHelper.java index 46588114..b2f74f2f 100644 --- a/src/com/owncloud/android/files/FileOperationsHelper.java +++ b/src/com/owncloud/android/files/FileOperationsHelper.java @@ -119,7 +119,7 @@ public class FileOperationsHelper { } - public void shareFileWithLinkToApp(OCFile file, Intent sendIntent) { + public void shareFileWithLinkToApp(OCFile file, String password, Intent sendIntent) { if (file != null) { mFileActivity.showLoadingDialog(); @@ -128,6 +128,7 @@ public class FileOperationsHelper { service.setAction(OperationsService.ACTION_CREATE_SHARE); service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); service.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath()); + service.putExtra(OperationsService.EXTRA_PASSWORD_SHARE, password); service.putExtra(OperationsService.EXTRA_SEND_INTENT, sendIntent); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); diff --git a/src/com/owncloud/android/operations/CreateShareOperation.java b/src/com/owncloud/android/operations/CreateShareOperation.java index 01059c9e..70d6bf7b 100644 --- a/src/com/owncloud/android/operations/CreateShareOperation.java +++ b/src/com/owncloud/android/operations/CreateShareOperation.java @@ -44,7 +44,6 @@ import com.owncloud.android.operations.common.SyncOperation; public class CreateShareOperation extends SyncOperation { private static final String TAG = CreateShareOperation.class.getSimpleName(); - protected FileDataStorageManager mStorageManager; @@ -76,8 +75,9 @@ public class CreateShareOperation extends SyncOperation { * To obtain combinations, add the desired values together. * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. */ - public CreateShareOperation(Context context, String path, ShareType shareType, String shareWith, boolean publicUpload, - String password, int permissions, Intent sendIntent) { + public CreateShareOperation(Context context, String path, ShareType shareType, String shareWith, + boolean publicUpload, String password, int permissions, + Intent sendIntent) { mContext = context; mPath = path; @@ -98,7 +98,8 @@ public class CreateShareOperation extends SyncOperation { RemoteOperationResult result = ((GetRemoteSharesForFileOperation)operation).execute(client); if (!result.isSuccess() || result.getData().size() <= 0) { - operation = new CreateRemoteShareOperation(mPath, mShareType, mShareWith, mPublicUpload, mPassword, mPermissions); + operation = new CreateRemoteShareOperation(mPath, mShareType, mShareWith, mPublicUpload, + mPassword, mPermissions); result = ((CreateRemoteShareOperation)operation).execute(client); } @@ -112,7 +113,30 @@ public class CreateShareOperation extends SyncOperation { return result; } - + public String getPath() { + return mPath; + } + + public ShareType getShareType() { + return mShareType; + } + + public String getShareWith() { + return mShareWith; + } + + public boolean getPublicUpload() { + return mPublicUpload; + } + + public String getPassword() { + return mPassword; + } + + public int getPermissions() { + return mPermissions; + } + public Intent getSendIntent() { return mSendIntent; } diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index a4bc8f6c..6a32af06 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -85,6 +85,7 @@ public class OperationsService extends Service { public static final String EXTRA_RESULT = "RESULT"; public static final String EXTRA_NEW_PARENT_PATH = "NEW_PARENT_PATH"; public static final String EXTRA_FILE = "FILE"; + public static final String EXTRA_PASSWORD_SHARE = "PASSWORD_SHARE"; public static final String EXTRA_COOKIE = "COOKIE"; @@ -525,10 +526,12 @@ public class OperationsService extends Service { String action = operationIntent.getAction(); if (action.equals(ACTION_CREATE_SHARE)) { // Create Share String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH); + String password = operationIntent.getStringExtra(EXTRA_PASSWORD_SHARE); Intent sendIntent = operationIntent.getParcelableExtra(EXTRA_SEND_INTENT); if (remotePath.length() > 0) { - operation = new CreateShareOperation(OperationsService.this, remotePath, ShareType.PUBLIC_LINK, - "", false, "", 1, sendIntent); + operation = new CreateShareOperation(OperationsService.this, remotePath, + ShareType.PUBLIC_LINK, + "", false, password, 1, sendIntent); } } else if (action.equals(ACTION_UNSHARE)) { // Unshare file diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index e92474b7..7f48b9e6 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -61,7 +61,9 @@ import com.owncloud.android.operations.SynchronizeFolderOperation; import com.owncloud.android.operations.UnshareLinkOperation; import com.owncloud.android.services.OperationsService; import com.owncloud.android.services.OperationsService.OperationsServiceBinder; +import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.LoadingDialog; +import com.owncloud.android.ui.dialog.SharePasswordDialogFragment; import com.owncloud.android.utils.ErrorMessageAdapter; @@ -74,12 +76,14 @@ public class FileActivity extends SherlockFragmentActivity public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE"; public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT"; public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW"; - public static final String EXTRA_FROM_NOTIFICATION= "com.owncloud.android.ui.activity.FROM_NOTIFICATION"; + public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION"; public static final String TAG = FileActivity.class.getSimpleName(); private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID"; + private static final String DIALOG_SHARE_PASSWORD = "DIALOG_SHARE_PASSWORD"; + private static final String KEY_TRY_SHARE_AGAIN = "TRY_SHARE_AGAIN"; protected static final long DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS = 200; @@ -117,6 +121,8 @@ public class FileActivity extends SherlockFragmentActivity protected FileDownloaderBinder mDownloaderBinder = null; protected FileUploaderBinder mUploaderBinder = null; private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null; + + private boolean mTryShareAgain = false; /** @@ -139,6 +145,7 @@ public class FileActivity extends SherlockFragmentActivity mFileOperationsHelper.setOpIdWaitingFor( savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE) ); + mTryShareAgain = savedInstanceState.getBoolean(KEY_TRY_SHARE_AGAIN); } else { account = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT); mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE); @@ -301,6 +308,7 @@ public class FileActivity extends SherlockFragmentActivity outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount); outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification); outState.putLong(KEY_WAITING_FOR_OP_ID, mFileOperationsHelper.getOpIdWaitingFor()); + outState.putBoolean(KEY_TRY_SHARE_AGAIN, mTryShareAgain); } @@ -346,7 +354,14 @@ public class FileActivity extends SherlockFragmentActivity protected boolean isRedirectingToSetupAccount() { return mRedirectingToSetupAccount; } - + + public boolean isTryShareAgain(){ + return mTryShareAgain; + } + + public void setTryShareAgain(boolean tryShareAgain) { + mTryShareAgain = tryShareAgain; + } public OperationsServiceBinder getOperationsServiceBinder() { return mOperationsServiceBinder; @@ -450,10 +465,12 @@ public class FileActivity extends SherlockFragmentActivity if (result.getCode() == ResultCode.UNAUTHORIZED) { dismissLoadingDialog(); - Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, + operation, getResources()), Toast.LENGTH_LONG); t.show(); } + mTryShareAgain = false; } else if (operation instanceof CreateShareOperation) { onCreateShareOperationFinish((CreateShareOperation) operation, result); @@ -478,18 +495,36 @@ public class FileActivity extends SherlockFragmentActivity } - private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) { + private void onCreateShareOperationFinish(CreateShareOperation operation, + RemoteOperationResult result) { dismissLoadingDialog(); if (result.isSuccess()) { + mTryShareAgain = false; updateFileFromDB(); Intent sendIntent = operation.getSendIntent(); startActivity(sendIntent); - - } else { - Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), - Toast.LENGTH_LONG); - t.show(); + } else { + // Detect Failure (403) --> needs Password + if (result.getCode() == ResultCode.SHARE_FORBIDDEN) { + if (!isTryShareAgain()) { + SharePasswordDialogFragment dialog = + SharePasswordDialogFragment.newInstance(new OCFile(operation.getPath()), + operation.getSendIntent()); + dialog.show(getSupportFragmentManager(), DIALOG_SHARE_PASSWORD); + } else { + Toast t = Toast.makeText(this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + t.show(); + mTryShareAgain = false; + } + } else { + Toast t = Toast.makeText(this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + t.show(); + } } } diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 58e7ec5e..5efe4232 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -23,13 +23,10 @@ package com.owncloud.android.ui.activity; import java.io.File; -import java.io.IOException; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.Dialog; diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index fbdf69d8..d4c1c7b2 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -30,6 +30,7 @@ import android.accounts.Account; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.os.Build; import android.preference.PreferenceManager; import android.text.format.DateUtils; import android.view.LayoutInflater; @@ -37,7 +38,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; -import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; @@ -200,15 +200,19 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { if (!file.isFolder()) { AbsListView parentList = (AbsListView)parent; - if (parentList.getChoiceMode() == AbsListView.CHOICE_MODE_NONE) { - checkBoxV.setVisibility(View.GONE); - } else { - if (parentList.isItemChecked(position)) { - checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (parentList.getChoiceMode() == AbsListView.CHOICE_MODE_NONE) { + checkBoxV.setVisibility(View.GONE); } else { - checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); + 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); } - checkBoxV.setVisibility(View.VISIBLE); } } else { //Folder @@ -234,15 +238,21 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { // local state ImageView localStateView = (ImageView) view.findViewById(R.id.localFileIndicator); localStateView.bringToFront(); - FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder(); - FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); - boolean downloading = (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)); - OperationsServiceBinder opsBinder = mTransferServiceGetter.getOperationsServiceBinder(); - downloading |= (opsBinder != null && opsBinder.isSynchronizing(mAccount, file.getRemotePath())); + FileDownloaderBinder downloaderBinder = + mTransferServiceGetter.getFileDownloaderBinder(); + FileUploaderBinder uploaderBinder = + mTransferServiceGetter.getFileUploaderBinder(); + boolean downloading = (downloaderBinder != null && + downloaderBinder.isDownloading(mAccount, file)); + OperationsServiceBinder opsBinder = + mTransferServiceGetter.getOperationsServiceBinder(); + downloading |= (opsBinder != null && + opsBinder.isSynchronizing(mAccount, file.getRemotePath())); if (downloading) { localStateView.setImageResource(R.drawable.downloading_file_indicator); localStateView.setVisibility(View.VISIBLE); - } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { + } else if (uploaderBinder != null && + uploaderBinder.isUploading(mAccount, file)) { localStateView.setImageResource(R.drawable.uploading_file_indicator); localStateView.setVisibility(View.VISIBLE); } else if (file.isDown()) { @@ -254,7 +264,8 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { // share with me icon if (!file.isFolder()) { - ImageView sharedWithMeIconV = (ImageView) view.findViewById(R.id.sharedWithMeIcon); + ImageView sharedWithMeIconV = (ImageView) + view.findViewById(R.id.sharedWithMeIcon); sharedWithMeIconV.bringToFront(); if (checkIfFileIsSharedWithMe(file)) { sharedWithMeIconV.setVisibility(View.VISIBLE); @@ -306,7 +317,8 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { } } } else { - fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(file.getMimetype(), file.getFileName())); + fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(file.getMimetype(), + file.getFileName())); } } else { diff --git a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java index 823abc5c..287c5b9e 100644 --- a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -40,8 +40,6 @@ import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.DisplayUtils; -import third_parties.in.srain.cube.GridViewWithHeaderAndFooter; - /** * This Adapter populates a ListView with all files and directories contained * in a local directory diff --git a/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java b/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java index e05f2165..fc88e5d1 100644 --- a/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java +++ b/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java @@ -147,7 +147,7 @@ public class ShareLinkToDialog extends SherlockDialogFragment { } else { // Create a new share resource ((ComponentsGetter)getSherlockActivity()).getFileOperationsHelper() - .shareFileWithLinkToApp(mFile, mIntent); + .shareFileWithLinkToApp(mFile, "", mIntent); } } }) diff --git a/src/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java b/src/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java new file mode 100644 index 00000000..d8f507b1 --- /dev/null +++ b/src/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java @@ -0,0 +1,124 @@ +/** + * ownCloud Android client application + * @author masensio + * Copyright (C) 2015 ownCloud Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.owncloud.android.ui.dialog; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.actionbarsherlock.app.SherlockDialogFragment; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.ui.activity.FileActivity; + +/** + * Dialog to input the password for sharing a file/folder. + * + * Triggers the share when the password is introduced. + */ + +public class SharePasswordDialogFragment extends SherlockDialogFragment + implements DialogInterface.OnClickListener { + + private static final String ARG_FILE = "FILE"; + private static final String ARG_SEND_INTENT = "SEND_INTENT"; + + public static final String PASSWORD_FRAGMENT = "PASSWORD_FRAGMENT"; + + private OCFile mFile; + private Intent mSendIntent; + + /** + * Public factory method to create new SharePasswordDialogFragment instances. + * + * @param file + * @param sendIntent + * @return Dialog ready to show. + */ + public static SharePasswordDialogFragment newInstance(OCFile file, Intent sendIntent) { + SharePasswordDialogFragment frag = new SharePasswordDialogFragment(); + Bundle args = new Bundle(); + args.putParcelable(ARG_FILE, file); + args.putParcelable(ARG_SEND_INTENT, sendIntent); + frag.setArguments(args); + return frag; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + mFile = getArguments().getParcelable(ARG_FILE); + mSendIntent = getArguments().getParcelable(ARG_SEND_INTENT); + + // Inflate the layout for the dialog + LayoutInflater inflater = getActivity().getLayoutInflater(); + View v = inflater.inflate(R.layout.password_dialog, null); + + // Setup layout + EditText inputText = ((EditText)v.findViewById(R.id.share_password)); + inputText.setText(""); + inputText.requestFocus(); + + // Build the dialog + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setView(v) + .setPositiveButton(R.string.common_ok, this) + .setNegativeButton(R.string.common_cancel, this) + .setTitle(R.string.share_link_password_title); + Dialog d = builder.create(); + d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + return d; + } + + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == AlertDialog.BUTTON_POSITIVE) { + // Enable the flag "Share again" + ((FileActivity) getSherlockActivity()).setTryShareAgain(true); + + String password = + ((TextView)(getDialog().findViewById(R.id.share_password))) + .getText().toString(); + + if (password.length() <= 0) { + Toast.makeText( + getActivity(), + R.string.share_link_empty_password, + Toast.LENGTH_LONG).show(); + return; + } + + // Share the file + ((FileActivity)getSherlockActivity()).getFileOperationsHelper() + .shareFileWithLinkToApp(mFile, password, mSendIntent); + + } else { + // Disable the flag "Share again" + ((FileActivity) getSherlockActivity()).setTryShareAgain(false); + } + } +} diff --git a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 03289cf9..fb58be3a 100644 --- a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -22,7 +22,7 @@ package com.owncloud.android.ui.fragment; import java.util.ArrayList; -import android.content.Context; +import android.os.Build; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; @@ -33,6 +33,7 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ListAdapter; +import android.widget.ListView; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; @@ -80,10 +81,14 @@ implements OnItemClickListener, OnEnforceableRefreshListener { private ListAdapter mAdapter; - protected void setListAdapter(ListAdapter listAdapter) { mAdapter = listAdapter; - mCurrentListView.setAdapter(listAdapter); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mCurrentListView.setAdapter(listAdapter); + } else { + ((ListView)mCurrentListView).setAdapter(listAdapter); + } + mCurrentListView.invalidate(); } @@ -216,7 +221,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { */ protected int getReferencePosition() { if (mCurrentListView != null) { - return (mCurrentListView.getFirstVisiblePosition() + mCurrentListView.getLastVisiblePosition()) / 2; + return (mCurrentListView.getFirstVisiblePosition() + + mCurrentListView.getLastVisiblePosition()) / 2; } else { return 0; } @@ -234,7 +240,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { final int firstPosition = mFirstPositions.remove(mFirstPositions.size() -1); int top = mTops.remove(mTops.size() - 1); - Log_OC.v(TAG, "Setting selection to position: " + firstPosition + "; top: " + top + "; index: " + index); + Log_OC.v(TAG, "Setting selection to position: " + firstPosition + "; top: " + + top + "; index: " + index); if (mCurrentListView == mListView) { if (mHeightCell*index <= mListView.getHeight()) { @@ -331,8 +338,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { private void onCreateSwipeToRefresh(SwipeRefreshLayout refreshLayout) { // Colors in animations: background - refreshLayout.setColorScheme(R.color.background_color, R.color.background_color, R.color.background_color, - R.color.background_color); + refreshLayout.setColorScheme(R.color.background_color, R.color.background_color, + R.color.background_color, R.color.background_color); refreshLayout.setOnRefreshListener(this); } @@ -348,10 +355,13 @@ implements OnItemClickListener, OnEnforceableRefreshListener { } } - protected void setChoiceMode(int choiceMode) { - mListView.setChoiceMode(choiceMode); - mGridView.setChoiceMode(choiceMode); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mListView.setChoiceMode(choiceMode); + mGridView.setChoiceMode(choiceMode); + } else { + ((ListView)mListView).setChoiceMode(choiceMode); + } } protected void registerForContextMenu() { @@ -386,8 +396,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { mListFooterView.invalidate(); } else { - mGridView.removeFooterView(mGridFooterView); - mListView.removeFooterView(mListFooterView); +// mGridView.removeFooterView(mGridFooterView); +// mListView.removeFooterView(mListFooterView); } } diff --git a/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java index b3e40d8d..8a268b75 100644 --- a/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -64,7 +64,8 @@ public class LocalFileListFragment extends ExtendedListFragment { try { mContainerActivity = (ContainerActivity) activity; } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() + " must implement " + LocalFileListFragment.ContainerActivity.class.getSimpleName()); + throw new ClassCastException(activity.toString() + " must implement " + + LocalFileListFragment.ContainerActivity.class.getSimpleName()); } } @@ -99,7 +100,8 @@ public class LocalFileListFragment extends ExtendedListFragment { } /** - * Checks the file clicked over. Browses inside if it is a directory. Notifies the container activity in any case. + * Checks the file clicked over. Browses inside if it is a directory. + * Notifies the container activity in any case. */ @Override public void onItemClick(AdapterView l, View v, int position, long id) { @@ -117,7 +119,7 @@ public class LocalFileListFragment extends ExtendedListFragment { } else { /// Click on a file ImageView checkBoxV = (ImageView) v.findViewById(R.id.custom_checkbox); if (checkBoxV != null) { - if (getListView().isItemChecked(position)) { + if (((ListView)getListView()).isItemChecked(position)) { checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); } else { checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); @@ -182,7 +184,8 @@ public class LocalFileListFragment extends ExtendedListFragment { if(mDirectory != null){ directory = mDirectory; } else { - directory = Environment.getExternalStorageDirectory(); // TODO be careful with the state of the storage; could not be available + directory = Environment.getExternalStorageDirectory(); + // TODO be careful with the state of the storage; could not be available if (directory == null) return; // no files to show } } @@ -194,7 +197,8 @@ public class LocalFileListFragment extends ExtendedListFragment { directory = directory.getParentFile(); } - mCurrentListView.clearChoices(); // by now, only files in the same directory will be kept as selected + // by now, only files in the same directory will be kept as selected + ((ListView)mCurrentListView).clearChoices(); mAdapter.swapDirectory(directory); if (mDirectory == null || !mDirectory.equals(directory)) { mCurrentListView.setSelection(0); @@ -210,11 +214,12 @@ public class LocalFileListFragment extends ExtendedListFragment { */ public String[] getCheckedFilePaths() { ArrayList result = new ArrayList(); - SparseBooleanArray positions = mCurrentListView.getCheckedItemPositions(); + SparseBooleanArray positions = ((ListView)mCurrentListView).getCheckedItemPositions(); if (positions.size() > 0) { for (int i = 0; i < positions.size(); i++) { if (positions.get(positions.keyAt(i)) == true) { - result.add(((File) mCurrentListView.getItemAtPosition(positions.keyAt(i))).getAbsolutePath()); + result.add(((File) mCurrentListView.getItemAtPosition( + positions.keyAt(i))).getAbsolutePath()); } } @@ -237,7 +242,8 @@ public class LocalFileListFragment extends ExtendedListFragment { public void onDirectoryClick(File directory); /** - * Callback method invoked when a file (non directory) is clicked by the user on the files list + * Callback method invoked when a file (non directory) + * is clicked by the user on the files list * * @param file */ @@ -245,7 +251,8 @@ public class LocalFileListFragment extends ExtendedListFragment { /** - * Callback method invoked when the parent activity is fully created to get the directory to list firstly. + * Callback method invoked when the parent activity + * is fully created to get the directory to list firstly. * * @return Directory to list firstly. Can be NULL. */